Files
WebAVP/tests/browser-smoke.js

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);
}
});