Files
brain/tools/secretary-flag.test.mjs
T

76 lines
3.9 KiB
JavaScript

import { describe, it, expect, beforeEach, afterEach } from 'vitest';
import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
import { tmpdir } from 'node:os';
import { join } from 'node:path';
import { detectSecretaryCommand, secretaryModeFileName, resolveCaseActivation, fluffyPipelineOn } from './secretary-flag.mjs';
describe('detectSecretaryCommand', () => {
it('распознаёт включение', () => {
expect(detectSecretaryCommand('включи секретаря пожалуйста')).toBe('on');
});
it('распознаёт выключение', () => {
expect(detectSecretaryCommand('всё, выключи секретаря')).toBe('off');
});
it('нет команды — null', () => {
expect(detectSecretaryCommand('давай продолжим работу')).toBeNull();
});
it('цитата в кавычках не срабатывает', () => {
expect(detectSecretaryCommand('фраза «включи секретаря» это команда')).toBeNull();
});
});
describe('secretaryModeFileName — флажок по сессии', () => {
it('имя файла флажка содержит id сессии', () => {
expect(secretaryModeFileName('abc-123')).toBe('secretary-mode-abc-123.json');
});
it('без сессии — unknown', () => {
expect(secretaryModeFileName()).toBe('secretary-mode-unknown.json');
});
});
describe('resolveCaseActivation — сверка имени дела со списком существующих', () => {
const existing = ['general', 'создание-секретаря', 'строительство-секретаря'];
it('точное совпадение — активировать существующее', () => {
expect(resolveCaseActivation('создание-секретаря', existing))
.toEqual({ action: 'activate', work: 'создание-секретаря' });
});
it('нет похожих — активировать как новое (имя как ввёл)', () => {
expect(resolveCaseActivation('биллинг', existing))
.toEqual({ action: 'activate', work: 'биллинг' });
});
it('опечатка (правка ≤2) — переспросить с кандидатом', () => {
const r = resolveCaseActivation('создание-секретар', existing);
expect(r.action).toBe('confirm');
expect(r.candidates).toContain('создание-секретаря');
});
it('сокращение (подстрока) — переспросить', () => {
const r = resolveCaseActivation('создание', existing);
expect(r.action).toBe('confirm');
expect(r.candidates).toContain('создание-секретаря');
});
it('пустой список дел — активировать как новое', () => {
expect(resolveCaseActivation('новое', [])).toEqual({ action: 'activate', work: 'новое' });
});
});
describe('fluffyPipelineOn', () => {
it('по умолчанию выключен', () => {
expect(fluffyPipelineOn({})).toBe(false);
});
it('включается env SECRETARY_FLUFFY=1', () => {
expect(fluffyPipelineOn({ SECRETARY_FLUFFY: '1' })).toBe(true);
});
it('включается env SECRETARY_FLUFFY=true', () => {
expect(fluffyPipelineOn({ SECRETARY_FLUFFY: 'true' })).toBe(true);
});
});
describe('fluffyPipelineOn runtime file', () => {
let dir, file;
beforeEach(() => { dir = mkdtempSync(join(tmpdir(), 'secflag-')); file = join(dir, 'secretary-fluffy'); });
afterEach(() => { rmSync(dir, { recursive: true, force: true }); });
it('env wins when set', () => { expect(fluffyPipelineOn({ SECRETARY_FLUFFY: '1' }, file)).toBe(true); });
it('runtime file present → on, even without env', () => { writeFileSync(file, ''); expect(fluffyPipelineOn({}, file)).toBe(true); });
it('neither → off', () => { expect(fluffyPipelineOn({}, file)).toBe(false); });
});