100 lines
2.7 KiB
TypeScript
100 lines
2.7 KiB
TypeScript
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
import type { TaskInfo } from '../infra/task/index.js';
|
|
|
|
const {
|
|
mockRecoverInterruptedRunningTasks,
|
|
mockGetTasksDir,
|
|
mockWatch,
|
|
mockStop,
|
|
mockExecuteAndCompleteTask,
|
|
mockInfo,
|
|
mockHeader,
|
|
mockBlankLine,
|
|
mockStatus,
|
|
mockSuccess,
|
|
mockWarn,
|
|
mockError,
|
|
mockResolveConfigValue,
|
|
} = vi.hoisted(() => ({
|
|
mockRecoverInterruptedRunningTasks: vi.fn(),
|
|
mockGetTasksDir: vi.fn(),
|
|
mockWatch: vi.fn(),
|
|
mockStop: vi.fn(),
|
|
mockExecuteAndCompleteTask: vi.fn(),
|
|
mockInfo: vi.fn(),
|
|
mockHeader: vi.fn(),
|
|
mockBlankLine: vi.fn(),
|
|
mockStatus: vi.fn(),
|
|
mockSuccess: vi.fn(),
|
|
mockWarn: vi.fn(),
|
|
mockError: vi.fn(),
|
|
mockResolveConfigValue: vi.fn(),
|
|
}));
|
|
|
|
vi.mock('../infra/task/index.js', () => ({
|
|
TaskRunner: vi.fn().mockImplementation(() => ({
|
|
recoverInterruptedRunningTasks: mockRecoverInterruptedRunningTasks,
|
|
getTasksDir: mockGetTasksDir,
|
|
})),
|
|
TaskWatcher: vi.fn().mockImplementation(() => ({
|
|
watch: mockWatch,
|
|
stop: mockStop,
|
|
})),
|
|
}));
|
|
|
|
vi.mock('../features/tasks/execute/taskExecution.js', () => ({
|
|
executeAndCompleteTask: mockExecuteAndCompleteTask,
|
|
}));
|
|
|
|
vi.mock('../shared/ui/index.js', () => ({
|
|
header: mockHeader,
|
|
info: mockInfo,
|
|
warn: mockWarn,
|
|
error: mockError,
|
|
success: mockSuccess,
|
|
status: mockStatus,
|
|
blankLine: mockBlankLine,
|
|
}));
|
|
|
|
vi.mock('../shared/i18n/index.js', () => ({
|
|
getLabel: vi.fn((key: string) => key),
|
|
}));
|
|
|
|
vi.mock('../infra/config/index.js', () => ({
|
|
resolveConfigValue: mockResolveConfigValue,
|
|
}));
|
|
|
|
import { watchTasks } from '../features/tasks/watch/index.js';
|
|
|
|
describe('watchTasks', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
mockResolveConfigValue.mockReturnValue('default');
|
|
mockRecoverInterruptedRunningTasks.mockReturnValue(0);
|
|
mockGetTasksDir.mockReturnValue('/project/.takt/tasks.yaml');
|
|
mockExecuteAndCompleteTask.mockResolvedValue(true);
|
|
|
|
mockWatch.mockImplementation(async (onTask: (task: TaskInfo) => Promise<void>) => {
|
|
await onTask({
|
|
name: 'task-1',
|
|
content: 'Task 1',
|
|
filePath: '/project/.takt/tasks.yaml',
|
|
createdAt: '2026-02-09T00:00:00.000Z',
|
|
status: 'running',
|
|
data: null,
|
|
});
|
|
});
|
|
});
|
|
|
|
it('watch開始時に中断されたrunningタスクをpendingへ復旧する', async () => {
|
|
mockRecoverInterruptedRunningTasks.mockReturnValue(1);
|
|
|
|
await watchTasks('/project');
|
|
|
|
expect(mockRecoverInterruptedRunningTasks).toHaveBeenCalledTimes(1);
|
|
expect(mockInfo).toHaveBeenCalledWith('Recovered 1 interrupted running task(s) to pending.');
|
|
expect(mockWatch).toHaveBeenCalledTimes(1);
|
|
expect(mockExecuteAndCompleteTask).toHaveBeenCalledTimes(1);
|
|
});
|
|
});
|