test: close the merged branches' coverage gaps
Cover the fs-provider load path without a cancellation signal, the app-level resumeCommand forwarding, and a command returning an error result.
This commit is contained in:
@@ -383,6 +383,20 @@ describe('workspace context instruction discovery', () => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('loads through a FileSystem provider without a cancellation signal', async () => {
|
||||||
|
// Direct-library callers may omit `signal`; the fs-backed probe must pass
|
||||||
|
// no options object rather than `{ signal: undefined }`.
|
||||||
|
const ctx = new Context()
|
||||||
|
await ctx.plugin(RecordingFileSystem)
|
||||||
|
const fs = ctx.fs as RecordingFileSystem
|
||||||
|
fs.entries.set('/repo/.git', { type: 'directory' })
|
||||||
|
fs.entries.set('/repo/AGENTS.md', { type: 'file', content: 'signalless rule' })
|
||||||
|
const rendered = await loadBaselineInstructions({ cwd: '/repo', maxBytes: 65536 }, fs)
|
||||||
|
expect(rendered?.text).toContain('signalless rule')
|
||||||
|
expect(fs.signals).toHaveLength(0)
|
||||||
|
await ctx.fiber.dispose()
|
||||||
|
})
|
||||||
|
|
||||||
it('skips a file that becomes unreadable after discovery without failing the request', async () => {
|
it('skips a file that becomes unreadable after discovery without failing the request', async () => {
|
||||||
const root = await tempRepo()
|
const root = await tempRepo()
|
||||||
const home = await tempRepo()
|
const home = await tempRepo()
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ describe('dsh-tui-demo app', () => {
|
|||||||
persistenceRoot: '/tmp/tui-sessions',
|
persistenceRoot: '/tmp/tui-sessions',
|
||||||
persistenceCompression: 'none',
|
persistenceCompression: 'none',
|
||||||
welcome: 'TUI ready',
|
welcome: 'TUI ready',
|
||||||
|
resumeCommand: 'dsh --resume {session}',
|
||||||
ui: { color: false, maxToolOutputLines: 3 },
|
ui: { color: false, maxToolOutputLines: 3 },
|
||||||
skills: { tool: { catalogDescriptionMaxLength: 8 } },
|
skills: { tool: { catalogDescriptionMaxLength: 8 } },
|
||||||
toolBash: { enableRunInBackground: false },
|
toolBash: { enableRunInBackground: false },
|
||||||
@@ -52,7 +53,12 @@ describe('dsh-tui-demo app', () => {
|
|||||||
expect(calls[0]?.config).toBeUndefined()
|
expect(calls[0]?.config).toBeUndefined()
|
||||||
expect(calls[2]?.config).toEqual({ root: '/tmp/tui-sessions', compression: 'none' })
|
expect(calls[2]?.config).toEqual({ root: '/tmp/tui-sessions', compression: 'none' })
|
||||||
const tuiConfig = calls[4]?.config as { sessionId: string }
|
const tuiConfig = calls[4]?.config as { sessionId: string }
|
||||||
expect(tuiConfig).toMatchObject({ welcome: 'TUI ready', color: false, maxToolOutputLines: 3 })
|
expect(tuiConfig).toMatchObject({
|
||||||
|
welcome: 'TUI ready',
|
||||||
|
resumeCommand: 'dsh --resume {session}',
|
||||||
|
color: false,
|
||||||
|
maxToolOutputLines: 3,
|
||||||
|
})
|
||||||
expect(tuiConfig.sessionId).toMatch(/^main-session-[0-9a-f-]{36}$/)
|
expect(tuiConfig.sessionId).toMatch(/^main-session-[0-9a-f-]{36}$/)
|
||||||
const spineConfig = calls[5]?.config as {
|
const spineConfig = calls[5]?.config as {
|
||||||
readonly agents: Array<Record<string, unknown>>
|
readonly agents: Array<Record<string, unknown>>
|
||||||
|
|||||||
@@ -1099,6 +1099,11 @@ describe('pi-tui chat lifecycle and transcript', () => {
|
|||||||
description: 'Fail a plugin command',
|
description: 'Fail a plugin command',
|
||||||
handler: () => { throw new Error('plugin command exploded') },
|
handler: () => { throw new Error('plugin command exploded') },
|
||||||
})
|
})
|
||||||
|
result.ctx.commands.register({
|
||||||
|
name: 'plugin-error',
|
||||||
|
description: 'Return an error result',
|
||||||
|
handler: () => ({ kind: 'error' as const, text: 'plugin error result' }),
|
||||||
|
})
|
||||||
|
|
||||||
result.terminal.send('/plugin-check value ')
|
result.terminal.send('/plugin-check value ')
|
||||||
result.terminal.send('\r')
|
result.terminal.send('\r')
|
||||||
@@ -1115,6 +1120,10 @@ describe('pi-tui chat lifecycle and transcript', () => {
|
|||||||
result.terminal.send('\r')
|
result.terminal.send('\r')
|
||||||
await tick()
|
await tick()
|
||||||
expect(result.terminal.output).toContain('Command failed: plugin command exploded')
|
expect(result.terminal.output).toContain('Command failed: plugin command exploded')
|
||||||
|
result.terminal.send('/plugin-error')
|
||||||
|
result.terminal.send('\r')
|
||||||
|
await tick()
|
||||||
|
expect(result.terminal.output).toContain('plugin error result')
|
||||||
result.terminal.send('/help')
|
result.terminal.send('/help')
|
||||||
result.terminal.send('\r')
|
result.terminal.send('\r')
|
||||||
await tick()
|
await tick()
|
||||||
@@ -1124,6 +1133,7 @@ describe('pi-tui chat lifecycle and transcript', () => {
|
|||||||
await result.controller.dispose()
|
await result.controller.dispose()
|
||||||
expect(result.ctx.commands.list(result.agent).map(command => command.name)).toEqual([
|
expect(result.ctx.commands.list(result.agent).map(command => command.name)).toEqual([
|
||||||
'plugin-check',
|
'plugin-check',
|
||||||
|
'plugin-error',
|
||||||
'plugin-fail',
|
'plugin-fail',
|
||||||
])
|
])
|
||||||
await result.ctx.fiber.dispose()
|
await result.ctx.fiber.dispose()
|
||||||
|
|||||||
Reference in New Issue
Block a user