Files

95 lines
2.4 KiB
JavaScript
Raw Permalink Normal View History

2023-01-01 18:09:08 +01:00
// see https://playwright.dev/docs/api/class-electronapplication
// https://github.com/microsoft/playwright/issues/6347#issuecomment-1085850728
// https://www.anycodings.com/1questions/958135/can-i-set-the-date-for-playwright-browser
const { _electron: electron } = require("playwright");
exports.startApplication = async (configFilename, systemDate = null, electronParams = [], timezone = "GMT") => {
2023-01-01 18:09:08 +01:00
global.electronApp = null;
global.page = null;
process.env.MM_CONFIG_FILE = configFilename;
process.env.TZ = timezone;
2024-10-25 11:34:35 +02:00
if (systemDate) {
process.env.MOCK_DATE = systemDate;
}
process.env.mmTestMode = "true";
2024-10-25 11:34:35 +02:00
2025-01-08 11:46:42 +01:00
// check environment for DISPLAY or WAYLAND_DISPLAY
if (process.env.WAYLAND_DISPLAY) {
electronParams.unshift("js/electron.js", "--ozone-platform=wayland");
2025-01-08 11:46:42 +01:00
} else {
electronParams.unshift("js/electron.js");
}
2025-11-03 19:47:01 +01:00
// Pass environment variables to Electron process
const env = {
...process.env,
MM_CONFIG_FILE: configFilename,
TZ: timezone,
mmTestMode: "true"
};
if (systemDate) {
env.MOCK_DATE = systemDate;
}
global.electronApp = await electron.launch({
args: electronParams,
env: env
});
2023-01-01 18:09:08 +01:00
await global.electronApp.firstWindow();
for (const win of global.electronApp.windows()) {
const title = await win.title();
expect(["MagicMirror²", "DevTools"]).toContain(title);
if (title === "MagicMirror²") {
global.page = win;
if (systemDate) {
await global.page.evaluate((systemDate) => {
Date.now = () => {
return new Date(systemDate).valueOf();
2023-01-01 18:09:08 +01:00
};
}, systemDate);
}
}
}
};
2025-11-03 19:47:01 +01:00
exports.stopApplication = async (timeout = 10000) => {
const app = global.electronApp;
2023-01-01 18:09:08 +01:00
global.electronApp = null;
global.page = null;
2024-10-25 11:34:35 +02:00
process.env.MOCK_DATE = undefined;
2025-11-03 19:47:01 +01:00
if (!app) {
return;
}
const killElectron = () => {
try {
const electronProcess = typeof app.process === "function" ? app.process() : null;
if (electronProcess && !electronProcess.killed) {
electronProcess.kill("SIGKILL");
}
} catch {
2025-11-03 19:47:01 +01:00
// Ignore errors caused by Playwright already tearing down the connection
}
};
try {
await Promise.race([
app.close(),
new Promise((_, reject) => setTimeout(() => reject(new Error("Electron close timeout")), timeout))
]);
} catch {
2025-11-03 19:47:01 +01:00
killElectron();
}
2023-01-01 18:09:08 +01:00
};
2025-02-27 19:31:00 +01:00
exports.getElement = async (selector, state = "visible") => {
2024-01-01 15:38:08 +01:00
expect(global.page).not.toBeNull();
2025-02-27 19:31:00 +01:00
const elem = global.page.locator(selector);
await elem.waitFor({ state: state });
2024-01-01 15:38:08 +01:00
expect(elem).not.toBeNull();
2023-01-01 18:09:08 +01:00
return elem;
};