import assert from "node:assert/strict"; import fs from "node:fs/promises"; import path from "node:path"; import os from "node:os"; import { fileURLToPath } from "node:url"; import { chromium } from "playwright"; const root=path.dirname(path.dirname(fileURLToPath(import.meta.url))); const artifacts=path.join(root,'test-artifacts'); await fs.mkdir(artifacts,{recursive:true}); const profile=await fs.mkdtemp(path.join(os.tmpdir(),'ytdl-components-test-')); const context=await chromium.launchPersistentContext(profile,{ headless:true,viewport:{width:1000,height:900}, executablePath:'C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe', ignoreDefaultArgs:['--disable-extensions'],args:['--enable-unsafe-extension-debugging'], }); try { const cdp=await context.browser().newBrowserCDPSession(); const {id}=await cdp.send('Extensions.loadUnpacked',{path:path.join(root,'extension')}); const worker=context.serviceWorkers()[0] || await context.waitForEvent('serviceworker'); await worker.evaluate(() => chrome.storage.local.set({ onboarding: { state: "complete", version: 1 } })); const page=await context.newPage(); let installerDownloads=0; page.on('download',()=>installerDownloads++); await page.goto(`chrome-extension://${id}/downloader.html`); await page.locator('#helper-panel[data-state="running"]').waitFor({timeout:90000}); await page.locator('#helper-panel > summary').click(); assert.equal(await page.locator('#helper-install').textContent(),'Переустановить'); const automatic=await page.locator('#auto-update').isChecked(); if(automatic) await page.locator('#auto-update').uncheck(); await page.locator('#helper-update').click(); const deadline=Date.now()+240000; let job; while(Date.now()Object.values((await chrome.storage.local.get('jobs')).jobs || {})); job=jobs.find(item=>item.kind==='update'); if(job && job.status!=='running') break; await new Promise(resolve=>setTimeout(resolve,200)); } assert.ok(job); assert.equal(job.status,'complete',job.error); assert.equal(installerDownloads,0,'Update components must use the helper, not download the embedded EXE'); await page.locator('#helper-panel[data-state="running"]').waitFor({timeout:90000}); await page.locator('#helper-update:not([disabled])').waitFor({timeout:30000}); assert.equal(await page.locator('.dependency-row[data-status="installed"]').count(),5); assert.equal(await page.locator('#engine option[value="nvenc"]').isDisabled(),false); assert.equal(await page.locator('#engine option[value="amf"]').isDisabled(),true); await page.locator('#auto-update').setChecked(automatic); await page.locator('.dependencies summary').click(); await page.screenshot({path:path.join(artifacts,'component-updater.png'),animations:'disabled'}); await fs.writeFile(path.join(artifacts,'browser-components.json'),JSON.stringify({updateButton:'passed',installerDownloads,job,automatic},null,2)); console.log('Browser component update passed: real native request, official version check, completed progress, ready tools, preserved automatic-update setting, no EXE download.'); } finally { await context.close(); if(path.dirname(path.resolve(profile))===path.resolve(os.tmpdir()) && path.basename(profile).startsWith('ytdl-components-test-')) await fs.rm(profile,{recursive:true,force:true}); }