77 lines
3.0 KiB
TypeScript
77 lines
3.0 KiB
TypeScript
import assert from 'node:assert/strict'
|
||
|
||
import { test } from 'vitest'
|
||
|
||
import { mergeActiveWork, normalizeActiveWork, quitPromptFor } from './quit-guard'
|
||
|
||
test('normalizeActiveWork drops junk and keeps the count at least the title count', () => {
|
||
assert.deepEqual(normalizeActiveWork(null), { count: 0, titles: [] })
|
||
assert.deepEqual(normalizeActiveWork({ count: 'many', titles: 'nope' }), { count: 0, titles: [] })
|
||
assert.deepEqual(normalizeActiveWork({ count: -3, titles: [' Fix login ', '', 7] }), {
|
||
count: 1,
|
||
titles: ['Fix login']
|
||
})
|
||
})
|
||
|
||
test('normalizeActiveWork keeps untitled sessions in the count', () => {
|
||
assert.deepEqual(normalizeActiveWork({ count: 3, titles: ['Fix login'] }), { count: 3, titles: ['Fix login'] })
|
||
})
|
||
|
||
test('mergeActiveWork de-dupes a session two windows both report', () => {
|
||
const merged = mergeActiveWork([
|
||
{ count: 2, titles: ['Fix login', 'Ship docs'] },
|
||
{ count: 1, titles: ['Fix login'] }
|
||
])
|
||
|
||
assert.deepEqual(merged, { count: 2, titles: ['Fix login', 'Ship docs'] })
|
||
})
|
||
|
||
test('quitPromptFor stays out of the way when nothing is running', () => {
|
||
assert.equal(quitPromptFor({ count: 0, titles: [] }, false), null)
|
||
})
|
||
|
||
test('quitPromptFor stays out of the way during an update handoff', () => {
|
||
assert.equal(quitPromptFor({ count: 2, titles: ['Fix login'] }, true), null)
|
||
})
|
||
|
||
test('quitPromptFor names the running chats', () => {
|
||
const prompt = quitPromptFor({ count: 2, titles: ['Fix login', 'Ship docs'] }, false)
|
||
|
||
assert.ok(prompt)
|
||
assert.equal(prompt.message, 'AITURK is still working on 2 chats.')
|
||
assert.ok(prompt.detail.includes('• Fix login'))
|
||
assert.ok(prompt.detail.includes('• Ship docs'))
|
||
})
|
||
|
||
test('quitPromptFor summarizes past the list cap and counts untitled work', () => {
|
||
const prompt = quitPromptFor({ count: 9, titles: ['a', 'b', 'c', 'd', 'e', 'f'] }, false)
|
||
|
||
assert.ok(prompt)
|
||
assert.equal(prompt.message, 'AITURK is still working on 9 chats.')
|
||
assert.ok(prompt.detail.includes('• d'))
|
||
assert.ok(!prompt.detail.includes('• e'))
|
||
assert.ok(prompt.detail.includes('• 5 more'))
|
||
})
|
||
|
||
test('quitPromptFor speaks singular for one chat', () => {
|
||
const prompt = quitPromptFor({ count: 1, titles: [] }, false)
|
||
|
||
assert.ok(prompt)
|
||
assert.equal(prompt.message, 'AITURK is still working on 1 chat.')
|
||
assert.ok(prompt.detail.includes('mid-turn'))
|
||
})
|
||
|
||
|
||
test('Turkish exit warning preserves custom titles, counts and handoff behavior', () => {
|
||
const work = { count: 7, titles: ['Custom English title', 'Türkçe görev'] }
|
||
const prompt = quitPromptFor(work, false, 'tr')
|
||
assert.ok(prompt)
|
||
assert.equal(prompt.message, 'AITURK hâlâ 7 sohbet üzerinde çalışıyor.')
|
||
assert.ok(prompt.detail.includes('• Custom English title'))
|
||
assert.ok(prompt.detail.includes('• Türkçe görev'))
|
||
assert.ok(prompt.detail.includes('• 5 sohbet daha'))
|
||
assert.ok(prompt.detail.includes('çalışmasını durdurur'))
|
||
assert.equal(quitPromptFor(work, true, 'tr'), null)
|
||
assert.equal(quitPromptFor({ count: 0, titles: [] }, false, 'tr'), null)
|
||
})
|