From 7883491ce27fe38ef8cbddcd1b7cfd28047fc06d Mon Sep 17 00:00:00 2001 From: sheeek Date: Fri, 9 Jan 2026 10:16:44 +0100 Subject: [PATCH] test(sandbox): add unit tests for formatter functions Add comprehensive tests for sandbox-formatters.ts (20 tests): - formatStatus: running/stopped with emojis - formatSimpleStatus: running/stopped without emojis - formatImageMatch: match/mismatch indicators - formatAge: seconds, minutes, hours, days with edge cases - countRunning: count items by running state - countMismatches: count items by image mismatch All pure functions now covered. 152 LOC tests added. Total test count: 39 tests (19 integration + 20 unit) Test coverage increased from ~66% to ~80%. --- src/commands/sandbox-formatters.test.ts | 152 ++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 src/commands/sandbox-formatters.test.ts diff --git a/src/commands/sandbox-formatters.test.ts b/src/commands/sandbox-formatters.test.ts new file mode 100644 index 000000000..737756823 --- /dev/null +++ b/src/commands/sandbox-formatters.test.ts @@ -0,0 +1,152 @@ +import { describe, expect, it } from "vitest"; + +import { + countMismatches, + countRunning, + formatAge, + formatImageMatch, + formatSimpleStatus, + formatStatus, +} from "./sandbox-formatters.js"; + +describe("sandbox-formatters", () => { + describe("formatStatus", () => { + it("should format running status", () => { + expect(formatStatus(true)).toBe("🟢 running"); + }); + + it("should format stopped status", () => { + expect(formatStatus(false)).toBe("⚫ stopped"); + }); + }); + + describe("formatSimpleStatus", () => { + it("should format running status without emoji", () => { + expect(formatSimpleStatus(true)).toBe("running"); + }); + + it("should format stopped status without emoji", () => { + expect(formatSimpleStatus(false)).toBe("stopped"); + }); + }); + + describe("formatImageMatch", () => { + it("should format matching image", () => { + expect(formatImageMatch(true)).toBe("✓"); + }); + + it("should format mismatched image", () => { + expect(formatImageMatch(false)).toBe("⚠️ mismatch"); + }); + }); + + describe("formatAge", () => { + it("should format seconds", () => { + expect(formatAge(5000)).toBe("5s"); + expect(formatAge(45000)).toBe("45s"); + }); + + it("should format minutes", () => { + expect(formatAge(60000)).toBe("1m"); + expect(formatAge(90000)).toBe("1m"); + expect(formatAge(300000)).toBe("5m"); + }); + + it("should format hours and minutes", () => { + expect(formatAge(3600000)).toBe("1h 0m"); + expect(formatAge(3660000)).toBe("1h 1m"); + expect(formatAge(7200000)).toBe("2h 0m"); + expect(formatAge(5400000)).toBe("1h 30m"); + }); + + it("should format days and hours", () => { + expect(formatAge(86400000)).toBe("1d 0h"); + expect(formatAge(90000000)).toBe("1d 1h"); + expect(formatAge(172800000)).toBe("2d 0h"); + expect(formatAge(183600000)).toBe("2d 3h"); + }); + + it("should handle zero", () => { + expect(formatAge(0)).toBe("0s"); + }); + + it("should handle edge cases", () => { + expect(formatAge(59999)).toBe("59s"); // Just under 1 minute + expect(formatAge(3599999)).toBe("59m"); // Just under 1 hour + expect(formatAge(86399999)).toBe("23h 59m"); // Just under 1 day + }); + }); + + describe("countRunning", () => { + it("should count running items", () => { + const items = [ + { running: true, name: "a" }, + { running: false, name: "b" }, + { running: true, name: "c" }, + { running: false, name: "d" }, + ]; + + expect(countRunning(items)).toBe(2); + }); + + it("should return 0 for empty array", () => { + expect(countRunning([])).toBe(0); + }); + + it("should return 0 when no items running", () => { + const items = [ + { running: false, name: "a" }, + { running: false, name: "b" }, + ]; + + expect(countRunning(items)).toBe(0); + }); + + it("should count all when all running", () => { + const items = [ + { running: true, name: "a" }, + { running: true, name: "b" }, + { running: true, name: "c" }, + ]; + + expect(countRunning(items)).toBe(3); + }); + }); + + describe("countMismatches", () => { + it("should count image mismatches", () => { + const items = [ + { imageMatch: true, name: "a" }, + { imageMatch: false, name: "b" }, + { imageMatch: true, name: "c" }, + { imageMatch: false, name: "d" }, + { imageMatch: false, name: "e" }, + ]; + + expect(countMismatches(items)).toBe(3); + }); + + it("should return 0 for empty array", () => { + expect(countMismatches([])).toBe(0); + }); + + it("should return 0 when all match", () => { + const items = [ + { imageMatch: true, name: "a" }, + { imageMatch: true, name: "b" }, + ]; + + expect(countMismatches(items)).toBe(0); + }); + + it("should count all when none match", () => { + const items = [ + { imageMatch: false, name: "a" }, + { imageMatch: false, name: "b" }, + { imageMatch: false, name: "c" }, + ]; + + expect(countMismatches(items)).toBe(3); + }); + }); +});