diff --git a/apps/waterfall-wiki/tests/canvas-ui-integration.ts b/apps/waterfall-wiki/tests/canvas-ui-integration.ts index ade6fb5..4d28558 100644 --- a/apps/waterfall-wiki/tests/canvas-ui-integration.ts +++ b/apps/waterfall-wiki/tests/canvas-ui-integration.ts @@ -10,14 +10,20 @@ export async function verifyCanvasAgentUI(base:string){ await db().query("INSERT INTO account_users(id,email,password_hash,verified_at) VALUES($1,$2,$3,now())",[owner,email,await hashPassword(password)]); const browser=await chromium.launch({executablePath:process.env.CHROMIUM_PATH||'/usr/bin/chromium',headless:true,args:['--no-sandbox','--disable-dev-shm-usage']}); const context=await browser.newContext({viewport:{width:1440,height:1000}}),errors:string[]=[]; - const page=await context.newPage(),canvasRequests:string[]=[]; + const page=await context.newPage(),canvasRequests:string[]=[],pending=new Set(),network:string[]=[]; + const requestName=(request:{method:()=>string;url:()=>string})=>request.method()+' '+new URL(request.url()).pathname; + page.on('request',request=>pending.add(requestName(request))); + page.on('requestfinished',request=>pending.delete(requestName(request))); + page.on('requestfailed',request=>{pending.delete(requestName(request));network.push(requestName(request)+': '+request.failure()?.errorText)}); page.on('response',response=>{const url=new URL(response.url());if(url.pathname.startsWith('/api/canvases'))canvasRequests.push(`${response.request().method()} ${url.pathname} ${response.status()}`)}); try{ page.setDefaultTimeout(20000);page.on('pageerror',e=>errors.push(e.message)); await page.goto(base+'/',{waitUntil:'domcontentloaded'}); await page.getByRole('heading',{name:/想法不该停在对话里/,level:1}).waitFor(); - await page.getByRole('link',{name:'开始创作',exact:true}).click(); - await page.getByText('登录你的账户',{exact:true}).first().waitFor({state:'attached'}); + const accountSession=page.waitForResponse(response=>new URL(response.url()).pathname==='/api/account/session'&&response.request().method()==='GET'); + const [,sessionResponse]=await Promise.all([page.getByRole('link',{name:'开始创作',exact:true}).click(),accountSession]); + assert.equal(sessionResponse.status(),200);assert.equal((await sessionResponse.json()).user,null); + await page.getByRole('heading',{name:'欢迎回来',exact:true,level:2}).waitFor(); await page.getByLabel('邮箱地址',{exact:true}).fill(email); await page.getByLabel('密码',{exact:true}).fill(password); await page.locator('form').getByRole('button',{name:'登录',exact:true}).click(); @@ -94,7 +100,8 @@ export async function verifyCanvasAgentUI(base:string){ console.log('Canvas UI dispatched a real stored task, received an external-client fixture result, rotated/revoked access and restored its online document'); }catch(error){ const statuses=await page.getByRole('status').allTextContents().catch(()=>[]); - console.error('Canvas agent UI diagnostics',JSON.stringify({url:page.url(),statuses,canvasRequests:canvasRequests.slice(-20),errors})); + const headings=await page.getByRole('heading').allTextContents().catch(()=>[]); + console.error('Canvas agent UI diagnostics',JSON.stringify({url:page.url(),browserConnected:browser.isConnected(),headings,statuses,pending:[...pending],network:network.slice(-20),canvasRequests:canvasRequests.slice(-20),errors})); throw error; }finally{await context.close();await browser.close()} }