diff --git a/TODO.md b/TODO.md index ff43640..9802577 100644 --- a/TODO.md +++ b/TODO.md @@ -20,6 +20,11 @@ regress. # Completed Steps +- 2026-09-29: The app page shows the app's branch as a label in its title, next + to the status badge, instead of after the repository under it; the app list + shows the Branch column right after Name and scrolls sideways on narrow + screens instead of cutting columns off (#240). + - 2026-09-29: `docker-compose.yml` now sets `UPAAS_PORT` to 8080 as well as `PORT`, since upaas reads `UPAAS_PORT` first and a `UPAAS_PORT` in `.env` made it listen away from the port mapping and healthcheck; the README's Compose diff --git a/internal/handlers/app_branch_test.go b/internal/handlers/app_branch_test.go new file mode 100644 index 0000000..a130971 --- /dev/null +++ b/internal/handlers/app_branch_test.go @@ -0,0 +1,76 @@ +package handlers_test + +import ( + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "sneak.berlin/go/upaas/internal/service/app" +) + +// TestAppBranchIsShown checks that an app's branch can be read from the app +// page title and from the app list without opening the edit page. +func TestAppBranchIsShown(t *testing.T) { + t.Parallel() + + testCtx := setupTestHandlers(t) + + createdApp, err := testCtx.appSvc.CreateApp(t.Context(), app.CreateAppInput{ + Name: "branch-shown-app", + RepoURL: "git@example.com:user/branch-shown-app.git", + Branch: "staging", + }) + require.NoError(t, err) + + t.Run("in the app page title next to the status badge", func(t *testing.T) { + t.Parallel() + + request := httptest.NewRequestWithContext( + t.Context(), http.MethodGet, "/apps/"+createdApp.ID, nil, + ) + request = addChiURLParams(request, map[string]string{"id": createdApp.ID}) + recorder := httptest.NewRecorder() + + testCtx.handlers.HandleAppDetail().ServeHTTP(recorder, request) + + require.Equal(t, http.StatusOK, recorder.Code) + + // The title row runs from the app name heading to the end of its div. + _, afterHeading, found := strings.Cut(recorder.Body.String(), "") + assert.Contains(t, titleRow, `x-text="statusLabel"`) + assert.Contains(t, titleRow, ">staging") + }) + + t.Run("in the app list before the repository", func(t *testing.T) { + t.Parallel() + + request := httptest.NewRequestWithContext( + t.Context(), http.MethodGet, "/", nil, + ) + recorder := httptest.NewRecorder() + + testCtx.handlers.HandleDashboard().ServeHTTP(recorder, request) + + require.Equal(t, http.StatusOK, recorder.Code) + + _, afterRowStart, found := strings.Cut( + recorder.Body.String(), ``, + ) + require.True(t, found, "app list has no row for the app") + + row, _, _ := strings.Cut(afterRowStart, "") + branchAt := strings.Index(row, ">staging") + repoAt := strings.Index(row, createdApp.RepoURL) + + require.NotEqual(t, -1, branchAt, "branch missing from the app's row") + require.NotEqual(t, -1, repoAt, "repository missing from the app's row") + assert.Less(t, branchAt, repoAt, "branch should come before repository") + }) +} diff --git a/templates/app_detail.html b/templates/app_detail.html index ecb085e..02d65c5 100644 --- a/templates/app_detail.html +++ b/templates/app_detail.html @@ -26,11 +26,12 @@
-
+

{{.App.Name}}

+ {{.App.Branch}}
-

{{.App.RepoURL}}@{{.App.Branch}}

+

{{.App.RepoURL}}

Edit diff --git a/templates/dashboard.html b/templates/dashboard.html index ff66e1c..480b9af 100644 --- a/templates/dashboard.html +++ b/templates/dashboard.html @@ -21,12 +21,13 @@ {{if .AppStats}}
+
- + @@ -41,8 +42,8 @@ {{.App.Name}} - +
NameRepository BranchRepository Status Last Deploy Deploys {{.App.RepoURL}} {{.App.Branch}}{{.App.RepoURL}} {{if eq .App.Status "running"}} Running @@ -78,6 +79,7 @@ {{end}}
+
{{else}}