diff --git a/packages/test-runner-core/package.json b/packages/test-runner-core/package.json index f4f36f156d..ef9de5f3af 100644 --- a/packages/test-runner-core/package.json +++ b/packages/test-runner-core/package.json @@ -33,8 +33,7 @@ }, "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" }, "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..404f2087d8 100644 --- a/packages/test-runner-core/test/src/runner/TestRunner.test.ts +++ b/packages/test-runner-core/test/src/runner/TestRunner.test.ts @@ -1,50 +1,45 @@ -import * as hanbi from 'hanbi'; -import { expect } from 'chai'; +import assert from 'node:assert/strict'; +import path from 'node:path'; +import { describe, it, mock } from 'node:test'; + 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 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'; interface BrowserStubs { - stop: hanbi.Stub>; - startDebugSession: hanbi.Stub; - startSession: hanbi.Stub; - stopSession: hanbi.Stub; - isActive: hanbi.Stub; - getBrowserUrl: hanbi.Stub; + stop: ReturnType; + startDebugSession: ReturnType; + startSession: ReturnType; + stopSession: ReturnType; + isActive: ReturnType; + getBrowserUrl: ReturnType; } function createBrowserStub(): [BrowserStubs, BrowserLauncher] { - const spies = { - stop: hanbi.spy(), - getBrowserUrl: hanbi.spy(), - startDebugSession: hanbi.spy(), - startSession: hanbi.spy(), - stopSession: hanbi.spy(), - isActive: hanbi.spy(), + const stubs: BrowserStubs = { + 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, + stubs, { 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, + stop: stubs.stop, + getBrowserUrl: stubs.getBrowserUrl, + startDebugSession: stubs.startDebugSession, + startSession: stubs.startSession, + stopSession: stubs.stopSession, + isActive: stubs.isActive, }, ]; } @@ -69,13 +64,13 @@ async function createTestRunner( const [browserStubs, 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, @@ -102,11 +97,11 @@ describe('TestRunner', function () { const { runner, browserStubs } = 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(browserStubs.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(); }); @@ -130,9 +125,9 @@ 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(browserStubs.stopSession.mock.callCount(), 1, 'browser session is stopped'); + assert.equal(browserStubs.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 () => { @@ -154,9 +149,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(browserStubs.stopSession.mock.callCount(), 1, 'browser session is stopped'); + assert.equal(browserStubs.stop.mock.callCount(), 1, 'browser is stopped'); + assert.equal(passed, false, 'test runner quits with false'); }); describe('groups', () => { @@ -164,14 +159,14 @@ 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 () => { @@ -184,15 +179,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,24 +198,24 @@ 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 () => { @@ -232,20 +227,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 +254,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..854336e493 100644 --- a/packages/test-runner-core/test/src/runner/TestScheduler.test.ts +++ b/packages/test-runner-core/test/src/runner/TestScheduler.test.ts @@ -1,25 +1,25 @@ -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; + stop: ReturnType; + startDebugSession: ReturnType; + startSession: ReturnType; + stopSession: ReturnType; + isActive: ReturnType; + getBrowserUrl: ReturnType; } describe('TestScheduler', () => { @@ -34,31 +34,25 @@ describe('TestScheduler', () => { } 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(), + const stubs: BrowserStubs = { + 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, + stubs, { 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, + stop: stubs.stop, + startDebugSession: stubs.startDebugSession, + startSession: stubs.startSession, + stopSession: stubs.stopSession, + isActive: stubs.isActive, + getBrowserUrl: stubs.getBrowserUrl, }, ]; } @@ -106,53 +100,53 @@ describe('TestScheduler', () => { 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(stubs.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 testCoverage = {}; - stubs.stopSession.returns(timeout(1).then(() => ({ testCoverage }))); + stubs.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 +156,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'))); + stubs.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 errorStub = mock.method(mockConfig.logger, 'error'); const [scheduler, sessions, [session1], stubs] = createTestFixture('1'); - stubs.startSession.returns( + stubs.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'))); + stubs.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)); + stubs.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 +274,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 +288,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.', ); }); @@ -343,35 +340,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][1]); + assert.equal(session2.browser, browsers[0][1]); + assert.equal(session3.browser, browsers[0][1]); + 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][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][1]); + assert.equal(session5.browser, browsers[1][1]); + assert.equal(session6.browser, browsers[1][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][0].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][1]); + assert.equal(session8.browser, browsers[2][1]); + assert.equal(session9.browser, browsers[2][1]); + 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][0].startSession.mock.callCount(), 0); }); it('finishing a test schedules a new one', async () => { @@ -382,14 +379,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][1]); + assert.equal(session3.status, SESSION_STATUS.INITIALIZING); + assert.equal(browsers[0][0].startSession.mock.callCount(), 3); }); it('overflow of concurrency budget does not trigger a new browser to start', async () => { @@ -400,15 +397,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][1]); + assert.equal(session7.status, SESSION_STATUS.SCHEDULED); + assert.equal(browsers[2][0].startSession.mock.callCount(), 0); }); it('finishing one browsers schedules a new browser', async () => { @@ -419,17 +416,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][1]); + assert.equal(session7.status, SESSION_STATUS.INITIALIZING); + assert.equal(browsers[2][0].startSession.mock.callCount(), 2); }); }); });