diff --git a/app/utils/node-info.ts b/app/utils/node-info.ts index f26d096..701a3f9 100644 --- a/app/utils/node-info.ts +++ b/app/utils/node-info.ts @@ -12,6 +12,11 @@ export interface PopulatedNode extends Machine { }; } +const GO_ZERO_TIMES = new Set(["0001-01-01 00:00:00", "0001-01-01T00:00:00Z"]); +export function isNoExpiry(expiry: string | null | undefined): boolean { + return expiry == null || GO_ZERO_TIMES.has(expiry); +} + export function mapNodes( nodes: Machine[], stats?: Record | undefined, @@ -35,12 +40,7 @@ export function mapNodes( routes: Array.from(new Set(node.availableRoutes)), hostInfo: stats?.[node.nodeKey], customRouting, - expired: - node.expiry === "0001-01-01 00:00:00" || - node.expiry === "0001-01-01T00:00:00Z" || - node.expiry === null - ? false - : new Date(node.expiry).getTime() < Date.now(), + expired: isNoExpiry(node.expiry) ? false : new Date(node.expiry!).getTime() < Date.now(), }; }); } diff --git a/tests/unit/utils/node-info.test.ts b/tests/unit/utils/node-info.test.ts new file mode 100644 index 0000000..e8e3cb0 --- /dev/null +++ b/tests/unit/utils/node-info.test.ts @@ -0,0 +1,29 @@ +import { describe, expect, test } from "vitest"; + +import { isNoExpiry } from "~/utils/node-info"; + +describe("isNoExpiry", () => { + test("returns true for null", () => { + expect(isNoExpiry(null)).toBe(true); + }); + + test("returns true for undefined", () => { + expect(isNoExpiry(undefined)).toBe(true); + }); + + test("returns true for Go zero-time ISO format", () => { + expect(isNoExpiry("0001-01-01T00:00:00Z")).toBe(true); + }); + + test("returns true for Go zero-time space format", () => { + expect(isNoExpiry("0001-01-01 00:00:00")).toBe(true); + }); + + test("returns false for a real future expiry", () => { + expect(isNoExpiry("2030-01-01T00:00:00Z")).toBe(false); + }); + + test("returns false for a real past expiry", () => { + expect(isNoExpiry("2020-01-01T00:00:00Z")).toBe(false); + }); +});