Files
preland/tests/e2e/brand-footer.cjs

32 lines
4.5 KiB
JavaScript

const {chromium}=require('/e2e/node_modules/playwright-core'),fs=require('fs'),http=require('http'),assert=require('assert/strict'),crypto=require('crypto');
const production=process.env.PUBLISHED==='1';
const server=production?null:http.createServer((req,res)=>{const r=http.request(new URL(req.url,'http://api:8001'),{method:req.method,headers:{...req.headers,connection:'close'}},up=>{res.writeHead(up.statusCode,up.headers);up.pipe(res)});req.pipe(r)}).listen(8121);
const base=process.env.PRELAND_URL||(production?'https://zoomstage.online':'http://pre301.localhost:8121');
(async()=>{const browser=await chromium.launch({args:['--no-sandbox']});const out=[];
try{for(const width of [1440,768,390,320])for(const theme of ['light','dark'])for(const indpic of [1,2]){
console.log('CASE',width,theme,indpic);
const ctx=await browser.newContext({viewport:{width,height:900},isMobile:width<768,hasTouch:width<768}),page=await ctx.newPage(),errors=[];
page.on('pageerror',e=>errors.push(e.message));
await page.route('**/*',route=>['GET','HEAD','OPTIONS'].includes(route.request().method())?route.continue():route.abort());
await page.goto(base+'/?theme=abcd'+(theme==='dark'?'1':'2')+'&indpic=abcd'+indpic,{waitUntil:'networkidle'});
await page.waitForFunction(()=>document.querySelector('#examples').dataset.examplesState==='ready');
assert.equal(await page.title(),'Улучшение изображения');assert(await page.locator('#dropzone-form').isVisible());
const footer=await page.locator('.footer').innerText();assert(!/Наши реквизиты|ИНН:|ОГРНИП:|Кардаполов|Иванов/.test(footer));assert.equal(await page.locator('.footer img[src*="payment.svg"] ').count(),0);assert(footer.includes(new URL(base).hostname));
const alignment=await page.evaluate(()=>{const h=document.querySelector('.header').getBoundingClientRect(),logo=[...document.querySelectorAll('.navbar-brand img')].find(e=>getComputedStyle(e).display!=='none').getBoundingClientRect();return {delta:logo.y-h.y-(h.height-logo.height)/2}});assert(Math.abs(alignment.delta)<1,'Видимый логотип должен быть по центру шапки');
const logos=await page.locator('.navbar-brand img,.footer-logo img').evaluateAll(es=>es.map(e=>({src:e.src,visible:getComputedStyle(e).display!=='none',width:e.naturalWidth,loaded:e.complete})));
assert.equal(logos.length,4);assert.equal(logos.filter(l=>l.visible).length,2);
for(const logo of logos){const url=new URL(logo.src);assert(url.searchParams.get('v'));const file=url.pathname.slice(1);const bytes=fs.readFileSync('/candidate/'+file);const digest=production?JSON.parse(fs.readFileSync('/candidate/release/brands.json'))[new URL(base).hostname].logos[file].sha256:crypto.createHash('sha256').update(bytes).digest('hex');assert.equal(url.searchParams.get('v'),digest.slice(0,16));if(logo.visible)assert(logo.loaded&&logo.width>0);}
assert(logos.filter(l=>l.visible).every(l=>new URL(l.src).pathname.endsWith(theme==='dark'?'logo-alt.svg':'logo.svg')));
await page.waitForFunction(()=>document.querySelectorAll('.image-examples-item')[1].getAttribute('aria-disabled')==='false');
await page.locator('.image-examples-item').nth(1).click();
await page.waitForFunction(()=>/02_(desk|mob)_1-source/.test(document.querySelector('#image-compare-source').src));
assert((await page.locator('#image-compare-source').getAttribute('src')).includes('/'+indpic+'/'));
assert(/02_(desk|mob)_2-result/.test(await page.locator('#image-compare-result').getAttribute('src')));
if(await page.evaluate(()=>document.documentElement.scrollWidth>innerWidth)){await page.screenshot({path:'/qa/overflow.png',fullPage:true});console.log(await page.evaluate(()=>[...document.querySelectorAll('body *')].map(e=>({tag:e.tagName,cls:e.className,x:e.getBoundingClientRect().x,right:e.getBoundingClientRect().right,width:e.getBoundingClientRect().width})).filter(e=>e.right>innerWidth+1)));}
assert.equal(await page.evaluate(()=>document.documentElement.scrollWidth>innerWidth),false);assert.deepEqual(errors,[]);
const row={width,theme,indpic,logos,errors};out.push(row);
if(indpic===1&&(width===1440||width===390))await page.screenshot({path:'/qa/brand-'+(production?'published':'local')+'-'+width+'-'+theme+'.png',fullPage:true});
await ctx.close();
}fs.writeFileSync('/qa/brand-'+(production?'published':'local')+'.json',JSON.stringify(out,null,2));console.log('PASS brand + thumbnail interactions',out.length,'cases');}
finally{await browser.close();server?.close();}})().catch(e=>{console.error(e);process.exit(1)});