Add release management components and update routing logic. Introduce keyboard shortcuts, enhance release data grid, and improve asset handling in Nginx configuration.

This commit is contained in:
Jeppe Bundgaard
2026-05-26 14:14:13 +02:00
parent a952dd2c61
commit 8ab8915429
77 changed files with 8353 additions and 1143 deletions
@@ -44,7 +44,6 @@ const availableRuntime = () => ({
versions: {
frontend: { version_label: "frontend-canary", commit_sha: "c0ffee" },
api: { version_label: "api-canary", commit_sha: "feedface" },
bundle_id: 31,
},
availability: {
configured: true,
@@ -62,7 +61,7 @@ const runtimeWithSelectableReleaseDetails = () => ({
},
availability: {
configured: false,
missing: ["release_bundle"],
missing: ["api_base_url"],
status: "unconfigured",
},
available_channels: [
@@ -115,7 +114,7 @@ const runtimeWithSelectableReleaseDetails = () => ({
},
availability: {
configured: false,
missing: ["release_bundle"],
missing: ["api_base_url"],
status: "unconfigured",
},
},
@@ -181,6 +180,7 @@ async function boot(page, runtime = unavailableRuntime, locale = "en") {
await page.addInitScript((selectedLocale) => {
window.localStorage.setItem("locale", selectedLocale);
window.localStorage.removeItem("release_channel_unavailable_ignore_until");
window.localStorage.setItem("release_source_override", "deployment");
}, locale);
await mockApi(page, {
@@ -206,7 +206,7 @@ test("users assigned to an unconfigured release channel can ignore the guard tem
await expect(guard).toBeVisible({ timeout: GUARD_TIMEOUT_MS });
await expect(guard).toContainText("Release channel is not ready");
await expect(guard).toContainText("Canary");
await expect(page.getByTestId("release-channel-missing")).toContainText("Release bundle");
await expect(page.getByTestId("release-channel-missing")).not.toContainText("Release bundle");
await expect(page.getByTestId("release-channel-missing")).toContainText("Frontend version");
await expect(page.getByTestId("release-channel-missing")).toContainText("API version");
await expect(page.getByTestId("release-channel-next-check")).toContainText("Checking again in");
@@ -242,6 +242,7 @@ test("invalid release runtime JSON shows the unavailable guard instead of crashi
await boot(page, internalRuntime);
await page.addInitScript(() => {
window.localStorage.setItem("release_channel_selected_slug", "internal");
window.localStorage.setItem("release_source_override", "deployment");
});
await page.route("**/release/runtime**", async (route) => {
await route.fulfill({
@@ -291,6 +292,7 @@ test("selected channel auth session 404 shows the release channel guard", async
await boot(page, internalRuntime);
await page.addInitScript(() => {
window.localStorage.setItem("release_channel_selected_slug", "internal");
window.localStorage.setItem("release_source_override", "deployment");
});
await page.route("**/release/runtime**", async (route) => {
await route.fulfill(json({ data: internalRuntime }));
@@ -324,7 +326,7 @@ test("release channel choices show git commit and release time when available",
const canary = page.getByTestId("release-channel-option-canary");
await expect(canary).toBeVisible();
await expect(canary).toContainText("Release bundle");
await expect(canary).not.toContainText("Release bundle");
await expect(page.getByTestId("release-channel-option-canary-frontend-release")).toContainText("c0ffee000000");
await expect(page.getByTestId("release-channel-option-canary-frontend-release")).toContainText(
/May 19, 2026|19 May 2026/