homeio
PublikFork dari doctor-io/homeio
update-check.test.ts
import { describe, expect, it } from "vitest";
import {
compareImageTags,
extractImageTag,
isTagUpdateAvailable,
} from "@/lib/server/modules/store/update-check";
describe("update-check (tag-based)", () => {
describe("extractImageTag", () => {
it("extracts tag from image with repo prefix", () => {
expect(extractImageTag("plexinc/pms-docker:1.41.3")).toBe("1.41.3");
});
it("extracts tag from simple image", () => {
expect(extractImageTag("nginx:1.25.3")).toBe("1.25.3");
});
it("returns null for image with no tag", () => {
expect(extractImageTag("nginx")).toBeNull();
});
it("returns null for null/undefined input", () => {
expect(extractImageTag(null)).toBeNull();
expect(extractImageTag(undefined)).toBeNull();
});
});
describe("compareImageTags", () => {
it("returns positive when a is greater", () => {
expect(compareImageTags("1.41.3", "1.41.2")).toBeGreaterThan(0);
expect(compareImageTags("2026.3.0", "2025.2.1")).toBeGreaterThan(0);
});
it("returns negative when a is less", () => {
expect(compareImageTags("1.41.2", "1.41.3")).toBeLessThan(0);
expect(compareImageTags("2025.2.1", "2026.3.0")).toBeLessThan(0);
});
it("returns 0 when equal", () => {
expect(compareImageTags("1.41.2", "1.41.2")).toBe(0);
});
it("compares by major version first", () => {
expect(compareImageTags("2.0.0", "1.99.99")).toBeGreaterThan(0);
});
});
describe("isTagUpdateAvailable", () => {
it("returns true when catalog tag is strictly newer", () => {
expect(isTagUpdateAvailable("plexinc/pms-docker:1.41.2", "plexinc/pms-docker:1.41.3")).toBe(true);
expect(isTagUpdateAvailable("wisdomsky/cloudflared-web:2025.2.1", "wisdomsky/cloudflared-web:2026.3.0")).toBe(true);
});
it("returns false when catalog tag is older than installed", () => {
// Catalog lags behind installed — should NOT show as update
expect(isTagUpdateAvailable("wisdomsky/cloudflared-web:2026.3.0", "wisdomsky/cloudflared-web:2025.2.1")).toBe(false);
});
it("returns false when tags are equal", () => {
expect(isTagUpdateAvailable("nginx:1.25.3", "nginx:1.25.3")).toBe(false);
});
it("returns false when either image is null", () => {
expect(isTagUpdateAvailable(null, "nginx:1.25.3")).toBe(false);
expect(isTagUpdateAvailable("nginx:1.25.3", null)).toBe(false);
expect(isTagUpdateAvailable(null, null)).toBe(false);
});
it("returns false when images have no tags", () => {
expect(isTagUpdateAvailable("nginx", "nginx")).toBe(false);
});
});
});