diff --git a/package-lock.json b/package-lock.json index 770cdad268..553ff1e647 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "testcafe", - "version": "3.4.0-rc.1", + "version": "3.4.0-rc.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "testcafe", - "version": "3.4.0-rc.1", + "version": "3.4.0-rc.2", "license": "MIT", "dependencies": { "@babel/core": "^7.23.2", diff --git a/package.json b/package.json index d882bfcc7f..8c4e043b9c 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "testcafe", "description": "Automated browser testing for the modern web development stack.", "license": "MIT", - "version": "3.4.0-rc.1", + "version": "3.4.0-rc.2", "author": { "name": "Developer Express Inc.", "url": "https://www.devexpress.com/" diff --git a/src/runner/browser-job.ts b/src/runner/browser-job.ts index 094ded2569..05e5dbb686 100644 --- a/src/runner/browser-job.ts +++ b/src/runner/browser-job.ts @@ -214,13 +214,17 @@ export default class BrowserJob extends AsyncEventEmitter { return this._testRunControllerQueue; } + private _getNextFixtureFirstTestIndex ( fixtureId: string ): number { + const nextFixtureFirstTestIndex = this._testRunControllerQueue.findIndex(testRun => testRun.test.fixture?.id !== fixtureId); + + return nextFixtureFirstTestIndex === -1 ? this._testRunControllerQueue.length : nextFixtureFirstTestIndex; + } + private _updateTestControllerQueues ({ test }: TestRunController, connectionId: string): void { if (!test.disableConcurrency || this._disableConcurrencyQueue[connectionId]?.length) return; - const lastIndexFixture = this._testRunControllerQueue.findIndex(el => el.test.fixture?.id !== test.fixture?.id); - - this._disableConcurrencyQueue[connectionId] = this._testRunControllerQueue.splice(0, lastIndexFixture); + this._disableConcurrencyQueue[connectionId] = this._testRunControllerQueue.splice(0, this._getNextFixtureFirstTestIndex(test.fixture?.id as string)); } // API diff --git a/test/functional/fixtures/regression/gh-2011/test.js b/test/functional/fixtures/regression/gh-2011/test.js index e4919cf98e..a73a9cae0e 100644 --- a/test/functional/fixtures/regression/gh-2011/test.js +++ b/test/functional/fixtures/regression/gh-2011/test.js @@ -1,8 +1,18 @@ -const path = require('path'); -const createTestCafe = require('../../../../../lib'); +const path = require('path'); +const createTestCafe = require('../../../../../lib'); +const { createReporter } = require('../../../utils/reporter'); +const { expect } = require('chai'); let testCafe = null; let runner = null; +let errors = null; + +const reporter = createReporter({ + reportTestDone (_, testRunInfo) { + errors = testRunInfo.errs; + }, +}); + const run = (pathToTest, concurrency) => { const src = path.join(__dirname, pathToTest); @@ -16,6 +26,7 @@ const run = (pathToTest, concurrency) => { return runner .src(src) .browsers(`chrome:headless`) + .reporter(reporter) .concurrency(concurrency) .run(); }) @@ -27,10 +38,17 @@ const run = (pathToTest, concurrency) => { describe('[Regression](GH-2011)', function () { it('Should execute all fixture\'s test with disableConcurrency in one browser', function () { - return run('./testcafe-fixtures/concurrency-mode-with-disable-concurrency-fixture-test.js', 3); + return run('./testcafe-fixtures/concurrency-mode-with-disable-concurrency-fixture-test.js', 3) + .then(() => expect(errors.length).eql(0)); }); it('Should execute all fixture\'s in different browser', function () { - return run('./testcafe-fixtures/concurrency-mode-with-disable-concurrency-fixture-all-test.js', 3); + return run('./testcafe-fixtures/concurrency-mode-with-disable-concurrency-fixture-all-test.js', 3) + .then(() => expect(errors.length).eql(0)); + }); + + it('Should execute all fixture\'s test in one browser', function () { + return run('./testcafe-fixtures/concurrency-mode-with-disable-concurrency-and-one-fixture-test.js', 3) + .then(() => expect(errors.length).eql(0)); }); }); diff --git a/test/functional/fixtures/regression/gh-2011/testcafe-fixtures/concurrency-mode-with-disable-concurrency-and-one-fixture-test.js b/test/functional/fixtures/regression/gh-2011/testcafe-fixtures/concurrency-mode-with-disable-concurrency-and-one-fixture-test.js new file mode 100644 index 0000000000..2a4f6cef2e --- /dev/null +++ b/test/functional/fixtures/regression/gh-2011/testcafe-fixtures/concurrency-mode-with-disable-concurrency-and-one-fixture-test.js @@ -0,0 +1,24 @@ +const connectionsFixture = {}; + +const addConnection = (connections, connectionId) => { + connections[connectionId] = true; +}; + +fixture `no concurrent fixture` + .beforeEach(async t => { + addConnection(connectionsFixture, t.testRun.browserConnection.id); + }) + .afterEach(async t => { + await t.expect(Object.keys(connectionsFixture).length).eql(1); + }) + .page `http://localhost:3000/fixtures/regression/gh-2011/pages/index.html` + .disableConcurrency(); + +test('long concurrent test 1', async t => { + await t.wait(5000); +}); + +for (let i = 0; i < 10; i++) { + test(`no concurrent test ${i}`, async () => { + }); +}