Files
camofox-browser/tests/e2e/concurrency.test.js
T
Pradeep Elankumaran 1bdd925371 feat: OpenAPI spec + swagger-stripey docs at /docs (#78)
Auto-generated OpenAPI 3.0 spec from JSDoc annotations on all 31 routes via swagger-jsdoc. Docs at /docs using swagger-stripey. CI split into parallel unit + e2e jobs (133s → 80s).

Supersedes #69. Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>
2026-04-25 11:52:02 -07:00

98 lines
2.9 KiB
JavaScript

import { createClient } from '../helpers/client.js';
import { getSharedEnv } from './sharedEnv.js';
describe('Concurrency', () => {
let serverUrl;
let testSiteUrl;
beforeAll(() => {
const env = getSharedEnv();
serverUrl = env.serverUrl;
testSiteUrl = env.testSiteUrl;
});
// Server lifecycle managed by globalSetup/globalTeardown
test('concurrent operations on same tab are serialized', async () => {
const client = createClient(serverUrl);
try {
const { tabId } = await client.createTab(`${testSiteUrl}/pageA`);
// Fire multiple operations concurrently on the same tab
const operations = [
client.getSnapshot(tabId),
client.navigate(tabId, `${testSiteUrl}/pageB`),
client.getSnapshot(tabId),
];
// All should complete without errors (tab locking serializes them)
const results = await Promise.all(operations);
expect(results.length).toBe(3);
// Each result should be valid (no crashes)
results.forEach(r => expect(r).toBeDefined());
} finally {
await client.cleanup();
}
});
test('parallel operations on different tabs work', async () => {
const client = createClient(serverUrl);
try {
// Create two tabs
const tab1 = await client.createTab(`${testSiteUrl}/pageA`);
const tab2 = await client.createTab(`${testSiteUrl}/pageB`);
// Run operations on both tabs in parallel
const [snap1, snap2] = await Promise.all([
client.getSnapshot(tab1.tabId),
client.getSnapshot(tab2.tabId),
]);
// Both should return valid snapshots
expect(snap1.snapshot).toContain('Page A');
expect(snap2.snapshot).toContain('Page B');
} finally {
await client.cleanup();
}
});
test('multiple clients can work independently', async () => {
const client1 = createClient(serverUrl);
const client2 = createClient(serverUrl);
try {
// Each client creates their own tab
const [tab1, tab2] = await Promise.all([
client1.createTab(`${testSiteUrl}/pageA`),
client2.createTab(`${testSiteUrl}/pageB`),
]);
// Verify they are independent
expect(tab1.tabId).not.toBe(tab2.tabId);
expect(client1.userId).not.toBe(client2.userId);
// Both can operate independently
const [snap1, snap2] = await Promise.all([
client1.getSnapshot(tab1.tabId),
client2.getSnapshot(tab2.tabId),
]);
expect(snap1.snapshot).toContain('Page A');
expect(snap2.snapshot).toContain('Page B');
// Closing one client's session doesn't affect the other
await client1.closeSession();
// Client 2 still works
const snap2After = await client2.getSnapshot(tab2.tabId);
expect(snap2After.snapshot).toContain('Page B');
} finally {
await client1.cleanup();
await client2.cleanup();
}
});
});