fix(client): resolve trajectory review follow-ups
This commit is contained in:
@@ -292,6 +292,26 @@ describe('paging', () => {
|
||||
.toEqual([1, 3, 7, 9, 13, 15])
|
||||
})
|
||||
|
||||
it('stops complete-history loading between pages after its consumer aborts', async () => {
|
||||
const middle = deferred<Awaited<ReturnType<FakeApiClient['onHistory']>>>()
|
||||
const { api, session } = makeSession()
|
||||
api.onHistory = payload => payload.beforeSeq === undefined
|
||||
? histResponse(plainTurn(12, 2, '最新问', '最新答'), true)
|
||||
: middle.promise
|
||||
await session.open()
|
||||
const controller = new AbortController()
|
||||
const completeHistory = session.loadAllHistory(controller.signal)
|
||||
controller.abort()
|
||||
middle.resolve(ok({
|
||||
events: entries(plainTurn(6, 1, '中间问', '中间答')) as never[],
|
||||
hasMore: true,
|
||||
}))
|
||||
await completeHistory
|
||||
|
||||
expect(api.callsOf('session.history')).toHaveLength(2)
|
||||
expect(session.getSnapshot().hasMore).toBe(true)
|
||||
})
|
||||
|
||||
it('drops a discontinuous older page fail-soft (window unchanged, hasMore cleared)', async () => {
|
||||
const { api, session } = makeSession()
|
||||
api.onHistory = payload => payload.beforeSeq === undefined
|
||||
@@ -767,6 +787,32 @@ describe('resync', () => {
|
||||
expect(snapshot.openState).toBe('open') // stale failure did not settle the fresh generation into error
|
||||
expect(snapshot.nodes.map(n => n.seq)).toEqual([7, 9])
|
||||
})
|
||||
|
||||
it('starts fresh paging while an older generation page is still pending', async () => {
|
||||
const stalePage = deferred<Awaited<ReturnType<FakeApiClient['onHistory']>>>()
|
||||
const { api, session } = makeSession()
|
||||
let call = 0
|
||||
api.onHistory = () => {
|
||||
call++
|
||||
if (call === 1) return histResponse(plainTurn(6, 1, '新', '页'), true)
|
||||
if (call === 2) return stalePage.promise
|
||||
if (call === 3) return histResponse(plainTurn(6, 1, '新', '代'), true)
|
||||
return histResponse(plainTurn(0, 0, '旧', '页'), false)
|
||||
}
|
||||
await session.open()
|
||||
const stale = session.loadOlder()
|
||||
await session.resync()
|
||||
const fresh = session.loadAllHistory()
|
||||
await vi.waitFor(() => { expect(call).toBe(4) })
|
||||
stalePage.resolve(ok({
|
||||
events: entries(plainTurn(0, 0, '废', '弃')) as never[],
|
||||
hasMore: false,
|
||||
}))
|
||||
await Promise.all([stale, fresh])
|
||||
|
||||
expect(session.getSnapshot().hasMore).toBe(false)
|
||||
expect(session.getSnapshot().nodes.map(node => node.seq)).toEqual([1, 3, 7, 9])
|
||||
})
|
||||
})
|
||||
|
||||
describe('run_code sub-dispatch indexing', () => {
|
||||
|
||||
Reference in New Issue
Block a user