@zohodesk/testinglibrary 0.0.7 → 0.0.8-n20-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/.babelrc +7 -2
- package/.eslintrc.js +5 -1
- package/.gitlab-ci.yml +206 -0
- package/README.md +172 -1
- package/build/common/data-generator/steps/DataGenerator.spec.js +19 -0
- package/build/common/data-generator/steps/DataGeneratorStepsHelper.js +19 -0
- package/build/common/multi-actor/steps/multiActorHandling.spec.js +26 -0
- package/build/common/searchFake/helpers/rpcRequestHelper.js +52 -0
- package/build/common/searchFake/steps/searchFake.spec.js +77 -0
- package/build/core/dataGenerator/DataGenerator.js +108 -0
- package/build/core/dataGenerator/DataGeneratorError.js +50 -0
- package/build/core/dataGenerator/DataGeneratorHelper.js +49 -0
- package/build/core/jest/preprocessor/jsPreprocessor.js +3 -9
- package/build/core/jest/setup/index.js +1 -7
- package/build/core/playwright/builtInFixtures/actorContext.js +75 -0
- package/build/core/playwright/builtInFixtures/addTags.js +19 -0
- package/build/core/playwright/builtInFixtures/cacheLayer.js +13 -0
- package/build/core/playwright/builtInFixtures/context.js +32 -0
- package/build/core/playwright/builtInFixtures/executionContext.js +17 -0
- package/build/core/playwright/builtInFixtures/i18N.js +41 -0
- package/build/core/playwright/builtInFixtures/index.js +46 -0
- package/build/core/playwright/builtInFixtures/page.js +38 -0
- package/build/core/playwright/builtInFixtures/unauthenticatedPage.js +18 -0
- package/build/core/playwright/clear-caches.js +49 -0
- package/build/core/playwright/codegen.js +4 -4
- package/build/core/playwright/configuration/Configuration.js +25 -0
- package/build/core/playwright/configuration/ConfigurationHelper.js +43 -0
- package/build/core/playwright/configuration/UserArgs.js +12 -0
- package/build/core/playwright/constants/browserTypes.js +12 -0
- package/build/core/playwright/constants/fileMutexConfig.js +9 -0
- package/build/core/playwright/custom-commands.js +1 -2
- package/build/core/playwright/env-initializer.js +28 -6
- package/build/core/playwright/fixtures.js +24 -0
- package/build/core/playwright/helpers/additionalProfiles.js +25 -0
- package/build/core/playwright/helpers/auth/accountLogin.js +21 -0
- package/build/core/playwright/helpers/auth/checkAuthCookies.js +41 -0
- package/build/core/playwright/helpers/auth/getUrlOrigin.js +13 -0
- package/build/core/playwright/helpers/auth/getUsers.js +118 -0
- package/build/core/playwright/helpers/auth/index.js +76 -0
- package/build/core/playwright/helpers/auth/loginDefaultStepsHelper.js +54 -0
- package/build/core/playwright/helpers/auth/loginSteps.js +50 -0
- package/build/core/playwright/helpers/checkAuthDirectory.js +27 -0
- package/build/core/playwright/helpers/configFileNameProvider.js +31 -0
- package/build/core/playwright/helpers/customFixturesHelper.js +58 -0
- package/build/core/playwright/helpers/fileMutex.js +71 -0
- package/build/core/playwright/helpers/getUserFixtures.js +23 -0
- package/build/core/playwright/helpers/mergeObjects.js +13 -0
- package/build/core/playwright/helpers/parseUserArgs.js +10 -0
- package/build/core/playwright/index.js +10 -98
- package/build/core/playwright/readConfigFile.js +93 -14
- package/build/core/playwright/report-generator.js +9 -8
- package/build/core/playwright/runner/Runner.js +22 -0
- package/build/core/playwright/runner/RunnerHelper.js +43 -0
- package/build/core/playwright/runner/RunnerTypes.js +17 -0
- package/build/core/playwright/runner/SpawnRunner.js +113 -0
- package/build/core/playwright/setup/Project.js +35 -0
- package/build/core/playwright/setup/ProjectConfiguration.js +80 -0
- package/build/core/playwright/setup/config-creator.js +75 -103
- package/build/core/playwright/setup/config-utils.js +188 -0
- package/build/core/playwright/setup/custom-reporter.js +136 -0
- package/build/core/playwright/setup/qc-custom-reporter.js +291 -0
- package/build/core/playwright/tagProcessor.js +69 -0
- package/build/core/playwright/test-runner.js +84 -98
- package/build/core/playwright/types.js +44 -0
- package/build/core/playwright/validateFeature.js +28 -0
- package/build/decorators.d.ts +1 -1
- package/build/decorators.js +1 -1
- package/build/index.d.ts +76 -3
- package/build/index.js +63 -17
- package/build/lib/cli.js +28 -4
- package/build/lib/post-install.js +19 -11
- package/build/parser/parser.js +0 -1
- package/build/setup-folder-structure/helper.js +37 -0
- package/build/setup-folder-structure/reportEnhancement/addonScript.html +25 -0
- package/build/setup-folder-structure/reportEnhancement/reportAlteration.js +25 -0
- package/build/setup-folder-structure/samples/accountLogin-sample.js +19 -0
- package/build/setup-folder-structure/samples/actors-index.js +2 -0
- package/build/setup-folder-structure/samples/auth-setup-sample.js +10 -67
- package/build/setup-folder-structure/samples/editions-index.js +3 -0
- package/build/setup-folder-structure/samples/free-sample.json +25 -0
- package/build/setup-folder-structure/samples/git-ignore.sample.js +8 -4
- package/build/setup-folder-structure/samples/settings.json +7 -0
- package/build/setup-folder-structure/samples/testSetup-sample.js +14 -0
- package/build/setup-folder-structure/samples/uat-config-sample.js +13 -2
- package/build/setup-folder-structure/setupProject.js +34 -12
- package/build/test/core/playwright/__tests__/tagProcessor.test.js +94 -0
- package/build/test/core/playwright/__tests__/validateFeature.test.js +69 -0
- package/build/test/core/playwright/buildInFixtures/__tests__/executionContext.test.js +27 -0
- package/build/test/core/playwright/configuration/__tests__/Configuration.test.js +53 -0
- package/build/test/core/playwright/helpers/__tests__/additionalProfiles.test.js +45 -0
- package/build/test/core/playwright/helpers/__tests__/configFileNameProvider.test.js +34 -0
- package/build/test/core/playwright/helpers/__tests__/customFixturesHelper.test.js +51 -0
- package/build/test/core/playwright/helpers/__tests__/fileMutex.test.js +79 -0
- package/build/test/core/playwright/helpers/__tests__/getUsers_ListOfActors.test.js +80 -0
- package/build/test/core/playwright/runner/__tests__/RunnerHelper.test.js +16 -0
- package/build/test/core/playwright/runner/__tests__/SpawnRunner.test.js +27 -0
- package/build/utils/cliArgsToObject.js +8 -1
- package/build/utils/commonUtils.js +17 -0
- package/build/utils/fileUtils.js +60 -4
- package/build/utils/logger.js +1 -31
- package/build/utils/rootPath.js +16 -9
- package/build/utils/stepDefinitionsFormatter.js +1 -2
- package/changelog.md +167 -0
- package/jest.config.js +29 -11
- package/npm-shrinkwrap.json +9610 -6631
- package/package.json +34 -27
- package/playwright.config.js +0 -50
- package/test-results/.last-run.json +4 -0
- package/unit_reports/unit-report.html +277 -0
- package/Changelog.md +0 -42
- package/build/bdd-framework/cli/commands/env.js +0 -43
- package/build/bdd-framework/cli/commands/export.js +0 -48
- package/build/bdd-framework/cli/commands/test.js +0 -59
- package/build/bdd-framework/cli/index.js +0 -11
- package/build/bdd-framework/cli/options.js +0 -20
- package/build/bdd-framework/cli/worker.js +0 -13
- package/build/bdd-framework/config/dir.js +0 -27
- package/build/bdd-framework/config/env.js +0 -49
- package/build/bdd-framework/config/index.js +0 -91
- package/build/bdd-framework/cucumber/buildStepDefinition.js +0 -43
- package/build/bdd-framework/cucumber/gherkin.d.js +0 -5
- package/build/bdd-framework/cucumber/gherkin.d.ts +0 -45
- package/build/bdd-framework/cucumber/loadConfig.js +0 -17
- package/build/bdd-framework/cucumber/loadFeatures.js +0 -39
- package/build/bdd-framework/cucumber/loadSnippetBuilder.js +0 -20
- package/build/bdd-framework/cucumber/loadSources.js +0 -57
- package/build/bdd-framework/cucumber/loadSteps.js +0 -35
- package/build/bdd-framework/decorators.js +0 -22
- package/build/bdd-framework/gen/formatter.js +0 -88
- package/build/bdd-framework/gen/i18n.js +0 -35
- package/build/bdd-framework/gen/index.js +0 -160
- package/build/bdd-framework/gen/poms.js +0 -46
- package/build/bdd-framework/gen/testFile.js +0 -356
- package/build/bdd-framework/gen/testNode.js +0 -48
- package/build/bdd-framework/gen/testPoms.js +0 -123
- package/build/bdd-framework/index.js +0 -45
- package/build/bdd-framework/playwright/fixtureParameterNames.js +0 -77
- package/build/bdd-framework/playwright/getLocationInFile.js +0 -46
- package/build/bdd-framework/playwright/loadConfig.js +0 -42
- package/build/bdd-framework/playwright/testTypeImpl.js +0 -41
- package/build/bdd-framework/playwright/transform.js +0 -80
- package/build/bdd-framework/playwright/types.js +0 -5
- package/build/bdd-framework/playwright/utils.js +0 -34
- package/build/bdd-framework/run/bddFixtures.js +0 -108
- package/build/bdd-framework/run/bddWorld.js +0 -87
- package/build/bdd-framework/snippets/index.js +0 -131
- package/build/bdd-framework/snippets/snippetSyntax.js +0 -41
- package/build/bdd-framework/snippets/snippetSyntaxDecorators.js +0 -26
- package/build/bdd-framework/snippets/snippetSyntaxTs.js +0 -18
- package/build/bdd-framework/stepDefinitions/createBdd.js +0 -49
- package/build/bdd-framework/stepDefinitions/createDecorators.js +0 -109
- package/build/bdd-framework/stepDefinitions/decorators/poms.js +0 -50
- package/build/bdd-framework/stepDefinitions/decorators/steps.js +0 -94
- package/build/bdd-framework/stepDefinitions/defineStep.js +0 -61
- package/build/bdd-framework/stepDefinitions/stepConfig.js +0 -24
- package/build/bdd-framework/utils/index.js +0 -50
- package/build/bdd-framework/utils/jsStringWrap.js +0 -44
- package/build/bdd-framework/utils/logger.js +0 -29
- package/build/setup-folder-structure/samples/authUsers-sample.json +0 -9
- package/build/setup-folder-structure/samples/env-config-sample.json +0 -21
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = void 0;
|
|
8
|
+
var _path = _interopRequireDefault(require("path"));
|
|
9
|
+
var _fs = _interopRequireDefault(require("fs"));
|
|
10
|
+
var _logger = require("../../utils/logger");
|
|
11
|
+
var _DataGeneratorHelper = require("./DataGeneratorHelper");
|
|
12
|
+
var _helpers = require("@zohodesk/testinglibrary/helpers");
|
|
13
|
+
var _DataGeneratorError = require("./DataGeneratorError");
|
|
14
|
+
function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); }
|
|
15
|
+
function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
|
|
16
|
+
function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); }
|
|
17
|
+
var _DataGenerator_brand = /*#__PURE__*/new WeakSet();
|
|
18
|
+
class DataGenerator {
|
|
19
|
+
constructor() {
|
|
20
|
+
_classPrivateMethodInitSpec(this, _DataGenerator_brand);
|
|
21
|
+
}
|
|
22
|
+
async generate(testInfo, actorInfo, generatorType, generatorName, scenarioName, dataTable) {
|
|
23
|
+
try {
|
|
24
|
+
let generators;
|
|
25
|
+
if (generatorType === 'API') {
|
|
26
|
+
generators = await _assertClassBrand(_DataGenerator_brand, this, _generateAPIGenerator).call(this, generatorName);
|
|
27
|
+
} else {
|
|
28
|
+
generators = await _assertClassBrand(_DataGenerator_brand, this, _getGenerator).call(this, testInfo, generatorName);
|
|
29
|
+
}
|
|
30
|
+
const processedGenerators = await (0, _DataGeneratorHelper.processGenerator)(generators, dataTable);
|
|
31
|
+
const apiPayload = await _assertClassBrand(_DataGenerator_brand, this, _constructApiPayload).call(this, scenarioName, processedGenerators, actorInfo);
|
|
32
|
+
const response = await (0, _DataGeneratorHelper.makeRequest)(process.env.DG_SERVICE_DOMAIN + process.env.DG_SERVICE_API_PATH, apiPayload);
|
|
33
|
+
_logger.Logger.log(_logger.Logger.INFO_TYPE, `Generated response for the generator: ${generatorName} for scenario: ${scenarioName}, Response: ${JSON.stringify(response)}`);
|
|
34
|
+
return response;
|
|
35
|
+
} catch (error) {
|
|
36
|
+
if (error instanceof _DataGeneratorError.DataGeneratorError) {
|
|
37
|
+
console.error(error.getMessage());
|
|
38
|
+
console.error("Stack trace:", error.stack);
|
|
39
|
+
_logger.Logger.log(_logger.Logger.FAILURE_TYPE, error.getMessage());
|
|
40
|
+
} else {
|
|
41
|
+
console.error("Error Type:", error.constructor.name);
|
|
42
|
+
console.error("Error Message:", error.message);
|
|
43
|
+
console.error("Stack trace:", error.stack);
|
|
44
|
+
_logger.Logger.log(_logger.Logger.FAILURE_TYPE, `${error.constructor.name} - Message: ${error.message}`);
|
|
45
|
+
}
|
|
46
|
+
console.error('Data Generation failed for the generator: ', generatorName, "\n\nError response :", error);
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async getDataGenUserExecutionContext(edition, profile) {
|
|
51
|
+
try {
|
|
52
|
+
const dataGenUserDetails = await (0, _helpers.getUserForSelectedEditionAndProfile)(edition, profile);
|
|
53
|
+
return dataGenUserDetails;
|
|
54
|
+
} catch (error) {
|
|
55
|
+
console.error('Error occurred while fetching data generation user details: ', error);
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async function _getGenerator(testInfo, generatorName) {
|
|
61
|
+
let generator = null;
|
|
62
|
+
let generatorFilePath = await (0, _DataGeneratorHelper.getGeneratorFilePath)(testInfo.file);
|
|
63
|
+
generatorFilePath = _path.default.join(generatorFilePath, "../../data-generators/generators.json");
|
|
64
|
+
if (_fs.default.existsSync(generatorFilePath)) {
|
|
65
|
+
const data = _fs.default.readFileSync(generatorFilePath, 'utf8');
|
|
66
|
+
const generatorObj = JSON.parse(data);
|
|
67
|
+
if (generatorName || generatorObj.generators) {
|
|
68
|
+
generator = generatorObj.generators[generatorName] || null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (!generator) {
|
|
72
|
+
throw new _DataGeneratorError.GeneratorError(`Generator "${generatorName}" could not be found in the path located at "${generatorFilePath}"`);
|
|
73
|
+
}
|
|
74
|
+
return generator;
|
|
75
|
+
}
|
|
76
|
+
async function _generateAPIGenerator(operationId) {
|
|
77
|
+
return [{
|
|
78
|
+
type: "dynamic",
|
|
79
|
+
generatorOperationId: operationId,
|
|
80
|
+
dataPath: "$.response.body:$",
|
|
81
|
+
name: operationId
|
|
82
|
+
}];
|
|
83
|
+
}
|
|
84
|
+
async function _constructApiPayload(scenarioName, processedGenerators, actorInfo) {
|
|
85
|
+
const dataGeneratorObj = actorInfo['data-generator'];
|
|
86
|
+
if (!dataGeneratorObj) {
|
|
87
|
+
throw new _DataGeneratorError.DataGeneratorConfigurationError(`Data Generator configuration is missing for the profile: ${actorInfo['profile']}`);
|
|
88
|
+
}
|
|
89
|
+
const apiPayload = {
|
|
90
|
+
scenario_name: scenarioName,
|
|
91
|
+
data_generation_templates: processedGenerators,
|
|
92
|
+
...dataGeneratorObj
|
|
93
|
+
};
|
|
94
|
+
const account = apiPayload.account;
|
|
95
|
+
if (account) {
|
|
96
|
+
account.email = actorInfo.email;
|
|
97
|
+
account.password = actorInfo.password;
|
|
98
|
+
}
|
|
99
|
+
const environmentDetails = apiPayload.environmentDetails || {};
|
|
100
|
+
if (environmentDetails) {
|
|
101
|
+
environmentDetails.iam_url = process.env.DG_IAM_DOMAIN;
|
|
102
|
+
const domainUrl = new URL(process.env.domain);
|
|
103
|
+
environmentDetails.host = domainUrl.origin;
|
|
104
|
+
}
|
|
105
|
+
apiPayload.environmentDetails = environmentDetails;
|
|
106
|
+
return apiPayload;
|
|
107
|
+
}
|
|
108
|
+
var _default = exports.default = DataGenerator;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.GeneratorError = exports.DataGeneratorError = exports.DataGeneratorConfigurationError = void 0;
|
|
7
|
+
class DataGeneratorError extends Error {
|
|
8
|
+
constructor(message) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = 'DataGeneratorError';
|
|
11
|
+
|
|
12
|
+
// Maintains proper stack trace for where our error was thrown (only available on V8)
|
|
13
|
+
if (Error.captureStackTrace) {
|
|
14
|
+
Error.captureStackTrace(this, DataGeneratorError);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Get formatted error message with error type and message
|
|
20
|
+
* @returns {string} Formatted error message
|
|
21
|
+
*/
|
|
22
|
+
getMessage() {
|
|
23
|
+
return `\n\n ${this.name} ::: \n\n Error Message: ${this.message} \n\n `;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Specific error for Data Generator configuration issues
|
|
28
|
+
exports.DataGeneratorError = DataGeneratorError;
|
|
29
|
+
class DataGeneratorConfigurationError extends DataGeneratorError {
|
|
30
|
+
constructor(message) {
|
|
31
|
+
super(message);
|
|
32
|
+
this.name = 'DataGeneratorConfigurationError';
|
|
33
|
+
if (Error.captureStackTrace) {
|
|
34
|
+
Error.captureStackTrace(this, DataGeneratorConfigurationError);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Specific error for Generator related issues
|
|
40
|
+
exports.DataGeneratorConfigurationError = DataGeneratorConfigurationError;
|
|
41
|
+
class GeneratorError extends DataGeneratorError {
|
|
42
|
+
constructor(message) {
|
|
43
|
+
super(message);
|
|
44
|
+
this.name = 'GeneratorError';
|
|
45
|
+
if (Error.captureStackTrace) {
|
|
46
|
+
Error.captureStackTrace(this, GeneratorError);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.GeneratorError = GeneratorError;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getGeneratorFilePath = getGeneratorFilePath;
|
|
7
|
+
exports.makeRequest = makeRequest;
|
|
8
|
+
exports.processGenerator = processGenerator;
|
|
9
|
+
//Create payload for the generators
|
|
10
|
+
async function processGenerator(generators, dataTable) {
|
|
11
|
+
if (!dataTable) {
|
|
12
|
+
return generators;
|
|
13
|
+
}
|
|
14
|
+
return generators.map(generator => {
|
|
15
|
+
dataTable.forEach(row => {
|
|
16
|
+
const generatorName = row.DG_API_NAME;
|
|
17
|
+
if (generatorName === generator.name) {
|
|
18
|
+
generator.params = generator.params ? generator.params : {};
|
|
19
|
+
|
|
20
|
+
// The API name row is only used for matching the template
|
|
21
|
+
// Filter out DG_API_NAME and collect other values
|
|
22
|
+
Object.entries(row).filter(([key]) => key !== 'DG_API_NAME').forEach(([key, value]) => {
|
|
23
|
+
if (value !== '') {
|
|
24
|
+
generator.params[key] = value;
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
return generator;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
async function makeRequest(url, payload) {
|
|
33
|
+
const response = await fetch(url, {
|
|
34
|
+
method: 'POST',
|
|
35
|
+
headers: {
|
|
36
|
+
'Content-Type': 'application/json'
|
|
37
|
+
},
|
|
38
|
+
body: JSON.stringify(payload)
|
|
39
|
+
});
|
|
40
|
+
if (!response.ok) {
|
|
41
|
+
const errorBody = await response.text();
|
|
42
|
+
throw new Error(`HTTP error! status: ${response.status}, body: ${errorBody}`);
|
|
43
|
+
}
|
|
44
|
+
return response.json();
|
|
45
|
+
}
|
|
46
|
+
async function getGeneratorFilePath(featureFile) {
|
|
47
|
+
let generatorPath = featureFile.replace(".features-gen/", "");
|
|
48
|
+
return generatorPath;
|
|
49
|
+
}
|
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
exports.default = void 0;
|
|
8
|
-
var _babelJest = _interopRequireDefault(require("babel-jest"));
|
|
9
|
-
var _default = _babelJest.default.createTransformer({
|
|
3
|
+
const babelJest = require('babel-jest');
|
|
4
|
+
module.exports = babelJest.createTransformer({
|
|
10
5
|
presets: [require.resolve('@babel/preset-env'), require.resolve('@babel/preset-react')],
|
|
11
6
|
plugins: [require.resolve('babel-plugin-transform-dynamic-import')]
|
|
12
|
-
});
|
|
13
|
-
exports.default = _default;
|
|
7
|
+
});
|
|
@@ -1,9 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
var _testUtils = _interopRequireDefault(require("react-dom/test-utils"));
|
|
5
|
-
var _globals = require("@jest/globals");
|
|
6
|
-
var _react = _interopRequireDefault(require("react"));
|
|
7
|
-
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
8
|
-
var _reactDom = _interopRequireDefault(require("react-dom"));
|
|
9
|
-
require("@testing-library/jest-dom/extend-expect");
|
|
3
|
+
require("@testing-library/jest-dom");
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _logger = require("../../../utils/logger");
|
|
8
|
+
var _additionalProfiles = require("../helpers/additionalProfiles");
|
|
9
|
+
var _loginDefaultStepsHelper = require("../helpers/auth/loginDefaultStepsHelper");
|
|
10
|
+
class ActorContext {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.actorsObj = {};
|
|
13
|
+
}
|
|
14
|
+
async setup(browser, $tags, testInfo, context, page, executionContext) {
|
|
15
|
+
try {
|
|
16
|
+
const {
|
|
17
|
+
profile
|
|
18
|
+
} = executionContext.actorInfo;
|
|
19
|
+
this.actorsObj[profile] = {
|
|
20
|
+
role: profile,
|
|
21
|
+
browser,
|
|
22
|
+
context,
|
|
23
|
+
page,
|
|
24
|
+
executionContext
|
|
25
|
+
};
|
|
26
|
+
const additionalActors = (0, _additionalProfiles.additionProfiles)($tags);
|
|
27
|
+
await Promise.all(Object.entries(additionalActors).map(async ([role, actorInfo]) => {
|
|
28
|
+
let context = await browser.newContext();
|
|
29
|
+
let page = await context.newPage();
|
|
30
|
+
let ctxTestDetails = {
|
|
31
|
+
page,
|
|
32
|
+
$tags,
|
|
33
|
+
context,
|
|
34
|
+
...actorInfo
|
|
35
|
+
};
|
|
36
|
+
await (0, _loginDefaultStepsHelper.executeDefaultLoginSteps)(context, testInfo, ctxTestDetails, actorInfo);
|
|
37
|
+
this.actorsObj[role] = {
|
|
38
|
+
role,
|
|
39
|
+
browser,
|
|
40
|
+
context,
|
|
41
|
+
page,
|
|
42
|
+
executionContext: {
|
|
43
|
+
actorInfo
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}));
|
|
47
|
+
} catch (error) {
|
|
48
|
+
_logger.Logger.log(_logger.Logger.FAILURE_TYPE, `Failed to setup additional actors:`, error);
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async cleanup() {
|
|
53
|
+
for (const actor of Object.values(this.actorsObj)) {
|
|
54
|
+
try {
|
|
55
|
+
await actor.context.close();
|
|
56
|
+
} catch (error) {
|
|
57
|
+
_logger.Logger.log(_logger.Logger.FAILURE_TYPE, `Failed to close context for actor ${actor.role}:`, error);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
var _default = exports.default = {
|
|
63
|
+
actorContext: async ({
|
|
64
|
+
page,
|
|
65
|
+
context,
|
|
66
|
+
executionContext,
|
|
67
|
+
$tags,
|
|
68
|
+
browser
|
|
69
|
+
}, use, testInfo) => {
|
|
70
|
+
const ctxObject = new ActorContext();
|
|
71
|
+
await ctxObject.setup(browser, $tags, testInfo, context, page, executionContext);
|
|
72
|
+
await use(ctxObject);
|
|
73
|
+
await ctxObject.cleanup();
|
|
74
|
+
}
|
|
75
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _default = exports.default = {
|
|
8
|
+
addTags: [async ({
|
|
9
|
+
$tags
|
|
10
|
+
}, use, testInfo) => {
|
|
11
|
+
testInfo.annotations.push({
|
|
12
|
+
type: 'tags',
|
|
13
|
+
description: $tags.join(', ')
|
|
14
|
+
});
|
|
15
|
+
await use();
|
|
16
|
+
}, {
|
|
17
|
+
auto: true
|
|
18
|
+
}]
|
|
19
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
const cacheMap = new Map();
|
|
8
|
+
var _default = exports.default = {
|
|
9
|
+
// eslint-disable-next-line no-empty-pattern
|
|
10
|
+
cacheLayer: async ({}, use) => {
|
|
11
|
+
await use(cacheMap);
|
|
12
|
+
}
|
|
13
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _readConfigFile = require("../readConfigFile");
|
|
8
|
+
const {
|
|
9
|
+
testSetup
|
|
10
|
+
} = (0, _readConfigFile.generateConfigFromFile)();
|
|
11
|
+
async function performDefaultContextSteps({
|
|
12
|
+
context
|
|
13
|
+
}) {
|
|
14
|
+
if (testSetup.context && typeof testSetup.context === 'function') {
|
|
15
|
+
await testSetup.context({
|
|
16
|
+
context
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
var _default = exports.default = {
|
|
21
|
+
context: async ({
|
|
22
|
+
context
|
|
23
|
+
}, use) => {
|
|
24
|
+
await context.addInitScript(() =>
|
|
25
|
+
// eslint-disable-next-line no-undef
|
|
26
|
+
window.localStorage.setItem('isDnBannerHide', true));
|
|
27
|
+
await performDefaultContextSteps({
|
|
28
|
+
context
|
|
29
|
+
});
|
|
30
|
+
await use(context);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _customFixturesHelper = require("../helpers/customFixturesHelper");
|
|
8
|
+
var _default = exports.default = {
|
|
9
|
+
executionContext: async ({
|
|
10
|
+
$tags
|
|
11
|
+
}, use) => {
|
|
12
|
+
const actorInfo = (0, _customFixturesHelper.getCustomAccountDetails)($tags);
|
|
13
|
+
await use({
|
|
14
|
+
actorInfo
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
/* eslint-disable no-undef */
|
|
8
|
+
/* eslint-disable no-param-reassign */
|
|
9
|
+
|
|
10
|
+
// Note: We are duplicating below method from @zohodesk/i18n. We are not importing it as react package not yet availble in test environment.
|
|
11
|
+
function replaceI18NValuesWithRegex(i18nStr, values) {
|
|
12
|
+
if (typeof values !== 'undefined') {
|
|
13
|
+
if (Array.isArray(values)) {
|
|
14
|
+
for (let i = 0; i < values.length; i++) {
|
|
15
|
+
i18nStr = i18nStr.replace(new RegExp(`\\{${i}\\}`, 'g'), values[i]);
|
|
16
|
+
}
|
|
17
|
+
} else {
|
|
18
|
+
i18nStr = i18nStr.replace(new RegExp('\\{0\\}', 'g'), values);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return i18nStr;
|
|
22
|
+
}
|
|
23
|
+
async function isI18NKeyDefined(key) {
|
|
24
|
+
return new Promise(resolve => {
|
|
25
|
+
if (typeof window.i18n[key] !== 'undefined') {
|
|
26
|
+
resolve();
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
var _default = exports.default = {
|
|
31
|
+
i18N: async ({
|
|
32
|
+
page
|
|
33
|
+
}, use) => {
|
|
34
|
+
await use(async (key, values) => {
|
|
35
|
+
await page.waitForFunction(isI18NKeyDefined(key));
|
|
36
|
+
const i18nValue = await page.evaluate(i18nKey => window.i18n[i18nKey], key);
|
|
37
|
+
const i18nStr = replaceI18NValuesWithRegex(i18nValue, values);
|
|
38
|
+
return i18nStr;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = void 0;
|
|
8
|
+
var _page = _interopRequireDefault(require("./page"));
|
|
9
|
+
var _context = _interopRequireDefault(require("./context"));
|
|
10
|
+
var _cacheLayer = _interopRequireDefault(require("./cacheLayer"));
|
|
11
|
+
var _addTags = _interopRequireDefault(require("./addTags"));
|
|
12
|
+
var _i18N = _interopRequireDefault(require("./i18N"));
|
|
13
|
+
var _unauthenticatedPage = _interopRequireDefault(require("./unauthenticatedPage"));
|
|
14
|
+
var _executionContext = _interopRequireDefault(require("./executionContext"));
|
|
15
|
+
var _actorContext = _interopRequireDefault(require("./actorContext"));
|
|
16
|
+
function extractTagsFromTitle(text) {
|
|
17
|
+
return text.match(/@\w+/g) || [];
|
|
18
|
+
}
|
|
19
|
+
function getBuiltInFixtures(bddMode) {
|
|
20
|
+
let builtInFixtures = {
|
|
21
|
+
..._page.default,
|
|
22
|
+
..._actorContext.default,
|
|
23
|
+
..._context.default,
|
|
24
|
+
..._cacheLayer.default,
|
|
25
|
+
..._i18N.default,
|
|
26
|
+
..._unauthenticatedPage.default,
|
|
27
|
+
..._executionContext.default
|
|
28
|
+
};
|
|
29
|
+
if (bddMode) {
|
|
30
|
+
builtInFixtures = {
|
|
31
|
+
...builtInFixtures,
|
|
32
|
+
..._addTags.default
|
|
33
|
+
};
|
|
34
|
+
} else {
|
|
35
|
+
builtInFixtures = {
|
|
36
|
+
...builtInFixtures,
|
|
37
|
+
$tags: async ({}, use, testInfo) => {
|
|
38
|
+
// Extract only the elements after the "@" symbol as tags
|
|
39
|
+
const tags = testInfo.title ? extractTagsFromTitle(testInfo.title) : [];
|
|
40
|
+
await use(tags);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return builtInFixtures;
|
|
45
|
+
}
|
|
46
|
+
var _default = exports.default = getBuiltInFixtures;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _loginDefaultStepsHelper = require("../helpers/auth/loginDefaultStepsHelper");
|
|
8
|
+
/* eslint-disable global-require */
|
|
9
|
+
var _default = exports.default = {
|
|
10
|
+
page: async ({
|
|
11
|
+
context,
|
|
12
|
+
$tags,
|
|
13
|
+
page,
|
|
14
|
+
executionContext
|
|
15
|
+
}, use, testInfo) => {
|
|
16
|
+
let testPortalDetails = executionContext.actorInfo;
|
|
17
|
+
let testDetails = {
|
|
18
|
+
page,
|
|
19
|
+
$tags,
|
|
20
|
+
context,
|
|
21
|
+
...testPortalDetails
|
|
22
|
+
};
|
|
23
|
+
try {
|
|
24
|
+
//This block is used to skip the login process if the @unauthenticated tag is added to the script
|
|
25
|
+
if ($tags.includes('@unauthenticated')) {
|
|
26
|
+
await context.clearCookies();
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
await (0, _loginDefaultStepsHelper.executeDefaultLoginSteps)(context, testInfo, testDetails, testPortalDetails);
|
|
30
|
+
} catch (e) {
|
|
31
|
+
console.error('Error during page', e);
|
|
32
|
+
} finally {
|
|
33
|
+
await (0, _loginDefaultStepsHelper.performDefaultPageSteps)(testDetails);
|
|
34
|
+
await use(page);
|
|
35
|
+
await context.close();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _default = exports.default = {
|
|
8
|
+
unauthenticatedPage: async ({
|
|
9
|
+
browser
|
|
10
|
+
}, use) => {
|
|
11
|
+
const context = await browser.newContext({
|
|
12
|
+
storageState: null
|
|
13
|
+
});
|
|
14
|
+
const unauthenticatedPage = await context.newPage();
|
|
15
|
+
await use(unauthenticatedPage);
|
|
16
|
+
await context.close();
|
|
17
|
+
}
|
|
18
|
+
};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = void 0;
|
|
8
|
+
var _path = _interopRequireDefault(require("path"));
|
|
9
|
+
var _fileUtils = require("../../utils/fileUtils");
|
|
10
|
+
var _logger = require("../../utils/logger");
|
|
11
|
+
var _readConfigFile = require("./readConfigFile");
|
|
12
|
+
var _checkAuthDirectory = require("./helpers/checkAuthDirectory");
|
|
13
|
+
function deleteAuthFiles(authFilePath) {
|
|
14
|
+
authFilePath = _path.default.resolve(process.cwd(), authFilePath);
|
|
15
|
+
const authFileFolder = _path.default.dirname(authFilePath);
|
|
16
|
+
_logger.Logger.log(_logger.Logger.INFO_TYPE, `Deleting auth files present in ${authFileFolder}`);
|
|
17
|
+
(0, _fileUtils.deleteFolder)(authFileFolder);
|
|
18
|
+
}
|
|
19
|
+
function deletePlaywrightReport(reportPath) {
|
|
20
|
+
_logger.Logger.log(_logger.Logger.INFO_TYPE, `Deleting Playwright report ${reportPath}`);
|
|
21
|
+
(0, _fileUtils.deleteFolder)(reportPath);
|
|
22
|
+
}
|
|
23
|
+
function deleteGeneratedFeatures() {
|
|
24
|
+
const featuresGenPath = _path.default.resolve(process.cwd(), 'uat', '.features-gen');
|
|
25
|
+
_logger.Logger.log(_logger.Logger.INFO_TYPE, `Deleting generated features at ${featuresGenPath}`);
|
|
26
|
+
(0, _fileUtils.deleteFolder)(featuresGenPath);
|
|
27
|
+
}
|
|
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
|
+
function clearCaches() {
|
|
34
|
+
try {
|
|
35
|
+
const {
|
|
36
|
+
authFilePath,
|
|
37
|
+
reportPath
|
|
38
|
+
} = (0, _readConfigFile.generateConfigFromFile)();
|
|
39
|
+
deleteAuthFiles(authFilePath);
|
|
40
|
+
deletePlaywrightReport(reportPath);
|
|
41
|
+
deleteGeneratedFeatures();
|
|
42
|
+
deleteLockFiles();
|
|
43
|
+
_logger.Logger.log(_logger.Logger.SUCCESS_TYPE, 'Caches Cleared. Now you can try running npm run uat');
|
|
44
|
+
} catch (err) {
|
|
45
|
+
_logger.Logger.error(err);
|
|
46
|
+
_logger.Logger.log(_logger.Logger.FAILURE_TYPE, 'Error While clearing cookies. Try manually delete folder uat/playwright and uat/playwright-report');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
var _default = exports.default = clearCaches;
|
|
@@ -9,11 +9,11 @@ var _child_process = require("child_process");
|
|
|
9
9
|
var _path = _interopRequireDefault(require("path"));
|
|
10
10
|
var _logger = require("../../utils/logger");
|
|
11
11
|
var _rootPath = require("../../utils/rootPath");
|
|
12
|
-
const userArgs = process.argv.slice(3);
|
|
13
|
-
const playwrightPath = _path.default.resolve((0, _rootPath.getExecutableBinaryPath)('playwright'));
|
|
14
|
-
const command = playwrightPath;
|
|
15
|
-
const args = ['codegen'].concat(userArgs);
|
|
16
12
|
function generateCodegen() {
|
|
13
|
+
const domainUrl = process.argv.slice(3);
|
|
14
|
+
const playwrightPath = _path.default.resolve((0, _rootPath.getExecutableBinaryPath)('playwright'));
|
|
15
|
+
const command = playwrightPath;
|
|
16
|
+
const args = ['codegen'].concat(domainUrl);
|
|
17
17
|
const childProcess = (0, _child_process.spawn)(command, args, {
|
|
18
18
|
stdio: 'inherit'
|
|
19
19
|
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _ConfigurationHelper = require("./ConfigurationHelper");
|
|
4
|
+
class Configuration {
|
|
5
|
+
properties = {};
|
|
6
|
+
constructor(props) {
|
|
7
|
+
this.properties = props;
|
|
8
|
+
}
|
|
9
|
+
add(key, value) {
|
|
10
|
+
this.properties[key] = value;
|
|
11
|
+
}
|
|
12
|
+
addAll(newConfig) {
|
|
13
|
+
this.properties = (0, _ConfigurationHelper.combineConfiguration)(this.properties, newConfig.getAll());
|
|
14
|
+
}
|
|
15
|
+
get(key) {
|
|
16
|
+
return this.properties[key];
|
|
17
|
+
}
|
|
18
|
+
getAll() {
|
|
19
|
+
return this.properties;
|
|
20
|
+
}
|
|
21
|
+
delete(key) {
|
|
22
|
+
delete this.properties[key];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
module.exports = Configuration;
|