agent-ecosystem/test/main/services/team/TeamTaskReader.test.ts
2026-05-02 20:24:46 +03:00

62 lines
2.1 KiB
TypeScript

import { afterEach, describe, expect, it, vi } from 'vitest';
import { TeamTaskReader } from '../../../../src/main/services/team/TeamTaskReader';
import type { TeamTask } from '../../../../src/shared/types/team';
function createDeferred<T>() {
let resolve!: (value: T) => void;
let reject!: (error: unknown) => void;
const promise = new Promise<T>((res, rej) => {
resolve = res;
reject = rej;
});
return { promise, resolve, reject };
}
function makeTask(id: string): TeamTask & { teamName: string } {
return {
id,
subject: id,
owner: 'alice',
status: 'pending',
createdAt: '2026-05-02T12:00:00.000Z',
updatedAt: '2026-05-02T12:00:00.000Z',
teamName: 'atlas-hq',
};
}
describe('TeamTaskReader', () => {
afterEach(() => {
vi.restoreAllMocks();
TeamTaskReader.invalidateAllTasksCache();
});
it('does not reuse or cache a stale in-flight getAllTasks scan after invalidation', async () => {
const firstRead = createDeferred<(TeamTask & { teamName: string })[]>();
const secondRead = createDeferred<(TeamTask & { teamName: string })[]>();
const readAllTasksUncached = vi
.spyOn(TeamTaskReader.prototype as unknown as { readAllTasksUncached: () => Promise<(TeamTask & { teamName: string })[]> }, 'readAllTasksUncached')
.mockImplementationOnce(() => firstRead.promise)
.mockImplementationOnce(() => secondRead.promise);
const reader = new TeamTaskReader();
const staleRequest = reader.getAllTasks();
await Promise.resolve();
expect(readAllTasksUncached).toHaveBeenCalledTimes(1);
TeamTaskReader.invalidateAllTasksCache();
const freshRequest = reader.getAllTasks();
await Promise.resolve();
expect(readAllTasksUncached).toHaveBeenCalledTimes(2);
secondRead.resolve([makeTask('fresh-task')]);
await expect(freshRequest).resolves.toEqual([makeTask('fresh-task')]);
firstRead.resolve([makeTask('stale-task')]);
await staleRequest;
await expect(reader.getAllTasks()).resolves.toEqual([makeTask('fresh-task')]);
expect(readAllTasksUncached).toHaveBeenCalledTimes(2);
});
});