76 lines
3.9 KiB
JavaScript
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); });
|
|
});
|