takt/src/__tests__/public-api-exports.test.ts
2026-02-12 17:33:39 +09:00

84 lines
3.9 KiB
TypeScript

import { describe, expect, it } from 'vitest';
describe('public API exports', () => {
it('should expose piece usecases, engine, and piece loader APIs', async () => {
// Given: パッケージの公開API
const api = await import('../index.js');
// When: 主要なユースケース関数とエンジン公開API・piece読み込みAPIを参照する
// Then: 必要な公開シンボルが利用できる
expect(typeof api.executeAgent).toBe('function');
expect(typeof api.generateReport).toBe('function');
expect(typeof api.executePart).toBe('function');
expect(typeof api.judgeStatus).toBe('function');
expect(typeof api.evaluateCondition).toBe('function');
expect(typeof api.decomposeTask).toBe('function');
expect(typeof api.PieceEngine).toBe('function');
expect(typeof api.loadPiece).toBe('function');
expect(typeof api.loadPieceByIdentifier).toBe('function');
expect(typeof api.listPieces).toBe('function');
});
it('should not expose internal engine implementation details', async () => {
// Given: パッケージの公開API
const api = await import('../index.js');
// When: 非公開にすべき内部シンボルの有無を確認する
// Then: 内部実装詳細は公開されていない
expect('AgentRunner' in api).toBe(false);
expect('RuleEvaluator' in api).toBe(false);
expect('AggregateEvaluator' in api).toBe(false);
expect('evaluateAggregateConditions' in api).toBe(false);
expect('needsStatusJudgmentPhase' in api).toBe(false);
expect('StatusJudgmentBuilder' in api).toBe(false);
expect('buildEditRule' in api).toBe(false);
expect('detectRuleIndex' in api).toBe(false);
expect('ParallelLogger' in api).toBe(false);
expect('InstructionBuilder' in api).toBe(false);
expect('ReportInstructionBuilder' in api).toBe(false);
expect('COMPLETE_MOVEMENT' in api).toBe(false);
expect('ABORT_MOVEMENT' in api).toBe(false);
expect('ERROR_MESSAGES' in api).toBe(false);
expect('determineNextMovementByRules' in api).toBe(false);
expect('extractBlockedPrompt' in api).toBe(false);
expect('LoopDetector' in api).toBe(false);
expect('createInitialState' in api).toBe(false);
expect('addUserInput' in api).toBe(false);
expect('getPreviousOutput' in api).toBe(false);
expect('handleBlocked' in api).toBe(false);
});
it('should not expose infrastructure implementations and internal shared utilities', async () => {
// Given: パッケージの公開API
const api = await import('../index.js');
// When: 非公開にすべきインフラ実装と内部ユーティリティの有無を確認する
// Then: 直接利用させない実装詳細は公開されていない
expect('ClaudeClient' in api).toBe(false);
expect('executeClaudeCli' in api).toBe(false);
expect('CodexClient' in api).toBe(false);
expect('mapToCodexSandboxMode' in api).toBe(false);
expect('getResourcesDir' in api).toBe(false);
expect('DEFAULT_PIECE_NAME' in api).toBe(false);
expect('buildPrompt' in api).toBe(false);
expect('writeFileAtomic' in api).toBe(false);
expect('getInputHistoryPath' in api).toBe(false);
expect('MAX_INPUT_HISTORY' in api).toBe(false);
expect('loadInputHistory' in api).toBe(false);
expect('saveInputHistory' in api).toBe(false);
expect('addToInputHistory' in api).toBe(false);
expect('getPersonaSessionsPath' in api).toBe(false);
expect('loadPersonaSessions' in api).toBe(false);
expect('savePersonaSessions' in api).toBe(false);
expect('updatePersonaSession' in api).toBe(false);
expect('clearPersonaSessions' in api).toBe(false);
expect('getWorktreeSessionsDir' in api).toBe(false);
expect('encodeWorktreePath' in api).toBe(false);
expect('getWorktreeSessionPath' in api).toBe(false);
expect('loadWorktreeSessions' in api).toBe(false);
expect('updateWorktreeSession' in api).toBe(false);
});
});