@zohodesk/testinglibrary 0.1.9 → 0.1.16-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 +4 -2
- package/.claude/settings.local.json +14 -0
- package/.gitlab-ci.yml +206 -0
- package/README.md +264 -1
- package/build/common/data-generator/steps/DataGenerator.spec.js +19 -0
- package/build/common/data-generator/steps/DataGeneratorStepsHelper.js +21 -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 +85 -0
- package/build/core/dataGenerator/DataGenerator.js +161 -0
- package/build/core/dataGenerator/DataGeneratorError.js +60 -0
- package/build/core/dataGenerator/DataGeneratorHelper.js +121 -0
- package/build/core/dataGenerator/authenticator/Authenticator.js +37 -0
- package/build/core/dataGenerator/authenticator/CookieAuthenticator.js +48 -0
- package/build/core/dataGenerator/authenticator/JWTauthenticator.js +59 -0
- package/build/core/dataGenerator/authenticator/OAuthAuthenticator.js +26 -0
- package/build/core/dataGenerator/authenticator/OrgOAuthAuthenticator.js +26 -0
- package/build/core/dataGenerator/authenticator/cookieAuthConfig.js +11 -0
- package/build/core/jest/preprocessor/jsPreprocessor.js +2 -7
- package/build/core/jest/setup/index.js +1 -7
- package/build/core/playwright/builtInFixtures/actorContext.js +78 -0
- package/build/core/playwright/builtInFixtures/caseTimeout.js +20 -0
- package/build/core/playwright/builtInFixtures/context.js +34 -16
- package/build/core/playwright/builtInFixtures/executionContext.js +17 -0
- package/build/core/playwright/builtInFixtures/i18N.js +8 -0
- package/build/core/playwright/builtInFixtures/index.js +7 -1
- package/build/core/playwright/builtInFixtures/page.js +22 -66
- package/build/core/playwright/clear-caches.js +17 -5
- package/build/core/playwright/codegen.js +4 -21
- package/build/core/playwright/configuration/Configuration.js +25 -0
- package/build/core/playwright/configuration/ConfigurationHelper.js +45 -0
- package/build/core/playwright/configuration/UserArgs.js +12 -0
- package/build/core/playwright/constants/configConstants.js +17 -0
- package/build/core/playwright/constants/failureTagConstants.js +17 -0
- package/build/core/playwright/constants/fileMutexConfig.js +9 -0
- package/build/core/playwright/constants/reporterConstants.js +20 -0
- package/build/core/playwright/constants/retryConstants.js +8 -0
- package/build/core/playwright/custom-commands.js +1 -1
- package/build/core/playwright/env-initializer.js +28 -9
- 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 +4 -1
- package/build/core/playwright/helpers/auth/checkAuthCookies.js +27 -23
- package/build/core/playwright/helpers/auth/getUsers.js +92 -45
- package/build/core/playwright/helpers/auth/index.js +30 -5
- package/build/core/playwright/helpers/auth/loginDefaultStepsHelper.js +62 -0
- package/build/core/playwright/helpers/auth/loginSteps.js +40 -22
- package/build/core/playwright/helpers/browserTimeoutFactor.js +16 -0
- package/build/core/playwright/helpers/caseTimeoutResolver.js +37 -0
- package/build/core/playwright/helpers/checkAuthDirectory.js +27 -0
- package/build/core/playwright/helpers/configFileNameProvider.js +26 -5
- package/build/core/playwright/helpers/configPathResolver.js +38 -0
- package/build/core/playwright/helpers/contextFailureHandler.js +81 -0
- package/build/core/playwright/helpers/customFixturesHelper.js +58 -0
- package/build/core/playwright/helpers/failureTagClassifier.js +197 -0
- package/build/core/playwright/helpers/fileMutex.js +71 -0
- package/build/core/playwright/helpers/logCollector.js +147 -0
- package/build/core/playwright/helpers/parseUserArgs.js +2 -3
- package/build/core/playwright/helpers/runtimeLogAnnotator.js +140 -0
- package/build/core/playwright/helpers/runtimeLogPath.js +61 -0
- package/build/core/playwright/helpers/runtimeLogReader.js +54 -0
- package/build/core/playwright/helpers/thirdPartyLib.js +13 -0
- package/build/core/playwright/index.js +8 -76
- package/build/core/playwright/patterns/casePatterns.js +9 -0
- package/build/core/playwright/patterns/codePatterns.js +9 -0
- package/build/core/playwright/patterns/environmentPatterns.js +15 -0
- package/build/core/playwright/patterns/index.js +33 -0
- package/build/core/playwright/patterns/logCollectorIgnorePatterns.js +15 -0
- package/build/core/playwright/patterns/toolPatterns.js +26 -0
- package/build/core/playwright/readConfigFile.js +49 -16
- package/build/core/playwright/reporter/PlaywrightReporter.js +58 -0
- package/build/core/playwright/reporter/Reporter.js +60 -0
- package/build/core/playwright/reporter/ShardReporter.js +62 -0
- package/build/core/playwright/reporter/UnitReporter.js +27 -0
- package/build/core/playwright/reporter/helpers/mergeAbortedTests.js +78 -0
- package/build/core/playwright/runCommand.js +71 -0
- 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 +93 -0
- package/build/core/playwright/setup/Project.js +35 -0
- package/build/core/playwright/setup/ProjectConfiguration.js +66 -0
- package/build/core/playwright/setup/config-creator.js +58 -40
- package/build/core/playwright/setup/config-utils.js +68 -37
- package/build/core/playwright/setup/custom-reporter.js +137 -14
- package/build/core/playwright/setup/merge-config.js +32 -0
- package/build/core/playwright/setup/qc-custom-reporter.js +342 -0
- package/build/core/playwright/tagProcessor.js +69 -0
- package/build/core/playwright/test-runner.js +44 -98
- package/build/core/playwright/types.js +4 -1
- 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 +17 -19
- package/build/index.js +28 -6
- package/build/lib/cli.js +42 -7
- package/build/setup-folder-structure/helper.js +2 -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/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 +7 -2
- package/build/setup-folder-structure/setupProject.js +23 -5
- package/build/test/core/dataGenerator/__tests__/DataGenerator.test.js +311 -0
- package/build/test/core/dataGenerator/__tests__/DataGeneratorHelper.test.js +204 -0
- package/build/test/core/dataGenerator/__tests__/DataGeneratorResolution.test.js +126 -0
- package/build/test/core/dataGenerator/authenticator/__tests__/Authenticator.test.js +88 -0
- package/build/test/core/dataGenerator/authenticator/__tests__/JWTauthenticator.test.js +136 -0
- package/build/test/core/dataGenerator/authenticator/__tests__/OAuthAuthenticator.test.js +39 -0
- package/build/test/core/dataGenerator/authenticator/__tests__/OrgOAuthAuthenticator.test.js +39 -0
- package/build/test/core/playwright/__tests__/runCommand.test.js +148 -0
- package/build/test/core/playwright/__tests__/tagProcessor.test.js +94 -0
- package/build/test/core/playwright/__tests__/validateFeature.test.js +72 -0
- package/build/test/core/playwright/buildInFixtures/__tests__/caseTimeout.test.js +96 -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 +75 -0
- package/build/test/core/playwright/helpers/__tests__/configPathResolver.test.js +55 -0
- package/build/test/core/playwright/helpers/__tests__/customFixturesHelper.test.js +51 -0
- package/build/test/core/playwright/helpers/__tests__/failureTagClassifier.test.js +604 -0
- package/build/test/core/playwright/helpers/__tests__/fileMutex.test.js +79 -0
- package/build/test/core/playwright/helpers/__tests__/getUsers_ListOfActors.test.js +83 -0
- package/build/test/core/playwright/helpers/__tests__/logCollector.test.js +163 -0
- package/build/test/core/playwright/helpers/__tests__/runtimeLogReader.test.js +112 -0
- package/build/test/core/playwright/helpers/auth/__tests__/checkAuthCookies.test.js +120 -0
- package/build/test/core/playwright/runner/__tests__/RunnerHelper.test.js +19 -0
- package/build/test/core/playwright/runner/__tests__/SpawnRunner.test.js +30 -0
- package/build/utils/cliArgsToObject.js +3 -0
- package/build/utils/commonUtils.js +20 -0
- package/build/utils/fileUtils.js +43 -1
- package/build/utils/logger.js +1 -30
- package/changelog.md +23 -0
- package/docs/CODE-REVIEW-AGENT.md +399 -0
- package/docs/code-review-instructions.md +157 -0
- package/jest.config.js +29 -11
- package/npm-shrinkwrap.json +13478 -4778
- package/package.json +39 -28
- package/playwright.config.js +13 -57
- package/unit_reports/unit-report.html +277 -0
- package/build/bdd-framework/cli/commands/env.js +0 -42
- package/build/bdd-framework/cli/commands/export.js +0 -47
- package/build/bdd-framework/cli/commands/test.js +0 -64
- package/build/bdd-framework/cli/index.js +0 -11
- package/build/bdd-framework/cli/options.js +0 -19
- package/build/bdd-framework/cli/worker.js +0 -13
- package/build/bdd-framework/config/configDir.js +0 -35
- package/build/bdd-framework/config/enrichReporterData.js +0 -23
- package/build/bdd-framework/config/env.js +0 -50
- package/build/bdd-framework/config/index.js +0 -94
- package/build/bdd-framework/config/lang.js +0 -14
- package/build/bdd-framework/cucumber/buildStepDefinition.js +0 -43
- package/build/bdd-framework/cucumber/createTestStep.js +0 -43
- package/build/bdd-framework/cucumber/formatter/EventDataCollector.js +0 -126
- package/build/bdd-framework/cucumber/formatter/GherkinDocumentParser.js +0 -72
- package/build/bdd-framework/cucumber/formatter/PickleParser.js +0 -25
- package/build/bdd-framework/cucumber/formatter/durationHelpers.js +0 -13
- package/build/bdd-framework/cucumber/formatter/getColorFns.js +0 -57
- package/build/bdd-framework/cucumber/formatter/index.js +0 -16
- package/build/bdd-framework/cucumber/formatter/locationHelpers.js +0 -16
- package/build/bdd-framework/cucumber/loadConfig.js +0 -17
- package/build/bdd-framework/cucumber/loadFeatures.js +0 -70
- package/build/bdd-framework/cucumber/loadSnippetBuilder.js +0 -20
- package/build/bdd-framework/cucumber/loadSteps.js +0 -47
- package/build/bdd-framework/cucumber/resolveFeaturePaths.js +0 -62
- package/build/bdd-framework/cucumber/stepArguments.js +0 -21
- package/build/bdd-framework/cucumber/types.js +0 -5
- package/build/bdd-framework/cucumber/valueChecker.js +0 -23
- package/build/bdd-framework/decorators.js +0 -18
- package/build/bdd-framework/gen/fixtures.js +0 -48
- package/build/bdd-framework/gen/formatter.js +0 -123
- package/build/bdd-framework/gen/i18n.js +0 -39
- package/build/bdd-framework/gen/index.js +0 -185
- package/build/bdd-framework/gen/testFile.js +0 -465
- package/build/bdd-framework/gen/testMeta.js +0 -60
- package/build/bdd-framework/gen/testNode.js +0 -60
- package/build/bdd-framework/gen/testPoms.js +0 -133
- package/build/bdd-framework/hooks/scenario.js +0 -130
- package/build/bdd-framework/hooks/worker.js +0 -89
- package/build/bdd-framework/index.js +0 -52
- package/build/bdd-framework/playwright/fixtureParameterNames.js +0 -93
- package/build/bdd-framework/playwright/getLocationInFile.js +0 -79
- package/build/bdd-framework/playwright/loadConfig.js +0 -42
- package/build/bdd-framework/playwright/loadUtils.js +0 -33
- package/build/bdd-framework/playwright/testTypeImpl.js +0 -61
- package/build/bdd-framework/playwright/transform.js +0 -88
- package/build/bdd-framework/playwright/types.js +0 -5
- package/build/bdd-framework/playwright/utils.js +0 -34
- package/build/bdd-framework/reporter/cucumber/base.js +0 -57
- package/build/bdd-framework/reporter/cucumber/custom.js +0 -73
- package/build/bdd-framework/reporter/cucumber/helper.js +0 -12
- package/build/bdd-framework/reporter/cucumber/html.js +0 -35
- package/build/bdd-framework/reporter/cucumber/index.js +0 -74
- package/build/bdd-framework/reporter/cucumber/json.js +0 -312
- package/build/bdd-framework/reporter/cucumber/junit.js +0 -205
- package/build/bdd-framework/reporter/cucumber/message.js +0 -20
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/AttachmentMapper.js +0 -64
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/Builder.js +0 -196
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/GherkinDocument.js +0 -43
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/GherkinDocumentClone.js +0 -52
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/GherkinDocuments.js +0 -105
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/Hook.js +0 -70
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/Meta.js +0 -45
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/Pickles.js +0 -27
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/Projects.js +0 -38
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestCase.js +0 -128
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestCaseRun.js +0 -126
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestCaseRunHooks.js +0 -102
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestStepAttachments.js +0 -50
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/TestStepRun.js +0 -88
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/index.js +0 -30
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/pwUtils.js +0 -51
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/timing.js +0 -35
- package/build/bdd-framework/reporter/cucumber/messagesBuilder/types.js +0 -5
- package/build/bdd-framework/run/StepInvoker.js +0 -68
- package/build/bdd-framework/run/bddDataAttachment.js +0 -46
- package/build/bdd-framework/run/bddFixtures.js +0 -191
- package/build/bdd-framework/run/bddWorld.js +0 -79
- package/build/bdd-framework/run/bddWorldInternal.js +0 -15
- package/build/bdd-framework/snippets/index.js +0 -132
- package/build/bdd-framework/snippets/snippetSyntax.js +0 -43
- 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 -66
- package/build/bdd-framework/stepDefinitions/decorators/class.js +0 -68
- package/build/bdd-framework/stepDefinitions/decorators/steps.js +0 -99
- package/build/bdd-framework/stepDefinitions/defineStep.js +0 -62
- package/build/bdd-framework/stepDefinitions/stepConfig.js +0 -24
- package/build/bdd-framework/utils/AutofillMap.js +0 -20
- package/build/bdd-framework/utils/exit.js +0 -62
- package/build/bdd-framework/utils/index.js +0 -93
- package/build/bdd-framework/utils/jsStringWrap.js +0 -44
- package/build/bdd-framework/utils/logger.js +0 -30
- package/build/bdd-framework/utils/stripAnsiEscapes.js +0 -20
- package/build/core/playwright/report-generator.js +0 -42
- package/build/core/playwright/tag-processor.js +0 -68
- 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,85 @@
|
|
|
1
|
+
import {createBdd} from '@zohodesk/testinglibrary';
|
|
2
|
+
import { jsonpath } from '@zohodesk/testinglibrary/thirdPartyHelper';
|
|
3
|
+
import { executeRpcRequest , entityIdReConstructor } from '../helpers/rpcRequestHelper';
|
|
4
|
+
|
|
5
|
+
const { Given } = createBdd();
|
|
6
|
+
|
|
7
|
+
Given('a search entity', async ({page}, dataTable)=>{
|
|
8
|
+
const data = dataTable.hashes();
|
|
9
|
+
|
|
10
|
+
for (const row of data) {
|
|
11
|
+
|
|
12
|
+
const { moduleName, entityId, searchString } = row;
|
|
13
|
+
const payload = {
|
|
14
|
+
className: 'applicationDriver.rpc.desk.integrations.search.SearchFakeDataPopulator',
|
|
15
|
+
methodName: 'populateSearchData',
|
|
16
|
+
arguments: {
|
|
17
|
+
module: moduleName,
|
|
18
|
+
searchString: searchString,
|
|
19
|
+
entityId: entityId
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
await entityIdReConstructor(payload);
|
|
23
|
+
|
|
24
|
+
await executeRpcRequest(page, payload);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
Given('a search entity and index a data under {string}', async ({page}, parentEntity, dataTable)=>{
|
|
29
|
+
const data = dataTable.hashes();
|
|
30
|
+
|
|
31
|
+
for (const row of data) {
|
|
32
|
+
|
|
33
|
+
const payload = {
|
|
34
|
+
className: 'applicationDriver.rpc.desk.integrations.search.SearchFakeDataPopulator',
|
|
35
|
+
methodName: 'populateSearchData',
|
|
36
|
+
arguments: {
|
|
37
|
+
module: 'ticket_under_contact_count',
|
|
38
|
+
searchString: '',
|
|
39
|
+
...row
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
await entityIdReConstructor(payload);
|
|
43
|
+
|
|
44
|
+
await executeRpcRequest(page, payload);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
Given('a search entity using {string}', async ({page,cacheLayer}, reference,dataTable)=>{
|
|
49
|
+
const data = dataTable.hashes();
|
|
50
|
+
|
|
51
|
+
const row = data[0];
|
|
52
|
+
if (!row || !row.moduleName || !row.searchString) {
|
|
53
|
+
throw new Error('Invalid or missing data in dataTable');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const { moduleName, searchEntity, searchString } = row;
|
|
57
|
+
|
|
58
|
+
const searchObj = cacheLayer.get(reference);
|
|
59
|
+
let entityIdValue;
|
|
60
|
+
|
|
61
|
+
if (typeof searchObj === 'string') {
|
|
62
|
+
entityIdValue = searchObj;
|
|
63
|
+
} else {
|
|
64
|
+
const jsonPath = searchEntity?.startsWith?.('$') ? searchEntity : `$.${searchEntity}`;
|
|
65
|
+
const result = jsonpath.query(searchObj, jsonPath);
|
|
66
|
+
|
|
67
|
+
if (!result || result.length === 0) {
|
|
68
|
+
throw new Error(`JSONPath query '${jsonPath}' returned no results from cache object for reference: ${reference}`);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
entityIdValue = result.length === 1 ? result[0] : result;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const payload = {
|
|
75
|
+
className: 'applicationDriver.rpc.desk.integrations.search.SearchFakeDataPopulator',
|
|
76
|
+
methodName: 'populateSearchData',
|
|
77
|
+
arguments: {
|
|
78
|
+
module: moduleName,
|
|
79
|
+
searchString: searchString,
|
|
80
|
+
entityId: entityIdValue
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
await entityIdReConstructor(payload);
|
|
84
|
+
await executeRpcRequest(page, payload);
|
|
85
|
+
});
|
|
@@ -0,0 +1,161 @@
|
|
|
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 _fs = _interopRequireDefault(require("fs"));
|
|
9
|
+
var _logger = require("../../utils/logger");
|
|
10
|
+
var _DataGeneratorHelper = require("./DataGeneratorHelper");
|
|
11
|
+
var _Authenticator = _interopRequireDefault(require("./authenticator/Authenticator.js"));
|
|
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, page = null) {
|
|
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 generatorOperationIds = generators.map(({
|
|
31
|
+
generatorOperationId
|
|
32
|
+
}) => generatorOperationId).filter(Boolean);
|
|
33
|
+
const domainUrl = _assertClassBrand(_DataGenerator_brand, this, _resolveDomainUrl).call(this, generatorOperationIds);
|
|
34
|
+
const processedGenerators = await (0, _DataGeneratorHelper.processGenerator)(generators, dataTable);
|
|
35
|
+
const apiPayload = await _assertClassBrand(_DataGenerator_brand, this, _constructApiPayload).call(this, scenarioName, processedGenerators, actorInfo, domainUrl, page);
|
|
36
|
+
_logger.Logger.log(_logger.Logger.INFO_TYPE, `API payload for generator: ${generatorName || 'UNKNOWN'} for scenario: ${scenarioName || 'UNKNOWN'}, Response: ${JSON.stringify(apiPayload || {})}`);
|
|
37
|
+
const response = await (0, _DataGeneratorHelper.makeRequest)(process.env.DG_SERVICE_DOMAIN + process.env.DG_SERVICE_API_PATH, apiPayload, page);
|
|
38
|
+
_logger.Logger.log(_logger.Logger.INFO_TYPE, `Generated response for the generator: ${generatorName} for scenario: ${scenarioName}, Response: ${JSON.stringify(response)}`);
|
|
39
|
+
return response;
|
|
40
|
+
} catch (error) {
|
|
41
|
+
if (error instanceof _DataGeneratorError.DataGeneratorError) {
|
|
42
|
+
console.error(error.getMessage());
|
|
43
|
+
console.error("Stack trace:", error.stack);
|
|
44
|
+
_logger.Logger.log(_logger.Logger.FAILURE_TYPE, error.getMessage());
|
|
45
|
+
} else {
|
|
46
|
+
console.error("Error Type:", error.constructor.name);
|
|
47
|
+
console.error("Error Message:", error.message);
|
|
48
|
+
console.error("Stack trace:", error.stack);
|
|
49
|
+
_logger.Logger.log(_logger.Logger.FAILURE_TYPE, `${error.constructor.name} - Message: ${error.message}`);
|
|
50
|
+
}
|
|
51
|
+
console.error('Data Generation failed for the generator: ', generatorName, "\n\nError response :", error);
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async function _getGenerator(testInfo, generatorName) {
|
|
57
|
+
let generator = null;
|
|
58
|
+
const generatorFilePaths = await (0, _DataGeneratorHelper.getGeneratorFilePaths)(testInfo.file);
|
|
59
|
+
for (const generatorFilePath of generatorFilePaths) {
|
|
60
|
+
if (!_fs.default.existsSync(generatorFilePath)) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const data = _fs.default.readFileSync(generatorFilePath, 'utf8');
|
|
64
|
+
const generatorObj = JSON.parse(data);
|
|
65
|
+
if (generatorName && generatorObj.generators) {
|
|
66
|
+
generator = generatorObj.generators[generatorName] || null;
|
|
67
|
+
}
|
|
68
|
+
if (generator) {
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (!generator) {
|
|
73
|
+
throw new _DataGeneratorError.GeneratorError(`Generator "${generatorName}" could not be found in any of the paths: ${generatorFilePaths.join(", ")}`);
|
|
74
|
+
}
|
|
75
|
+
return generator;
|
|
76
|
+
}
|
|
77
|
+
// Backward-compat: selects portalDomain for portal.* generators, domain otherwise.
|
|
78
|
+
// Remove this method and inline `process.env.portalDomain` directly once all
|
|
79
|
+
// generators use portal.* operation IDs and portalDomain is always configured.
|
|
80
|
+
function _resolveDomainUrl(generatorOperationIds) {
|
|
81
|
+
const usesPortalDomain = generatorOperationIds.some(id => id.startsWith('portal.'));
|
|
82
|
+
return usesPortalDomain ? process.env.portalDomain || process.env.domain : process.env.domain;
|
|
83
|
+
}
|
|
84
|
+
async function _generateAPIGenerator(operationId) {
|
|
85
|
+
return [{
|
|
86
|
+
type: "dynamic",
|
|
87
|
+
generatorOperationId: operationId,
|
|
88
|
+
name: operationId,
|
|
89
|
+
dataPath: "$.response.body:$"
|
|
90
|
+
}];
|
|
91
|
+
}
|
|
92
|
+
// Backward-compat: legacy v1 payload format for older DG service deployments.
|
|
93
|
+
// Remove this method and the DG_API_VERSION branch in #constructApiPayload
|
|
94
|
+
// once all environments are migrated to the v2 API.
|
|
95
|
+
async function _constructV1Payload(scenarioName, processedGenerators, actorInfo, domainUrl, page) {
|
|
96
|
+
const dataGeneratorObj = actorInfo['data-generator'];
|
|
97
|
+
if (!dataGeneratorObj) {
|
|
98
|
+
throw new _DataGeneratorError.DataGeneratorConfigurationError(`Data Generator configuration is missing for the profile: ${actorInfo['profile']}`);
|
|
99
|
+
}
|
|
100
|
+
let apiPayload = {
|
|
101
|
+
scenario_name: scenarioName,
|
|
102
|
+
data_generation_templates: processedGenerators,
|
|
103
|
+
...dataGeneratorObj
|
|
104
|
+
};
|
|
105
|
+
const account = apiPayload.account;
|
|
106
|
+
if (account) {
|
|
107
|
+
account.email = actorInfo.email;
|
|
108
|
+
account.password = actorInfo.password;
|
|
109
|
+
}
|
|
110
|
+
const environmentDetails = apiPayload.environmentDetails || {};
|
|
111
|
+
environmentDetails.iam_url = process.env.DG_IAM_DOMAIN;
|
|
112
|
+
environmentDetails.host = new URL(domainUrl).origin;
|
|
113
|
+
apiPayload.environmentDetails = environmentDetails;
|
|
114
|
+
apiPayload = await new _Authenticator.default().constructPayload(apiPayload, actorInfo, page);
|
|
115
|
+
_logger.Logger.log(_logger.Logger.INFO_TYPE, `Final API Payload (v1) after authentication augmentation: ${JSON.stringify(apiPayload)}`);
|
|
116
|
+
return apiPayload;
|
|
117
|
+
}
|
|
118
|
+
async function _constructV2Payload(scenarioName, processedGenerators, actorInfo, domainUrl, page) {
|
|
119
|
+
const dataGeneratorObj = actorInfo['data-generator'];
|
|
120
|
+
if (!dataGeneratorObj) {
|
|
121
|
+
throw new _DataGeneratorError.DataGeneratorConfigurationError(`Data Generator configuration is missing for the profile: ${actorInfo['profile']}`);
|
|
122
|
+
}
|
|
123
|
+
if (!dataGeneratorObj.account) {
|
|
124
|
+
throw new _DataGeneratorError.DataGeneratorConfigurationError('Missing "account" in data-generator config for profile: ' + actorInfo['profile']);
|
|
125
|
+
}
|
|
126
|
+
const account = {
|
|
127
|
+
...dataGeneratorObj.account
|
|
128
|
+
};
|
|
129
|
+
account.email = actorInfo.email;
|
|
130
|
+
account.password = actorInfo.password;
|
|
131
|
+
const selectedDomain = new URL(domainUrl);
|
|
132
|
+
const environment = {
|
|
133
|
+
host: selectedDomain.origin,
|
|
134
|
+
iam_url: process.env.DG_IAM_DOMAIN
|
|
135
|
+
};
|
|
136
|
+
const translatedGenerators = (0, _DataGeneratorHelper.translateGeneratorsToV2)(processedGenerators);
|
|
137
|
+
let apiPayload = {
|
|
138
|
+
scenario: {
|
|
139
|
+
name: scenarioName
|
|
140
|
+
},
|
|
141
|
+
mode: 'template',
|
|
142
|
+
spec: {
|
|
143
|
+
templates: translatedGenerators
|
|
144
|
+
},
|
|
145
|
+
account,
|
|
146
|
+
environment
|
|
147
|
+
};
|
|
148
|
+
apiPayload = await new _Authenticator.default().constructPayload(apiPayload, actorInfo, page);
|
|
149
|
+
_logger.Logger.log(_logger.Logger.INFO_TYPE, `Final API Payload after authentication augmentation: ${JSON.stringify(apiPayload)}`);
|
|
150
|
+
return apiPayload;
|
|
151
|
+
}
|
|
152
|
+
// Backward-compat: infer v1 from DG_SERVICE_API_PATH containing "/v1/".
|
|
153
|
+
// Remove this method and #constructV1Payload once all environments point to a v2 path.
|
|
154
|
+
async function _constructApiPayload(scenarioName, processedGenerators, actorInfo, domainUrl, page = null) {
|
|
155
|
+
var _process$env$DG_SERVI;
|
|
156
|
+
if ((_process$env$DG_SERVI = process.env.DG_SERVICE_API_PATH) !== null && _process$env$DG_SERVI !== void 0 && _process$env$DG_SERVI.includes('/v1/')) {
|
|
157
|
+
return _assertClassBrand(_DataGenerator_brand, this, _constructV1Payload).call(this, scenarioName, processedGenerators, actorInfo, domainUrl, page);
|
|
158
|
+
}
|
|
159
|
+
return _assertClassBrand(_DataGenerator_brand, this, _constructV2Payload).call(this, scenarioName, processedGenerators, actorInfo, domainUrl, page);
|
|
160
|
+
}
|
|
161
|
+
var _default = exports.default = DataGenerator;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.GeneratorError = exports.DataGeneratorError = exports.DataGeneratorConfigurationError = exports.AuthenticationError = 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;
|
|
51
|
+
class AuthenticationError extends DataGeneratorError {
|
|
52
|
+
constructor(message) {
|
|
53
|
+
super(message);
|
|
54
|
+
this.name = 'AuthenticationError';
|
|
55
|
+
if (Error.captureStackTrace) {
|
|
56
|
+
Error.captureStackTrace(this, AuthenticationError);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.AuthenticationError = AuthenticationError;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.getFeatureNameFromSpec = getFeatureNameFromSpec;
|
|
8
|
+
exports.getGeneratorFilePath = getGeneratorFilePath;
|
|
9
|
+
exports.getGeneratorFilePaths = getGeneratorFilePaths;
|
|
10
|
+
exports.makeRequest = makeRequest;
|
|
11
|
+
exports.postJson = postJson;
|
|
12
|
+
exports.processGenerator = processGenerator;
|
|
13
|
+
exports.translateGeneratorsToV2 = translateGeneratorsToV2;
|
|
14
|
+
var _path = _interopRequireDefault(require("path"));
|
|
15
|
+
var _logger = require("../../utils/logger");
|
|
16
|
+
var _configConstants = _interopRequireDefault(require("../playwright/constants/configConstants"));
|
|
17
|
+
const DATA_GENERATORS_DIR = 'data-generators';
|
|
18
|
+
const SPEC_FILE_SUFFIX = '.feature.spec.js';
|
|
19
|
+
|
|
20
|
+
// Translate v1 generator field names to v2 equivalents.
|
|
21
|
+
// generators.json files authored in v1 format (type:"dynamic", generatorOperationId, params, dataPath)
|
|
22
|
+
// are converted to the v2 API shape. Only params→inputs is renamed; dataPath and all other fields
|
|
23
|
+
// (including type and generatorOperationId) are passed through unchanged.
|
|
24
|
+
function translateGeneratorsToV2(generators) {
|
|
25
|
+
if (!(generators !== null && generators !== void 0 && generators.length)) {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
return generators.map(generator => {
|
|
29
|
+
const {
|
|
30
|
+
params,
|
|
31
|
+
...rest
|
|
32
|
+
} = generator;
|
|
33
|
+
const translated = {
|
|
34
|
+
...rest
|
|
35
|
+
};
|
|
36
|
+
if (params !== undefined && translated.inputs === undefined) {
|
|
37
|
+
translated.inputs = params;
|
|
38
|
+
}
|
|
39
|
+
return translated;
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
//Create payload for the generators
|
|
44
|
+
async function processGenerator(generators, dataTable) {
|
|
45
|
+
if (!dataTable) {
|
|
46
|
+
return generators;
|
|
47
|
+
}
|
|
48
|
+
return generators.map(generator => {
|
|
49
|
+
dataTable.forEach(row => {
|
|
50
|
+
const generatorName = row.DG_API_NAME;
|
|
51
|
+
if (generatorName === generator.name) {
|
|
52
|
+
generator.params = generator.params ? generator.params : {};
|
|
53
|
+
|
|
54
|
+
// The API name row is only used for matching the template
|
|
55
|
+
// Filter out DG_API_NAME and collect other values
|
|
56
|
+
Object.entries(row).filter(([key]) => key !== 'DG_API_NAME').forEach(([key, value]) => {
|
|
57
|
+
if (value !== '') {
|
|
58
|
+
generator.params[key] = value;
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
return generator;
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Routes POST requests through Playwright's request context (page.request) so calls pick up
|
|
68
|
+
// the proxy configured in playwright.config.js's `use.proxy`. Node's built-in fetch does not
|
|
69
|
+
// read HTTP_PROXY/HTTPS_PROXY, which causes connect timeouts against internal hosts that are
|
|
70
|
+
// only reachable via the corporate proxy.
|
|
71
|
+
async function postJson(url, payload, page) {
|
|
72
|
+
try {
|
|
73
|
+
const response = await page.request.post(url, {
|
|
74
|
+
data: payload,
|
|
75
|
+
headers: {
|
|
76
|
+
'Content-Type': 'application/json'
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
return {
|
|
80
|
+
ok: response.ok(),
|
|
81
|
+
status: response.status(),
|
|
82
|
+
text: () => response.text(),
|
|
83
|
+
json: () => response.json()
|
|
84
|
+
};
|
|
85
|
+
} catch (err) {
|
|
86
|
+
_logger.Logger.error(err);
|
|
87
|
+
throw new Error(`Error while making POST request to ${url}: ${err}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async function makeRequest(url, payload, page) {
|
|
91
|
+
const response = await postJson(url, payload, page);
|
|
92
|
+
if (!response.ok) {
|
|
93
|
+
const errorBody = await response.text();
|
|
94
|
+
throw new Error(`Data Generator Service Error: status: ${response.status}, body: ${errorBody}`);
|
|
95
|
+
}
|
|
96
|
+
return response.json();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Kept async for the existing call signature even though the work is synchronous.
|
|
100
|
+
async function getGeneratorFilePath(featureFile) {
|
|
101
|
+
const GENERATED_FEATURE_SEGMENT = `${_configConstants.default.FEATURES_GEN_DIR}${_path.default.sep}`;
|
|
102
|
+
let generatorPath = featureFile.replace(GENERATED_FEATURE_SEGMENT, "");
|
|
103
|
+
return generatorPath;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Feature name derived from the generated spec file,
|
|
107
|
+
// e.g. ".../feature-files/GetDepartment.feature.spec.js" -> "GetDepartment"
|
|
108
|
+
function getFeatureNameFromSpec(specFilePath) {
|
|
109
|
+
const specFileName = _path.default.basename(specFilePath);
|
|
110
|
+
return specFileName.slice(0, -SPEC_FILE_SUFFIX.length);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Candidate generator files for a feature, in lookup order:
|
|
114
|
+
// 1. per-feature file -> <module>/data-generators/<FeatureName>.generators.json
|
|
115
|
+
// 2. legacy shared file -> <module>/data-generators/generators.json
|
|
116
|
+
async function getGeneratorFilePaths(specFilePath) {
|
|
117
|
+
const featureName = getFeatureNameFromSpec(specFilePath);
|
|
118
|
+
const basePath = await getGeneratorFilePath(specFilePath);
|
|
119
|
+
const generatorDir = _path.default.join(basePath, '..', '..', DATA_GENERATORS_DIR);
|
|
120
|
+
return [_path.default.join(generatorDir, `${featureName}.generators.json`), _path.default.join(generatorDir, 'generators.json')];
|
|
121
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
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 _DataGeneratorError = require("../DataGeneratorError.js");
|
|
9
|
+
var _JWTauthenticator = _interopRequireDefault(require("./JWTauthenticator.js"));
|
|
10
|
+
var _OAuthAuthenticator = _interopRequireDefault(require("./OAuthAuthenticator.js"));
|
|
11
|
+
var _OrgOAuthAuthenticator = _interopRequireDefault(require("./OrgOAuthAuthenticator.js"));
|
|
12
|
+
var _CookieAuthenticator = _interopRequireDefault(require("./CookieAuthenticator.js"));
|
|
13
|
+
class Authenticator {
|
|
14
|
+
// Only route authentication augmentations; do not modify environment or base payload here.
|
|
15
|
+
async constructPayload(apiPayload, actorInfo, page = null) {
|
|
16
|
+
var _actorInfo$dataGener;
|
|
17
|
+
const authenticationLoaders = {
|
|
18
|
+
'jwt-auth': () => new _JWTauthenticator.default(),
|
|
19
|
+
'iam-oauth2-schema': () => new _OAuthAuthenticator.default(),
|
|
20
|
+
'org-oauth': () => new _OrgOAuthAuthenticator.default(),
|
|
21
|
+
'cookie-auth': () => new _CookieAuthenticator.default()
|
|
22
|
+
};
|
|
23
|
+
const authentications = (actorInfo === null || actorInfo === void 0 || (_actorInfo$dataGener = actorInfo['data-generator']) === null || _actorInfo$dataGener === void 0 || (_actorInfo$dataGener = _actorInfo$dataGener.account) === null || _actorInfo$dataGener === void 0 ? void 0 : _actorInfo$dataGener.authentications) || [];
|
|
24
|
+
const authenticationTypes = authentications.map(auth => String(auth).toLowerCase()).filter(Boolean);
|
|
25
|
+
for (const authenticationType of authenticationTypes) {
|
|
26
|
+
const authenticatorLoader = authenticationLoaders[authenticationType];
|
|
27
|
+
if (!authenticatorLoader) {
|
|
28
|
+
throw new _DataGeneratorError.AuthenticationError(`Unknown authentication type: "${authenticationType}". Supported types are: ${Object.keys(authenticationLoaders).join(', ')}`);
|
|
29
|
+
}
|
|
30
|
+
const authenticatorInstance = await authenticatorLoader();
|
|
31
|
+
apiPayload = await authenticatorInstance.constructPayload(apiPayload, actorInfo, page);
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
return apiPayload;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.default = Authenticator;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _cookieAuthConfig = require("./cookieAuthConfig.js");
|
|
8
|
+
var _DataGeneratorError = require("../DataGeneratorError.js");
|
|
9
|
+
/**
|
|
10
|
+
* CookieAuthenticator prepares the payload for cookie-based authentication.
|
|
11
|
+
* It extracts cookies from the browser page context and attaches them
|
|
12
|
+
* as cookieAuthHeaders in the account block for the data generator service.
|
|
13
|
+
*/
|
|
14
|
+
class CookieAuthenticator {
|
|
15
|
+
async constructPayload(apiPayload, actorInfo, page = null) {
|
|
16
|
+
if (!page) {
|
|
17
|
+
throw new _DataGeneratorError.AuthenticationError('Cookie authentication failed: "page" is required but was not provided');
|
|
18
|
+
}
|
|
19
|
+
const {
|
|
20
|
+
csrfHeaderName
|
|
21
|
+
} = _cookieAuthConfig.COOKIE_AUTH_CONFIG;
|
|
22
|
+
const {
|
|
23
|
+
csrfToken,
|
|
24
|
+
cookieString
|
|
25
|
+
} = await _getCookies.call(CookieAuthenticator, page);
|
|
26
|
+
apiPayload.account.authHeaders = {
|
|
27
|
+
Cookie: cookieString,
|
|
28
|
+
[csrfHeaderName]: csrfToken
|
|
29
|
+
};
|
|
30
|
+
return apiPayload;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async function _getCookies(page) {
|
|
34
|
+
const {
|
|
35
|
+
csrfCookieName,
|
|
36
|
+
csrfParamName
|
|
37
|
+
} = _cookieAuthConfig.COOKIE_AUTH_CONFIG;
|
|
38
|
+
const context = page.context();
|
|
39
|
+
const pageUrl = new URL(page.url());
|
|
40
|
+
const currentDomain = pageUrl.hostname;
|
|
41
|
+
const cookies = await context.cookies([page.url()]);
|
|
42
|
+
const csrfCookies = cookies.filter(cookie => cookie.domain.includes(currentDomain) && cookie.name === csrfCookieName);
|
|
43
|
+
return {
|
|
44
|
+
csrfToken: csrfCookies.map(c => `${csrfParamName}=${c.value}`).join('; '),
|
|
45
|
+
cookieString: cookies.map(c => `${c.name}=${c.value}`).join('; ')
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
var _default = exports.default = CookieAuthenticator;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _DataGeneratorError = require("../DataGeneratorError.js");
|
|
8
|
+
var _DataGeneratorHelper = require("../DataGeneratorHelper.js");
|
|
9
|
+
/**
|
|
10
|
+
* JWTauthenticator constructs payload by fetching a JWT access token
|
|
11
|
+
* from the authenticator app and attaching it to the account.jwt config.
|
|
12
|
+
*/
|
|
13
|
+
class JWTauthenticator {
|
|
14
|
+
async constructPayload(apiPayload, actorInfo, page = null) {
|
|
15
|
+
const account = actorInfo['data-generator'].account;
|
|
16
|
+
if (!account) {
|
|
17
|
+
throw new _DataGeneratorError.AuthenticationError('JWT authentication failed: "account" is missing in actor configuration');
|
|
18
|
+
}
|
|
19
|
+
const jwtConf = account['jwt-oauth'];
|
|
20
|
+
if (!jwtConf) {
|
|
21
|
+
throw new _DataGeneratorError.AuthenticationError('JWT authentication failed: "jwt-oauth" is missing in actor configuration');
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Build payload for authenticator service
|
|
25
|
+
const userToken = encodeURIComponent((actorInfo === null || actorInfo === void 0 ? void 0 : actorInfo.email) || '');
|
|
26
|
+
const jwtAuthUrl = process.env.DG_JWT_AUTH_URL;
|
|
27
|
+
const responseType = jwtConf.response_type;
|
|
28
|
+
const clientId = jwtConf.client_id;
|
|
29
|
+
const tokenUrl = jwtConf.token_url;
|
|
30
|
+
const domainUrl = process.env.DG_DOMAIN_URL;
|
|
31
|
+
const authPayload = {
|
|
32
|
+
user_token: userToken,
|
|
33
|
+
jwt_secret: jwtConf.jwt_secret,
|
|
34
|
+
jwt_auth_url: jwtAuthUrl,
|
|
35
|
+
response_type: responseType,
|
|
36
|
+
client_id: clientId,
|
|
37
|
+
token_url: tokenUrl,
|
|
38
|
+
domain_url: domainUrl
|
|
39
|
+
};
|
|
40
|
+
const authenticatorApi = process.env.DG_JWT_AUTHENTICATOR_API;
|
|
41
|
+
const resp = await (0, _DataGeneratorHelper.postJson)(authenticatorApi, authPayload, page);
|
|
42
|
+
if (!resp.ok) {
|
|
43
|
+
const errorBody = await resp.text();
|
|
44
|
+
throw new Error(`JWT authenticator error! status: ${resp.status}, body: ${errorBody}`);
|
|
45
|
+
}
|
|
46
|
+
const json = await resp.json();
|
|
47
|
+
const accessToken = json === null || json === void 0 ? void 0 : json.access_token;
|
|
48
|
+
if (!accessToken) {
|
|
49
|
+
throw new Error('JWT authenticator did not return access_token');
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Attach access token to authHeaders so downstream API calls can use it directly
|
|
53
|
+
apiPayload.account = apiPayload.account || {};
|
|
54
|
+
apiPayload.account.authHeaders = apiPayload.account.authHeaders || {};
|
|
55
|
+
apiPayload.account.authHeaders.Authorization = `Zoho-oauthtoken ${accessToken}`;
|
|
56
|
+
return apiPayload;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
var _default = exports.default = JWTauthenticator;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _DataGeneratorError = require("../DataGeneratorError.js");
|
|
8
|
+
/**
|
|
9
|
+
* OAuthAuthenticator prepares the payload for OAuth2-based authentication.
|
|
10
|
+
* It ensures oauth2 config is present in the account block so the
|
|
11
|
+
* data generator service can use it.
|
|
12
|
+
*/
|
|
13
|
+
class OAuthAuthenticator {
|
|
14
|
+
async constructPayload(apiPayload, actorInfo) {
|
|
15
|
+
const account = actorInfo['data-generator'].account;
|
|
16
|
+
if (!account) {
|
|
17
|
+
throw new _DataGeneratorError.AuthenticationError('OAuth2 authentication failed: "account" is missing in actor configuration');
|
|
18
|
+
}
|
|
19
|
+
if (!account.oauth2) {
|
|
20
|
+
throw new _DataGeneratorError.AuthenticationError('OAuth2 authentication failed: "oauth2" is missing in actor configuration');
|
|
21
|
+
}
|
|
22
|
+
apiPayload.account.oauth2 = account.oauth2;
|
|
23
|
+
return apiPayload;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
var _default = exports.default = OAuthAuthenticator;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _DataGeneratorError = require("../DataGeneratorError.js");
|
|
8
|
+
/**
|
|
9
|
+
* OrgOAuthAuthenticator prepares the payload for org_oauth authentication.
|
|
10
|
+
* It ensures org_oauth config is present in the account block so the
|
|
11
|
+
* data generator service can use it.
|
|
12
|
+
*/
|
|
13
|
+
class OrgOAuthAuthenticator {
|
|
14
|
+
async constructPayload(apiPayload, actorInfo) {
|
|
15
|
+
const account = actorInfo['data-generator'].account;
|
|
16
|
+
if (!account) {
|
|
17
|
+
throw new _DataGeneratorError.AuthenticationError('OrgOAuth authentication failed: "account" is missing in actor configuration');
|
|
18
|
+
}
|
|
19
|
+
if (!account.org_oauth) {
|
|
20
|
+
throw new _DataGeneratorError.AuthenticationError('OrgOAuth authentication failed: "org_oauth" is missing in actor configuration');
|
|
21
|
+
}
|
|
22
|
+
apiPayload.account.org_oauth = account.org_oauth;
|
|
23
|
+
return apiPayload;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
var _default = exports.default = OrgOAuthAuthenticator;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.COOKIE_AUTH_CONFIG = void 0;
|
|
7
|
+
const COOKIE_AUTH_CONFIG = exports.COOKIE_AUTH_CONFIG = {
|
|
8
|
+
csrfHeaderName: 'X-ZCSRF-TOKEN',
|
|
9
|
+
csrfCookieName: 'crmcsr',
|
|
10
|
+
csrfParamName: 'crmcsrfparam'
|
|
11
|
+
};
|
|
@@ -1,12 +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 = exports.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
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");
|