diff --git a/packages/test-runner-core/package.json b/packages/test-runner-core/package.json index f4f36f156d..80bf5e3404 100644 --- a/packages/test-runner-core/package.json +++ b/packages/test-runner-core/package.json @@ -33,8 +33,8 @@ }, "scripts": { "build": "tsc", - "test:node": "mocha test/**/*.test.ts --require ts-node/register --reporter dot", - "test:watch": "mocha test/**/*.test.ts --require ts-node/register --watch --watch-files src,test" + "test:node": "node --experimental-strip-types --test --test-force-exit test/**/*.test.ts", + "test:watch": "node --experimental-strip-types --test --test-force-exit --watch test/**/*.test.ts" }, "files": [ "*.d.ts", diff --git a/packages/test-runner-core/test/src/runner/TestRunner.test.ts b/packages/test-runner-core/test/src/runner/TestRunner.test.ts index 9471a71f11..68379f15af 100644 --- a/packages/test-runner-core/test/src/runner/TestRunner.test.ts +++ b/packages/test-runner-core/test/src/runner/TestRunner.test.ts @@ -1,52 +1,27 @@ -import * as hanbi from 'hanbi'; -import { expect } from 'chai'; -import portfinder from 'portfinder'; -import path from 'path'; - -import { BrowserLauncher } from '../../../src/browser-launcher/BrowserLauncher.js'; -import { TestRunnerCoreConfig } from '../../../src/config/TestRunnerCoreConfig.js'; -import { TestRunner } from '../../../src/runner/TestRunner.js'; -import { Logger } from '../../../src/logger/Logger.js'; -import { SESSION_STATUS } from '../../../src/test-session/TestSessionStatus.js'; -import { TestRunnerGroupConfig } from '../../../src/index.js'; +import assert from 'node:assert/strict'; +import path from 'node:path'; +import { describe, it, mock } from 'node:test'; -interface BrowserStubs { - stop: hanbi.Stub>; - startDebugSession: hanbi.Stub; - startSession: hanbi.Stub; - stopSession: hanbi.Stub; - isActive: hanbi.Stub; - getBrowserUrl: hanbi.Stub; -} +import portfinder from 'portfinder'; -function createBrowserStub(): [BrowserStubs, BrowserLauncher] { - const spies = { - stop: hanbi.spy(), - getBrowserUrl: hanbi.spy(), - startDebugSession: hanbi.spy(), - startSession: hanbi.spy(), - stopSession: hanbi.spy(), - isActive: hanbi.spy(), +import type { BrowserLauncher } from '../../../dist/browser-launcher/BrowserLauncher.js'; +import type { TestRunnerCoreConfig } from '../../../dist/config/TestRunnerCoreConfig.js'; +import { TestRunner } from '../../../dist/runner/TestRunner.js'; +import type { Logger } from '../../../dist/logger/Logger.js'; +import { SESSION_STATUS } from '../../../dist/test-session/TestSessionStatus.js'; +import type { TestRunnerGroupConfig } from '../../../dist/index.js'; + +function createBrowserStub(): BrowserLauncher { + return { + name: 'myBrowser', + type: 'myBrowser', + stop: mock.fn(() => Promise.resolve()), + getBrowserUrl: mock.fn(() => ''), + startDebugSession: mock.fn(() => Promise.resolve()), + startSession: mock.fn(() => Promise.resolve()), + stopSession: mock.fn(() => Promise.resolve({})), + isActive: mock.fn(() => true), }; - spies.stop.returns(Promise.resolve()); - spies.getBrowserUrl.returns(''); - spies.startDebugSession.returns(Promise.resolve()); - spies.startSession.returns(Promise.resolve()); - spies.stopSession.returns(Promise.resolve({})); - spies.isActive.returns(true); - return [ - spies, - { - name: 'myBrowser', - type: 'myBrowser', - stop: spies.stop.handler, - getBrowserUrl: spies.getBrowserUrl.handler, - startDebugSession: spies.startDebugSession.handler, - startSession: spies.startSession.handler, - stopSession: spies.stopSession.handler, - isActive: spies.isActive.handler, - }, - ]; } const logger: Logger = { @@ -67,15 +42,15 @@ async function createTestRunner( port: 9000 + Math.floor(Math.random() * 1000), }); - const [browserStubs, browser] = createBrowserStub(); + const browser = createBrowserStub(); - console.log(path.resolve(__dirname, '..', '..', '..', '..', '..')); + console.log(path.resolve(import.meta.dirname, '..', '..', '..', '..', '..')); const config: TestRunnerCoreConfig = { - files: [path.resolve(__dirname, '..', '..', 'fixtures', 'a.test.js')], + files: [path.resolve(import.meta.dirname, '..', '..', 'fixtures', 'a.test.js')], reporters: [], logger, - rootDir: path.resolve(__dirname, '..', '..', '..', '..', '..'), + rootDir: path.resolve(import.meta.dirname, '..', '..', '..', '..', '..'), testFramework: { path: 'my-framework.js' }, concurrentBrowsers: 2, concurrency: 10, @@ -94,24 +69,24 @@ async function createTestRunner( ...extraConfig, }; const runner = new TestRunner(config, groupConfigs); - return { runner, browser, browserStubs }; + return { runner, browser }; } describe('TestRunner', function () { it('can run a single test file', async () => { - const { runner, browserStubs } = await createTestRunner(); + const { runner, browser } = await createTestRunner(); await runner.start(); - expect(runner.started).to.equal(true, 'runner is started'); - expect(browserStubs.startSession.callCount).to.equal(1); + assert.equal(runner.started, true, 'runner is started'); + assert.equal(browser.startSession.mock.callCount(), 1); const sessions = Array.from(runner.sessions.all()); - expect(sessions.length).to.equal(1, 'one session is created'); + assert.equal(sessions.length, 1, 'one session is created'); await runner.stop(); }); it('closes test runner for a successful test', async () => { - const { runner, browserStubs } = await createTestRunner(); + const { runner, browser } = await createTestRunner(); let resolveStopped: (passed: boolean) => void; const stopped = new Promise(resolve => { resolveStopped = resolve; @@ -130,13 +105,13 @@ describe('TestRunner', function () { const passed = await stopped; - expect(browserStubs.stopSession.callCount).to.equal(1, 'browser session is stopped'); - expect(browserStubs.stop.callCount).to.equal(1, 'browser is stopped'); - expect(passed).to.equal(true, 'test runner quits with true'); + assert.equal(browser.stopSession.mock.callCount(), 1, 'browser session is stopped'); + assert.equal(browser.stop.mock.callCount(), 1, 'browser is stopped'); + assert.equal(passed, true, 'test runner quits with true'); }); it('closes test runner for a failed test', async () => { - const { runner, browserStubs } = await createTestRunner(); + const { runner, browser } = await createTestRunner(); let resolveStopped: (passed: boolean) => void; const stopped = new Promise(resolve => { resolveStopped = resolve; @@ -154,9 +129,9 @@ describe('TestRunner', function () { runner.sessions.updateStatus({ ...sessions[0], passed: false }, SESSION_STATUS.TEST_FINISHED); const passed = await stopped; - expect(browserStubs.stopSession.callCount).to.equal(1, 'browser session is stopped'); - expect(browserStubs.stop.callCount).to.equal(1, 'browser is stopped'); - expect(passed).to.equal(false, 'test runner quits with false'); + assert.equal(browser.stopSession.mock.callCount(), 1, 'browser session is stopped'); + assert.equal(browser.stop.mock.callCount(), 1, 'browser is stopped'); + assert.equal(passed, false, 'test runner quits with false'); }); describe('groups', () => { @@ -164,18 +139,18 @@ describe('TestRunner', function () { const { runner } = await createTestRunner(undefined, [ { name: 'a', - files: [path.join(__dirname, '..', '..', 'fixtures', 'group-a', '*.test.js')], + files: [path.join(import.meta.dirname, '..', '..', 'fixtures', 'group-a', '*.test.js')], }, ]); const sessions = Array.from(runner.sessions.all()); - expect(sessions.length).to.equal(3); - expect(sessions.filter(s => s.group.name === 'default').length).to.equal(1); - expect(sessions.filter(s => s.group.name === 'a').length).to.equal(2); + assert.equal(sessions.length, 3); + assert.equal(sessions.filter(s => s.group.name === 'default').length, 1); + assert.equal(sessions.filter(s => s.group.name === 'a').length, 2); }); it('can create a group with a custom browser, inheriting test files', async () => { - const [, groupBrowser] = createBrowserStub(); + const groupBrowser = createBrowserStub(); const { browser, runner } = await createTestRunner(undefined, [ { name: 'a', @@ -184,15 +159,15 @@ describe('TestRunner', function () { ]); const sessions = Array.from(runner.sessions.all()); - expect(sessions.length).to.equal(2); - expect(sessions.filter(s => s.group.name === 'default').length).to.equal(1); - expect(sessions.filter(s => s.group.name === 'a').length).to.equal(1); + assert.equal(sessions.length, 2); + assert.equal(sessions.filter(s => s.group.name === 'default').length, 1); + assert.equal(sessions.filter(s => s.group.name === 'a').length, 1); const sessionDefault = sessions.find(s => s.group.name === 'default')!; const sessionA = sessions.find(s => s.group.name === 'a')!; - expect(sessionDefault.testFile).to.equal(sessionA.testFile); - expect(sessionDefault.browser).to.equal(browser); - expect(sessionA.browser).to.equal(groupBrowser); + assert.equal(sessionDefault.testFile, sessionA.testFile); + assert.equal(sessionDefault.browser, browser); + assert.equal(sessionA.browser, groupBrowser); }); it('can create test groups inheriting browser', async () => { @@ -203,28 +178,28 @@ describe('TestRunner', function () { [ { name: 'a', - files: [path.join(__dirname, '..', '..', 'fixtures', 'group-a', '*.test.js')], + files: [path.join(import.meta.dirname, '..', '..', 'fixtures', 'group-a', '*.test.js')], }, { name: 'b', - files: [path.join(__dirname, '..', '..', 'fixtures', 'group-b', '*.test.js')], + files: [path.join(import.meta.dirname, '..', '..', 'fixtures', 'group-b', '*.test.js')], }, { name: 'c', - files: [path.join(__dirname, '..', '..', 'fixtures', 'group-c', '*.test.js')], + files: [path.join(import.meta.dirname, '..', '..', 'fixtures', 'group-c', '*.test.js')], }, ], ); const sessions = Array.from(runner.sessions.all()); - expect(sessions.length).to.equal(6); - expect(sessions.filter(s => s.group.name === 'a').length).to.equal(2); - expect(sessions.filter(s => s.group.name === 'b').length).to.equal(2); - expect(sessions.filter(s => s.group.name === 'c').length).to.equal(2); + assert.equal(sessions.length, 6); + assert.equal(sessions.filter(s => s.group.name === 'a').length, 2); + assert.equal(sessions.filter(s => s.group.name === 'b').length, 2); + assert.equal(sessions.filter(s => s.group.name === 'c').length, 2); }); it('can create test groups with custom browsers', async () => { - const [, browserB] = createBrowserStub(); + const browserB = createBrowserStub(); const { browser, runner } = await createTestRunner( { files: undefined, @@ -232,20 +207,24 @@ describe('TestRunner', function () { [ { name: 'a', - files: [path.join(__dirname, '..', '..', 'fixtures', 'group-a', 'a-1.test.js')], + files: [ + path.join(import.meta.dirname, '..', '..', 'fixtures', 'group-a', 'a-1.test.js'), + ], }, { name: 'b', browsers: [browserB], - files: [path.join(__dirname, '..', '..', 'fixtures', 'group-b', 'b-1.test.js')], + files: [ + path.join(import.meta.dirname, '..', '..', 'fixtures', 'group-b', 'b-1.test.js'), + ], }, ], ); const sessions = Array.from(runner.sessions.all()); - expect(sessions.length).to.equal(2); - expect(sessions.find(s => s.group.name === 'a')!.browser).to.equal(browser); - expect(sessions.find(s => s.group.name === 'b')!.browser).to.equal(browserB); + assert.equal(sessions.length, 2); + assert.equal(sessions.find(s => s.group.name === 'a')!.browser, browser); + assert.equal(sessions.find(s => s.group.name === 'b')!.browser, browserB); }); it('can ignore files via string[] globs', async () => { @@ -255,8 +234,9 @@ describe('TestRunner', function () { }); const sessions = Array.from(runner.sessions.all()); - const allFiles = sessions.flatMap(x => path.relative(__dirname, x.testFile)); - expect(allFiles).to.deep.equal( + const allFiles = sessions.flatMap(x => path.relative(import.meta.dirname, x.testFile)); + assert.deepEqual( + allFiles, [ '../../fixtures/a.test.js', '../../fixtures/group-a/a-1.test.js', diff --git a/packages/test-runner-core/test/src/runner/TestScheduler.test.ts b/packages/test-runner-core/test/src/runner/TestScheduler.test.ts index 5433c76613..240e257788 100644 --- a/packages/test-runner-core/test/src/runner/TestScheduler.test.ts +++ b/packages/test-runner-core/test/src/runner/TestScheduler.test.ts @@ -1,27 +1,18 @@ -import { expect } from 'chai'; -import * as hanbi from 'hanbi'; +import assert from 'node:assert/strict'; +import { describe, it, beforeEach, mock } from 'node:test'; -import { BrowserLauncher } from '../../../src/browser-launcher/BrowserLauncher.js'; +import type { BrowserLauncher } from '../../../dist/browser-launcher/BrowserLauncher.js'; -import { TestRunnerCoreConfig } from '../../../src/config/TestRunnerCoreConfig.js'; -import { TestScheduler } from '../../../src/runner/TestScheduler.js'; -import { TestSession } from '../../../src/test-session/TestSession.js'; -import { TestSessionManager } from '../../../src/test-session/TestSessionManager.js'; -import { SESSION_STATUS } from '../../../src/test-session/TestSessionStatus.js'; +import type { TestRunnerCoreConfig } from '../../../dist/config/TestRunnerCoreConfig.js'; +import { TestScheduler } from '../../../dist/runner/TestScheduler.js'; +import type { TestSession } from '../../../dist/test-session/TestSession.js'; +import { TestSessionManager } from '../../../dist/test-session/TestSessionManager.js'; +import { SESSION_STATUS } from '../../../dist/test-session/TestSessionStatus.js'; function timeout(ms = 0): Promise { return new Promise(r => setTimeout(r, ms)); } -interface BrowserStubs { - stop: hanbi.Stub>; - startDebugSession: hanbi.Stub; - startSession: hanbi.Stub; - stopSession: hanbi.Stub; - isActive: hanbi.Stub; - getBrowserUrl: hanbi.Stub; -} - describe('TestScheduler', () => { let mockConfig: TestRunnerCoreConfig; @@ -33,34 +24,17 @@ describe('TestScheduler', () => { } as Partial as TestSession; } - function createBrowserStub(name: string): [BrowserStubs, BrowserLauncher] { - const spies = { - stop: hanbi.spy(), - startDebugSession: hanbi.spy(), - startSession: hanbi.spy(), - stopSession: hanbi.spy(), - isActive: hanbi.spy(), - getBrowserUrl: hanbi.spy(), + function createBrowserStub(name: string): BrowserLauncher { + return { + name, + type: name, + stop: mock.fn(() => timeout(1)), + startDebugSession: mock.fn(() => timeout(1)), + startSession: mock.fn(() => timeout(1)), + stopSession: mock.fn(() => timeout(1).then(() => ({ testCoverage: {} }))), + isActive: mock.fn(() => true), + getBrowserUrl: mock.fn(() => ''), }; - spies.stop.returns(timeout(1)); - spies.startDebugSession.returns(timeout(1)); - spies.startSession.returns(timeout(1)); - spies.stopSession.returns(timeout(1).then(() => ({ testCoverage: {} }))); - spies.isActive.returns(true); - spies.getBrowserUrl.returns(''); - return [ - spies, - { - name, - type: name, - stop: spies.stop.handler, - startDebugSession: spies.startDebugSession.handler, - startSession: spies.startSession.handler, - stopSession: spies.stopSession.handler, - isActive: spies.isActive.handler, - getBrowserUrl: spies.getBrowserUrl.handler, - }, - ]; } beforeEach(() => { @@ -88,8 +62,8 @@ describe('TestScheduler', () => { function createTestFixture( ...ids: string[] - ): [TestScheduler, TestSessionManager, TestSession[], BrowserStubs] { - const [browserStubs, browser] = createBrowserStub('a'); + ): [TestScheduler, TestSessionManager, TestSession[], BrowserLauncher] { + const browser = createBrowserStub('a'); const sessions: TestSession[] = []; for (const id of ids) { const session = createSession({ id, browser }); @@ -97,62 +71,62 @@ describe('TestScheduler', () => { } const sessionManager = new TestSessionManager([], sessions); const scheduler = new TestScheduler(mockConfig, sessionManager, [browser]); - return [scheduler, sessionManager, sessions, browserStubs]; + return [scheduler, sessionManager, sessions, browser]; } describe('single browser', () => { it('scheduling a session starts the browser and marks initializing', async () => { - const [scheduler, sessions, [session1], stubs] = createTestFixture('1'); + const [scheduler, sessions, [session1], browser] = createTestFixture('1'); scheduler.schedule(1, [session1]); const finalSession1 = sessions.get(session1.id)!; - expect(finalSession1.status).to.equal(SESSION_STATUS.INITIALIZING); - expect(stubs.startSession.callCount).to.equal(1); + assert.equal(finalSession1.status, SESSION_STATUS.INITIALIZING); + assert.equal(browser.startSession.mock.callCount(), 1); }); it('when a session goes to status test finished, the browser is stopped and results is stored', async () => { - const [scheduler, sessions, [session1], stubs] = createTestFixture('1'); + const [scheduler, sessions, [session1], browser] = createTestFixture('1'); const testCoverage = {}; - stubs.stopSession.returns(timeout(1).then(() => ({ testCoverage }))); + browser.stopSession.mock.mockImplementation(() => timeout(1).then(() => ({ testCoverage }))); scheduler.schedule(1, [session1]); - await timeout(2); + await timeout(5); sessions.updateStatus({ ...session1, passed: true }, SESSION_STATUS.TEST_FINISHED); - await timeout(4); + await timeout(20); const finalSession1 = sessions.get(session1.id)!; - expect(finalSession1.status).to.equal(SESSION_STATUS.FINISHED); - expect(finalSession1.passed).to.equal(true); - expect(finalSession1.testCoverage).to.equal(testCoverage); + assert.equal(finalSession1.status, SESSION_STATUS.FINISHED); + assert.equal(finalSession1.passed, true); + assert.equal(finalSession1.testCoverage, testCoverage); }); it('batches test execution', async () => { const [scheduler, sessions, sessionsToSchedule] = createTestFixture('1', '2', '3'); scheduler.schedule(1, sessionsToSchedule); - expect(sessions.get('1')!.status).to.equal(SESSION_STATUS.INITIALIZING); - expect(sessions.get('2')!.status).to.equal(SESSION_STATUS.INITIALIZING); - expect(sessions.get('3')!.status).to.equal(SESSION_STATUS.SCHEDULED); + assert.equal(sessions.get('1')!.status, SESSION_STATUS.INITIALIZING); + assert.equal(sessions.get('2')!.status, SESSION_STATUS.INITIALIZING); + assert.equal(sessions.get('3')!.status, SESSION_STATUS.SCHEDULED); // wait for browser to start, session 3 should still not be started await timeout(2); - expect(sessions.get('3')!.status).to.equal(SESSION_STATUS.SCHEDULED); + assert.equal(sessions.get('3')!.status, SESSION_STATUS.SCHEDULED); // mark tests as finished sessions.updateStatus({ ...sessions.get('1')!, passed: true }, SESSION_STATUS.TEST_FINISHED); sessions.updateStatus({ ...sessions.get('2')!, passed: true }, SESSION_STATUS.TEST_FINISHED); // wait for browser to end - await timeout(4); + await timeout(20); // sessions 1 and 2 should be finished - expect(sessions.get('1')!.status).to.equal(SESSION_STATUS.FINISHED); - expect(sessions.get('1')!.passed).to.be.true; - expect(sessions.get('2')!.status).to.equal(SESSION_STATUS.FINISHED); - expect(sessions.get('2')!.passed).to.be.true; + assert.equal(sessions.get('1')!.status, SESSION_STATUS.FINISHED); + assert.equal(sessions.get('1')!.passed, true); + assert.equal(sessions.get('2')!.status, SESSION_STATUS.FINISHED); + assert.equal(sessions.get('2')!.passed, true); // session 3 should be started - expect(sessions.get('3')!.status).to.equal(SESSION_STATUS.INITIALIZING); + assert.equal(sessions.get('3')!.status, SESSION_STATUS.INITIALIZING); }); it('scheduling new tests while executing keeps batching', async () => { @@ -162,111 +136,112 @@ describe('TestScheduler', () => { // schedule 2 sessions scheduler.schedule(1, sessionsToSchedule.slice(0, 2)); - expect(sessions.get('1')!.status).to.equal(SESSION_STATUS.INITIALIZING); - expect(sessions.get('2')!.status).to.equal(SESSION_STATUS.INITIALIZING); + assert.equal(sessions.get('1')!.status, SESSION_STATUS.INITIALIZING); + assert.equal(sessions.get('2')!.status, SESSION_STATUS.INITIALIZING); // schedule 3 more sessions after browser starts - await timeout(4); + await timeout(20); scheduler.schedule(1, sessionsToSchedule.slice(2, 5)); - expect(sessions.get('1')!.status).to.equal(SESSION_STATUS.INITIALIZING); - expect(sessions.get('2')!.status).to.equal(SESSION_STATUS.INITIALIZING); - expect(sessions.get('3')!.status).to.equal(SESSION_STATUS.SCHEDULED); - expect(sessions.get('4')!.status).to.equal(SESSION_STATUS.SCHEDULED); - expect(sessions.get('5')!.status).to.equal(SESSION_STATUS.SCHEDULED); + assert.equal(sessions.get('1')!.status, SESSION_STATUS.INITIALIZING); + assert.equal(sessions.get('2')!.status, SESSION_STATUS.INITIALIZING); + assert.equal(sessions.get('3')!.status, SESSION_STATUS.SCHEDULED); + assert.equal(sessions.get('4')!.status, SESSION_STATUS.SCHEDULED); + assert.equal(sessions.get('5')!.status, SESSION_STATUS.SCHEDULED); // mark first test as finished sessions.updateStatus({ ...sessions.get('1')!, passed: true }, SESSION_STATUS.TEST_FINISHED); // wait for browser to end - await timeout(4); + await timeout(20); // session 1 is finished, session 2 is still waiting, session 3 is now starting and the rest is still scheduled - expect(sessions.get('1')!.status).to.equal(SESSION_STATUS.FINISHED); - expect(sessions.get('1')!.passed).to.be.true; - expect(sessions.get('2')!.status).to.equal(SESSION_STATUS.INITIALIZING); - expect(sessions.get('3')!.status).to.equal(SESSION_STATUS.INITIALIZING); - expect(sessions.get('4')!.status).to.equal(SESSION_STATUS.SCHEDULED); - expect(sessions.get('5')!.status).to.equal(SESSION_STATUS.SCHEDULED); + assert.equal(sessions.get('1')!.status, SESSION_STATUS.FINISHED); + assert.equal(sessions.get('1')!.passed, true); + assert.equal(sessions.get('2')!.status, SESSION_STATUS.INITIALIZING); + assert.equal(sessions.get('3')!.status, SESSION_STATUS.INITIALIZING); + assert.equal(sessions.get('4')!.status, SESSION_STATUS.SCHEDULED); + assert.equal(sessions.get('5')!.status, SESSION_STATUS.SCHEDULED); // mark 2 and 3 as finished - await timeout(2); + await timeout(5); sessions.updateStatus({ ...sessions.get('2')!, passed: true }, SESSION_STATUS.TEST_FINISHED); sessions.updateStatus({ ...sessions.get('3')!, passed: true }, SESSION_STATUS.TEST_FINISHED); // 2 and 3 finish when browser closes - await timeout(2); - expect(sessions.get('2')!.status).to.equal(SESSION_STATUS.FINISHED); - expect(sessions.get('3')!.status).to.equal(SESSION_STATUS.FINISHED); + await timeout(20); + assert.equal(sessions.get('2')!.status, SESSION_STATUS.FINISHED); + assert.equal(sessions.get('3')!.status, SESSION_STATUS.FINISHED); }); it('error while starting browser marks session as failed', async () => { - const [scheduler, sessions, [session1], stubs] = createTestFixture('1'); - stubs.startSession.callsFake(() => Promise.reject(new Error('mock error'))); + const [scheduler, sessions, [session1], browser] = createTestFixture('1'); + browser.startSession.mock.mockImplementation(() => Promise.reject(new Error('mock error'))); scheduler.schedule(1, [session1]); - await timeout(4); + await timeout(20); const finalSession1 = sessions.get(session1.id)!; - expect(finalSession1.status).to.equal(SESSION_STATUS.FINISHED); - expect(finalSession1.passed).to.equal(false); - expect(finalSession1.errors.length).to.equal(1); - expect(finalSession1.errors[0].message).to.equal('mock error'); + assert.equal(finalSession1.status, SESSION_STATUS.FINISHED); + assert.equal(finalSession1.passed, false); + assert.equal(finalSession1.errors.length, 1); + assert.equal(finalSession1.errors[0].message, 'mock error'); }); it('error while starting browser after a session changed state gets logged', async () => { - const errorStub = hanbi.stubMethod(mockConfig.logger, 'error'); - const [scheduler, sessions, [session1], stubs] = createTestFixture('1'); - stubs.startSession.returns( + const errorStub = mock.method(mockConfig.logger, 'error'); + const [scheduler, sessions, [session1], browser] = createTestFixture('1'); + browser.startSession.mock.mockImplementation(() => timeout(5).then(() => { throw new Error('mock error'); }), ); scheduler.schedule(1, [session1]); - await timeout(1); - sessions.updateStatus({ ...session1, passed: true }, SESSION_STATUS.TEST_FINISHED); await timeout(2); + sessions.updateStatus({ ...session1, passed: true }, SESSION_STATUS.TEST_FINISHED); + await timeout(5); const finalSession1 = sessions.get(session1.id)!; - expect(finalSession1.status).to.equal(SESSION_STATUS.FINISHED); - expect(finalSession1.passed).to.equal(true); + assert.equal(finalSession1.status, SESSION_STATUS.FINISHED); + assert.equal(finalSession1.passed, true); await timeout(20); - expect(errorStub.callCount).to.equal(1); - expect(errorStub.getCall(0).args[0]).to.an.instanceof(Error); - expect((errorStub.getCall(0).args[0] as Error).message).to.equal('mock error'); + assert.equal(errorStub.mock.callCount(), 1); + assert.ok(errorStub.mock.calls[0].arguments[0] instanceof Error); + assert.equal((errorStub.mock.calls[0].arguments[0] as Error).message, 'mock error'); }); it('error while stopping browser marks session as failed', async () => { - const [scheduler, sessions, [session1], stubs] = createTestFixture('1'); - stubs.stopSession.callsFake(() => Promise.reject(new Error('mock error'))); + const [scheduler, sessions, [session1], browser] = createTestFixture('1'); + browser.stopSession.mock.mockImplementation(() => Promise.reject(new Error('mock error'))); scheduler.schedule(1, [session1]); - await timeout(2); + await timeout(5); sessions.updateStatus({ ...session1, passed: true }, SESSION_STATUS.TEST_FINISHED); - await timeout(4); + await timeout(20); const finalSession1 = sessions.get(session1.id)!; - expect(finalSession1.status).to.equal(SESSION_STATUS.FINISHED); - expect(finalSession1.passed).to.equal(false); - expect(finalSession1.errors.length).to.equal(1); - expect(finalSession1.errors[0].message).to.equal('mock error'); + assert.equal(finalSession1.status, SESSION_STATUS.FINISHED); + assert.equal(finalSession1.passed, false); + assert.equal(finalSession1.errors.length, 1); + assert.equal(finalSession1.errors[0].message, 'mock error'); }); it('timeout starting the browser marks the session as failed', async () => { mockConfig.browserStartTimeout = 2; - const [scheduler, sessions, [session1], stubs] = createTestFixture('1'); - stubs.startSession.returns(timeout(4)); + const [scheduler, sessions, [session1], browser] = createTestFixture('1'); + browser.startSession.mock.mockImplementation(() => timeout(40)); scheduler.schedule(1, [session1]); - await timeout(3); + await timeout(20); const finalSession1 = sessions.get(session1.id)!; - expect(finalSession1.status).to.equal(SESSION_STATUS.FINISHED); - expect(finalSession1.passed).to.equal(false); - expect(finalSession1.errors.length).to.equal(1); - expect(finalSession1.errors[0].message).to.equal( + assert.equal(finalSession1.status, SESSION_STATUS.FINISHED); + assert.equal(finalSession1.passed, false); + assert.equal(finalSession1.errors.length, 1); + assert.equal( + finalSession1.errors[0].message, 'The browser was unable to create and start a test page after 2ms. You can increase this timeout with the browserStartTimeout option.', ); }); @@ -279,10 +254,11 @@ describe('TestScheduler', () => { await timeout(20); const finalSession1 = sessions.get(session1.id)!; - expect(finalSession1.status).to.equal(SESSION_STATUS.FINISHED); - expect(finalSession1.passed).to.equal(false); - expect(finalSession1.errors.length).to.equal(1); - expect(finalSession1.errors[0].message).to.equal( + assert.equal(finalSession1.status, SESSION_STATUS.FINISHED); + assert.equal(finalSession1.passed, false); + assert.equal(finalSession1.errors.length, 1); + assert.equal( + finalSession1.errors[0].message, 'Browser tests did not start after 2ms You can increase this timeout with the testsStartTimeout option. Check the browser logs or open the browser in debug mode for more information.', ); }); @@ -292,15 +268,16 @@ describe('TestScheduler', () => { const [scheduler, sessions, [session1]] = createTestFixture('1'); scheduler.schedule(1, [session1]); - await timeout(1); + await timeout(5); sessions.updateStatus({ ...session1, passed: true }, SESSION_STATUS.TEST_STARTED); - await timeout(4); + await timeout(20); const finalSession1 = sessions.get(session1.id)!; - expect(finalSession1.status).to.equal(SESSION_STATUS.FINISHED); - expect(finalSession1.passed).to.equal(false); - expect(finalSession1.errors.length).to.equal(1); - expect(finalSession1.errors[0].message).to.equal( + assert.equal(finalSession1.status, SESSION_STATUS.FINISHED); + assert.equal(finalSession1.passed, false); + assert.equal(finalSession1.errors.length, 1); + assert.equal( + finalSession1.errors[0].message, 'Browser tests did not finish within 2ms. You can increase this timeout with the testsFinishTimeout option. Check the browser logs or open the browser in debug mode for more information.', ); }); @@ -309,13 +286,13 @@ describe('TestScheduler', () => { describe('multi browsers', () => { function createTestFixture( fixtures: { name: string; ids: string[] }[], - ): [TestScheduler, TestSessionManager, Array<[BrowserStubs, BrowserLauncher]>, TestSession[]] { - const browsers: Array<[BrowserStubs, BrowserLauncher]> = []; + ): [TestScheduler, TestSessionManager, Array, TestSession[]] { + const browsers: Array = []; const sessions: TestSession[] = []; for (const fixture of fixtures) { - const [stubs, browser] = createBrowserStub(fixture.name); - browsers.push([stubs, browser]); + const browser = createBrowserStub(fixture.name); + browsers.push(browser); for (const id of fixture.ids) { const session = createSession({ id, browser }); @@ -324,11 +301,7 @@ describe('TestScheduler', () => { } const sessionManager = new TestSessionManager([], sessions); - const scheduler = new TestScheduler( - mockConfig, - sessionManager, - browsers.map(b => b[1]), - ); + const scheduler = new TestScheduler(mockConfig, sessionManager, browsers); return [scheduler, sessionManager, browsers, sessions]; } @@ -343,35 +316,35 @@ describe('TestScheduler', () => { const session1 = sessionManager.get('1')!; const session2 = sessionManager.get('2')!; const session3 = sessionManager.get('3')!; - expect(session1.browser).to.equal(browsers[0][1]); - expect(session2.browser).to.equal(browsers[0][1]); - expect(session3.browser).to.equal(browsers[0][1]); - expect(session1.status).to.equal(SESSION_STATUS.INITIALIZING); - expect(session2.status).to.equal(SESSION_STATUS.INITIALIZING); - expect(session3.status).to.equal(SESSION_STATUS.SCHEDULED); - expect(browsers[0][0].startSession.callCount).to.equal(2); + assert.equal(session1.browser, browsers[0]); + assert.equal(session2.browser, browsers[0]); + assert.equal(session3.browser, browsers[0]); + assert.equal(session1.status, SESSION_STATUS.INITIALIZING); + assert.equal(session2.status, SESSION_STATUS.INITIALIZING); + assert.equal(session3.status, SESSION_STATUS.SCHEDULED); + assert.equal(browsers[0].startSession.mock.callCount(), 2); const session4 = sessionManager.get('4')!; const session5 = sessionManager.get('5')!; const session6 = sessionManager.get('6')!; - expect(session4.browser).to.equal(browsers[1][1]); - expect(session5.browser).to.equal(browsers[1][1]); - expect(session6.browser).to.equal(browsers[1][1]); - expect(session4.status).to.equal(SESSION_STATUS.INITIALIZING); - expect(session5.status).to.equal(SESSION_STATUS.INITIALIZING); - expect(session6.status).to.equal(SESSION_STATUS.SCHEDULED); - expect(browsers[1][0].startSession.callCount).to.equal(2); + assert.equal(session4.browser, browsers[1]); + assert.equal(session5.browser, browsers[1]); + assert.equal(session6.browser, browsers[1]); + assert.equal(session4.status, SESSION_STATUS.INITIALIZING); + assert.equal(session5.status, SESSION_STATUS.INITIALIZING); + assert.equal(session6.status, SESSION_STATUS.SCHEDULED); + assert.equal(browsers[1].startSession.mock.callCount(), 2); const session7 = sessionManager.get('7')!; const session8 = sessionManager.get('8')!; const session9 = sessionManager.get('9')!; - expect(session7.browser).to.equal(browsers[2][1]); - expect(session8.browser).to.equal(browsers[2][1]); - expect(session9.browser).to.equal(browsers[2][1]); - expect(session7.status).to.equal(SESSION_STATUS.SCHEDULED); - expect(session8.status).to.equal(SESSION_STATUS.SCHEDULED); - expect(session9.status).to.equal(SESSION_STATUS.SCHEDULED); - expect(browsers[2][0].startSession.called).to.equal(false); + assert.equal(session7.browser, browsers[2]); + assert.equal(session8.browser, browsers[2]); + assert.equal(session9.browser, browsers[2]); + assert.equal(session7.status, SESSION_STATUS.SCHEDULED); + assert.equal(session8.status, SESSION_STATUS.SCHEDULED); + assert.equal(session9.status, SESSION_STATUS.SCHEDULED); + assert.equal(browsers[2].startSession.mock.callCount(), 0); }); it('finishing a test schedules a new one', async () => { @@ -382,14 +355,14 @@ describe('TestScheduler', () => { ]); scheduler.schedule(1, sessions); - await timeout(1); + await timeout(5); sessionManager.updateStatus({ ...sessions[0], passed: true }, SESSION_STATUS.TEST_FINISHED); - await timeout(4); + await timeout(20); const session3 = sessionManager.get('3')!; - expect(session3.browser).to.equal(browsers[0][1]); - expect(session3.status).to.equal(SESSION_STATUS.INITIALIZING); - expect(browsers[0][0].startSession.callCount).to.equal(3); + assert.equal(session3.browser, browsers[0]); + assert.equal(session3.status, SESSION_STATUS.INITIALIZING); + assert.equal(browsers[0].startSession.mock.callCount(), 3); }); it('overflow of concurrency budget does not trigger a new browser to start', async () => { @@ -400,15 +373,15 @@ describe('TestScheduler', () => { ]); scheduler.schedule(1, sessions); - await timeout(2); + await timeout(5); sessionManager.updateStatus({ ...sessions[0], passed: true }, SESSION_STATUS.TEST_FINISHED); sessionManager.updateStatus({ ...sessions[1], passed: true }, SESSION_STATUS.TEST_FINISHED); - await timeout(4); + await timeout(20); const session7 = sessionManager.get('7')!; - expect(session7.browser).to.equal(browsers[2][1]); - expect(session7.status).to.equal(SESSION_STATUS.SCHEDULED); - expect(browsers[2][0].startSession.called).to.equal(false); + assert.equal(session7.browser, browsers[2]); + assert.equal(session7.status, SESSION_STATUS.SCHEDULED); + assert.equal(browsers[2].startSession.mock.callCount(), 0); }); it('finishing one browsers schedules a new browser', async () => { @@ -419,17 +392,17 @@ describe('TestScheduler', () => { ]); scheduler.schedule(1, sessions); - await timeout(2); + await timeout(5); sessionManager.updateStatus({ ...sessions[0], passed: true }, SESSION_STATUS.TEST_FINISHED); sessionManager.updateStatus({ ...sessions[1], passed: true }, SESSION_STATUS.TEST_FINISHED); - await timeout(2); + await timeout(5); sessionManager.updateStatus({ ...sessions[2], passed: true }, SESSION_STATUS.TEST_FINISHED); - await timeout(4); + await timeout(20); const session7 = sessionManager.get('7')!; - expect(session7.browser).to.equal(browsers[2][1]); - expect(session7.status).to.equal(SESSION_STATUS.INITIALIZING); - expect(browsers[2][0].startSession.callCount).to.equal(2); + assert.equal(session7.browser, browsers[2]); + assert.equal(session7.status, SESSION_STATUS.INITIALIZING); + assert.equal(browsers[2].startSession.mock.callCount(), 2); }); }); });