ui(report): show wrinkle loading hints over side photos

This commit is contained in:
xsl
2026-10-16 16:45:07 +08:00
parent 9181069643
commit 571d78a2ed
5 changed files with 20 additions and 7 deletions
+8 -1
View File
@@ -29,7 +29,12 @@ try {
const result=await(await primary).json();assert.equal(result.ok,true);assert.equal(result.wrinkle_views.left.status,'pending');
assert.equal(fs.readFileSync(path.join(dir,'provider-calls.jsonl'),'utf8').trim().split('\n').length,1,'main response cannot wait for side paid calls');
await page.waitForSelector('#s-report.active');const conclusion=await page.locator('#ditem-para2').textContent();
await page.waitForFunction(()=>document.querySelector('#wrinkle-layer-note').textContent.includes('加载中'));
await page.waitForFunction(()=>document.querySelectorAll('#wrinkle-sides .wrinkle-loading:not([hidden])').length===2);
assert(await page.locator('#wrinkle-layer-note').evaluate(e=>e.hidden),'pending text is on images, not duplicated below');
for(const view of ['left','right']) {
const sizes=await page.locator('#wrinkle-'+view).evaluate(img=>{const a=img.closest('button').getBoundingClientRect(),b=img.parentNode.querySelector('.wrinkle-loading').getBoundingClientRect();return [a.width,a.height,b.width,b.height];});
assert.equal(sizes[0],sizes[2]);assert.equal(sizes[1],sizes[3]);
}
await page.waitForFunction(()=>window.__annotationStarts.length===1);
await page.evaluate(()=>window.__asyncScreen('s-splash'));
const api=page.context().request;
@@ -39,6 +44,7 @@ try {
assert.equal(await page.locator('#wrinkle-left').getAttribute('data-has-annotation'),'false','hidden report is not patched by stale response');
await page.evaluate(()=>window.__asyncScreen('s-report'));
await page.waitForFunction(()=>['left','right'].every(v=>document.querySelector('#wrinkle-'+v).dataset.hasAnnotation==='true'));
assert.equal(await page.locator('#wrinkle-sides .wrinkle-loading:not([hidden])').count(),0,'loading mask disappears when layers are ready');
assert.equal(await page.locator('#ditem-para2').textContent(),conclusion);
assert.deepEqual(await page.evaluate(()=>window.__annotationStarts),[{report:true,scan:false}]);
const stored=await(await api.get(base+'api/reports/'+result.record_id)).json();assert.equal(stored.report.payload.wrinkle_job.status,'complete');assert.deepEqual(stored.report.vm,result.vm);assert.deepEqual(stored.report.presentation,result.presentation);
@@ -49,6 +55,7 @@ try {
await page.evaluate(()=>window.__startAsyncReport());await page.waitForSelector('#s-report.active');
await page.waitForFunction(()=>document.querySelector('#wrinkle-layer-note').textContent.includes('部分侧脸未获取'));
assert.equal(await page.locator('#s-report.active').count(),1,'optional annotation failure keeps report accessible');
assert.equal(await page.locator('#wrinkle-sides .wrinkle-loading:not([hidden])').count(),0,'failed load never leaves a permanent mask');
assert.equal(await page.locator('#ditem-para2').textContent(),conclusion);
assert.equal(fs.readFileSync(path.join(dir,'provider-calls.jsonl'),'utf8').trim().split('\n').length,4,'failed optional endpoint adds no provider retry');
assert.deepEqual(errors,[]);console.log('PASS: fast main report, side requests only after active report, pending/ready UI, unchanged conclusions/scores, owner isolation, snapshot cache, exactly 3 fixture calls');