ordinary-local.spec.ts 1.9 KB

123456789101112131415161718192021222324252627
  1. import {test,expect} from '@playwright/test'
  2. test('ordinary SSE replies remain readable from Web without a second history source',async({page})=>{
  3. await page.goto('/chat')
  4. await expect(page.getByRole('heading',{name:'登录夭夭'})).toBeVisible()
  5. await page.getByLabel('账号').fill('admin');await page.getByLabel('密码').fill('e2e-password')
  6. await page.getByRole('button',{name:'登录',exact:true}).click()
  7. await expect(page.getByRole('navigation')).toBeVisible()
  8. await page.getByRole('button',{name:'新建聊天',exact:true}).click()
  9. await expect(page.locator('.composer-context')).toHaveText('等待本轮实际用量 · 窗口未确认')
  10. const prompt=`本地落盘验收 ${Date.now()}`
  11. await page.locator('.composer-textarea').fill(prompt)
  12. await page.getByRole('button',{name:'发送消息'}).click()
  13. await expect(page.locator('.message__content').filter({hasText:'这是来自假 Gateway 的流式回复。'})).toHaveCount(1,{timeout:15000})
  14. await expect(page.locator('.composer-context')).toHaveText('12.2k / 112.0k · 剩余 99.8k')
  15. const result=await page.evaluate(async()=>{
  16. const response=await fetch('/api/app/sessions/session-new/messages?profile=yaoyao&limit=100')
  17. return{status:response.status,source:response.headers.get('X-Yaoyao-Data-Source'),body:await response.json()}
  18. })
  19. expect(result.status).toBe(200);expect(result.source).toBe('local')
  20. expect(result.body.messages.filter((m:any)=>m.role==='user').map((m:any)=>m.content)).toEqual([prompt])
  21. expect(result.body.messages.filter((m:any)=>m.role==='assistant').map((m:any)=>m.content)).toEqual(['这是来自假 Gateway 的流式回复。'])
  22. await page.reload()
  23. await expect(page.locator('.message__content').filter({hasText:'这是来自假 Gateway 的流式回复。'})).toHaveCount(1)
  24. await expect(page.locator('.composer-context')).toHaveText('12.2k / 112.0k · 剩余 99.8k')
  25. await page.screenshot({path:'/tmp/yaoyao-ordinary-local-browser.png',fullPage:true})
  26. })