import { describe, it, expect, beforeEach } from 'vitest'; import { createFleetGroup, groupsForAgent, loadFleetGroups, normalizeGroupColor, primaryGroupForAgent, saveFleetGroups, } from './fleetGroups'; describe('fleetGroups', () => { beforeEach(() => { localStorage.clear(); }); it('normalizeGroupColor accepts hex', () => { expect(normalizeGroupColor('#abc')).toBe('#aabbcc'); expect(normalizeGroupColor('#aabbcc')).toBe('#aabbcc'); }); it('persists and loads groups', () => { const g = createFleetGroup('Rack A', '#ff00ff', ['a1', 'a2']); saveFleetGroups([g]); const loaded = loadFleetGroups(); expect(loaded).toHaveLength(1); expect(loaded[0].name).toBe('Rack A'); expect(loaded[0].agentIds).toEqual(['a1', 'a2']); }); it('groupsForAgent and primaryGroupForAgent', () => { const groups = [ createFleetGroup('G1', '#00e8f5', ['x']), createFleetGroup('G2', '#ff0000', ['x', 'y']), ]; expect(groupsForAgent(groups, 'x').map((g) => g.name)).toEqual(['G1', 'G2']); expect(primaryGroupForAgent(groups, 'x')?.name).toBe('G1'); saveFleetGroups(groups); expect(loadFleetGroups()).toHaveLength(2); }); it('generates unique fallback IDs for loaded groups missing an ID', () => { // Manually saving raw JSON objects without IDs to simulate legacy state const rawGroups = [ { name: 'Legacy Group 1', color: '#ff0000', agentIds: [] }, { name: 'Legacy Group 2', color: '#00ff00', agentIds: [] }, ]; localStorage.setItem('aetherforge_fleet_groups', JSON.stringify(rawGroups)); const loaded = loadFleetGroups(); expect(loaded).toHaveLength(2); expect(loaded[0].id).toBeDefined(); expect(loaded[1].id).toBeDefined(); expect(loaded[0].id).not.toBe(loaded[1].id); expect(loaded[0].id.startsWith('fg-')).toBe(true); expect(loaded[1].id.startsWith('fg-')).toBe(true); }); });