Files
gridpilot.gg/tests/smoke/playwright-init.smoke.test.ts
2025-12-16 11:52:26 +01:00

109 lines
3.1 KiB
TypeScript

import { describe, it, expect, afterEach, beforeAll, afterAll } from 'vitest';
import { PlaywrightAutomationAdapter, FixtureServer } from 'core/automation/infrastructure//automation';
import { NoOpLogAdapter } from '@core/automation/infrastructure//logging/NoOpLogAdapter';
describe('Playwright Adapter Smoke Tests', () => {
let adapter: PlaywrightAutomationAdapter | undefined;
let server: FixtureServer | undefined;
let unhandledRejectionHandler: ((reason: unknown) => void) | null = null;
const logger = new NoOpLogAdapter();
beforeAll(() => {
unhandledRejectionHandler = (reason: unknown) => {
const message =
reason instanceof Error ? reason.message : String(reason ?? '');
if (message.includes('cdpSession.send: Target page, context or browser has been closed')) {
return;
}
throw reason;
};
(process as any).on('unhandledRejection', unhandledRejectionHandler);
});
afterEach(async () => {
if (adapter) {
try {
await adapter.disconnect();
} catch {
// Ignore cleanup errors
}
adapter = undefined;
}
if (server) {
try {
await server.stop();
} catch {
// Ignore cleanup errors
}
server = undefined;
}
});
afterAll(() => {
if (unhandledRejectionHandler) {
(process as any).removeListener('unhandledRejection', unhandledRejectionHandler);
unhandledRejectionHandler = null;
}
});
it('Adapter instantiates without errors', () => {
expect(() => {
adapter = new PlaywrightAutomationAdapter({
headless: true,
mode: 'mock',
timeout: 5000,
}, logger);
}).not.toThrow();
});
it('Browser connects successfully', async () => {
adapter = new PlaywrightAutomationAdapter({
headless: true,
mode: 'mock',
timeout: 5000,
}, logger);
const result = await adapter.connect();
expect(result.success).toBe(true);
expect(adapter.isConnected()).toBe(true);
});
it('Basic navigation works with mock fixtures', async () => {
server = new FixtureServer();
await server.start();
adapter = new PlaywrightAutomationAdapter({
headless: true,
mode: 'mock',
timeout: 5000,
}, logger);
await adapter.connect();
const navResult = await adapter.navigateToPage(server.getFixtureUrl(2));
expect(navResult.success).toBe(true);
});
it('Adapter can be instantiated multiple times', () => {
expect(() => {
const adapter1 = new PlaywrightAutomationAdapter({
headless: true,
mode: 'mock',
timeout: 5000,
}, logger);
const adapter2 = new PlaywrightAutomationAdapter({
headless: true,
mode: 'mock',
timeout: 5000,
}, logger);
expect(adapter1).not.toBe(adapter2);
}).not.toThrow();
});
it('FixtureServer starts and stops cleanly', async () => {
server = new FixtureServer();
await expect(server.start()).resolves.not.toThrow();
expect(server.getFixtureUrl(2)).toContain('http://localhost:');
await expect(server.stop()).resolves.not.toThrow();
});
});