assembled-remote.spec.ts 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. /** Stateful behavior of the app-owned RemoteMock scenario. */
  2. import { expect, it } from 'vitest'
  3. import { createAssembledRemote } from './assembled-remote.ts'
  4. it('advances turns and updates the Session summary after accepted prompts', async () => {
  5. const { mock } = createAssembledRemote()
  6. await mock.dispatch('session/create', [{ request: { cwd: '/work' } }])
  7. await mock.dispatch('session/prompt', [{
  8. request: { sessionId: 'fx-1', requestId: 'request-1', mode: 'queue', content: [] },
  9. }])
  10. await mock.dispatch('session/prompt', [{
  11. request: { sessionId: 'fx-1', requestId: 'request-2', mode: 'queue', content: [] },
  12. }])
  13. const listed = await mock.dispatch('session/list', []) as {
  14. readonly ok: true
  15. readonly value: {
  16. readonly items: readonly { readonly sessionId: string; readonly blank: boolean; readonly running: boolean }[]
  17. }
  18. }
  19. expect(listed.ok).toBe(true)
  20. expect(listed.value.items.find(item => item.sessionId === 'fx-1')).toMatchObject({
  21. blank: false,
  22. running: true,
  23. })
  24. const iterator = mock.open('session/follow', [{
  25. request: { address: { kind: 'session', sessionId: 'fx-1' } },
  26. }], new AbortController().signal)[Symbol.asyncIterator]()
  27. await expect(iterator.next()).resolves.toMatchObject({
  28. done: false,
  29. value: {
  30. records: [
  31. { event: { type: 'turn/start', data: { turn: 0 } } },
  32. { event: { type: 'user/message' } },
  33. { event: { type: 'turn/start', data: { turn: 1 } } },
  34. { event: { type: 'user/message' } },
  35. ],
  36. },
  37. })
  38. await iterator.return?.()
  39. mock.assertNoUnmatched()
  40. })