201 lines
4.8 KiB
JavaScript
201 lines
4.8 KiB
JavaScript
import { describe, expect, it } from 'bun:test'
|
|
import { applyDirectoryEvent } from '../event-reducer'
|
|
import { INITIAL_STATE } from '../types'
|
|
|
|
describe('applyDirectoryEvent', () => {
|
|
it('does not duplicate overlapping delta text after a newer part.updated replaces an older one', () => {
|
|
const state = structuredClone(INITIAL_STATE)
|
|
const messageID = 'msg-1'
|
|
const partID = 'part-1'
|
|
|
|
applyDirectoryEvent(state, {
|
|
type: 'message.part.updated',
|
|
properties: {
|
|
part: {
|
|
id: partID,
|
|
type: 'text',
|
|
messageID,
|
|
text: 'Fix typo in ToolOutputDialog — ',
|
|
},
|
|
},
|
|
})
|
|
|
|
applyDirectoryEvent(state, {
|
|
type: 'message.part.updated',
|
|
properties: {
|
|
part: {
|
|
id: partID,
|
|
type: 'text',
|
|
messageID,
|
|
text: 'Fix typo in ToolOutputDialog — toolFailedToReadDiagram vs toolFailedReadDiagram • Let me fix it.',
|
|
},
|
|
},
|
|
})
|
|
|
|
applyDirectoryEvent(state, {
|
|
type: 'message.part.delta',
|
|
properties: {
|
|
messageID,
|
|
partID,
|
|
field: 'text',
|
|
delta: 'toolFailedToReadDiagram vs toolFailedReadDiagram • Let me fix it.',
|
|
},
|
|
})
|
|
|
|
expect(state.part[messageID]).toHaveLength(1)
|
|
expect(state.part[messageID]?.[0]?.text).toBe(
|
|
'Fix typo in ToolOutputDialog — toolFailedToReadDiagram vs toolFailedReadDiagram • Let me fix it.',
|
|
)
|
|
})
|
|
|
|
it('appends only the non-overlapping suffix of a streaming delta', () => {
|
|
const state = structuredClone(INITIAL_STATE)
|
|
const messageID = 'msg-2'
|
|
const partID = 'part-2'
|
|
|
|
applyDirectoryEvent(state, {
|
|
type: 'message.part.updated',
|
|
properties: {
|
|
part: {
|
|
id: partID,
|
|
type: 'text',
|
|
messageID,
|
|
text: 'toolFailedToReadDiagram vs toolFailedRead',
|
|
},
|
|
},
|
|
})
|
|
|
|
applyDirectoryEvent(state, {
|
|
type: 'message.part.updated',
|
|
properties: {
|
|
part: {
|
|
id: partID,
|
|
type: 'text',
|
|
messageID,
|
|
text: 'toolFailedToReadDiagram vs toolFailedReadDiagra',
|
|
},
|
|
},
|
|
})
|
|
|
|
applyDirectoryEvent(state, {
|
|
type: 'message.part.delta',
|
|
properties: {
|
|
messageID,
|
|
partID,
|
|
field: 'text',
|
|
delta: 'Diagram • Let me fix it.',
|
|
},
|
|
})
|
|
|
|
expect(state.part[messageID]?.[0]?.text).toBe(
|
|
'toolFailedToReadDiagram vs toolFailedReadDiagram • Let me fix it.',
|
|
)
|
|
})
|
|
|
|
it('appends a non-overlapping delta unchanged', () => {
|
|
const state = structuredClone(INITIAL_STATE)
|
|
const messageID = 'msg-3'
|
|
const partID = 'part-3'
|
|
|
|
applyDirectoryEvent(state, {
|
|
type: 'message.part.updated',
|
|
properties: {
|
|
part: {
|
|
id: partID,
|
|
type: 'text',
|
|
messageID,
|
|
text: 'PR comment done — ',
|
|
},
|
|
},
|
|
})
|
|
|
|
applyDirectoryEvent(state, {
|
|
type: 'message.part.delta',
|
|
properties: {
|
|
messageID,
|
|
partID,
|
|
field: 'text',
|
|
delta: 'Let me fix it.',
|
|
},
|
|
})
|
|
|
|
expect(state.part[messageID]?.[0]?.text).toBe('PR comment done — Let me fix it.')
|
|
})
|
|
|
|
it('preserves legitimate repeated output when no updated-to-delta dedupe window is active', () => {
|
|
const state = structuredClone(INITIAL_STATE)
|
|
const messageID = 'msg-4'
|
|
const partID = 'part-4'
|
|
|
|
applyDirectoryEvent(state, {
|
|
type: 'message.part.updated',
|
|
properties: {
|
|
part: {
|
|
id: partID,
|
|
type: 'text',
|
|
messageID,
|
|
text: 'ha',
|
|
},
|
|
},
|
|
})
|
|
|
|
applyDirectoryEvent(state, {
|
|
type: 'message.part.delta',
|
|
properties: {
|
|
messageID,
|
|
partID,
|
|
field: 'text',
|
|
delta: 'ha',
|
|
},
|
|
})
|
|
|
|
expect(state.part[messageID]?.[0]?.text).toBe('haha')
|
|
})
|
|
|
|
it('does not let a stale running tool update overwrite a completed tool part', () => {
|
|
const state = structuredClone(INITIAL_STATE)
|
|
const messageID = 'msg-5'
|
|
const partID = 'part-5'
|
|
|
|
applyDirectoryEvent(state, {
|
|
type: 'message.part.updated',
|
|
properties: {
|
|
part: {
|
|
id: partID,
|
|
type: 'tool',
|
|
messageID,
|
|
tool: 'apply_patch',
|
|
state: {
|
|
status: 'completed',
|
|
time: {
|
|
start: 10,
|
|
end: 20,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
})
|
|
|
|
applyDirectoryEvent(state, {
|
|
type: 'message.part.updated',
|
|
properties: {
|
|
part: {
|
|
id: partID,
|
|
type: 'tool',
|
|
messageID,
|
|
tool: 'apply_patch',
|
|
state: {
|
|
status: 'running',
|
|
time: {
|
|
start: 10,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
})
|
|
|
|
expect(state.part[messageID]?.[0]?.state?.status).toBe('completed')
|
|
expect(state.part[messageID]?.[0]?.state?.time?.end).toBe(20)
|
|
})
|
|
})
|