Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
024ec5b
WIP
kobenguyent Feb 20, 2024
4e28312
fix: more UTs
kobenguyent Feb 20, 2024
0cc967e
fix: more tests
kobenguyent Feb 21, 2024
f535d49
fix: more tests
kobenguyent Feb 21, 2024
33ccd9b
fix: more tests
kobenguyent Feb 22, 2024
41e22d3
fix: unit tests
kobenguyent Feb 22, 2024
2b404b0
fix: unit tests
kobenguyent Feb 22, 2024
462e1de
fix: output module
kobenguyent Feb 23, 2024
e46c79b
fix: runner tests
kobenguyent Feb 23, 2024
82d892b
fix: more runner tests
kobenguyent Feb 23, 2024
1c790ee
fix: more runner tests
kobenguyent Feb 23, 2024
2f1cfe6
Merge branch '3.x' into migrate-to-esm
kobenguyent Mar 6, 2024
8115f4a
fix: MockServer_test.js
kobenguyent Mar 6, 2024
c09919c
fix: more tests and export __dirname
kobenguyent Mar 7, 2024
afd5245
fix: more test/unit
kobenguyent Mar 7, 2024
733de43
fix: tryTo plugin
kobenguyent Mar 7, 2024
5b1f101
fix: tryTo plugin
kobenguyent Mar 7, 2024
9bea75d
fix: tryTo plugin
kobenguyent Mar 7, 2024
d55aaed
fix: tryTo plugin
kobenguyent Mar 7, 2024
f4129b1
fix: fixDefFiles.js
kobenguyent Mar 7, 2024
81c103d
fix: bdd_test
kobenguyent Mar 11, 2024
ac57fea
merged with 3.x branch
kobenguyent Mar 30, 2024
37d4c21
try to fix plugin tests
kobenguyent Mar 30, 2024
35584c4
bump monocart coverage version
kobenguyent Mar 31, 2024
9860591
fix: conflicts
kobenguyent Apr 2, 2024
0601089
fix: failed UTs
kobenguyent Apr 2, 2024
7cb26c7
fix tests
kobenguyent Apr 8, 2024
1c8318f
fix: help_test.js
kobenguyent Apr 19, 2024
fb98821
fix some dry-run tests
kobenguyent Apr 19, 2024
2b62f7b
fix conflict
kobenguyent Sep 23, 2024
79f012b
fix: soft expect helper tests
kobenguyent Sep 23, 2024
a7e5a76
fix: screenshotOnFail tests
kobenguyent Sep 23, 2024
8e2fc37
fix: codepcept-js code and types
kobenguyent Sep 23, 2024
6f5f03b
fix: gherkin_test and scenario stale test
kobenguyent Sep 23, 2024
b5f9f3a
fix: actions, playwright, pw_test, stepbystep report, webapi
kobenguyent Sep 23, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fix: unit tests
  • Loading branch information
kobenguyent committed Feb 22, 2024
commit 41e22d39e69aefbbf4b7c81829c61f5791c3eb10
20 changes: 10 additions & 10 deletions lib/command/workers/runTests.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
const tty = require('tty');
import tty from 'tty';
import { parentPort, workerData } from 'worker_threads';
import * as event from '../../event.js';
import Container from '../../container.js';
import { getConfig } from '../utils.js';
import { deepMerge, tryOrDefault } from '../../utils.js';
import Codecept from '../../codecept.js';

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

const { parentPort, workerData } = require('worker_threads');
const event = require('../../event.js');
const container = require('../../container.js');
const { getConfig } = require('../utils.js');
const { tryOrDefault, deepMerge } = require('../../utils.js');

// eslint-disable-next-line no-unused-vars
let stdout = '';
/* eslint-enable no-unused-vars */
const stderr = '';

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

const {
options, tests, testRoot, workerIndex,
Expand All @@ -37,7 +37,7 @@ const config = deepMerge(getConfig(options.config || testRoot), overrideConfigs)
const codecept = new Codecept(config, options);
codecept.init(testRoot);
codecept.loadTests();
const mocha = container.mocha();
const mocha = Container.mocha();
filterTests();

(async function () {
Expand Down Expand Up @@ -284,6 +284,6 @@ function sendToParentThread(data) {

function listenToParentThread() {
parentPort.on('message', (eventData) => {
container.append({ support: eventData.data });
Container.append({ support: eventData.data });
});
}
2 changes: 1 addition & 1 deletion lib/plugin/tryTo.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ export default function (config) {
return tryTo;
}

function tryTo(callback) {
export function tryTo(callback) {
let result = false;
return recorder.add('tryTo', () => {
recorder.session.start('tryTo');
Expand Down
5 changes: 2 additions & 3 deletions lib/recorder.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ export default {
* @api
* @inner
*/
start () {
start() {
debug('Starting recording promises');
running = true;
asyncErr = null;
Expand Down Expand Up @@ -171,7 +171,7 @@ export default {
* @return {Promise<*>}
* @inner
*/
async add(taskName, fn = undefined, force = false, retry = undefined, timeout = undefined) {
add(taskName, fn = undefined, force = false, retry = undefined, timeout = undefined) {
if (typeof taskName === 'function') {
fn = taskName;
taskName = fn.toString();
Expand Down Expand Up @@ -358,7 +358,6 @@ export default {
toString() {
return `Queue: ${currentQueue()}\n\nTasks: ${this.scheduled()}`;
},

};

function getTimeoutPromise(timeoutMs, taskName) {
Expand Down
44 changes: 20 additions & 24 deletions lib/scenario.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import recorder from './recorder.js';
import assertThrown from './assert/throws.js';
import { ucfirst, isAsyncFunction } from './utils.js';
import * as parser from './parser.js';
import container from './container.js';
import Container from './container.js';

export const injectHook = function (inject, suite) {
const injectHook = function (inject, suite) {
try {
inject();
} catch (err) {
Expand Down Expand Up @@ -34,24 +34,24 @@ export function test(test) {
test.timeout(0);
test.async = true;

test.fn = async function (done) {
recorder.errHandler(async (err) => {
test.fn = function (done) {
recorder.errHandler((err) => {
recorder.session.start('teardown');
recorder.cleanAsyncErr();
if (test.throws) { // check that test should actually fail
try {
assertThrown(err, test.throws);
event.emit(event.test.passed, test);
event.emit(event.test.finished, test);
await recorder.add(() => done());
recorder.add(() => done());
return;
} catch (newErr) {
err = newErr;
}
}
event.emit(event.test.failed, test, err);
event.emit(event.test.finished, test);
await recorder.add(() => done(err));
recorder.add(() => done(err));
});

if (isAsyncFunction(testFn)) {
Expand Down Expand Up @@ -82,9 +82,7 @@ export function test(test) {
event.emit(event.test.passed, test);
event.emit(event.test.finished, test);
});
recorder.add('finish test', () => {
done();
});
recorder.add('finish test', () => done());
recorder.catch();
}).catch(catchError);
return;
Expand All @@ -100,9 +98,7 @@ export function test(test) {
event.emit(event.test.passed, test);
event.emit(event.test.finished, test);
});
recorder.add('finish test', () => {
done();
});
recorder.add('finish test', () => done());
recorder.catch();
}
};
Expand All @@ -112,7 +108,7 @@ export function test(test) {
/**
* Injects arguments to function from controller
*/
export const injected = function (fn, suite, hookName) {
export function injected(fn, suite, hookName) {
return function (done) {
const errHandler = (err) => {
recorder.session.start('teardown');
Expand Down Expand Up @@ -169,7 +165,7 @@ export const injected = function (fn, suite, hookName) {
recorder.add('fire hook.failed', () => event.emit(event.hook.failed, suite, e));
});
};
};
}

/**
* Starts promise chain, so helpers could enqueue their hooks
Expand All @@ -181,31 +177,31 @@ export function setup(suite) {
}, suite);
}

export const teardown = function (suite) {
export function teardown(suite) {
return injectHook(() => {
recorder.startUnlessRunning();
event.emit(event.test.after, suite && suite.ctx && suite.ctx.currentTest);
}, suite);
};
}

export const suiteSetup = function (suite) {
export function suiteSetup(suite) {
return injectHook(() => {
recorder.startUnlessRunning();
event.emit(event.suite.before, suite);
}, suite);
};
}

export const suiteTeardown = function (suite) {
export function suiteTeardown(suite) {
return injectHook(() => {
recorder.startUnlessRunning();
event.emit(event.suite.after, suite);
}, suite);
};
}

export const getInjectedArguments = (fn, test) => {
export function getInjectedArguments(fn, test) {
const testArgs = {};
const params = parser.getParams(fn) || [];
const objects = container.support();
const objects = Container.support();
for (const key of params) {
testArgs[key] = {};
if (test && test.inject && test.inject[key]) {
Expand All @@ -216,8 +212,8 @@ export const getInjectedArguments = (fn, test) => {
if (!objects[key]) {
throw new Error(`Object of type ${key} is not defined in container`);
}
testArgs[key] = container.support(key);
testArgs[key] = Container.support(key);
}

return testArgs;
};
}
11 changes: 5 additions & 6 deletions lib/workers.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,14 @@ const createOutputDir = (configPath) => {
}
};

const populateGroups = (numberOfWorkers) => {
export function populateGroups(numberOfWorkers) {
const groups = [];
for (let i = 0; i < numberOfWorkers; i++) {
groups[i] = [];
}

return groups;
};
}

const createWorker = (workerObject) => {
const worker = new Worker(pathToWorker, {
Expand Down Expand Up @@ -146,9 +146,9 @@ const indexOfSmallestElement = (groups) => {
for (let j = 1; j < groups.length; j++) {
if (groups[j - 1].length > groups[j].length) {
i = j;
return i;
}
}
return i;
};

const convertToMochaTests = (testGroup) => {
Expand Down Expand Up @@ -453,7 +453,6 @@ export class Workers extends EventEmitter {
worker.on('exit', () => {
this.closedWorkers += 1;
if (this.closedWorkers === this.numberOfWorkers) {
console.log(this)
this._finishRun();
}
});
Expand All @@ -467,7 +466,7 @@ export class Workers extends EventEmitter {
process.exitCode = 0;
}
// removed this.finishedTests because in all /lib only first argument (!this.isFailed()) is used)
this.emit(event.all.result, !this.isFailed());
this.emit(event.all.result, { status: !this.isFailed(), stats: this.stats });
this.emit('end'); // internal event
}

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

output.result(this.stats.passes, this.stats.failures, this.stats.pending, ms(this.stats.duration));
output.result(cts.passes, this.stats.failures, this.stats.pending, ms(this.stats.duration));
process.env.RUNS_WITH_WORKERS = 'false';
}
}
9 changes: 7 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
"lint": "eslint bin/ examples/ lib/ test/ translations/ runok.js",
"lint-fix": "eslint bin/ examples/ lib/ test/ translations/ runok.js --fix",
"docs": "./runok.js docs",
"test:unit": "mocha test/unit --recursive --timeout 10000 --exit",
"test:unit": "mocha $(find test/unit -name '*.js' | grep workers --invert) --timeout 40000 --exit",
"test:runner": "mocha test/runner --recursive --timeout 10000 --exit",
"test": "npm run test:unit && npm run test:runner",
"test:appium-quick": "mocha test/helper/AppiumV2_test.js --grep 'quick'",
Expand All @@ -67,6 +67,7 @@
"prepare-release": "./runok.js versioning && ./runok.js get:commit-log"
},
"dependencies": {
"@babel/core": "^7.23.9",
"@codeceptjs/configure": "0.10.0",
"@codeceptjs/helper": "^2.0.3",
"@cucumber/cucumber-expressions": "17",
Expand All @@ -76,6 +77,7 @@
"acorn": "8.11.3",
"arrify": "2.0.1",
"axios": "1.6.7",
"babel-register-esm": "^1.2.5",
"chai": "5.0.3",
"chai-deep-match": "1.2.1",
"chai-exclude": "2.1.0",
Expand Down Expand Up @@ -105,6 +107,7 @@
"mkdirp": "1.0.4",
"mocha": "10.2.0",
"ms": "2.1.3",
"node-worker-threads-pool": "^1.5.1",
"openai": "3.2.1",
"ora-classic": "5.4.2",
"pactum": "3.6.0",
Expand All @@ -113,7 +116,9 @@
"promise-retry": "1.1.1",
"resq": "1.11.0",
"sprintf-js": "1.1.1",
"uuid": "9.0"
"uuid": "9.0",
"web-worker": "^1.3.0",
"worker-nodes": "^2.6.0"
},
"optionalDependencies": {
"@codeceptjs/detox-helper": "1.0.2"
Expand Down
2 changes: 1 addition & 1 deletion test/data/sandbox/codecept.customworker.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ export const config = {
helpers: {
FileSystem: {},
Workers: {
require: './workers_helper',
require: './workers_helper.js',
},
},
include: {},
Expand Down
2 changes: 0 additions & 2 deletions test/data/sandbox/custom-worker/base_test.worker.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
Feature('Workers');

Scenario('say something', ({ I }) => {
I.say('Hello Workers');
share({ fromWorker: true });
});

Scenario('glob current dir', ({ I }) => {
I.amInPath('.');
I.say('hello world');
I.seeFile('codecept.glob.js');
});
3 changes: 1 addition & 2 deletions test/data/sandbox/custom-worker/share_test.worker.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import assert from 'assert';
const assert = require('assert');

Feature('Shared Memory in Workers');

Scenario('Should get the data shared from main process', ({ I }) => {
I.say('Hello Workers');
const { fromMain } = inject();
console.log(fromMain);
assert.equal(fromMain, true);
});

Expand Down
3 changes: 2 additions & 1 deletion test/data/sandbox/workers_helper.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import assert from 'assert';
import { isMainThread } from 'worker_threads';
import Helper from '@codeceptjs/helper';

export default class Workers {
export default class Workers extends Helper {
seeThisIsWorker() {
assert(!isMainThread, 'this is running inside worker');
}
Expand Down
5 changes: 3 additions & 2 deletions test/unit/plugin/retryFailedStep_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,19 @@ describe('retryFailedStep', () => {
event.dispatcher.emit(event.step.finished, { });
});

it('should retry failed step', async () => {
it('should retry failed step', (done) => {
retryFailedStep({ retries: 2, minTimeout: 1 });
event.dispatcher.emit(event.test.before, {});
event.dispatcher.emit(event.step.started, { name: 'click' });

let counter = 0;
await recorder.add(() => {
recorder.add(() => {
counter++;
if (counter < 3) {
throw new Error();
}
}, undefined, undefined, true);
done();
return recorder.promise();
});

Expand Down
Loading