mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-24 16:54:43 +00:00
Exercise the full Electron, gateway, and mock-provider submit path while same-chat route query tokens churn during session creation. Assert the mock provider receives the prompt and its streamed response reaches the transcript.
75 lines
No EOL
2.4 KiB
TypeScript
75 lines
No EOL
2.4 KiB
TypeScript
/**
|
|
* Regression coverage for #69578: harmless route-token churn during a send
|
|
* must not make the desktop silently drop the prompt before prompt.submit.
|
|
*/
|
|
|
|
import { test, expect } from './test'
|
|
|
|
import {
|
|
type MockBackendFixture,
|
|
setupMockBackend,
|
|
waitForAppReady,
|
|
} from './fixtures'
|
|
|
|
const PROMPT = 'E2E route token drift must still submit this prompt.'
|
|
|
|
let fixture: MockBackendFixture | null = null
|
|
|
|
test.beforeAll(async () => {
|
|
fixture = await setupMockBackend()
|
|
await waitForAppReady(fixture!, 120_000)
|
|
})
|
|
|
|
test.afterAll(async () => {
|
|
await fixture?.cleanup()
|
|
fixture = null
|
|
})
|
|
|
|
test('submits while same-chat search tokens churn during new-session creation', async ({}, testInfo) => {
|
|
const { page, mock } = fixture!
|
|
const composer = page.locator('[contenteditable="true"]').first()
|
|
|
|
await composer.click()
|
|
await composer.type(PROMPT, { delay: 10 })
|
|
|
|
// The submit pipeline snapshots the route synchronously, then awaits session
|
|
// creation. Keep changing only the query string of whichever chat route is
|
|
// current. Before #69578, comparing the raw route token treated this as a
|
|
// user chat switch and aborted before prompt.submit.
|
|
await page.evaluate(() => {
|
|
let revision = 0
|
|
const interval = window.setInterval(() => {
|
|
const pathname = window.location.hash.slice(1).split(/[?#]/, 1)[0] || '/new'
|
|
window.location.hash = `${pathname}?e2e-route-churn=${revision++}`
|
|
}, 1)
|
|
|
|
;(window as typeof window & { __e2eStopRouteChurn?: () => void }).__e2eStopRouteChurn = () => {
|
|
window.clearInterval(interval)
|
|
}
|
|
})
|
|
|
|
try {
|
|
await page.keyboard.press('Enter')
|
|
|
|
await expect
|
|
.poll(() => mock.receivedPrompts.includes(PROMPT), { timeout: 60_000 })
|
|
.toBe(true)
|
|
|
|
await page.waitForFunction(
|
|
prompt => document.querySelector('[data-slot="aui_thread-viewport"]')?.textContent?.includes(prompt) ?? false,
|
|
PROMPT,
|
|
{ timeout: 15_000 },
|
|
)
|
|
await page.waitForFunction(
|
|
() => document.querySelector('[data-slot="aui_thread-viewport"]')?.textContent?.includes('mock inference server') ?? false,
|
|
undefined,
|
|
{ timeout: 60_000 },
|
|
)
|
|
} finally {
|
|
await page.evaluate(() => {
|
|
;(window as typeof window & { __e2eStopRouteChurn?: () => void }).__e2eStopRouteChurn?.()
|
|
})
|
|
}
|
|
|
|
await page.screenshot({ path: testInfo.outputPath('same-chat-route-churn-submitted.png') })
|
|
}) |