agent-ecosystem/test/renderer/store/teamDataSelectors.test.ts
2026-05-22 00:06:28 +03:00

95 lines
3.1 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import {
selectTeamDataForName,
selectTeamIsAliveForName,
selectTeamMemberSnapshotsForName,
selectTeamTasksForName,
type TeamDataSelectorState,
} from '../../../src/renderer/store/team/teamDataSelectors';
import type { TeamViewSnapshot } from '../../../src/shared/types';
function createSnapshot(overrides: Partial<TeamViewSnapshot> = {}): TeamViewSnapshot {
return {
teamName: 'my-team',
config: { name: 'My Team' },
members: [],
tasks: [],
kanbanState: { teamName: 'my-team', reviewers: [], tasks: {} },
processes: [],
...overrides,
};
}
function createState(overrides: Partial<TeamDataSelectorState> = {}): TeamDataSelectorState {
return {
teamDataCacheByName: {},
selectedTeamName: null,
selectedTeamData: null,
...overrides,
};
}
describe('teamDataSelectors', () => {
it('returns null when no team name is selected or cached', () => {
const state = createState();
expect(selectTeamDataForName(state, null)).toBeNull();
expect(selectTeamDataForName(state, undefined)).toBeNull();
expect(selectTeamDataForName(state, 'missing-team')).toBeNull();
});
it('prefers selected team data over cached data for the active team', () => {
const cachedSnapshot = createSnapshot({ teamName: 'my-team', isAlive: false });
const selectedSnapshot = createSnapshot({ teamName: 'my-team', isAlive: true });
const state = createState({
selectedTeamName: 'my-team',
selectedTeamData: selectedSnapshot,
teamDataCacheByName: {
'my-team': cachedSnapshot,
},
});
expect(selectTeamDataForName(state, 'my-team')).toBe(selectedSnapshot);
});
it('falls back to cached team data outside the selected snapshot', () => {
const cachedSnapshot = createSnapshot({ teamName: 'cached-team', isAlive: true });
const state = createState({
selectedTeamName: 'other-team',
selectedTeamData: createSnapshot({ teamName: 'other-team' }),
teamDataCacheByName: {
'cached-team': cachedSnapshot,
},
});
expect(selectTeamDataForName(state, 'cached-team')).toBe(cachedSnapshot);
});
it('returns stable empty arrays and scalar fields from team snapshots', () => {
const task = { id: 'task-1', subject: 'Build', status: 'pending' as const };
const member = { name: 'alice', role: 'developer', currentTaskId: null, taskCount: 0 };
const state = createState({
teamDataCacheByName: {
'my-team': createSnapshot({
members: [member],
tasks: [task],
isAlive: true,
}),
},
});
expect(selectTeamMemberSnapshotsForName(state, 'my-team')).toEqual([member]);
expect(selectTeamTasksForName(state, 'my-team')).toEqual([task]);
expect(selectTeamIsAliveForName(state, 'my-team')).toBe(true);
expect(selectTeamMemberSnapshotsForName(state, 'missing-team')).toBe(
selectTeamMemberSnapshotsForName(state, 'missing-team')
);
expect(selectTeamTasksForName(state, 'missing-team')).toBe(
selectTeamTasksForName(state, 'missing-team')
);
expect(selectTeamIsAliveForName(state, 'missing-team')).toBeUndefined();
});
});