Files
openclaw/ui/src/build-info.test.ts
Peter Steinberger b81946d6af fix(ui): make Cloud Worker startup responsive (#121200)
* fix(openai): filter platform-only ChatGPT catalog rows

* fix(ui): show Cloud Worker startup progress

* fix(ui): keep cloud startup out of app bootstrap

* fix(ui): reduce cloud startup bootstrap cost

* fix(ui): satisfy cloud startup lint

* fix(ui): keep cloud startup within UI limits

* fix(ui): satisfy cloud startup CI limits

* fix(ui): isolate concurrent cloud startup

* fix(ui): address cloud startup review findings

* fix(ui): persist cloud startup recovery per session

* style(ui): format cloud startup chat props
2026-08-09 22:42:45 -07:00

141 lines
4.9 KiB
TypeScript

import { describe, expect, it, vi } from "vitest";
import { normalizeControlUiBuildInfo } from "./build-info-normalizers.ts";
import type { ControlUiBuildInfo } from "./build-info-types.ts";
const COMMIT = "0123456789abcdef0123456789abcdef01234567";
describe("Control UI build info", () => {
it("compares the normalized embedded version with the gateway", async () => {
const injectedBuildInfo: ControlUiBuildInfo = {
version: "2026.7.19",
commit: COMMIT,
commitAt: null,
builtAt: null,
branch: null,
dirty: null,
release: false,
buildId: "test",
};
vi.stubGlobal("OPENCLAW_CONTROL_UI_BUILD_INFO", injectedBuildInfo);
vi.resetModules();
try {
const { CONTROL_UI_BUILD_INFO, controlUiVersionDiffersFrom } =
await import("./build-info.ts");
expect(CONTROL_UI_BUILD_INFO).toBe(injectedBuildInfo);
expect(controlUiVersionDiffersFrom(" 2026.7.19 ")).toBe(false);
expect(controlUiVersionDiffersFrom("2026.7.20")).toBe(true);
expect(controlUiVersionDiffersFrom("2026.7.19", COMMIT.slice(0, 12))).toBe(false);
expect(controlUiVersionDiffersFrom("2026.7.19", "f".repeat(40))).toBe(true);
expect(controlUiVersionDiffersFrom(undefined)).toBe(false);
} finally {
vi.unstubAllGlobals();
vi.resetModules();
}
});
it("normalizes the fallback when no build info is injected", async () => {
vi.stubGlobal("OPENCLAW_CONTROL_UI_BUILD_INFO", undefined);
vi.resetModules();
try {
const { CONTROL_UI_BUILD_INFO } = await import("./build-info.ts");
expect(CONTROL_UI_BUILD_INFO).toEqual(normalizeControlUiBuildInfo(undefined));
} finally {
vi.unstubAllGlobals();
vi.resetModules();
}
});
it("keeps only full Git SHAs", () => {
expect(normalizeControlUiBuildInfo({ commit: COMMIT.toUpperCase() }).commit).toBe(COMMIT);
expect(normalizeControlUiBuildInfo({ commit: COMMIT.slice(0, 12) }).commit).toBeNull();
expect(normalizeControlUiBuildInfo({ commit: "not-a-sha" }).commit).toBeNull();
});
it("normalizes advisory branch identity", () => {
expect(normalizeControlUiBuildInfo({ branch: " feature/build-chip " }).branch).toBe(
"feature/build-chip",
);
expect(normalizeControlUiBuildInfo({ branch: "HEAD" }).branch).toBeNull();
expect(normalizeControlUiBuildInfo({ branch: " " }).branch).toBeNull();
expect(normalizeControlUiBuildInfo({ branch: "x".repeat(101) }).branch).toBe("x".repeat(100));
expect(normalizeControlUiBuildInfo({ branch: `${"x".repeat(98)}😀tail` }).branch).toBe(
`${"x".repeat(98)}😀`,
);
expect(normalizeControlUiBuildInfo({ branch: `${"x".repeat(99)}😀tail` }).branch).toBe(
"x".repeat(99),
);
});
it("canonicalizes only valid UTC build timestamps", () => {
expect(normalizeControlUiBuildInfo({ builtAt: "2026-07-10T12:34:56Z" }).builtAt).toBe(
"2026-07-10T12:34:56.000Z",
);
expect(normalizeControlUiBuildInfo({ builtAt: "2026-07-10T12:34:56.123Z" }).builtAt).toBe(
"2026-07-10T12:34:56.123Z",
);
expect(normalizeControlUiBuildInfo({ builtAt: "2026-07-10T12:34:56.7Z" }).builtAt).toBe(
"2026-07-10T12:34:56.700Z",
);
expect(normalizeControlUiBuildInfo({ builtAt: "2026-07-10T12:34:56.12Z" }).builtAt).toBe(
"2026-07-10T12:34:56.120Z",
);
expect(normalizeControlUiBuildInfo({ builtAt: "2026-02-30T12:34:56Z" }).builtAt).toBeNull();
expect(
normalizeControlUiBuildInfo({ builtAt: "2026-07-10T12:34:56+00:00" }).builtAt,
).toBeNull();
expect(normalizeControlUiBuildInfo({ commitAt: "2026-07-10T11:22:33Z" }).commitAt).toBe(
"2026-07-10T11:22:33.000Z",
);
expect(
normalizeControlUiBuildInfo({ commitAt: "2026-07-10T11:22:33+02:00" }).commitAt,
).toBeNull();
});
it("renders invalid injected metadata as unavailable instead of inventing identity", () => {
expect(
normalizeControlUiBuildInfo({
version: " ",
commit: "deadbeef",
commitAt: "later",
builtAt: "later",
branch: "HEAD",
dirty: "yes",
release: "yes",
buildId: "",
}),
).toEqual({
version: null,
commit: null,
commitAt: null,
builtAt: null,
branch: null,
dirty: null,
release: false,
buildId: "dev",
});
});
it("passes through normalized branch, dirty state, and release identity", () => {
expect(
normalizeControlUiBuildInfo({ branch: " feature/x ", dirty: false, release: true }),
).toMatchObject({
branch: "feature/x",
dirty: false,
release: true,
});
});
it("derives a stable service-worker id from the same artifact metadata", () => {
expect(
normalizeControlUiBuildInfo({
version: "2026.7.10",
commit: COMMIT,
builtAt: "2026-07-10T12:34:56.000Z",
release: true,
}).buildId,
).toBe("2026.7.10-release-0123456789ab-2026-07-10T12-34-56.000Z");
});
});