101c08d447
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
33 lines
1.4 KiB
JavaScript
33 lines
1.4 KiB
JavaScript
import { describe, it, expect } from 'vitest';
|
|
import { buildExtractionPrompt, parseExtractionResponse } from './secretary-extract.mjs';
|
|
|
|
describe('buildExtractionPrompt', () => {
|
|
it('включает дела и обмен в запрос', () => {
|
|
const { system, user } = buildExtractionPrompt({
|
|
lastExchange: { user: 'привет', assistant: 'ответ', actions: [{ tool: 'Read' }] },
|
|
worksIndex: [{ slug: 'sec', title: 'Секретарь', goal: 'память сути' }],
|
|
});
|
|
expect(system).toContain('JSON');
|
|
expect(user).toContain('sec');
|
|
expect(user).toContain('привет');
|
|
expect(user).toContain('Read');
|
|
});
|
|
it('без дел — помечает отсутствие', () => {
|
|
const { user } = buildExtractionPrompt({ lastExchange: {}, worksIndex: [] });
|
|
expect(user).toContain('нет открытых дел');
|
|
});
|
|
});
|
|
|
|
describe('parseExtractionResponse', () => {
|
|
it('парсит JSON в обёртке с хвостовой запятой', () => {
|
|
const out = parseExtractionResponse('```json\n{ "work":"sec", "decisions":[{"text":"A","turns":[7]}], }\n```');
|
|
expect(out.work).toBe('sec');
|
|
expect(out.decisions[0].text).toBe('A');
|
|
expect(out.supersede).toEqual([]);
|
|
});
|
|
it('мусор → null', () => {
|
|
expect(parseExtractionResponse('не json вовсе')).toBeNull();
|
|
expect(parseExtractionResponse('')).toBeNull();
|
|
});
|
|
});
|