takt/src/__tests__/loadPreviousOrderContent.test.ts
2026-02-19 19:51:18 +09:00

107 lines
3.5 KiB
TypeScript

/**
* Tests for loadPreviousOrderContent utility function.
*
* Verifies order.md loading from run directories,
* including happy path, missing slug, and missing file cases.
*/
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
import { mkdirSync, writeFileSync, rmSync } from 'node:fs';
import { join } from 'node:path';
import { tmpdir } from 'node:os';
import { loadPreviousOrderContent } from '../features/interactive/runSessionReader.js';
function createTmpDir(): string {
const dir = join(tmpdir(), `takt-order-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
mkdirSync(dir, { recursive: true });
return dir;
}
function createRunWithOrder(cwd: string, slug: string, taskContent: string, orderContent: string): void {
const runDir = join(cwd, '.takt', 'runs', slug);
mkdirSync(join(runDir, 'context', 'task'), { recursive: true });
const meta = {
task: taskContent,
piece: 'default',
status: 'completed',
startTime: '2026-02-01T00:00:00.000Z',
logsDirectory: `.takt/runs/${slug}/logs`,
reportDirectory: `.takt/runs/${slug}/reports`,
runSlug: slug,
};
writeFileSync(join(runDir, 'meta.json'), JSON.stringify(meta), 'utf-8');
writeFileSync(join(runDir, 'context', 'task', 'order.md'), orderContent, 'utf-8');
}
function createRunWithoutOrder(cwd: string, slug: string, taskContent: string): void {
const runDir = join(cwd, '.takt', 'runs', slug);
mkdirSync(runDir, { recursive: true });
const meta = {
task: taskContent,
piece: 'default',
status: 'completed',
startTime: '2026-02-01T00:00:00.000Z',
logsDirectory: `.takt/runs/${slug}/logs`,
reportDirectory: `.takt/runs/${slug}/reports`,
runSlug: slug,
};
writeFileSync(join(runDir, 'meta.json'), JSON.stringify(meta), 'utf-8');
}
describe('loadPreviousOrderContent', () => {
let tmpDir: string;
beforeEach(() => {
tmpDir = createTmpDir();
});
afterEach(() => {
rmSync(tmpDir, { recursive: true, force: true });
});
it('should return order.md content when run and file exist', () => {
const taskContent = 'Implement feature X';
const orderContent = '# Task\n\nImplement feature X with tests.';
createRunWithOrder(tmpDir, 'run-feature-x', taskContent, orderContent);
const result = loadPreviousOrderContent(tmpDir, taskContent);
expect(result).toBe(orderContent);
});
it('should return null when no matching run exists', () => {
const result = loadPreviousOrderContent(tmpDir, 'Non-existent task');
expect(result).toBeNull();
});
it('should return null when run exists but order.md is missing', () => {
const taskContent = 'Task without order';
createRunWithoutOrder(tmpDir, 'run-no-order', taskContent);
const result = loadPreviousOrderContent(tmpDir, taskContent);
expect(result).toBeNull();
});
it('should return null when .takt/runs directory does not exist', () => {
const emptyDir = join(tmpdir(), `takt-empty-${Date.now()}`);
mkdirSync(emptyDir, { recursive: true });
const result = loadPreviousOrderContent(emptyDir, 'any task');
expect(result).toBeNull();
rmSync(emptyDir, { recursive: true, force: true });
});
it('should match the correct run among multiple runs', () => {
createRunWithOrder(tmpDir, 'run-a', 'Task A', '# Order A');
createRunWithOrder(tmpDir, 'run-b', 'Task B', '# Order B');
expect(loadPreviousOrderContent(tmpDir, 'Task A')).toBe('# Order A');
expect(loadPreviousOrderContent(tmpDir, 'Task B')).toBe('# Order B');
});
});