133 lines
4.4 KiB
TypeScript
133 lines
4.4 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
|
|
import {
|
|
areTeamGraphSlotAssignmentsEqual,
|
|
getDefaultTeamGraphSlotAssignmentsForMembers,
|
|
isTeamGraphSlotPersistenceDisabled,
|
|
migrateStableSlotAssignmentsForMembers,
|
|
normalizeLegacySixRowOrbitAssignments,
|
|
normalizeTeamGraphGridOwnerOrder,
|
|
normalizeTeamGraphSlotAssignmentsForVisibleOwners,
|
|
pruneTeamGraphSlotAssignmentsForVisibleOwners,
|
|
seedStableSlotAssignmentsForMembers,
|
|
} from '../../../src/renderer/store/team/teamGraphLayout';
|
|
|
|
describe('teamGraphLayout', () => {
|
|
it('migrates legacy name-keyed assignments to stable owner ids', () => {
|
|
const migrated = migrateStableSlotAssignmentsForMembers(
|
|
{
|
|
alice: { ringIndex: 0, sectorIndex: 1 },
|
|
},
|
|
[{ name: 'alice', agentId: 'agent-a' }]
|
|
);
|
|
|
|
expect(migrated.changed).toBe(true);
|
|
expect(migrated.assignments).toEqual({
|
|
'agent-a': { ringIndex: 0, sectorIndex: 1 },
|
|
});
|
|
});
|
|
|
|
it('drops stale name-keyed assignments when stable assignments already exist', () => {
|
|
const migrated = migrateStableSlotAssignmentsForMembers(
|
|
{
|
|
alice: { ringIndex: 0, sectorIndex: 1 },
|
|
'agent-a': { ringIndex: 0, sectorIndex: 2 },
|
|
},
|
|
[{ name: 'alice', agentId: 'agent-a' }]
|
|
);
|
|
|
|
expect(migrated.changed).toBe(true);
|
|
expect(migrated.assignments).toEqual({
|
|
'agent-a': { ringIndex: 0, sectorIndex: 2 },
|
|
});
|
|
});
|
|
|
|
it('seeds default assignments only when no visible owner has a persisted assignment', () => {
|
|
const seeded = seedStableSlotAssignmentsForMembers(
|
|
{ unrelated: { ringIndex: 4, sectorIndex: 0 } },
|
|
[
|
|
{ name: 'alice', agentId: 'agent-a' },
|
|
{ name: 'bob', agentId: 'agent-b' },
|
|
]
|
|
);
|
|
|
|
expect(seeded.changed).toBe(true);
|
|
expect(Object.keys(seeded.assignments)).toEqual(['unrelated', 'agent-a', 'agent-b']);
|
|
expect(seeded.assignments['agent-a']).toEqual({ ringIndex: 0, sectorIndex: 0 });
|
|
expect(seeded.assignments['agent-b']).toEqual({ ringIndex: 0, sectorIndex: 1 });
|
|
|
|
const preserved = seedStableSlotAssignmentsForMembers(seeded.assignments, [
|
|
{ name: 'alice', agentId: 'agent-a' },
|
|
{ name: 'bob', agentId: 'agent-b' },
|
|
]);
|
|
expect(preserved.changed).toBe(false);
|
|
expect(preserved.assignments).toBe(seeded.assignments);
|
|
});
|
|
|
|
it('normalizes six-owner legacy two-row orbit assignments', () => {
|
|
const ownerIds = ['a', 'b', 'c', 'd', 'e', 'f'];
|
|
const normalized = normalizeLegacySixRowOrbitAssignments(
|
|
{
|
|
a: { ringIndex: 0, sectorIndex: 0 },
|
|
b: { ringIndex: 0, sectorIndex: 4 },
|
|
c: { ringIndex: 1, sectorIndex: 2 },
|
|
d: { ringIndex: 1, sectorIndex: 0 },
|
|
},
|
|
ownerIds
|
|
);
|
|
|
|
expect(normalized).toEqual({
|
|
a: { ringIndex: 0, sectorIndex: 0 },
|
|
b: { ringIndex: 2, sectorIndex: 1 },
|
|
c: { ringIndex: 2, sectorIndex: 2 },
|
|
d: { ringIndex: 2, sectorIndex: 0 },
|
|
});
|
|
});
|
|
|
|
it('normalizes and prunes assignments to visible owners', () => {
|
|
const normalized = normalizeTeamGraphSlotAssignmentsForVisibleOwners(
|
|
{
|
|
a: { ringIndex: 0, sectorIndex: 0 },
|
|
hidden: { ringIndex: 4, sectorIndex: 4 },
|
|
},
|
|
['a']
|
|
);
|
|
|
|
expect(normalized).toEqual({ a: { ringIndex: 0, sectorIndex: 0 } });
|
|
expect(pruneTeamGraphSlotAssignmentsForVisibleOwners({ hidden: { ringIndex: 4, sectorIndex: 4 } }, ['a']))
|
|
.toBeUndefined();
|
|
});
|
|
|
|
it('normalizes grid owner order by filtering stale and duplicate ids then appending missing ids', () => {
|
|
expect(normalizeTeamGraphGridOwnerOrder(['b', 'stale', 'b'], ['a', 'b', 'c'])).toEqual([
|
|
'b',
|
|
'a',
|
|
'c',
|
|
]);
|
|
});
|
|
|
|
it('compares assignments by owner id and slot coordinates', () => {
|
|
expect(
|
|
areTeamGraphSlotAssignmentsEqual(
|
|
{ a: { ringIndex: 0, sectorIndex: 0 } },
|
|
{ a: { ringIndex: 0, sectorIndex: 0 } }
|
|
)
|
|
).toBe(true);
|
|
expect(
|
|
areTeamGraphSlotAssignmentsEqual(
|
|
{ a: { ringIndex: 0, sectorIndex: 0 } },
|
|
{ a: { ringIndex: 0, sectorIndex: 1 } }
|
|
)
|
|
).toBe(false);
|
|
});
|
|
|
|
it('exposes default assignment and persistence guardrail helpers', () => {
|
|
expect(
|
|
getDefaultTeamGraphSlotAssignmentsForMembers([
|
|
{ name: 'team-lead', agentId: 'lead-agent' },
|
|
{ name: 'alice', agentId: 'agent-a' },
|
|
])
|
|
).toEqual({ 'agent-a': { ringIndex: 0, sectorIndex: 0 } });
|
|
expect(isTeamGraphSlotPersistenceDisabled()).toBe(true);
|
|
});
|
|
});
|