LazyBoy2/tests/history_memory_ui.mjs

45 lines
2.9 KiB
JavaScript

import { chromium } from '../tools/playwright/node_modules/playwright/index.mjs';
import assert from 'node:assert/strict';
const transcript = Array.from({length:5000}, (_, i) => ({role:i%2?'assistant':'user', content:`Message ${i}\n\n${'Variable height **Markdown** content. '.repeat(i%8+1)}`,at:new Date(1700000000000+i*60000).toISOString()}));
const activity={state:'idle',running:false,queued:false,active_task_ids:[]};
const browser=await chromium.launch({headless:true});
try {
const page=await browser.newPage({viewport:{width:1280,height:800}});
const errors=[];page.on('pageerror',e=>errors.push(e.message));
await page.addInitScript(()=>{window.sources=[];window.EventSource=class {
constructor(){window.sources.push(this)} close(){} };});
await page.route('**/api/**',route=>{
const path=new URL(route.request().url()).pathname;
if(path==='/api/agents') return route.fulfill({json:{agents:[{id:'owner',name:'Memory test'}]}});
if(path==='/api/agents/owner') return route.fulfill({json:{id:'owner',name:'Memory test',transcript,activity}});
if(path.endsWith('/activity'))return route.fulfill({json:activity});
if(path.endsWith('/computer'))return route.fulfill({json:{ready:false,state:'stopped'}});
return route.fulfill({json:{}});
});
await page.goto(process.env.LAZYBOY_TEST_UI_URL || 'http://127.0.0.1:5173');
await page.locator('[data-message-index="4999"]').waitFor();
const cdp=await page.context().newCDPSession(page);
const heap=async()=>{await cdp.send('HeapProfiler.collectGarbage');return (await cdp.send('Runtime.getHeapUsage')).usedSize;};
const baseline=await heap();
let maxRows=0;
for(let round=0;round<3;round++)for(let step=0;step<30;step++){
await page.locator('.messages').evaluate((el,ratio)=>{el.scrollTop=(el.scrollHeight-el.clientHeight)*ratio;},step/29);
await page.waitForTimeout(40);
maxRows=Math.max(maxRows,await page.locator('.message-block').count());
}
await page.locator('.messages').evaluate(el=>{el.scrollTop=0});
await page.locator('[data-message-index="0"]').waitFor();
const top=await page.locator('.messages').evaluate(el=>el.scrollTop);
transcript.push({role:'assistant',content:'NEW REPLY',at:new Date().toISOString()});
await page.evaluate(()=>window.sources.at(-1).onopen());
await page.waitForTimeout(500);
assert.ok(Math.abs(await page.locator('.messages').evaluate(el=>el.scrollTop)-top)<5,'new reply must not pull reader down');
await page.locator('.messages').evaluate(el=>{el.scrollTop=el.scrollHeight});
await page.getByText('NEW REPLY',{exact:true}).waitFor();
const end=await heap();
assert.ok(maxRows<80,`rendered ${maxRows} rows`);
assert.ok(end-baseline<32*1024*1024,`heap grew ${(end-baseline)/1024/1024} MiB`);
assert.deepEqual(errors,[]);
console.log(JSON.stringify({result:'PASS',messages:transcript.length,maxRows,baselineMiB:baseline/1024/1024,finalMiB:end/1024/1024}));
} finally {await browser.close();}