@zohodesk/testinglibrary 0.4.48-experimental → 0.4.50-experimental
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitlab-ci.yml +2 -2
- package/README.md +1 -54
- package/build/bdd-framework/cli/commands/env.js +42 -0
- package/build/bdd-framework/cli/commands/export.js +62 -0
- package/build/bdd-framework/cli/commands/test.js +64 -0
- package/build/bdd-framework/cli/index.js +11 -0
- package/build/bdd-framework/cli/options.js +19 -0
- package/build/bdd-framework/cli/worker.js +13 -0
- package/build/bdd-framework/config/configDir.js +35 -0
- package/build/bdd-framework/config/enrichReporterData.js +23 -0
- package/build/bdd-framework/config/env.js +50 -0
- package/build/bdd-framework/config/index.js +94 -0
- package/build/bdd-framework/config/lang.js +14 -0
- package/build/bdd-framework/cucumber/buildStepDefinition.js +43 -0
- package/build/bdd-framework/cucumber/createTestStep.js +43 -0
- package/build/bdd-framework/cucumber/formatter/EventDataCollector.js +126 -0
- package/build/bdd-framework/cucumber/formatter/GherkinDocumentParser.js +72 -0
- package/build/bdd-framework/cucumber/formatter/PickleParser.js +25 -0
- package/build/bdd-framework/cucumber/formatter/durationHelpers.js +13 -0
- package/build/bdd-framework/cucumber/formatter/getColorFns.js +57 -0
- package/build/bdd-framework/cucumber/formatter/index.js +16 -0
- package/build/bdd-framework/cucumber/formatter/locationHelpers.js +16 -0
- package/build/bdd-framework/cucumber/loadConfig.js +17 -0
- package/build/bdd-framework/cucumber/loadFeatures.js +70 -0
- package/build/bdd-framework/cucumber/loadSnippetBuilder.js +20 -0
- package/build/bdd-framework/cucumber/loadSteps.js +47 -0
- package/build/bdd-framework/cucumber/resolveFeaturePaths.js +62 -0
- package/build/bdd-framework/cucumber/stepArguments.js +21 -0
- package/build/bdd-framework/cucumber/types.js +5 -0
- package/build/bdd-framework/cucumber/valueChecker.js +23 -0
- package/build/bdd-framework/decorators.js +18 -0
- package/build/bdd-framework/gen/fixtures.js +48 -0
- package/build/bdd-framework/gen/formatter.js +167 -0
- package/build/bdd-framework/gen/i18n.js +39 -0
- package/build/bdd-framework/gen/index.js +197 -0
- package/build/bdd-framework/gen/specialTags.js +70 -0
- package/build/bdd-framework/gen/testFile.js +470 -0
- package/build/bdd-framework/gen/testMeta.js +60 -0
- package/build/bdd-framework/gen/testNode.js +35 -0
- package/build/bdd-framework/gen/testPoms.js +133 -0
- package/build/bdd-framework/hooks/scenario.js +130 -0
- package/build/bdd-framework/hooks/worker.js +89 -0
- package/build/bdd-framework/index.js +52 -0
- package/build/bdd-framework/playwright/fixtureParameterNames.js +93 -0
- package/build/bdd-framework/playwright/getLocationInFile.js +79 -0
- package/build/bdd-framework/playwright/loadConfig.js +42 -0
- package/build/bdd-framework/playwright/loadUtils.js +33 -0
- package/build/bdd-framework/playwright/testTypeImpl.js +79 -0
- package/build/bdd-framework/playwright/transform.js +88 -0
- package/build/bdd-framework/playwright/types.js +12 -0
- package/build/bdd-framework/playwright/utils.js +56 -0
- package/build/bdd-framework/reporter/cucumber/base.js +52 -0
- package/build/bdd-framework/reporter/cucumber/custom.js +73 -0
- package/build/bdd-framework/reporter/cucumber/helper.js +12 -0
- package/build/bdd-framework/reporter/cucumber/html.js +40 -0
- package/build/bdd-framework/reporter/cucumber/index.js +74 -0
- package/build/bdd-framework/reporter/cucumber/json.js +312 -0
- package/build/bdd-framework/reporter/cucumber/junit.js +205 -0
- package/build/bdd-framework/reporter/cucumber/message.js +20 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/AttachmentMapper.js +82 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/Builder.js +197 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/GherkinDocument.js +43 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/GherkinDocumentClone.js +52 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/GherkinDocuments.js +105 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/Hook.js +70 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/Meta.js +45 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/Pickles.js +27 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/Projects.js +38 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestCase.js +128 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestCaseRun.js +154 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestCaseRunHooks.js +123 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestStepAttachments.js +67 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestStepRun.js +114 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/index.js +30 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/pwStepUtils.js +70 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/timing.js +35 -0
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/types.js +5 -0
- package/build/bdd-framework/run/StepInvoker.js +69 -0
- package/build/bdd-framework/run/bddData/index.js +59 -0
- package/build/bdd-framework/run/bddData/types.js +5 -0
- package/build/bdd-framework/run/bddFixtures.js +192 -0
- package/build/bdd-framework/run/bddWorld.js +79 -0
- package/build/bdd-framework/run/bddWorldInternal.js +11 -0
- package/build/bdd-framework/snippets/index.js +132 -0
- package/build/bdd-framework/snippets/snippetSyntax.js +43 -0
- package/build/bdd-framework/snippets/snippetSyntaxDecorators.js +26 -0
- package/build/bdd-framework/snippets/snippetSyntaxTs.js +18 -0
- package/build/bdd-framework/stepDefinitions/createBdd.js +66 -0
- package/build/bdd-framework/stepDefinitions/decorators/class.js +68 -0
- package/build/bdd-framework/stepDefinitions/decorators/steps.js +99 -0
- package/build/bdd-framework/stepDefinitions/defineStep.js +62 -0
- package/build/bdd-framework/stepDefinitions/stepConfig.js +24 -0
- package/build/bdd-framework/steps/createBdd.js +78 -0
- package/build/bdd-framework/steps/decorators/class.js +68 -0
- package/build/bdd-framework/steps/decorators/steps.js +98 -0
- package/build/bdd-framework/steps/defineStep.js +62 -0
- package/build/bdd-framework/steps/stepConfig.js +24 -0
- package/build/bdd-framework/utils/AutofillMap.js +20 -0
- package/build/bdd-framework/utils/exit.js +62 -0
- package/build/bdd-framework/utils/index.js +93 -0
- package/build/bdd-framework/utils/jsStringWrap.js +44 -0
- package/build/bdd-framework/utils/logger.js +30 -0
- package/build/bdd-framework/utils/stripAnsiEscapes.js +20 -0
- package/build/core/playwright/builtInFixtures/page.js +17 -32
- package/build/core/playwright/clear-caches.js +0 -7
- package/build/core/playwright/constants/fileMutexConfig.js +3 -9
- package/build/core/playwright/helpers/auth/loginSteps.js +2 -9
- package/build/core/playwright/helpers/configFileNameProvider.js +1 -1
- package/build/core/playwright/helpers/fileMutex.js +51 -28
- package/build/core/playwright/index.js +23 -10
- package/build/core/playwright/runner/SpawnRunner.js +2 -2
- package/build/core/playwright/setup/config-creator.js +8 -15
- package/build/core/playwright/setup/config-utils.js +25 -8
- package/build/core/playwright/tagProcessor.js +34 -22
- package/build/core/playwright/test-runner.js +2 -2
- package/build/decorators.d.ts +1 -1
- package/build/decorators.js +1 -1
- package/build/setup-folder-structure/samples/auth-setup-sample.js +68 -10
- package/build/setup-folder-structure/samples/authUsers-sample.json +9 -0
- package/build/setup-folder-structure/samples/env-config-sample.json +21 -0
- package/build/setup-folder-structure/samples/uat-config-sample.js +1 -3
- package/build/setup-folder-structure/setupProject.js +5 -22
- package/build/test/core/playwright/__tests__/tagProcessor.test.js +19 -18
- package/build/test/core/playwright/helpers/__tests__/configFileNameProvider.test.js +1 -1
- package/build/test/core/playwright/helpers/__tests__/fileMutex.test.js +64 -39
- package/npm-shrinkwrap.json +3342 -7679
- package/package.json +9 -11
- package/playwright.config.js +48 -0
- package/unit_reports/unit-report.html +260 -0
- package/build/core/playwright/fixtures.js +0 -24
- package/build/setup-folder-structure/samples/accountLogin-sample.js +0 -19
- package/build/setup-folder-structure/samples/actors-index.js +0 -2
- package/build/setup-folder-structure/samples/editions-index.js +0 -3
- package/build/setup-folder-structure/samples/free-sample.json +0 -25
- package/build/setup-folder-structure/samples/settings.json +0 -7
- package/build/setup-folder-structure/samples/testSetup-sample.js +0 -14
|
@@ -9,7 +9,6 @@ var _path = _interopRequireDefault(require("path"));
|
|
|
9
9
|
var _fileUtils = require("../../utils/fileUtils");
|
|
10
10
|
var _logger = require("../../utils/logger");
|
|
11
11
|
var _readConfigFile = require("./readConfigFile");
|
|
12
|
-
var _checkAuthDirectory = require("./helpers/checkAuthDirectory");
|
|
13
12
|
function deleteAuthFiles(authFilePath) {
|
|
14
13
|
authFilePath = _path.default.resolve(process.cwd(), authFilePath);
|
|
15
14
|
const authFileFolder = _path.default.dirname(authFilePath);
|
|
@@ -25,11 +24,6 @@ function deleteGeneratedFeatures() {
|
|
|
25
24
|
_logger.Logger.log(_logger.Logger.INFO_TYPE, `Deleting generated features at ${featuresGenPath}`);
|
|
26
25
|
(0, _fileUtils.deleteFolder)(featuresGenPath);
|
|
27
26
|
}
|
|
28
|
-
function deleteLockFiles() {
|
|
29
|
-
const lockFilePath = (0, _checkAuthDirectory.getLockDirectoryPath)();
|
|
30
|
-
_logger.Logger.log(_logger.Logger.INFO_TYPE, `Deleting lock files at ${lockFilePath}`);
|
|
31
|
-
(0, _fileUtils.deleteFolder)(lockFilePath);
|
|
32
|
-
}
|
|
33
27
|
function clearCaches() {
|
|
34
28
|
try {
|
|
35
29
|
const {
|
|
@@ -39,7 +33,6 @@ function clearCaches() {
|
|
|
39
33
|
deleteAuthFiles(authFilePath);
|
|
40
34
|
deletePlaywrightReport(reportPath);
|
|
41
35
|
deleteGeneratedFeatures();
|
|
42
|
-
deleteLockFiles();
|
|
43
36
|
_logger.Logger.log(_logger.Logger.SUCCESS_TYPE, 'Caches Cleared. Now you can try running npm run uat');
|
|
44
37
|
} catch (err) {
|
|
45
38
|
_logger.Logger.error(err);
|
|
@@ -3,13 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
retries: {
|
|
10
|
-
retries: 10,
|
|
11
|
-
factor: 1,
|
|
12
|
-
minTimeout: 10000,
|
|
13
|
-
maxTimeout: 20000
|
|
14
|
-
}
|
|
6
|
+
exports.fileDeletionTimeoutConfig = void 0;
|
|
7
|
+
const fileDeletionTimeoutConfig = exports.fileDeletionTimeoutConfig = {
|
|
8
|
+
timeout: 45000
|
|
15
9
|
};
|
|
@@ -21,16 +21,13 @@ async function performLoginSteps(testInfo, isLoggedIn, loginSteps) {
|
|
|
21
21
|
authFilePrefix = authFilePrefix || email;
|
|
22
22
|
const authFile = _path.default.resolve(_path.default.join((0, _checkAuthCookies.getAuthFileDirectory)(), `${authFilePrefix}-cookies.json`));
|
|
23
23
|
const lockFileName = email.replace(/[@.]/g, '_');
|
|
24
|
-
const fileMutex = new _fileMutex.default((0, _checkAuthDirectory.getLockDirectoryPath)(), lockFileName, _fileMutexConfig.
|
|
24
|
+
const fileMutex = new _fileMutex.default((0, _checkAuthDirectory.getLockDirectoryPath)(), lockFileName, email, authFile, _fileMutexConfig.fileDeletionTimeoutConfig);
|
|
25
25
|
try {
|
|
26
26
|
await fileMutex.acquire();
|
|
27
27
|
await (0, _checkAuthCookies.loadCookiesIfPresent)(page, authFile);
|
|
28
|
-
await page.goto(process.env.domain);
|
|
29
|
-
await Promise.race([page.waitForNavigation(), page.waitForLoadState('networkidle'), page.waitForTimeout(5000)]);
|
|
30
28
|
const isAlreadyLoggedIn = await isLoggedIn(testInfo);
|
|
31
29
|
if (!isAlreadyLoggedIn) {
|
|
32
30
|
await loginSteps(testInfo);
|
|
33
|
-
await page.goto(process.env.domain);
|
|
34
31
|
await isLoggedIn(testInfo);
|
|
35
32
|
await page.context().storageState({
|
|
36
33
|
path: authFile
|
|
@@ -39,11 +36,7 @@ async function performLoginSteps(testInfo, isLoggedIn, loginSteps) {
|
|
|
39
36
|
} catch (error) {
|
|
40
37
|
console.error(`Error during login for ${email}:`, error);
|
|
41
38
|
} finally {
|
|
42
|
-
|
|
43
|
-
await fileMutex.release();
|
|
44
|
-
} catch (releaseError) {
|
|
45
|
-
console.error(`Error releasing lock for ${email}:`, releaseError);
|
|
46
|
-
}
|
|
39
|
+
await fileMutex.release();
|
|
47
40
|
}
|
|
48
41
|
}
|
|
49
42
|
var _default = exports.default = performLoginSteps;
|
|
@@ -16,7 +16,7 @@ function getUATFileName(mode) {
|
|
|
16
16
|
if (_fs.default.existsSync(uatConfFilePath)) {
|
|
17
17
|
return uatConfFilePath;
|
|
18
18
|
}
|
|
19
|
-
return _path.default.resolve(process.cwd(), `uat
|
|
19
|
+
return _path.default.resolve(process.cwd(), `uat.config.js`);
|
|
20
20
|
}
|
|
21
21
|
function getEnvConfigFilePath(mode) {
|
|
22
22
|
const confFilePath = _path.default.resolve(process.cwd(), `uat/conf/${mode}/settings.json`);
|
|
@@ -6,48 +6,71 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.default = void 0;
|
|
8
8
|
var _path = _interopRequireDefault(require("path"));
|
|
9
|
-
var _properLockfile = _interopRequireDefault(require("proper-lockfile"));
|
|
10
9
|
var _fs = require("fs");
|
|
11
|
-
function _classPrivateMethodInitSpec(
|
|
12
|
-
function _checkPrivateRedeclaration(
|
|
13
|
-
function
|
|
14
|
-
var
|
|
10
|
+
function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); }
|
|
11
|
+
function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
|
|
12
|
+
function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; }
|
|
13
|
+
var _getLockFilePath = /*#__PURE__*/new WeakSet();
|
|
15
14
|
class FileMutex {
|
|
16
|
-
constructor(directory, lockFileName,
|
|
17
|
-
_classPrivateMethodInitSpec(this,
|
|
15
|
+
constructor(directory, lockFileName, email, authFile, fileDeletionTimeoutConfig) {
|
|
16
|
+
_classPrivateMethodInitSpec(this, _getLockFilePath);
|
|
18
17
|
this.directory = directory;
|
|
19
18
|
this.lockFileName = lockFileName + ".lock";
|
|
20
|
-
this.
|
|
19
|
+
this.email = email;
|
|
20
|
+
this.authFile = authFile;
|
|
21
|
+
this.fileDeletionTimeout = fileDeletionTimeoutConfig.timeout;
|
|
22
|
+
this.createDirectoryIfNotExist();
|
|
23
|
+
this.lockFilePath = _classPrivateMethodGet(this, _getLockFilePath, _getLockFilePath2).call(this);
|
|
21
24
|
}
|
|
22
25
|
async acquire() {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
if (!(0, _fs.existsSync)(lockFilePath)) {
|
|
27
|
-
console.log(`[DEBUG] Creating missing lock file:`, this.lockFileName);
|
|
28
|
-
(0, _fs.writeFileSync)(lockFilePath, 'locked');
|
|
29
|
-
}
|
|
30
|
-
await _properLockfile.default.lock(lockFilePath, this.options);
|
|
31
|
-
} catch (err) {
|
|
32
|
-
throw new Error(`Failed to acquire lock after ${this.options.retries.retries} attempts: ${err.message}`);
|
|
26
|
+
if ((0, _fs.existsSync)(this.authFile)) {
|
|
27
|
+
console.log(`${this.email} Cookie file exists. Loading cookies...`);
|
|
28
|
+
return;
|
|
33
29
|
}
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
if (!(0, _fs.existsSync)(this.lockFilePath)) {
|
|
32
|
+
(0, _fs.writeFileSync)(this.lockFilePath, 'locked');
|
|
33
|
+
console.log(`Lock file created: ${this.lockFilePath}`);
|
|
34
|
+
return resolve();
|
|
35
|
+
}
|
|
36
|
+
const timeout = setTimeout(() => {
|
|
37
|
+
watcher.close();
|
|
38
|
+
reject(new Error('Watch timeout exceeded'));
|
|
39
|
+
}, this.fileDeletionTimeout);
|
|
40
|
+
const watcher = (0, _fs.watch)(this.directory, (eventType, filename) => {
|
|
41
|
+
try {
|
|
42
|
+
if (eventType === 'rename' && filename === this.lockFileName) {
|
|
43
|
+
clearTimeout(timeout);
|
|
44
|
+
console.log(`Lock file deleted! Proceeding...`);
|
|
45
|
+
watcher.close();
|
|
46
|
+
resolve();
|
|
47
|
+
}
|
|
48
|
+
} catch (err) {
|
|
49
|
+
console.error(`Error watching for lock file deletion: ${err.message}`);
|
|
50
|
+
watcher.close();
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
});
|
|
34
54
|
}
|
|
35
55
|
async release() {
|
|
36
56
|
try {
|
|
37
|
-
|
|
57
|
+
if ((0, _fs.existsSync)(this.lockFilePath)) {
|
|
58
|
+
(0, _fs.unlinkSync)(this.lockFilePath);
|
|
59
|
+
console.log(`Lock file deleted: ${this.lockFilePath}`);
|
|
60
|
+
}
|
|
38
61
|
} catch (err) {
|
|
39
|
-
|
|
62
|
+
console.error(`Error deleting lock file: ${err.message}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async createDirectoryIfNotExist() {
|
|
66
|
+
if (!(0, _fs.existsSync)(this.directory)) {
|
|
67
|
+
(0, _fs.mkdirSync)(this.directory, {
|
|
68
|
+
recursive: true
|
|
69
|
+
});
|
|
40
70
|
}
|
|
41
71
|
}
|
|
42
72
|
}
|
|
43
|
-
function
|
|
73
|
+
function _getLockFilePath2() {
|
|
44
74
|
return _path.default.resolve(_path.default.join(this.directory, this.lockFileName));
|
|
45
75
|
}
|
|
46
|
-
function _createDirectoryIfNotExist() {
|
|
47
|
-
if (!(0, _fs.existsSync)(this.directory)) {
|
|
48
|
-
(0, _fs.mkdirSync)(this.directory, {
|
|
49
|
-
recursive: true
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
76
|
var _default = exports.default = FileMutex;
|
|
@@ -1,24 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
3
4
|
Object.defineProperty(exports, "__esModule", {
|
|
4
5
|
value: true
|
|
5
6
|
});
|
|
6
|
-
exports
|
|
7
|
-
Object.defineProperty(exports, "expect", {
|
|
7
|
+
Object.defineProperty(exports, "createBdd", {
|
|
8
8
|
enumerable: true,
|
|
9
9
|
get: function () {
|
|
10
|
-
return
|
|
10
|
+
return _bddFramework.createBdd;
|
|
11
11
|
}
|
|
12
12
|
});
|
|
13
|
-
Object.defineProperty(exports, "
|
|
13
|
+
Object.defineProperty(exports, "expect", {
|
|
14
14
|
enumerable: true,
|
|
15
15
|
get: function () {
|
|
16
|
-
return
|
|
16
|
+
return _test.expect;
|
|
17
17
|
}
|
|
18
18
|
});
|
|
19
|
-
|
|
19
|
+
exports.test = void 0;
|
|
20
|
+
var _bddFramework = require("../../bdd-framework");
|
|
20
21
|
var _test = require("@playwright/test");
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
var _readConfigFile = require("./readConfigFile");
|
|
23
|
+
var _builtInFixtures = _interopRequireDefault(require("./builtInFixtures"));
|
|
24
|
+
var _getUserFixtures = _interopRequireDefault(require("./helpers/getUserFixtures"));
|
|
25
|
+
const {
|
|
26
|
+
bddMode
|
|
27
|
+
} = (0, _readConfigFile.generateConfigFromFile)();
|
|
28
|
+
let base = bddMode ? _bddFramework.test : _test.test;
|
|
29
|
+
const buildInFixtures = (0, _builtInFixtures.default)(bddMode);
|
|
30
|
+
const buildInFixturesTest = base.extend({
|
|
31
|
+
...buildInFixtures
|
|
32
|
+
});
|
|
33
|
+
const userFixtures = (0, _getUserFixtures.default)();
|
|
34
|
+
const userFixturesTest = base.extend({
|
|
35
|
+
...userFixtures
|
|
36
|
+
});
|
|
37
|
+
const test = exports.test = (0, _test.mergeTests)(buildInFixturesTest, userFixturesTest);
|
|
@@ -33,9 +33,9 @@ class SpawnRunner extends _Runner.default {
|
|
|
33
33
|
const {
|
|
34
34
|
tagArgs
|
|
35
35
|
} = this.runnerObj;
|
|
36
|
-
const configPath = (0, _readConfigFile.isUserConfigFileAvailable)() ? _path.default.resolve(__dirname, '../', 'setup', 'config-creator.js') : _path.default.resolve(
|
|
36
|
+
const configPath = (0, _readConfigFile.isUserConfigFileAvailable)() ? _path.default.resolve(__dirname, '../', 'setup', 'config-creator.js') : _path.default.resolve('../', '../', '../', '../', 'playwrightConfig.js');
|
|
37
37
|
const beforeCommand = 'node';
|
|
38
|
-
const bddGenPath = _path.default.resolve(
|
|
38
|
+
const bddGenPath = _path.default.resolve(__dirname, '../', '../', '../', 'bdd-framework', 'cli', 'index.js');
|
|
39
39
|
const beforeArgs = [bddGenPath, '-c', require.resolve(configPath)];
|
|
40
40
|
if (tagArgs) {
|
|
41
41
|
beforeArgs.push('--tags');
|
|
@@ -25,8 +25,7 @@ const {
|
|
|
25
25
|
featureFilesFolder,
|
|
26
26
|
stepDefinitionsFolder,
|
|
27
27
|
testIdAttribute,
|
|
28
|
-
globalTimeout
|
|
29
|
-
customReporter
|
|
28
|
+
globalTimeout
|
|
30
29
|
} = uatConfig;
|
|
31
30
|
const projects = (0, _configUtils.getProjects)({
|
|
32
31
|
browsers,
|
|
@@ -40,21 +39,12 @@ const testDir = (0, _configUtils.getTestDir)(bddMode, process.cwd(), {
|
|
|
40
39
|
featureFilesFolder,
|
|
41
40
|
stepDefinitionsFolder
|
|
42
41
|
});
|
|
43
|
-
const
|
|
42
|
+
const testOptions = (0, _configUtils.getTestUseOptions)({
|
|
44
43
|
trace,
|
|
45
44
|
video,
|
|
46
45
|
viewport,
|
|
47
46
|
testIdAttribute
|
|
48
|
-
};
|
|
49
|
-
let reporter = [['html', {
|
|
50
|
-
outputFolder: reportPath,
|
|
51
|
-
open: openReportOn
|
|
52
|
-
}], ['list'], ['json', {
|
|
53
|
-
outputFile: _path.default.join(process.cwd(), 'uat', 'test-results', 'test-results.json')
|
|
54
|
-
}], ['./custom-reporter.js']];
|
|
55
|
-
if (customReporter) {
|
|
56
|
-
reporter = [customReporter, ...reporter];
|
|
57
|
-
}
|
|
47
|
+
});
|
|
58
48
|
|
|
59
49
|
/**
|
|
60
50
|
* Playwright configuration object
|
|
@@ -67,12 +57,15 @@ function getPlaywrightConfig() {
|
|
|
67
57
|
globalTimeout: globalTimeout || 3600000,
|
|
68
58
|
outputDir: _path.default.join(process.cwd(), 'uat', 'test-results'),
|
|
69
59
|
fullyParallel: true,
|
|
70
|
-
reporter,
|
|
60
|
+
reporter: [['html', {
|
|
61
|
+
outputFolder: reportPath,
|
|
62
|
+
open: openReportOn
|
|
63
|
+
}], ['list'], ['./custom-reporter.js']],
|
|
71
64
|
timeout: testTimeout,
|
|
72
65
|
expect: {
|
|
73
66
|
timeout: expectTimeout
|
|
74
67
|
},
|
|
75
|
-
use,
|
|
68
|
+
use: testOptions,
|
|
76
69
|
projects: isAuthMode ? [{
|
|
77
70
|
name: 'setup',
|
|
78
71
|
testMatch: /.*\.setup\.js/,
|
|
@@ -7,12 +7,14 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
exports.getBrowsersList = getBrowsersList;
|
|
8
8
|
exports.getProjects = getProjects;
|
|
9
9
|
exports.getTestDir = getTestDir;
|
|
10
|
+
exports.getTestUseOptions = getTestUseOptions;
|
|
10
11
|
var _test = require("@playwright/test");
|
|
11
12
|
var _path = _interopRequireDefault(require("path"));
|
|
12
13
|
var _readConfigFile = require("../readConfigFile");
|
|
13
|
-
var
|
|
14
|
+
var _bddFramework = require("../../../bdd-framework");
|
|
14
15
|
var _logger = require("../../../utils/logger");
|
|
15
16
|
var _browserTypes = require("../constants/browserTypes");
|
|
17
|
+
var _configFileNameProvider = require("../helpers/configFileNameProvider");
|
|
16
18
|
var _fileUtils = require("../../../utils/fileUtils");
|
|
17
19
|
/**
|
|
18
20
|
** Playwright project configuration
|
|
@@ -146,15 +148,30 @@ function getPathsForFeatureFiles(cwd) {
|
|
|
146
148
|
function getTestDir(bddMode, cwd, {
|
|
147
149
|
stepDefinitionsFolder
|
|
148
150
|
}) {
|
|
149
|
-
return bddMode ? (0,
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
importTestFrom: require.resolve('../fixtures.js'),
|
|
151
|
+
return bddMode ? (0, _bddFramework.defineBddConfig)({
|
|
152
|
+
paths: getPathsForFeatureFiles(cwd),
|
|
153
|
+
import: [_path.default.join(cwd, 'uat', '**', stepDefinitionsFolder, '*.spec.js')],
|
|
153
154
|
featuresRoot: _path.default.join(cwd, 'uat'),
|
|
154
155
|
outputDir: _path.default.join(cwd, 'uat', '.features-gen'),
|
|
155
|
-
disableWarnings: {
|
|
156
|
-
importTestFrom: true
|
|
157
|
-
},
|
|
158
156
|
publish: true
|
|
159
157
|
}) : _path.default.join(cwd, 'uat');
|
|
158
|
+
}
|
|
159
|
+
function getTestUseOptions({
|
|
160
|
+
viewport,
|
|
161
|
+
trace,
|
|
162
|
+
video,
|
|
163
|
+
testIdAttribute
|
|
164
|
+
}) {
|
|
165
|
+
let defaultTestuseOptions = {
|
|
166
|
+
viewport,
|
|
167
|
+
testIdAttribute,
|
|
168
|
+
trace: trace ? 'on' : 'off',
|
|
169
|
+
video: video ? {
|
|
170
|
+
mode: 'on',
|
|
171
|
+
size: {
|
|
172
|
+
...viewport
|
|
173
|
+
}
|
|
174
|
+
} : 'off'
|
|
175
|
+
};
|
|
176
|
+
return defaultTestuseOptions;
|
|
160
177
|
}
|
|
@@ -1,50 +1,62 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _logger = require("../../utils/logger");
|
|
4
|
-
function _classPrivateMethodInitSpec(
|
|
5
|
-
function _checkPrivateRedeclaration(
|
|
6
|
-
function
|
|
7
|
-
var
|
|
4
|
+
function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); }
|
|
5
|
+
function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
|
|
6
|
+
function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; }
|
|
7
|
+
var _buildTagsString = /*#__PURE__*/new WeakSet();
|
|
8
|
+
var _parseEdition = /*#__PURE__*/new WeakSet();
|
|
9
|
+
var _processSingleEdition = /*#__PURE__*/new WeakSet();
|
|
10
|
+
var _processMultipleEditions = /*#__PURE__*/new WeakSet();
|
|
11
|
+
var _getEditionArgs = /*#__PURE__*/new WeakSet();
|
|
12
|
+
var _buildEditionTags = /*#__PURE__*/new WeakSet();
|
|
8
13
|
class TagProcessor {
|
|
9
14
|
constructor(editionOrder) {
|
|
10
|
-
_classPrivateMethodInitSpec(this,
|
|
15
|
+
_classPrivateMethodInitSpec(this, _buildEditionTags);
|
|
16
|
+
_classPrivateMethodInitSpec(this, _getEditionArgs);
|
|
17
|
+
_classPrivateMethodInitSpec(this, _processMultipleEditions);
|
|
18
|
+
_classPrivateMethodInitSpec(this, _processSingleEdition);
|
|
19
|
+
_classPrivateMethodInitSpec(this, _parseEdition);
|
|
20
|
+
_classPrivateMethodInitSpec(this, _buildTagsString);
|
|
11
21
|
this.editionOrder = editionOrder;
|
|
12
22
|
}
|
|
13
|
-
processTags(
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
23
|
+
processTags(config) {
|
|
24
|
+
const {
|
|
25
|
+
tags,
|
|
26
|
+
edition
|
|
27
|
+
} = config.getAll();
|
|
28
|
+
if (!edition) return tags;
|
|
17
29
|
const editionsArray = edition.split(',');
|
|
18
|
-
const editionTags = editionsArray.length === 1 ?
|
|
30
|
+
const editionTags = editionsArray.length === 1 ? _classPrivateMethodGet(this, _processSingleEdition, _processSingleEdition2).call(this, editionsArray[0], tags) : _classPrivateMethodGet(this, _processMultipleEditions, _processMultipleEditions2).call(this, editionsArray, tags);
|
|
19
31
|
return editionTags;
|
|
20
32
|
}
|
|
21
33
|
}
|
|
22
|
-
function
|
|
34
|
+
function _buildTagsString2(tags, editionTags) {
|
|
23
35
|
return tags && tags !== '' ? `${tags} and not (${editionTags})` : `not (${editionTags})`;
|
|
24
36
|
}
|
|
25
|
-
function
|
|
37
|
+
function _parseEdition2(edition) {
|
|
26
38
|
if (edition.startsWith('<=')) return ['<=', edition.slice(2)];
|
|
27
39
|
if (edition.startsWith('>=')) return ['>=', edition.slice(2)];
|
|
28
40
|
if (edition.startsWith('<')) return ['<', edition.slice(1)];
|
|
29
41
|
if (edition.startsWith('>')) return ['>', edition.slice(1)];
|
|
30
42
|
return [null, edition];
|
|
31
43
|
}
|
|
32
|
-
function
|
|
33
|
-
const editionArgs =
|
|
44
|
+
function _processSingleEdition2(selectedEdition, tagArgs) {
|
|
45
|
+
const editionArgs = _classPrivateMethodGet(this, _getEditionArgs, _getEditionArgs2).call(this, selectedEdition);
|
|
34
46
|
if (editionArgs && editionArgs.length > 0) {
|
|
35
|
-
const editionTags =
|
|
36
|
-
return
|
|
47
|
+
const editionTags = _classPrivateMethodGet(this, _buildEditionTags, _buildEditionTags2).call(this, editionArgs, 'or');
|
|
48
|
+
return _classPrivateMethodGet(this, _buildTagsString, _buildTagsString2).call(this, tagArgs, editionTags);
|
|
37
49
|
}
|
|
38
50
|
_logger.Logger.log(_logger.Logger.INFO_TYPE, `No matching editions for ${selectedEdition} found. Running with default edition`);
|
|
39
51
|
return tagArgs;
|
|
40
52
|
}
|
|
41
|
-
function
|
|
53
|
+
function _processMultipleEditions2(editionsArray, tagArgs) {
|
|
42
54
|
const filteredEditions = this.editionOrder.filter(edition => !editionsArray.includes(edition));
|
|
43
|
-
const editionTags =
|
|
44
|
-
return
|
|
55
|
+
const editionTags = _classPrivateMethodGet(this, _buildEditionTags, _buildEditionTags2).call(this, filteredEditions, 'or');
|
|
56
|
+
return _classPrivateMethodGet(this, _buildTagsString, _buildTagsString2).call(this, tagArgs, editionTags);
|
|
45
57
|
}
|
|
46
|
-
function
|
|
47
|
-
const [operator, editionValue] =
|
|
58
|
+
function _getEditionArgs2(selectedEdition) {
|
|
59
|
+
const [operator, editionValue] = _classPrivateMethodGet(this, _parseEdition, _parseEdition2).call(this, selectedEdition.toLowerCase());
|
|
48
60
|
const index = this.editionOrder.findIndex(edition => edition.toLowerCase() === editionValue);
|
|
49
61
|
if (index === -1) {
|
|
50
62
|
_logger.Logger.log(_logger.Logger.INFO_TYPE, `No matching editions for ${selectedEdition} found. Running with default edition`);
|
|
@@ -63,7 +75,7 @@ function _getEditionArgs(selectedEdition) {
|
|
|
63
75
|
return this.editionOrder.filter((_, i) => i !== index);
|
|
64
76
|
}
|
|
65
77
|
}
|
|
66
|
-
function
|
|
78
|
+
function _buildEditionTags2(editionArgs, operator = 'or') {
|
|
67
79
|
return editionArgs.map(edition => `@edition_${edition}`).join(` ${operator} `);
|
|
68
80
|
}
|
|
69
81
|
module.exports = TagProcessor;
|
|
@@ -24,7 +24,7 @@ var _RunnerHelper = _interopRequireDefault(require("./runner/RunnerHelper"));
|
|
|
24
24
|
var _Runner = _interopRequireDefault(require("./runner/Runner"));
|
|
25
25
|
function runPreprocessing(tagArgs, configPath) {
|
|
26
26
|
const beforeCommand = 'node';
|
|
27
|
-
const bddGenPath = _path.default.resolve(
|
|
27
|
+
const bddGenPath = _path.default.resolve(__dirname, '../', '../', 'bdd-framework', 'cli', 'index.js');
|
|
28
28
|
const beforeArgs = [bddGenPath, '-c', configPath];
|
|
29
29
|
if (tagArgs) {
|
|
30
30
|
beforeArgs.push('--tags');
|
|
@@ -104,7 +104,7 @@ function main() {
|
|
|
104
104
|
//This is only used for pass the user arguments to need places in legacy code. We need to rewamp that also.
|
|
105
105
|
const userArgsObject = userArgConfig.getAll();
|
|
106
106
|
const tagProcessor = new _tagProcessor.default(editionOrder);
|
|
107
|
-
const tagArgs = tagProcessor.processTags(
|
|
107
|
+
const tagArgs = tagProcessor.processTags(uatConfig);
|
|
108
108
|
const runnerObj = new _Runner.default();
|
|
109
109
|
runnerObj.setTagArgs(tagArgs);
|
|
110
110
|
runnerObj.setUserArgs(userArgsObject);
|
package/build/decorators.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from '
|
|
1
|
+
export * from './bdd-framework/decorators';
|
package/build/decorators.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
var _decorators = require("
|
|
6
|
+
var _decorators = require("./bdd-framework/decorators");
|
|
7
7
|
Object.keys(_decorators).forEach(function (key) {
|
|
8
8
|
if (key === "default" || key === "__esModule") return;
|
|
9
9
|
if (key in exports && exports[key] === _decorators[key]) return;
|
|
@@ -1,15 +1,73 @@
|
|
|
1
1
|
/* eslint-disable no-console */
|
|
2
2
|
import { test as setup, expect } from '@zohodesk/testinglibrary';
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
} from '
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
5
|
+
import { getAuthFileDirectory } from '../../core/playwright';
|
|
6
|
+
import { Logger } from '../../utils/logger';
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
const userdata = require('./authUsers.json');
|
|
9
9
|
|
|
10
|
-
const
|
|
10
|
+
const authContent = { cookies: [] };
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
const LOGIN_ERR_MESSAGE = 'Need go be logged in';
|
|
13
|
+
// const AUTH_ERR_MESSAGE = `Founded Path - ${path.resolve(process.cwd(),'uat','playwright','.auth')} \n Find if file is Properly Created. Cookies Cannot Be Read .. `
|
|
14
|
+
|
|
15
|
+
function convertCookiesToParse(cookies, authFilePath) {
|
|
16
|
+
try {
|
|
17
|
+
return JSON.parse(cookies);
|
|
18
|
+
} catch (err) {
|
|
19
|
+
Logger.error(err);
|
|
20
|
+
throw new Error(
|
|
21
|
+
` Error while parsing cookies ${err} \n${path.resolve(
|
|
22
|
+
process.cwd(),
|
|
23
|
+
authFilePath
|
|
24
|
+
)} File is Empty`
|
|
25
|
+
);
|
|
26
|
+
// process.exit()
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const authDirectory = getAuthFileDirectory(); //path.resolve(process.cwd(), 'uat', 'playwright', '.auth');
|
|
30
|
+
if (!existsSync(authDirectory)) {
|
|
31
|
+
console.log('Creating auth directory for the first time setup...');
|
|
32
|
+
mkdirSync(authDirectory, { recursive: true });
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
userdata.forEach(data => {
|
|
36
|
+
const authFile = path.resolve(path.join(authDirectory, `${data.filename}`));
|
|
37
|
+
if (!existsSync(authFile)) {
|
|
38
|
+
console.log('creating auth file..');
|
|
39
|
+
writeFileSync(authFile, JSON.stringify(authContent, null, 2));
|
|
40
|
+
}
|
|
41
|
+
setup(data.description, async ({ page }) => {
|
|
42
|
+
try {
|
|
43
|
+
const cookies = readFileSync(authFile);
|
|
44
|
+
const parsedCookies = convertCookiesToParse(cookies, authFile);
|
|
45
|
+
await page
|
|
46
|
+
.context()
|
|
47
|
+
.addCookies(
|
|
48
|
+
parsedCookies.cookies === undefined ? [] : parsedCookies.cookies
|
|
49
|
+
);
|
|
50
|
+
await page.goto(page.getBaseUrl());
|
|
51
|
+
await page.waitForLoadState();
|
|
52
|
+
if (await page.url().includes(process.env.domain)) {
|
|
53
|
+
await page.waitForSelector(data.locator);
|
|
54
|
+
} else {
|
|
55
|
+
throw new Error(LOGIN_ERR_MESSAGE);
|
|
56
|
+
}
|
|
57
|
+
} catch (err) {
|
|
58
|
+
if (err.message === LOGIN_ERR_MESSAGE) {
|
|
59
|
+
await expect(page.locator('.load-bg')).toBeHidden();
|
|
60
|
+
await page.locator('#login_id').type(data.useremail);
|
|
61
|
+
await page.locator('#nextbtn').click();
|
|
62
|
+
await page.locator('#password').type(data.password);
|
|
63
|
+
await page.locator('#nextbtn').click();
|
|
64
|
+
|
|
65
|
+
await page.waitForLoadState('networkidle');
|
|
66
|
+
|
|
67
|
+
await page.waitForSelector(data.locator);
|
|
68
|
+
|
|
69
|
+
await page.context().storageState({ path: authFile });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"dev": {
|
|
3
|
+
"domain": "https://desk.localzoho.com/agent",
|
|
4
|
+
"orgName": "org-name",
|
|
5
|
+
"deptName": "dept-name",
|
|
6
|
+
"moduleName": "module-name",
|
|
7
|
+
"devURL": "Provide your devURL here"
|
|
8
|
+
},
|
|
9
|
+
"prod": {
|
|
10
|
+
"domain": "https://desk.localzoho.com/agent",
|
|
11
|
+
"orgName": "org-name",
|
|
12
|
+
"deptName": "dept-name",
|
|
13
|
+
"moduleName": "module-name"
|
|
14
|
+
},
|
|
15
|
+
"k8test": {
|
|
16
|
+
"domain": "https://desk.localzoho.com/agent",
|
|
17
|
+
"orgName": "org-name",
|
|
18
|
+
"deptName": "dept-name",
|
|
19
|
+
"moduleName": "module-name"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
const testSetup = require('../../fixtures/testSetup');
|
|
2
1
|
/**
|
|
3
2
|
* @typedef {Object|null} viewportConfig
|
|
4
3
|
* @property {number} width - width of the viewport
|
|
@@ -41,6 +40,5 @@ module.exports = {
|
|
|
41
40
|
bddMode: true,
|
|
42
41
|
featureFilesFolder: 'feature-files',
|
|
43
42
|
stepDefinitionsFolder: 'steps',
|
|
44
|
-
viewport: { width: 1280, height: 720 }
|
|
45
|
-
testSetup
|
|
43
|
+
viewport: { width: 1280, height: 720 }
|
|
46
44
|
}
|