107 lines
3.5 KiB
TypeScript
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');
|
|
});
|
|
});
|