import { _electron as electron,expect } from '@playwright/test' import fs from 'node:fs/promises' import path from 'node:path' import {PDFDocument} from 'pdf-lib' const profile=path.join(process.cwd(),'.qa','packaged-profile-1.0.1') await fs.mkdir(profile,{recursive:true}) const env={...process.env};delete env.ELECTRON_RUN_AS_NODE let app try{ app=await electron.launch({executablePath:path.join(process.cwd(),'release','win-unpacked','收据工坊.exe'),args:['--smoke-test','--user-data-dir='+profile],env,timeout:60000}) const page=await app.firstWindow();page.setDefaultTimeout(20000) await expect(page.getByRole('heading',{name:'收据工作台',exact:true})).toBeVisible({timeout:30000}) await expect(page.getByText('把表格交给收据工坊')).toBeVisible({timeout:30000}) const boot=await page.evaluate(()=>window.receipts.bootstrap()) expect(boot.dataDirectory).toBe(profile) expect(boot.nextNumber).toBe('SJ00000001') const sealFolder=path.join(process.cwd(),'.qa','fixtures','seals'),output=path.join(process.cwd(),'.qa','packaged-output') await fs.mkdir(output,{recursive:true}) await app.evaluate(({shell})=>{shell.openPath=async()=>''}) await page.evaluate(async({output,sealFolder})=>{const b=await window.receipts.bootstrap();await window.receipts.saveSettings({...b.settings,outputDirectory:output,sealDirectory:sealFolder,numberPrefix:'PACK'})},{output,sealFolder}) const seals=await page.evaluate(()=>window.receipts.listSeals());expect(seals.images.length).toBeGreaterThan(0) await app.evaluate(({dialog},file)=>{dialog.showOpenDialog=async()=>({canceled:false,filePaths:[file]})},path.join(process.cwd(),'.qa','fixtures','收据测试数据.xlsx')) const draft=await page.evaluate(()=>window.receipts.importExcel()) expect(draft.rows[0].receipt.customer).toBe('某某学校 初二年级 张三') expect(draft.rows[0].receipt.school).toBe('某某学校') expect(draft.rows[0].receipt.grade).toBe('初二年级') expect(draft.rows[0].receipt.studentName).toBe('张三') await page.evaluate(async({id,sealId})=>window.receipts.exportReceipts({draftId:id,rowIndices:[0],sealId,options:{pdf:true,png:true,print:true,receiptsPerPage:2,cutLine:true}}),{id:draft.id,sealId:seals.images[0].id}) await expect.poll(async()=>page.evaluate(async()=> (await window.receipts.listBatches())[0]?.status),{timeout:90000}).toBe('completed') const batch=(await page.evaluate(()=>window.receipts.listBatches()))[0] const files=await fs.readdir(batch.outputDirectory,{recursive:true}) expect(files.filter(n=>n.endsWith('.png'))).toHaveLength(1) const png=await fs.readFile(path.join(batch.outputDirectory,files.find(n=>n.endsWith('.png')))) expect(png.readUInt32BE(png.indexOf('pHYs')+4)).toBe(11811) const pdf=await PDFDocument.load(await fs.readFile(path.join(batch.outputDirectory,files.find(n=>path.basename(n).startsWith('A4'))))) expect(pdf.getPageCount()).toBe(1) await fs.writeFile('.qa/package-result.json',JSON.stringify({passed:true,platform:'Windows 10 x64',packaged:true,renderedPdf:true,renderedPng:true,dpi:300,profile},null,2)) console.log('Packaged application verified: standalone startup, Excel, seals, PDF and PNG.') }finally{if(app)await app.close().catch(()=>{})}