Skip to content

Commit d9768c9

Browse files
committed
test: simplify browser stubs code
1 parent a0f3e7f commit d9768c9

2 files changed

Lines changed: 58 additions & 102 deletions

File tree

packages/test-runner-core/test/src/runner/TestRunner.test.ts

Lines changed: 16 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -11,37 +11,17 @@ import type { Logger } from '../../../dist/logger/Logger.js';
1111
import { SESSION_STATUS } from '../../../dist/test-session/TestSessionStatus.js';
1212
import type { TestRunnerGroupConfig } from '../../../dist/index.js';
1313

14-
interface BrowserStubs {
15-
stop: ReturnType<typeof mock.fn>;
16-
startDebugSession: ReturnType<typeof mock.fn>;
17-
startSession: ReturnType<typeof mock.fn>;
18-
stopSession: ReturnType<typeof mock.fn>;
19-
isActive: ReturnType<typeof mock.fn>;
20-
getBrowserUrl: ReturnType<typeof mock.fn>;
21-
}
22-
23-
function createBrowserStub(): [BrowserStubs, BrowserLauncher] {
24-
const stubs: BrowserStubs = {
14+
function createBrowserStub(): BrowserLauncher {
15+
return {
16+
name: 'myBrowser',
17+
type: 'myBrowser',
2518
stop: mock.fn(() => Promise.resolve()),
2619
getBrowserUrl: mock.fn(() => ''),
2720
startDebugSession: mock.fn(() => Promise.resolve()),
2821
startSession: mock.fn(() => Promise.resolve()),
2922
stopSession: mock.fn(() => Promise.resolve({})),
3023
isActive: mock.fn(() => true),
3124
};
32-
return [
33-
stubs,
34-
{
35-
name: 'myBrowser',
36-
type: 'myBrowser',
37-
stop: stubs.stop,
38-
getBrowserUrl: stubs.getBrowserUrl,
39-
startDebugSession: stubs.startDebugSession,
40-
startSession: stubs.startSession,
41-
stopSession: stubs.stopSession,
42-
isActive: stubs.isActive,
43-
},
44-
];
4525
}
4626

4727
const logger: Logger = {
@@ -62,7 +42,7 @@ async function createTestRunner(
6242
port: 9000 + Math.floor(Math.random() * 1000),
6343
});
6444

65-
const [browserStubs, browser] = createBrowserStub();
45+
const browser = createBrowserStub();
6646

6747
console.log(path.resolve(import.meta.dirname, '..', '..', '..', '..', '..'));
6848

@@ -89,24 +69,24 @@ async function createTestRunner(
8969
...extraConfig,
9070
};
9171
const runner = new TestRunner(config, groupConfigs);
92-
return { runner, browser, browserStubs };
72+
return { runner, browser };
9373
}
9474

9575
describe('TestRunner', function () {
9676
it('can run a single test file', async () => {
97-
const { runner, browserStubs } = await createTestRunner();
77+
const { runner, browser } = await createTestRunner();
9878

9979
await runner.start();
10080
assert.equal(runner.started, true, 'runner is started');
101-
assert.equal(browserStubs.startSession.mock.callCount(), 1);
81+
assert.equal(browser.startSession.mock.callCount(), 1);
10282

10383
const sessions = Array.from(runner.sessions.all());
10484
assert.equal(sessions.length, 1, 'one session is created');
10585
await runner.stop();
10686
});
10787

10888
it('closes test runner for a successful test', async () => {
109-
const { runner, browserStubs } = await createTestRunner();
89+
const { runner, browser } = await createTestRunner();
11090
let resolveStopped: (passed: boolean) => void;
11191
const stopped = new Promise<boolean>(resolve => {
11292
resolveStopped = resolve;
@@ -125,13 +105,13 @@ describe('TestRunner', function () {
125105

126106
const passed = await stopped;
127107

128-
assert.equal(browserStubs.stopSession.mock.callCount(), 1, 'browser session is stopped');
129-
assert.equal(browserStubs.stop.mock.callCount(), 1, 'browser is stopped');
108+
assert.equal(browser.stopSession.mock.callCount(), 1, 'browser session is stopped');
109+
assert.equal(browser.stop.mock.callCount(), 1, 'browser is stopped');
130110
assert.equal(passed, true, 'test runner quits with true');
131111
});
132112

133113
it('closes test runner for a failed test', async () => {
134-
const { runner, browserStubs } = await createTestRunner();
114+
const { runner, browser } = await createTestRunner();
135115
let resolveStopped: (passed: boolean) => void;
136116
const stopped = new Promise<boolean>(resolve => {
137117
resolveStopped = resolve;
@@ -149,8 +129,8 @@ describe('TestRunner', function () {
149129
runner.sessions.updateStatus({ ...sessions[0], passed: false }, SESSION_STATUS.TEST_FINISHED);
150130
const passed = await stopped;
151131

152-
assert.equal(browserStubs.stopSession.mock.callCount(), 1, 'browser session is stopped');
153-
assert.equal(browserStubs.stop.mock.callCount(), 1, 'browser is stopped');
132+
assert.equal(browser.stopSession.mock.callCount(), 1, 'browser session is stopped');
133+
assert.equal(browser.stop.mock.callCount(), 1, 'browser is stopped');
154134
assert.equal(passed, false, 'test runner quits with false');
155135
});
156136

@@ -170,7 +150,7 @@ describe('TestRunner', function () {
170150
});
171151

172152
it('can create a group with a custom browser, inheriting test files', async () => {
173-
const [, groupBrowser] = createBrowserStub();
153+
const groupBrowser = createBrowserStub();
174154
const { browser, runner } = await createTestRunner(undefined, [
175155
{
176156
name: 'a',
@@ -219,7 +199,7 @@ describe('TestRunner', function () {
219199
});
220200

221201
it('can create test groups with custom browsers', async () => {
222-
const [, browserB] = createBrowserStub();
202+
const browserB = createBrowserStub();
223203
const { browser, runner } = await createTestRunner(
224204
{
225205
files: undefined,

packages/test-runner-core/test/src/runner/TestScheduler.test.ts

Lines changed: 42 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,6 @@ function timeout(ms = 0): Promise<void> {
1313
return new Promise(r => setTimeout(r, ms));
1414
}
1515

16-
interface BrowserStubs {
17-
stop: ReturnType<typeof mock.fn>;
18-
startDebugSession: ReturnType<typeof mock.fn>;
19-
startSession: ReturnType<typeof mock.fn>;
20-
stopSession: ReturnType<typeof mock.fn>;
21-
isActive: ReturnType<typeof mock.fn>;
22-
getBrowserUrl: ReturnType<typeof mock.fn>;
23-
}
24-
2516
describe('TestScheduler', () => {
2617
let mockConfig: TestRunnerCoreConfig;
2718

@@ -33,28 +24,17 @@ describe('TestScheduler', () => {
3324
} as Partial<TestSession> as TestSession;
3425
}
3526

36-
function createBrowserStub(name: string): [BrowserStubs, BrowserLauncher] {
37-
const stubs: BrowserStubs = {
27+
function createBrowserStub(name: string): BrowserLauncher {
28+
return {
29+
name,
30+
type: name,
3831
stop: mock.fn(() => timeout(1)),
3932
startDebugSession: mock.fn(() => timeout(1)),
4033
startSession: mock.fn(() => timeout(1)),
4134
stopSession: mock.fn(() => timeout(1).then(() => ({ testCoverage: {} }))),
4235
isActive: mock.fn(() => true),
4336
getBrowserUrl: mock.fn(() => ''),
4437
};
45-
return [
46-
stubs,
47-
{
48-
name,
49-
type: name,
50-
stop: stubs.stop,
51-
startDebugSession: stubs.startDebugSession,
52-
startSession: stubs.startSession,
53-
stopSession: stubs.stopSession,
54-
isActive: stubs.isActive,
55-
getBrowserUrl: stubs.getBrowserUrl,
56-
},
57-
];
5838
}
5939

6040
beforeEach(() => {
@@ -82,32 +62,32 @@ describe('TestScheduler', () => {
8262

8363
function createTestFixture(
8464
...ids: string[]
85-
): [TestScheduler, TestSessionManager, TestSession[], BrowserStubs] {
86-
const [browserStubs, browser] = createBrowserStub('a');
65+
): [TestScheduler, TestSessionManager, TestSession[], BrowserLauncher] {
66+
const browser = createBrowserStub('a');
8767
const sessions: TestSession[] = [];
8868
for (const id of ids) {
8969
const session = createSession({ id, browser });
9070
sessions.push(session);
9171
}
9272
const sessionManager = new TestSessionManager([], sessions);
9373
const scheduler = new TestScheduler(mockConfig, sessionManager, [browser]);
94-
return [scheduler, sessionManager, sessions, browserStubs];
74+
return [scheduler, sessionManager, sessions, browser];
9575
}
9676

9777
describe('single browser', () => {
9878
it('scheduling a session starts the browser and marks initializing', async () => {
99-
const [scheduler, sessions, [session1], stubs] = createTestFixture('1');
79+
const [scheduler, sessions, [session1], browser] = createTestFixture('1');
10080
scheduler.schedule(1, [session1]);
10181

10282
const finalSession1 = sessions.get(session1.id)!;
10383
assert.equal(finalSession1.status, SESSION_STATUS.INITIALIZING);
104-
assert.equal(stubs.startSession.mock.callCount(), 1);
84+
assert.equal(browser.startSession.mock.callCount(), 1);
10585
});
10686

10787
it('when a session goes to status test finished, the browser is stopped and results is stored', async () => {
108-
const [scheduler, sessions, [session1], stubs] = createTestFixture('1');
88+
const [scheduler, sessions, [session1], browser] = createTestFixture('1');
10989
const testCoverage = {};
110-
stubs.stopSession.mock.mockImplementation(() => timeout(1).then(() => ({ testCoverage })));
90+
browser.stopSession.mock.mockImplementation(() => timeout(1).then(() => ({ testCoverage })));
11191
scheduler.schedule(1, [session1]);
11292

11393
await timeout(5);
@@ -194,8 +174,8 @@ describe('TestScheduler', () => {
194174
});
195175

196176
it('error while starting browser marks session as failed', async () => {
197-
const [scheduler, sessions, [session1], stubs] = createTestFixture('1');
198-
stubs.startSession.mock.mockImplementation(() => Promise.reject(new Error('mock error')));
177+
const [scheduler, sessions, [session1], browser] = createTestFixture('1');
178+
browser.startSession.mock.mockImplementation(() => Promise.reject(new Error('mock error')));
199179
scheduler.schedule(1, [session1]);
200180

201181
await timeout(20);
@@ -209,8 +189,8 @@ describe('TestScheduler', () => {
209189

210190
it('error while starting browser after a session changed state gets logged', async () => {
211191
const errorStub = mock.method(mockConfig.logger, 'error');
212-
const [scheduler, sessions, [session1], stubs] = createTestFixture('1');
213-
stubs.startSession.mock.mockImplementation(() =>
192+
const [scheduler, sessions, [session1], browser] = createTestFixture('1');
193+
browser.startSession.mock.mockImplementation(() =>
214194
timeout(5).then(() => {
215195
throw new Error('mock error');
216196
}),
@@ -233,8 +213,8 @@ describe('TestScheduler', () => {
233213
});
234214

235215
it('error while stopping browser marks session as failed', async () => {
236-
const [scheduler, sessions, [session1], stubs] = createTestFixture('1');
237-
stubs.stopSession.mock.mockImplementation(() => Promise.reject(new Error('mock error')));
216+
const [scheduler, sessions, [session1], browser] = createTestFixture('1');
217+
browser.stopSession.mock.mockImplementation(() => Promise.reject(new Error('mock error')));
238218
scheduler.schedule(1, [session1]);
239219

240220
await timeout(5);
@@ -250,8 +230,8 @@ describe('TestScheduler', () => {
250230

251231
it('timeout starting the browser marks the session as failed', async () => {
252232
mockConfig.browserStartTimeout = 2;
253-
const [scheduler, sessions, [session1], stubs] = createTestFixture('1');
254-
stubs.startSession.mock.mockImplementation(() => timeout(40));
233+
const [scheduler, sessions, [session1], browser] = createTestFixture('1');
234+
browser.startSession.mock.mockImplementation(() => timeout(40));
255235
scheduler.schedule(1, [session1]);
256236

257237
await timeout(20);
@@ -306,13 +286,13 @@ describe('TestScheduler', () => {
306286
describe('multi browsers', () => {
307287
function createTestFixture(
308288
fixtures: { name: string; ids: string[] }[],
309-
): [TestScheduler, TestSessionManager, Array<[BrowserStubs, BrowserLauncher]>, TestSession[]] {
310-
const browsers: Array<[BrowserStubs, BrowserLauncher]> = [];
289+
): [TestScheduler, TestSessionManager, Array<BrowserLauncher>, TestSession[]] {
290+
const browsers: Array<BrowserLauncher> = [];
311291
const sessions: TestSession[] = [];
312292

313293
for (const fixture of fixtures) {
314-
const [stubs, browser] = createBrowserStub(fixture.name);
315-
browsers.push([stubs, browser]);
294+
const browser = createBrowserStub(fixture.name);
295+
browsers.push(browser);
316296

317297
for (const id of fixture.ids) {
318298
const session = createSession({ id, browser });
@@ -321,11 +301,7 @@ describe('TestScheduler', () => {
321301
}
322302

323303
const sessionManager = new TestSessionManager([], sessions);
324-
const scheduler = new TestScheduler(
325-
mockConfig,
326-
sessionManager,
327-
browsers.map(b => b[1]),
328-
);
304+
const scheduler = new TestScheduler(mockConfig, sessionManager, browsers);
329305
return [scheduler, sessionManager, browsers, sessions];
330306
}
331307

@@ -340,35 +316,35 @@ describe('TestScheduler', () => {
340316
const session1 = sessionManager.get('1')!;
341317
const session2 = sessionManager.get('2')!;
342318
const session3 = sessionManager.get('3')!;
343-
assert.equal(session1.browser, browsers[0][1]);
344-
assert.equal(session2.browser, browsers[0][1]);
345-
assert.equal(session3.browser, browsers[0][1]);
319+
assert.equal(session1.browser, browsers[0]);
320+
assert.equal(session2.browser, browsers[0]);
321+
assert.equal(session3.browser, browsers[0]);
346322
assert.equal(session1.status, SESSION_STATUS.INITIALIZING);
347323
assert.equal(session2.status, SESSION_STATUS.INITIALIZING);
348324
assert.equal(session3.status, SESSION_STATUS.SCHEDULED);
349-
assert.equal(browsers[0][0].startSession.mock.callCount(), 2);
325+
assert.equal(browsers[0].startSession.mock.callCount(), 2);
350326

351327
const session4 = sessionManager.get('4')!;
352328
const session5 = sessionManager.get('5')!;
353329
const session6 = sessionManager.get('6')!;
354-
assert.equal(session4.browser, browsers[1][1]);
355-
assert.equal(session5.browser, browsers[1][1]);
356-
assert.equal(session6.browser, browsers[1][1]);
330+
assert.equal(session4.browser, browsers[1]);
331+
assert.equal(session5.browser, browsers[1]);
332+
assert.equal(session6.browser, browsers[1]);
357333
assert.equal(session4.status, SESSION_STATUS.INITIALIZING);
358334
assert.equal(session5.status, SESSION_STATUS.INITIALIZING);
359335
assert.equal(session6.status, SESSION_STATUS.SCHEDULED);
360-
assert.equal(browsers[1][0].startSession.mock.callCount(), 2);
336+
assert.equal(browsers[1].startSession.mock.callCount(), 2);
361337

362338
const session7 = sessionManager.get('7')!;
363339
const session8 = sessionManager.get('8')!;
364340
const session9 = sessionManager.get('9')!;
365-
assert.equal(session7.browser, browsers[2][1]);
366-
assert.equal(session8.browser, browsers[2][1]);
367-
assert.equal(session9.browser, browsers[2][1]);
341+
assert.equal(session7.browser, browsers[2]);
342+
assert.equal(session8.browser, browsers[2]);
343+
assert.equal(session9.browser, browsers[2]);
368344
assert.equal(session7.status, SESSION_STATUS.SCHEDULED);
369345
assert.equal(session8.status, SESSION_STATUS.SCHEDULED);
370346
assert.equal(session9.status, SESSION_STATUS.SCHEDULED);
371-
assert.equal(browsers[2][0].startSession.mock.callCount(), 0);
347+
assert.equal(browsers[2].startSession.mock.callCount(), 0);
372348
});
373349

374350
it('finishing a test schedules a new one', async () => {
@@ -384,9 +360,9 @@ describe('TestScheduler', () => {
384360
await timeout(20);
385361

386362
const session3 = sessionManager.get('3')!;
387-
assert.equal(session3.browser, browsers[0][1]);
363+
assert.equal(session3.browser, browsers[0]);
388364
assert.equal(session3.status, SESSION_STATUS.INITIALIZING);
389-
assert.equal(browsers[0][0].startSession.mock.callCount(), 3);
365+
assert.equal(browsers[0].startSession.mock.callCount(), 3);
390366
});
391367

392368
it('overflow of concurrency budget does not trigger a new browser to start', async () => {
@@ -403,9 +379,9 @@ describe('TestScheduler', () => {
403379
await timeout(20);
404380

405381
const session7 = sessionManager.get('7')!;
406-
assert.equal(session7.browser, browsers[2][1]);
382+
assert.equal(session7.browser, browsers[2]);
407383
assert.equal(session7.status, SESSION_STATUS.SCHEDULED);
408-
assert.equal(browsers[2][0].startSession.mock.callCount(), 0);
384+
assert.equal(browsers[2].startSession.mock.callCount(), 0);
409385
});
410386

411387
it('finishing one browsers schedules a new browser', async () => {
@@ -424,9 +400,9 @@ describe('TestScheduler', () => {
424400
await timeout(20);
425401

426402
const session7 = sessionManager.get('7')!;
427-
assert.equal(session7.browser, browsers[2][1]);
403+
assert.equal(session7.browser, browsers[2]);
428404
assert.equal(session7.status, SESSION_STATUS.INITIALIZING);
429-
assert.equal(browsers[2][0].startSession.mock.callCount(), 2);
405+
assert.equal(browsers[2].startSession.mock.callCount(), 2);
430406
});
431407
});
432408
});

0 commit comments

Comments
 (0)