80 lines
3.3 KiB
JavaScript
80 lines
3.3 KiB
JavaScript
'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);
|
|
}
|
|
});
|