feat: reconcile WebAVP desktop parity and releases
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
'use strict';
|
||||
|
||||
const { app, BrowserWindow } = require('electron');
|
||||
|
||||
const targetUrl = process.env.WEBAVP_SMOKE_WEB_URL || 'http://127.0.0.1:5152/';
|
||||
let failed = false;
|
||||
|
||||
app.commandLine.appendSwitch('disable-gpu');
|
||||
|
||||
app.whenReady().then(async () => {
|
||||
const win = new BrowserWindow({ show: false, webPreferences: { contextIsolation: true, nodeIntegration: false, sandbox: true } });
|
||||
win.webContents.on('console-message', (_event, level, message) => {
|
||||
if (level >= 2) {
|
||||
failed = true;
|
||||
console.error(`[WebAVP] Browser console error: ${message}`);
|
||||
}
|
||||
});
|
||||
try {
|
||||
await win.loadURL(targetUrl);
|
||||
const result = await win.webContents.executeJavaScript(`(async () => {
|
||||
const deadline = Date.now() + 12000;
|
||||
while (!document.getElementById('releaseStatus')?.textContent && Date.now() < deadline) {
|
||||
await new Promise(resolve => setTimeout(resolve, 100));
|
||||
}
|
||||
async function importCameraCount(count) {
|
||||
const input = document.getElementById('fileInput');
|
||||
const transfer = new DataTransfer();
|
||||
for (let index = 1; index <= count; index += 1) {
|
||||
transfer.items.add(new File(['x'], 'Camera' + index + '.mp4', { type: 'video/mp4' }));
|
||||
}
|
||||
Object.defineProperty(input, 'files', { value: transfer.files, configurable: true });
|
||||
input.dispatchEvent(new Event('change', { bubbles: true }));
|
||||
const importDeadline = Date.now() + 5000;
|
||||
while (document.querySelectorAll('.cam-cell').length < count && Date.now() < importDeadline) {
|
||||
await new Promise(resolve => setTimeout(resolve, 50));
|
||||
}
|
||||
return [...document.querySelectorAll('.cam-cell')]
|
||||
.filter(cell => getComputedStyle(cell).display !== 'none').length;
|
||||
}
|
||||
|
||||
document.querySelector('[data-layout="2x2"]').click();
|
||||
const fixedVisible = await importCameraCount(5);
|
||||
document.getElementById('newSessionBtn').click();
|
||||
document.querySelector('[data-layout="auto"]').click();
|
||||
const autoVisible = await importCameraCount(17);
|
||||
|
||||
return ({
|
||||
title: document.title,
|
||||
hasUtils: !!window.WebAVPUtils,
|
||||
autoGrid16: window.WebAVPUtils?.getAutoGrid(16),
|
||||
releaseText: document.getElementById('releaseAction')?.textContent.trim(),
|
||||
releaseFallback: document.getElementById('releaseAction')?.href,
|
||||
releaseStatus: document.getElementById('releaseStatus')?.textContent,
|
||||
hasFourByFour: !!document.querySelector('[data-layout="4x4"]'),
|
||||
hasDewarp: /dewarp|fisheye/i.test(document.documentElement.textContent),
|
||||
fixedVisible,
|
||||
autoVisible
|
||||
});
|
||||
})()`);
|
||||
const passed = result.title === 'Alta Video Player'
|
||||
&& result.hasUtils
|
||||
&& result.autoGrid16?.cols === 4
|
||||
&& result.autoGrid16?.rows === 4
|
||||
&& result.releaseText === 'Download Desktop App'
|
||||
&& result.releaseFallback.startsWith('https://git.pejicorp.com/peji/WebAVP/releases')
|
||||
&& result.releaseStatus.length > 0
|
||||
&& result.hasFourByFour
|
||||
&& !result.hasDewarp
|
||||
&& result.fixedVisible === 4
|
||||
&& result.autoVisible === 16
|
||||
&& !failed;
|
||||
if (!passed) throw new Error(`Browser assertions failed: ${JSON.stringify(result)}`);
|
||||
console.log(`[WebAVP] Browser smoke passed at ${targetUrl}`);
|
||||
app.exit(0);
|
||||
} catch (err) {
|
||||
console.error(`[WebAVP] Browser smoke failed: ${err.message}`);
|
||||
app.exit(1);
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user