Skip to content

Commit 41e22d3

Browse files
committed
fix: unit tests
1 parent 33ccd9b commit 41e22d3

File tree

13 files changed

+91
-104
lines changed

13 files changed

+91
-104
lines changed

lib/command/workers/runTests.js

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
const tty = require('tty');
1+
import tty from 'tty';
2+
import { parentPort, workerData } from 'worker_threads';
3+
import * as event from '../../event.js';
4+
import Container from '../../container.js';
5+
import { getConfig } from '../utils.js';
6+
import { deepMerge, tryOrDefault } from '../../utils.js';
7+
import Codecept from '../../codecept.js';
28

39
if (!tty.getWindowSize) {
410
// this is really old method, long removed from Node, but Mocha
@@ -7,19 +13,13 @@ if (!tty.getWindowSize) {
713
tty.getWindowSize = () => [40, 80];
814
}
915

10-
const { parentPort, workerData } = require('worker_threads');
11-
const event = require('../../event.js');
12-
const container = require('../../container.js');
13-
const { getConfig } = require('../utils.js');
14-
const { tryOrDefault, deepMerge } = require('../../utils.js');
15-
1616
// eslint-disable-next-line no-unused-vars
1717
let stdout = '';
1818
/* eslint-enable no-unused-vars */
1919
const stderr = '';
2020

2121
// Requiring of Codecept need to be after tty.getWindowSize is available.
22-
const Codecept = require(process.env.CODECEPT_CLASS_PATH || '../../codecept.js);
22+
//const Codecept = importSync(process.env.CODECEPT_CLASS_PATH || '../../codecept.js');
2323

2424
const {
2525
options, tests, testRoot, workerIndex,
@@ -37,7 +37,7 @@ const config = deepMerge(getConfig(options.config || testRoot), overrideConfigs)
3737
const codecept = new Codecept(config, options);
3838
codecept.init(testRoot);
3939
codecept.loadTests();
40-
const mocha = container.mocha();
40+
const mocha = Container.mocha();
4141
filterTests();
4242

4343
(async function () {
@@ -284,6 +284,6 @@ function sendToParentThread(data) {
284284

285285
function listenToParentThread() {
286286
parentPort.on('message', (eventData) => {
287-
container.append({ support: eventData.data });
287+
Container.append({ support: eventData.data });
288288
});
289289
}

lib/plugin/tryTo.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export default function (config) {
7979
return tryTo;
8080
}
8181

82-
function tryTo(callback) {
82+
export function tryTo(callback) {
8383
let result = false;
8484
return recorder.add('tryTo', () => {
8585
recorder.session.start('tryTo');

lib/recorder.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export default {
4343
* @api
4444
* @inner
4545
*/
46-
start () {
46+
start() {
4747
debug('Starting recording promises');
4848
running = true;
4949
asyncErr = null;
@@ -171,7 +171,7 @@ export default {
171171
* @return {Promise<*>}
172172
* @inner
173173
*/
174-
async add(taskName, fn = undefined, force = false, retry = undefined, timeout = undefined) {
174+
add(taskName, fn = undefined, force = false, retry = undefined, timeout = undefined) {
175175
if (typeof taskName === 'function') {
176176
fn = taskName;
177177
taskName = fn.toString();
@@ -358,7 +358,6 @@ export default {
358358
toString() {
359359
return `Queue: ${currentQueue()}\n\nTasks: ${this.scheduled()}`;
360360
},
361-
362361
};
363362

364363
function getTimeoutPromise(timeoutMs, taskName) {

lib/scenario.js

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import recorder from './recorder.js';
44
import assertThrown from './assert/throws.js';
55
import { ucfirst, isAsyncFunction } from './utils.js';
66
import * as parser from './parser.js';
7-
import container from './container.js';
7+
import Container from './container.js';
88

9-
export const injectHook = function (inject, suite) {
9+
const injectHook = function (inject, suite) {
1010
try {
1111
inject();
1212
} catch (err) {
@@ -34,24 +34,24 @@ export function test(test) {
3434
test.timeout(0);
3535
test.async = true;
3636

37-
test.fn = async function (done) {
38-
recorder.errHandler(async (err) => {
37+
test.fn = function (done) {
38+
recorder.errHandler((err) => {
3939
recorder.session.start('teardown');
4040
recorder.cleanAsyncErr();
4141
if (test.throws) { // check that test should actually fail
4242
try {
4343
assertThrown(err, test.throws);
4444
event.emit(event.test.passed, test);
4545
event.emit(event.test.finished, test);
46-
await recorder.add(() => done());
46+
recorder.add(() => done());
4747
return;
4848
} catch (newErr) {
4949
err = newErr;
5050
}
5151
}
5252
event.emit(event.test.failed, test, err);
5353
event.emit(event.test.finished, test);
54-
await recorder.add(() => done(err));
54+
recorder.add(() => done(err));
5555
});
5656

5757
if (isAsyncFunction(testFn)) {
@@ -82,9 +82,7 @@ export function test(test) {
8282
event.emit(event.test.passed, test);
8383
event.emit(event.test.finished, test);
8484
});
85-
recorder.add('finish test', () => {
86-
done();
87-
});
85+
recorder.add('finish test', () => done());
8886
recorder.catch();
8987
}).catch(catchError);
9088
return;
@@ -100,9 +98,7 @@ export function test(test) {
10098
event.emit(event.test.passed, test);
10199
event.emit(event.test.finished, test);
102100
});
103-
recorder.add('finish test', () => {
104-
done();
105-
});
101+
recorder.add('finish test', () => done());
106102
recorder.catch();
107103
}
108104
};
@@ -112,7 +108,7 @@ export function test(test) {
112108
/**
113109
* Injects arguments to function from controller
114110
*/
115-
export const injected = function (fn, suite, hookName) {
111+
export function injected(fn, suite, hookName) {
116112
return function (done) {
117113
const errHandler = (err) => {
118114
recorder.session.start('teardown');
@@ -169,7 +165,7 @@ export const injected = function (fn, suite, hookName) {
169165
recorder.add('fire hook.failed', () => event.emit(event.hook.failed, suite, e));
170166
});
171167
};
172-
};
168+
}
173169

174170
/**
175171
* Starts promise chain, so helpers could enqueue their hooks
@@ -181,31 +177,31 @@ export function setup(suite) {
181177
}, suite);
182178
}
183179

184-
export const teardown = function (suite) {
180+
export function teardown(suite) {
185181
return injectHook(() => {
186182
recorder.startUnlessRunning();
187183
event.emit(event.test.after, suite && suite.ctx && suite.ctx.currentTest);
188184
}, suite);
189-
};
185+
}
190186

191-
export const suiteSetup = function (suite) {
187+
export function suiteSetup(suite) {
192188
return injectHook(() => {
193189
recorder.startUnlessRunning();
194190
event.emit(event.suite.before, suite);
195191
}, suite);
196-
};
192+
}
197193

198-
export const suiteTeardown = function (suite) {
194+
export function suiteTeardown(suite) {
199195
return injectHook(() => {
200196
recorder.startUnlessRunning();
201197
event.emit(event.suite.after, suite);
202198
}, suite);
203-
};
199+
}
204200

205-
export const getInjectedArguments = (fn, test) => {
201+
export function getInjectedArguments(fn, test) {
206202
const testArgs = {};
207203
const params = parser.getParams(fn) || [];
208-
const objects = container.support();
204+
const objects = Container.support();
209205
for (const key of params) {
210206
testArgs[key] = {};
211207
if (test && test.inject && test.inject[key]) {
@@ -216,8 +212,8 @@ export const getInjectedArguments = (fn, test) => {
216212
if (!objects[key]) {
217213
throw new Error(`Object of type ${key} is not defined in container`);
218214
}
219-
testArgs[key] = container.support(key);
215+
testArgs[key] = Container.support(key);
220216
}
221217

222218
return testArgs;
223-
};
219+
}

lib/workers.js

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,14 @@ const createOutputDir = (configPath) => {
4343
}
4444
};
4545

46-
const populateGroups = (numberOfWorkers) => {
46+
export function populateGroups(numberOfWorkers) {
4747
const groups = [];
4848
for (let i = 0; i < numberOfWorkers; i++) {
4949
groups[i] = [];
5050
}
5151

5252
return groups;
53-
};
53+
}
5454

5555
const createWorker = (workerObject) => {
5656
const worker = new Worker(pathToWorker, {
@@ -146,9 +146,9 @@ const indexOfSmallestElement = (groups) => {
146146
for (let j = 1; j < groups.length; j++) {
147147
if (groups[j - 1].length > groups[j].length) {
148148
i = j;
149-
return i;
150149
}
151150
}
151+
return i;
152152
};
153153

154154
const convertToMochaTests = (testGroup) => {
@@ -453,7 +453,6 @@ export class Workers extends EventEmitter {
453453
worker.on('exit', () => {
454454
this.closedWorkers += 1;
455455
if (this.closedWorkers === this.numberOfWorkers) {
456-
console.log(this)
457456
this._finishRun();
458457
}
459458
});
@@ -467,7 +466,7 @@ export class Workers extends EventEmitter {
467466
process.exitCode = 0;
468467
}
469468
// removed this.finishedTests because in all /lib only first argument (!this.isFailed()) is used)
470-
this.emit(event.all.result, !this.isFailed());
469+
this.emit(event.all.result, { status: !this.isFailed(), stats: this.stats });
471470
this.emit('end'); // internal event
472471
}
473472

@@ -497,7 +496,7 @@ export class Workers extends EventEmitter {
497496
this.failuresLog.forEach(log => output.print(...log));
498497
}
499498

500-
output.result(this.stats.passes, this.stats.failures, this.stats.pending, ms(this.stats.duration));
499+
output.result(cts.passes, this.stats.failures, this.stats.pending, ms(this.stats.duration));
501500
process.env.RUNS_WITH_WORKERS = 'false';
502501
}
503502
}

package.json

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
"lint": "eslint bin/ examples/ lib/ test/ translations/ runok.js",
4141
"lint-fix": "eslint bin/ examples/ lib/ test/ translations/ runok.js --fix",
4242
"docs": "./runok.js docs",
43-
"test:unit": "mocha test/unit --recursive --timeout 10000 --exit",
43+
"test:unit": "mocha $(find test/unit -name '*.js' | grep workers --invert) --timeout 40000 --exit",
4444
"test:runner": "mocha test/runner --recursive --timeout 10000 --exit",
4545
"test": "npm run test:unit && npm run test:runner",
4646
"test:appium-quick": "mocha test/helper/AppiumV2_test.js --grep 'quick'",
@@ -67,6 +67,7 @@
6767
"prepare-release": "./runok.js versioning && ./runok.js get:commit-log"
6868
},
6969
"dependencies": {
70+
"@babel/core": "^7.23.9",
7071
"@codeceptjs/configure": "0.10.0",
7172
"@codeceptjs/helper": "^2.0.3",
7273
"@cucumber/cucumber-expressions": "17",
@@ -76,6 +77,7 @@
7677
"acorn": "8.11.3",
7778
"arrify": "2.0.1",
7879
"axios": "1.6.7",
80+
"babel-register-esm": "^1.2.5",
7981
"chai": "5.0.3",
8082
"chai-deep-match": "1.2.1",
8183
"chai-exclude": "2.1.0",
@@ -105,6 +107,7 @@
105107
"mkdirp": "1.0.4",
106108
"mocha": "10.2.0",
107109
"ms": "2.1.3",
110+
"node-worker-threads-pool": "^1.5.1",
108111
"openai": "3.2.1",
109112
"ora-classic": "5.4.2",
110113
"pactum": "3.6.0",
@@ -113,7 +116,9 @@
113116
"promise-retry": "1.1.1",
114117
"resq": "1.11.0",
115118
"sprintf-js": "1.1.1",
116-
"uuid": "9.0"
119+
"uuid": "9.0",
120+
"web-worker": "^1.3.0",
121+
"worker-nodes": "^2.6.0"
117122
},
118123
"optionalDependencies": {
119124
"@codeceptjs/detox-helper": "1.0.2"

test/data/sandbox/codecept.customworker.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export const config = {
55
helpers: {
66
FileSystem: {},
77
Workers: {
8-
require: './workers_helper',
8+
require: './workers_helper.js',
99
},
1010
},
1111
include: {},
Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
Feature('Workers');
22

33
Scenario('say something', ({ I }) => {
4-
I.say('Hello Workers');
54
share({ fromWorker: true });
65
});
76

87
Scenario('glob current dir', ({ I }) => {
98
I.amInPath('.');
10-
I.say('hello world');
119
I.seeFile('codecept.glob.js');
1210
});

test/data/sandbox/custom-worker/share_test.worker.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
import assert from 'assert';
1+
const assert = require('assert');
22

33
Feature('Shared Memory in Workers');
44

55
Scenario('Should get the data shared from main process', ({ I }) => {
66
I.say('Hello Workers');
77
const { fromMain } = inject();
8-
console.log(fromMain);
98
assert.equal(fromMain, true);
109
});
1110

test/data/sandbox/workers_helper.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import assert from 'assert';
22
import { isMainThread } from 'worker_threads';
3+
import Helper from '@codeceptjs/helper';
34

4-
export default class Workers {
5+
export default class Workers extends Helper {
56
seeThisIsWorker() {
67
assert(!isMainThread, 'this is running inside worker');
78
}

0 commit comments

Comments
 (0)