Files

64 lines
2.5 KiB
TypeScript

import { test, expect, ElectronApplication, Page } from '@playwright/test';
import { launchApp, waitForMainWindow, readBuildInfo } from '../helpers/launch';
// End-to-end smoke of the PACKAGED app. Everything here runs unchanged on macOS
// and Windows; CI builds the artifact for the OS, then runs this. It deliberately
// avoids anything needing a provider API key (no agent turn) so it is hermetic
// and deterministic on a clean machine.
test.describe('packaged app boot', () => {
let app: ElectronApplication;
let win: Page;
test.beforeAll(async () => {
app = await launchApp();
win = await waitForMainWindow(app);
});
test.afterAll(async () => {
await app?.close().catch(() => {});
});
test('main window paints the React shell', async () => {
// waitForMainWindow already required a mounted #root; assert it explicitly.
const childCount = await win.evaluate(() => document.getElementById('root')!.childElementCount);
expect(childCount).toBeGreaterThan(0);
});
test('preload bridge is exposed', async () => {
const hasBridge = await win.evaluate(() => ({
port: typeof (window as any).openswarm?.getBackendPort === 'function',
buildInfo: typeof (window as any).openswarm?.getBuildInfo === 'function',
}));
expect(hasBridge.port).toBe(true);
expect(hasBridge.buildInfo).toBe(true);
});
test('backend reaches HTTP-ready (health 200)', async () => {
const port: number = await win.evaluate(() => (window as any).openswarm.getBackendPort());
expect(port).toBeGreaterThan(0);
// Poll the real backend the packaged app spawned, from inside the renderer
// (same origin/path the app itself uses), until it answers 200.
await expect.poll(
async () =>
win.evaluate(
(p) => fetch(`http://127.0.0.1:${p}/api/health/check`).then((r) => r.status).catch(() => 0),
port,
),
{ timeout: 150_000, intervals: [1000] },
).toBe(200);
});
test('provenance: running app reports the built commit', async () => {
const info = await win.evaluate(() => (window as any).openswarm.getBuildInfo());
const onDisk = readBuildInfo();
expect(info.sha).toBe(onDisk.sha);
expect(info.shortSha).toMatch(/^[0-9a-f]{12}$/);
expect(info.version).toBe(onDisk.version);
});
test('app version is reported', async () => {
const version = await win.evaluate(() => (window as any).openswarm.getAppVersion());
expect(version).toMatch(/^\d+\.\d+\.\d+/);
});
});