89 lines
3.1 KiB
TypeScript
89 lines
3.1 KiB
TypeScript
/**
|
|
* Unit tests for container sort order within stacks via dockhand.order label.
|
|
*
|
|
* Run with: bun test tests/unit/stack-order.test.ts
|
|
*/
|
|
|
|
import { describe, test, expect } from 'bun:test';
|
|
import { getOrderValue } from '../src/lib/server/container-labels';
|
|
|
|
interface MockContainer {
|
|
service: string;
|
|
labels: Record<string, string>;
|
|
}
|
|
|
|
function sortContainers(containers: MockContainer[]): MockContainer[] {
|
|
return [...containers].sort((a, b) => {
|
|
const orderA = getOrderValue(a.labels);
|
|
const orderB = getOrderValue(b.labels);
|
|
if (orderA !== orderB) return orderA - orderB;
|
|
return a.service.localeCompare(b.service);
|
|
});
|
|
}
|
|
|
|
describe('stack container sort order', () => {
|
|
test('containers without labels sort alphabetically', () => {
|
|
const containers: MockContainer[] = [
|
|
{ service: 'redis', labels: {} },
|
|
{ service: 'app', labels: {} },
|
|
{ service: 'nginx', labels: {} },
|
|
];
|
|
const sorted = sortContainers(containers);
|
|
expect(sorted.map(c => c.service)).toEqual(['app', 'nginx', 'redis']);
|
|
});
|
|
|
|
test('lower order values appear first', () => {
|
|
const containers: MockContainer[] = [
|
|
{ service: 'redis', labels: { 'dockhand.order': '3' } },
|
|
{ service: 'app', labels: { 'dockhand.order': '1' } },
|
|
{ service: 'nginx', labels: { 'dockhand.order': '2' } },
|
|
];
|
|
const sorted = sortContainers(containers);
|
|
expect(sorted.map(c => c.service)).toEqual(['app', 'nginx', 'redis']);
|
|
});
|
|
|
|
test('same order value falls back to alphabetical', () => {
|
|
const containers: MockContainer[] = [
|
|
{ service: 'redis', labels: { 'dockhand.order': '1' } },
|
|
{ service: 'app', labels: { 'dockhand.order': '1' } },
|
|
{ service: 'nginx', labels: { 'dockhand.order': '1' } },
|
|
];
|
|
const sorted = sortContainers(containers);
|
|
expect(sorted.map(c => c.service)).toEqual(['app', 'nginx', 'redis']);
|
|
});
|
|
|
|
test('negative values sort before default (0)', () => {
|
|
const containers: MockContainer[] = [
|
|
{ service: 'redis', labels: {} },
|
|
{ service: 'app', labels: { 'dockhand.order': '-1' } },
|
|
{ service: 'nginx', labels: {} },
|
|
];
|
|
const sorted = sortContainers(containers);
|
|
expect(sorted.map(c => c.service)).toEqual(['app', 'nginx', 'redis']);
|
|
});
|
|
|
|
test('mixed labeled and unlabeled containers', () => {
|
|
const containers: MockContainer[] = [
|
|
{ service: 'redis', labels: {} },
|
|
{ service: 'app', labels: { 'dockhand.order': '1' } },
|
|
{ service: 'nginx', labels: { 'dockhand.order': '-1' } },
|
|
{ service: 'postgres', labels: {} },
|
|
{ service: 'worker', labels: { 'dockhand.order': '2' } },
|
|
];
|
|
const sorted = sortContainers(containers);
|
|
// nginx(-1) → postgres(0) → redis(0) → app(1) → worker(2)
|
|
expect(sorted.map(c => c.service)).toEqual(['nginx', 'postgres', 'redis', 'app', 'worker']);
|
|
});
|
|
|
|
test('invalid order values treated as 0', () => {
|
|
const containers: MockContainer[] = [
|
|
{ service: 'redis', labels: { 'dockhand.order': 'abc' } },
|
|
{ service: 'app', labels: { 'dockhand.order': '1' } },
|
|
{ service: 'nginx', labels: {} },
|
|
];
|
|
const sorted = sortContainers(containers);
|
|
// nginx(0) → redis(0, invalid=0) → app(1)
|
|
expect(sorted.map(c => c.service)).toEqual(['nginx', 'redis', 'app']);
|
|
});
|
|
});
|