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%.
This commit is contained in:
committed by
Peter Steinberger
parent
7f02b62bba
commit
7883491ce2
152
src/commands/sandbox-formatters.test.ts
Normal file
152
src/commands/sandbox-formatters.test.ts
Normal file
@@ -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);
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user