import { describe, expect, it } from "vitest";
import { sortBySeverity } from "./sorting.js";
describe("sortBySeverity", () => {
it("should sort items by severity order with lowest value first", () => {
const items = [
{ name: "running-1", state: "running" },
{ name: "exited-1", state: "exited" },
{ name: "paused-1", state: "paused" },
];
const severityOrder: Record<string, number> = {
exited: 0,
paused: 1,
running: 2,
};
const sorted = sortBySeverity(items, (item) => item.state, severityOrder);
expect(sorted.map((i) => i.state)).toEqual(["exited", "paused", "running"]);
});
it("should use name as tiebreaker via secondary sort key", () => {
const items = [
{ name: "bravo", state: "running" },
{ name: "alpha", state: "running" },
{ name: "charlie", state: "running" },
];
const severityOrder: Record<string, number> = { running: 0 };
const sorted = sortBySeverity(
items,
(item) => item.state,
severityOrder,
(item) => item.name
);
expect(sorted.map((i) => i.name)).toEqual(["alpha", "bravo", "charlie"]);
});
it("should place unknown states at the end", () => {
const items = [
{ name: "unknown-1", state: "unknown" },
{ name: "running-1", state: "running" },
{ name: "exited-1", state: "exited" },
];
const severityOrder: Record<string, number> = {
exited: 0,
running: 1,
};
const sorted = sortBySeverity(items, (item) => item.state, severityOrder);
expect(sorted.map((i) => i.state)).toEqual(["exited", "running", "unknown"]);
});
it("should not mutate the original array", () => {
const items = [
{ name: "b", state: "running" },
{ name: "a", state: "exited" },
];
const severityOrder: Record<string, number> = { exited: 0, running: 1 };
const sorted = sortBySeverity(items, (item) => item.state, severityOrder);
expect(sorted).not.toBe(items);
expect(items[0].state).toBe("running"); // original unchanged
expect(sorted[0].state).toBe("exited");
});
it("should work with container severity order", () => {
const items = [
{ name: "app1", state: "running" },
{ name: "db", state: "exited" },
{ name: "cache", state: "dead" },
{ name: "proxy", state: "paused" },
{ name: "worker", state: "restarting" },
{ name: "web", state: "stopped" },
];
const containerSeverity: Record<string, number> = {
exited: 0,
dead: 1,
stopped: 2,
paused: 3,
restarting: 4,
running: 5,
};
const sorted = sortBySeverity(
items,
(item) => item.state,
containerSeverity,
(item) => item.name
);
expect(sorted.map((i) => i.state)).toEqual([
"exited",
"dead",
"stopped",
"paused",
"restarting",
"running",
]);
});
it("should work with compose project severity order", () => {
const items = [
{ name: "web", status: "running" },
{ name: "api", status: "partial" },
{ name: "db", status: "stopped" },
];
const composeSeverity: Record<string, number> = {
partial: 0,
running: 1,
stopped: 2,
};
const sorted = sortBySeverity(
items,
(item) => item.status,
composeSeverity,
(item) => item.name
);
expect(sorted.map((i) => i.status)).toEqual(["partial", "running", "stopped"]);
});
});