takt/src/__tests__/requeueHelpers.test.ts
2026-03-04 00:34:07 +09:00

89 lines
2.4 KiB
TypeScript

import { describe, expect, it, vi, beforeEach } from 'vitest';
const { mockDebug } = vi.hoisted(() => ({
mockDebug: vi.fn(),
}));
vi.mock('../shared/utils/index.js', async (importOriginal) => ({
...(await importOriginal<Record<string, unknown>>()),
createLogger: () => ({
debug: (...args: unknown[]) => mockDebug(...args),
info: vi.fn(),
error: vi.fn(),
enter: vi.fn(),
exit: vi.fn(),
}),
}));
import { hasDeprecatedProviderConfig } from '../features/tasks/list/requeueHelpers.js';
describe('hasDeprecatedProviderConfig', () => {
beforeEach(() => {
vi.clearAllMocks();
});
it('YAML parse エラーを debug 記録しつつ有効な候補で判定を続行する', () => {
const orderContent = [
'```yaml',
'movements: [',
'```',
'',
'```yaml',
'movements:',
' - name: review',
' provider_options:',
' codex:',
' network_access: true',
'```',
].join('\n');
expect(hasDeprecatedProviderConfig(orderContent)).toBe(true);
expect(mockDebug).toHaveBeenCalledTimes(1);
expect(mockDebug).toHaveBeenCalledWith(
'Failed to parse YAML candidate for deprecated provider config detection',
expect.objectContaining({ error: expect.any(String) }),
);
});
it('provider block 新記法のみの piece config は deprecated と判定しない', () => {
const orderContent = [
'movements:',
' - name: review',
' provider:',
' type: codex',
' model: gpt-5.3',
' network_access: true',
].join('\n');
expect(hasDeprecatedProviderConfig(orderContent)).toBe(false);
});
it('provider object と同階層 model の旧記法を deprecated と判定する', () => {
const orderContent = [
'movements:',
' - name: review',
' provider:',
' type: codex',
' network_access: true',
' model: gpt-5.3',
].join('\n');
expect(hasDeprecatedProviderConfig(orderContent)).toBe(true);
});
it('循環参照を含む YAML でもスタックオーバーフローせず判定できる', () => {
const orderContent = [
'movements:',
' - &step',
' name: review',
' provider:',
' type: codex',
' model: gpt-5.3',
' network_access: true',
' self: *step',
].join('\n');
expect(hasDeprecatedProviderConfig(orderContent)).toBe(false);
});
});