@zohodesk/testinglibrary 0.0.58-n20-experimental → 0.0.60-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/README.md +0 -8
- package/build/common/data-generator/steps/DataGenerator.spec.js +1 -1
- package/build/common/data-generator/steps/DataGeneratorStepsHelper.js +4 -19
- package/build/core/dataGenerator/DataGenerator.js +25 -104
- package/build/core/dataGenerator/DataGeneratorHelper.js +4 -52
- package/build/core/playwright/builtInFixtures/cacheLayer.js +2 -197
- package/build/core/playwright/constants/reporterConstants.js +1 -0
- package/build/core/playwright/helpers/auth/getUsers.js +2 -2
- package/build/core/playwright/readConfigFile.js +1 -3
- package/build/core/playwright/reporter/PlaywrightReporter.js +44 -0
- package/build/core/playwright/reporter/UnitReporter.js +27 -0
- package/build/core/playwright/validateFeature.js +0 -11
- package/build/lib/cli.js +30 -7
- package/build/utils/commonUtils.js +9 -0
- package/build/utils/logger.js +1 -3
- package/changelog.md +0 -27
- package/npm-shrinkwrap.json +7843 -3408
- package/package.json +15 -11
- package/.claude/worktrees/thirsty-yalow/.babelrc +0 -24
- package/.claude/worktrees/thirsty-yalow/.eslintrc.js +0 -31
- package/.claude/worktrees/thirsty-yalow/.gitlab-ci.yml +0 -208
- package/.claude/worktrees/thirsty-yalow/.prettierrc +0 -6
- package/.claude/worktrees/thirsty-yalow/README.md +0 -234
- package/.claude/worktrees/thirsty-yalow/bin/cli.js +0 -3
- package/.claude/worktrees/thirsty-yalow/bin/postinstall.js +0 -1
- package/.claude/worktrees/thirsty-yalow/changelog.md +0 -167
- package/.claude/worktrees/thirsty-yalow/jest.config.js +0 -82
- package/.claude/worktrees/thirsty-yalow/package.json +0 -62
- package/.claude/worktrees/thirsty-yalow/playwright.config.js +0 -62
- package/AUTO_CLEANUP_PLAN.md +0 -171
- package/build/core/dataGenerator/validateGenerators.js +0 -82
- package/build/core/playwright/report-generator.js +0 -42
- package/build/utils/datePlaceholders.js +0 -170
- package/build/utils/timeFormat.js +0 -41
- package/unit_reports/unit-report.html +0 -277
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
# Testing Framework
|
|
2
|
-
|
|
3
|
-
## Framework that abstracts the configuration for playwright and Jest
|
|
4
|
-
# 0.2.4
|
|
5
|
-
- Issue fixes on custom fixtures
|
|
6
|
-
- Page Fixture
|
|
7
|
-
- i18n Fixture
|
|
8
|
-
|
|
9
|
-
# 0.2.1
|
|
10
|
-
**Issue Fixes**
|
|
11
|
-
- Fixes issue in actors configuration
|
|
12
|
-
- Added Error Logger
|
|
13
|
-
|
|
14
|
-
# 0.2.0
|
|
15
|
-
**Major Breaking Change**
|
|
16
|
-
- Removed Env-config.json in favour of conf/*/settings.json
|
|
17
|
-
- Mode in uat.config.js is deprecated. Use command args instead
|
|
18
|
-
|
|
19
|
-
**Enhancements**
|
|
20
|
-
- Playwright version updated to 1.42.1
|
|
21
|
-
- Playwright-bdd version updated to 6.1.1
|
|
22
|
-
- Tags Support
|
|
23
|
-
- Added getMetaInfo fixture to get the actors Info data
|
|
24
|
-
|
|
25
|
-
**Issue Fixes**
|
|
26
|
-
- Fixes #10- Mode config not working properly
|
|
27
|
-
|
|
28
|
-
# 0.1.9
|
|
29
|
-
**Enhancements**
|
|
30
|
-
- Added option to specify browsers in command line.
|
|
31
|
-
- npm run uat -- --browsers='chrome,firefox'
|
|
32
|
-
- Playwright version updated to 1.41.1
|
|
33
|
-
- Added option to Skip Browser download
|
|
34
|
-
- Added New Command re-run-failed to run only the failed cases
|
|
35
|
-
**Major Change**
|
|
36
|
-
- Default fixtures moved inside the library.(Page, Context, i18N, unauthenticatedPage)
|
|
37
|
-
**Internal Library Change**
|
|
38
|
-
Examples folder updated to latest testing library version.
|
|
39
|
-
|
|
40
|
-
# 0.1.8
|
|
41
|
-
**Issue Fixes**
|
|
42
|
-
- Fix #9 Custom report generate Error on Windows
|
|
43
|
-
- Add Tags annotations only on bddMode
|
|
44
|
-
|
|
45
|
-
**Enhancements**
|
|
46
|
-
- Added Failed steps in test summary
|
|
47
|
-
|
|
48
|
-
# 0.1.7
|
|
49
|
-
**Enhancements**
|
|
50
|
-
- Added option to run teardown logic.
|
|
51
|
-
- Added support for tag based filtering.
|
|
52
|
-
- Playwright-bdd version updated to 5.6.0.
|
|
53
|
-
- New fixture added to add tag as annotations in test report
|
|
54
|
-
|
|
55
|
-
**Issue Fixes**
|
|
56
|
-
- Edition command option. Fixed the edition tags not generated properly
|
|
57
|
-
|
|
58
|
-
# 0.1.6
|
|
59
|
-
|
|
60
|
-
**Enhancements**
|
|
61
|
-
- New Command option Added `--edition`.
|
|
62
|
-
- New Configuration Added `editionOrder`.
|
|
63
|
-
`In uat.config.js, editionOrder: ['Free', 'Express']`
|
|
64
|
-
- Cache Layer added
|
|
65
|
-
|
|
66
|
-
**USAGE**
|
|
67
|
-
- npm run uat --edition="Free"
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
# 0.1.5
|
|
72
|
-
|
|
73
|
-
**Enhancements**
|
|
74
|
-
|
|
75
|
-
- Playwright version updated to `1.40.1`
|
|
76
|
-
- And and But Support added
|
|
77
|
-
- Added Code Suggestions support
|
|
78
|
-
- Custom Reporter added. Now the report will be available in json format.
|
|
79
|
-
- New Commands added.
|
|
80
|
-
|
|
81
|
-
`- help: npx ZDTestingFramework help`
|
|
82
|
-
|
|
83
|
-
- Will list down the commands available in the tool
|
|
84
|
-
|
|
85
|
-
`- clearCaches: npx ZDTestingFramework clearCaches`
|
|
86
|
-
|
|
87
|
-
- Will clear the exisiting cookies in the authentication setup
|
|
88
|
-
|
|
89
|
-
**Issue Fixes**
|
|
90
|
-
|
|
91
|
-
- Fixed Issue that occurs while quitting node process.
|
|
92
|
-
|
|
93
|
-
# 0.1.4
|
|
94
|
-
|
|
95
|
-
- `testIdAttribute` config added
|
|
96
|
-
- Fixed issue while reading boolean configuration values
|
|
97
|
-
|
|
98
|
-
# 0.1.3
|
|
99
|
-
|
|
100
|
-
- uat config sample file updated with `bddMode` and `viewport` values
|
|
101
|
-
- user configuration issue fix when the value is undefined
|
|
102
|
-
|
|
103
|
-
# 0.1.2
|
|
104
|
-
|
|
105
|
-
- Bdd version updated to `5.4.0`
|
|
106
|
-
- Playwright version updated to `1.39.0`
|
|
107
|
-
|
|
108
|
-
# 0.1.1
|
|
109
|
-
|
|
110
|
-
- Fixed post install script error
|
|
111
|
-
- Fixed error `@cucumber/gherkin` not found. Cause of this issue is updating @cucumber/cucumber to 9.5.0. Reverting this version to 9.2.0
|
|
112
|
-
- Removed testing library exports
|
|
113
|
-
|
|
114
|
-
# 0.1.0
|
|
115
|
-
|
|
116
|
-
- Removed eslint as dev dependencies as it causes `npm aliases not supported error` for npm version < 6
|
|
117
|
-
|
|
118
|
-
# 0.0.9
|
|
119
|
-
|
|
120
|
-
- Video sized in report adjusted to viewport size
|
|
121
|
-
- Changes in package.json scripts while setting up project
|
|
122
|
-
|
|
123
|
-
# 0.0.8
|
|
124
|
-
|
|
125
|
-
- Tags Support
|
|
126
|
-
- Enable running without bddmode feature
|
|
127
|
-
- viewport configuration
|
|
128
|
-
- Internal Change - Code refactoring
|
|
129
|
-
|
|
130
|
-
# 0.0.7
|
|
131
|
-
|
|
132
|
-
- Removed react and react-dom as dependencies. Added this as peer dependency
|
|
133
|
-
|
|
134
|
-
# 0.0.6
|
|
135
|
-
|
|
136
|
-
## Provided Initial Support for cucumber feature files
|
|
137
|
-
|
|
138
|
-
- Playwright-bdd and cucumber added as dependencies
|
|
139
|
-
- Added config bddMode which toggles the feature files processing
|
|
140
|
-
- Added expect timeout and test timeout as an option
|
|
141
|
-
- Decorators support for given, when and then. Typescript support needed to use this feature
|
|
142
|
-
|
|
143
|
-
## Internal Library change
|
|
144
|
-
|
|
145
|
-
- Provided support for import/export statements
|
|
146
|
-
|
|
147
|
-
# 0.0.5
|
|
148
|
-
|
|
149
|
-
- Added Init command to initialize the folder structure and configuration for testing
|
|
150
|
-
- Renamed config.json to env-config.json
|
|
151
|
-
- Configured report file path directory and Handled Edge case in Cookies Handling
|
|
152
|
-
|
|
153
|
-
# 0.0.4
|
|
154
|
-
|
|
155
|
-
- Issue Fixes while loading the storage state
|
|
156
|
-
|
|
157
|
-
# 0.0.3
|
|
158
|
-
|
|
159
|
-
- Added Support for custom config generator based on user preferences
|
|
160
|
-
|
|
161
|
-
# 0.0.2
|
|
162
|
-
|
|
163
|
-
- Fix for Finding directories inside node_modules folder
|
|
164
|
-
|
|
165
|
-
# 0.0.1
|
|
166
|
-
|
|
167
|
-
- test and report command support
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
const path = require('path');
|
|
2
|
-
const { existsSync } = require('fs');
|
|
3
|
-
const appPath = process.cwd();
|
|
4
|
-
|
|
5
|
-
const appGlobals = path.resolve(appPath, '__testUtils__', 'globals.js');
|
|
6
|
-
|
|
7
|
-
module.exports = {
|
|
8
|
-
reporters: [
|
|
9
|
-
"default",
|
|
10
|
-
[
|
|
11
|
-
"jest-html-reporter",
|
|
12
|
-
{
|
|
13
|
-
outputPath: "unit_reports/unit-report.html",
|
|
14
|
-
pageTitle: "Unit Report"
|
|
15
|
-
}
|
|
16
|
-
]
|
|
17
|
-
],
|
|
18
|
-
rootDir: process.cwd(),
|
|
19
|
-
testEnvironment: 'node',
|
|
20
|
-
|
|
21
|
-
setupFilesAfterEnv: [
|
|
22
|
-
existsSync(appGlobals) && appGlobals,
|
|
23
|
-
path.resolve(__dirname, 'src', 'core', 'jest', 'setup', 'index.js')
|
|
24
|
-
].filter(Boolean),
|
|
25
|
-
|
|
26
|
-
transform: {
|
|
27
|
-
'^.+\\.(js|jsx)$': path.resolve(
|
|
28
|
-
__dirname,
|
|
29
|
-
'src',
|
|
30
|
-
'core',
|
|
31
|
-
'jest',
|
|
32
|
-
'preprocessor',
|
|
33
|
-
'jsPreprocessor.js'
|
|
34
|
-
),
|
|
35
|
-
'^.+\\.jsx?$': 'babel-jest'
|
|
36
|
-
},
|
|
37
|
-
|
|
38
|
-
testMatch: ['**/__tests__/**/*.test.js'],
|
|
39
|
-
|
|
40
|
-
modulePathIgnorePatterns: ['/build/'],
|
|
41
|
-
|
|
42
|
-
transformIgnorePatterns: [
|
|
43
|
-
'/node_modules/',
|
|
44
|
-
'/src/setup-folder-structure/samples/'
|
|
45
|
-
],
|
|
46
|
-
|
|
47
|
-
coveragePathIgnorePatterns:[
|
|
48
|
-
'/src/setup-folder-structure/samples/'
|
|
49
|
-
],
|
|
50
|
-
|
|
51
|
-
testPathIgnorePatterns: [
|
|
52
|
-
'/node_modules/',
|
|
53
|
-
'/build/',
|
|
54
|
-
'/uat/'
|
|
55
|
-
],
|
|
56
|
-
|
|
57
|
-
watchPathIgnorePatterns: [
|
|
58
|
-
'/node_modules/',
|
|
59
|
-
'/build/'
|
|
60
|
-
],
|
|
61
|
-
|
|
62
|
-
clearMocks: true,
|
|
63
|
-
resetMocks: false,
|
|
64
|
-
|
|
65
|
-
collectCoverage: true,
|
|
66
|
-
collectCoverageFrom: ['src/**/*.js'],
|
|
67
|
-
coverageDirectory: './build/cov',
|
|
68
|
-
coverageReporters: ['lcov', 'json', 'html', 'json-summary', 'text'],
|
|
69
|
-
// coverageThreshold: {
|
|
70
|
-
// global: {
|
|
71
|
-
// branches: 100,
|
|
72
|
-
// functions: 100,
|
|
73
|
-
// lines: 100,
|
|
74
|
-
// statements: 100
|
|
75
|
-
// }
|
|
76
|
-
// },
|
|
77
|
-
globals: {
|
|
78
|
-
__DEVELOPMENT__: true,
|
|
79
|
-
__DOCS__: false,
|
|
80
|
-
__TEST__: true
|
|
81
|
-
}
|
|
82
|
-
};
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@zohodesk/testinglibrary",
|
|
3
|
-
"version": "3.2.21",
|
|
4
|
-
"description": "",
|
|
5
|
-
"main": "./build/index.js",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"postinstall": "node bin/postinstall.js",
|
|
8
|
-
"test": "jest",
|
|
9
|
-
"clean": "rm -rf build && mkdir build",
|
|
10
|
-
"build-babel": "babel -d ./build ./src --copy-files",
|
|
11
|
-
"build": "npm run clean && npm run build-babel",
|
|
12
|
-
"prepare": "npm run build",
|
|
13
|
-
"lint": "eslint src/* --fix"
|
|
14
|
-
},
|
|
15
|
-
"exports": {
|
|
16
|
-
".": "./build/index.js",
|
|
17
|
-
"./helpers": "./build/core/playwright/helpers/auth/index.js",
|
|
18
|
-
"./DataGenerator": "./build/core/dataGenerator/DataGenerator.js",
|
|
19
|
-
"./thirdPartyHelper": "./build/core/playwright/helpers/thirdPartyLib.js"
|
|
20
|
-
},
|
|
21
|
-
"keywords": [],
|
|
22
|
-
"author": "",
|
|
23
|
-
"license": "ISC",
|
|
24
|
-
"dependencies": {
|
|
25
|
-
"@babel/code-frame": "7.27.1",
|
|
26
|
-
"@babel/preset-react": "7.22.5",
|
|
27
|
-
"@cucumber/cucumber": "11.3.0",
|
|
28
|
-
"@playwright/test": "1.53.2",
|
|
29
|
-
"@reportportal/agent-js-playwright": "5.1.11",
|
|
30
|
-
"@testing-library/jest-dom": "5.11.9",
|
|
31
|
-
"babel-jest": "29.6.2",
|
|
32
|
-
"babel-plugin-transform-dynamic-import": "2.1.0",
|
|
33
|
-
"fast-glob": "3.3.1",
|
|
34
|
-
"jest": "29.6.2",
|
|
35
|
-
"jest-environment-jsdom": "29.6.2",
|
|
36
|
-
"msw": "1.2.3",
|
|
37
|
-
"playwright": "1.53.2",
|
|
38
|
-
"playwright-bdd": "8.3.1",
|
|
39
|
-
"properties-reader": "2.3.0",
|
|
40
|
-
"supports-color": "8.1.1",
|
|
41
|
-
"jsonpath": "^1.1.1"
|
|
42
|
-
},
|
|
43
|
-
"bin": {
|
|
44
|
-
"ZDTestingFramework": "./bin/cli.js"
|
|
45
|
-
},
|
|
46
|
-
"peerDependencies": {
|
|
47
|
-
"eslint": "*",
|
|
48
|
-
"react": "*",
|
|
49
|
-
"react-dom": "*"
|
|
50
|
-
},
|
|
51
|
-
"devDependencies": {
|
|
52
|
-
"@babel/cli": "7.22.15",
|
|
53
|
-
"@babel/core": "7.22.17",
|
|
54
|
-
"@babel/node": "7.22.15",
|
|
55
|
-
"@babel/plugin-transform-runtime": "7.22.15",
|
|
56
|
-
"@babel/polyfill": "7.12.1",
|
|
57
|
-
"@babel/preset-env": "7.22.15",
|
|
58
|
-
"@babel/runtime": "7.22.15",
|
|
59
|
-
"commander": "11.0.0",
|
|
60
|
-
"jest-html-reporter": "3.10.2"
|
|
61
|
-
}
|
|
62
|
-
}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
// @ts-check
|
|
2
|
-
const { defineConfig, devices } = require('@playwright/test');
|
|
3
|
-
const path = require('path');
|
|
4
|
-
const numCPUs = require('os').cpus().length;
|
|
5
|
-
|
|
6
|
-
export default defineConfig({
|
|
7
|
-
testDir: path.join(path.resolve(process.cwd()), 'uat'),
|
|
8
|
-
outputDir: path.join(process.cwd(), 'uat', 'test-results'),
|
|
9
|
-
fullyParallel: true,
|
|
10
|
-
retries: process.env.CI ? 2 : 0,
|
|
11
|
-
reporter: [['html', { outputFolder: path.join(process.cwd(), 'uat', 'playwright-report'), open: "always" }]],
|
|
12
|
-
timeout: 60 * 1000,
|
|
13
|
-
expect: {
|
|
14
|
-
timeout: 5 * 1000,
|
|
15
|
-
},
|
|
16
|
-
use: {
|
|
17
|
-
trace: 'on',
|
|
18
|
-
video: {
|
|
19
|
-
mode: 'on',
|
|
20
|
-
size: { width: 640, height: 480 }
|
|
21
|
-
}
|
|
22
|
-
},
|
|
23
|
-
projects: [
|
|
24
|
-
{ name: 'setup', testMatch: /.*\.setup\.js/ },
|
|
25
|
-
{
|
|
26
|
-
name: 'chromium',
|
|
27
|
-
use: {
|
|
28
|
-
...devices['Desktop Chrome'],
|
|
29
|
-
storageState: path.resolve(process.cwd(), 'uat', 'playwright/.auth/user.json')
|
|
30
|
-
},
|
|
31
|
-
dependencies: ['setup'],
|
|
32
|
-
},
|
|
33
|
-
|
|
34
|
-
{
|
|
35
|
-
name: 'firefox',
|
|
36
|
-
timeout: 4 * 60 * 1000,
|
|
37
|
-
expect: {
|
|
38
|
-
timeout: 80 * 1000,
|
|
39
|
-
},
|
|
40
|
-
use: {
|
|
41
|
-
...devices['Desktop Firefox'],
|
|
42
|
-
storageState: path.resolve(process.cwd(), 'uat', 'playwright/.auth/user.json')
|
|
43
|
-
},
|
|
44
|
-
dependencies: ['setup'],
|
|
45
|
-
},
|
|
46
|
-
|
|
47
|
-
{
|
|
48
|
-
name: 'webkit',
|
|
49
|
-
timeout: 2 * 60 * 1000,
|
|
50
|
-
expect: {
|
|
51
|
-
timeout: 80 * 1000,
|
|
52
|
-
},
|
|
53
|
-
use: {
|
|
54
|
-
...devices['Desktop Safari'],
|
|
55
|
-
storageState: path.resolve(process.cwd(), 'uat', 'playwright/.auth/user.json')
|
|
56
|
-
},
|
|
57
|
-
dependencies: ['setup'],
|
|
58
|
-
},
|
|
59
|
-
|
|
60
|
-
],
|
|
61
|
-
});
|
|
62
|
-
|
package/AUTO_CLEANUP_PLAN.md
DELETED
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
# Data Generator System — Design & Current State
|
|
2
|
-
|
|
3
|
-
## Data Generator Overview
|
|
4
|
-
|
|
5
|
-
### How It Works
|
|
6
|
-
- BDD step: `Given generate a "{Type}" entity "{name}" with generator "{GeneratorName}"`
|
|
7
|
-
- Framework builds a **global generator index** at first use — scans all `*.generators.json` files under `modules/`
|
|
8
|
-
- Generator names must be **unique across the entire UAT suite**
|
|
9
|
-
- `ZDTestingFramework validate` checks for duplicate generator names before test run
|
|
10
|
-
- Data generated using **org-level OAuth credentials** (org-oauth) by default
|
|
11
|
-
- When scenario runs under a non-admin profile (`@profile_agent`), data generation still uses org-level `data-generator` — falls back automatically if profile has no own credentials
|
|
12
|
-
|
|
13
|
-
### Generator File Convention
|
|
14
|
-
- **Pattern:** `*.generators.json` (configurable via `generatorFilePattern` in `uat.config.js`)
|
|
15
|
-
- **Location:** anywhere under `modules/` — discovered globally via recursive scan
|
|
16
|
-
- **Examples:** `ticket.generators.json`, `account.generators.json`, `webhook.generators.json`
|
|
17
|
-
|
|
18
|
-
### Generator JSON Structure
|
|
19
|
-
```json
|
|
20
|
-
{
|
|
21
|
-
"generators": {
|
|
22
|
-
"GeneratorName": [
|
|
23
|
-
{
|
|
24
|
-
"type": "dynamic",
|
|
25
|
-
"name": "stepName",
|
|
26
|
-
"generatorOperationId": "support.Module.operationName",
|
|
27
|
-
"dataPath": "$.response.body:$",
|
|
28
|
-
"params": { "key": "$previousStep.value" }
|
|
29
|
-
}
|
|
30
|
-
]
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
### Discovery Mechanism
|
|
36
|
-
- **Index-based** — built once, O(1) lookups
|
|
37
|
-
- `#getModulesRoot()` uses `configConstants.TEST_SLICE_FOLDER + stage + 'modules'` (deterministic)
|
|
38
|
-
- Scans recursively for files matching `generatorFilePattern` (default: `*.generators.json`)
|
|
39
|
-
- First generator name match wins (no duplicates enforced by validator)
|
|
40
|
-
|
|
41
|
-
### Profile Resolution for Data Generation
|
|
42
|
-
- **Default (no `using` profile):** Uses org-level `data-generator` from edition JSON. If scenario profile (e.g., `@profile_agent`) has no `data-generator`, falls back to org-level via `getListOfActors()`.
|
|
43
|
-
- **Explicit profile (`using "agent" profile`):** Resolves that profile's credentials via `getUserForSelectedEditionAndProfile()`.
|
|
44
|
-
|
|
45
|
-
### Constraints
|
|
46
|
-
| Constraint | Detail |
|
|
47
|
-
|---|---|
|
|
48
|
-
| **Unique generator names** | Generator names must be unique across all `*.generators.json` files |
|
|
49
|
-
| **Global discovery** | Framework scans entire `modules/` tree — generators in any module are accessible from any feature file |
|
|
50
|
-
| **File pattern** | Configurable via `generatorFilePattern` in `uat.config.js` (default: `*.generators.json`) |
|
|
51
|
-
| **DG_API_NAME matching** | In Gherkin data tables, `DG_API_NAME` column matches generator step's `name` field to inject params |
|
|
52
|
-
| **Chained steps** | Multi-step generators use `$previousStep.value` syntax to pass output between steps |
|
|
53
|
-
| **dataPath extraction** | `dataPath` uses JSONPath to extract specific fields from DG service response |
|
|
54
|
-
| **Cached response** | Generated data is cached via `cacheLayer.set(entityName, response.data)` for use in subsequent steps |
|
|
55
|
-
| **Org-level auth fallback** | If profile has no `data-generator`, org-level config from edition JSON is used automatically |
|
|
56
|
-
|
|
57
|
-
---
|
|
58
|
-
|
|
59
|
-
## Current Generators
|
|
60
|
-
|
|
61
|
-
| Generator | File | Steps | Used By |
|
|
62
|
-
|---|---|---|---|
|
|
63
|
-
| `TicketWithDepartment` | `Ticket/data-generators/ticket.generators.json` | getDepartments → createProduct → createTicket | 452+ scenarios |
|
|
64
|
-
| `TicketBasic` | `Ticket/data-generators/ticket.generators.json` | getDepartments → createTicket (no product) | Express/Free editions |
|
|
65
|
-
| `CreateAccountRecord` | `Account/data-generators/account.generators.json` | createAccount | 37 scenarios |
|
|
66
|
-
| `CreateContactRecord` | `Contact/data-generators/contact.generators.json` | createContact | 42 scenarios |
|
|
67
|
-
| `CreateContractRecord` | `Contract/DV/Subtabs/*/data-generators/contract.generators.json` | getDepartments → createAccount → createContract | 4 scenarios |
|
|
68
|
-
| `CreateWebhookRecord` | `Webhooks/List/data-generators/webhook.generators.json` | createWebhook (with default subscriptions) | Webhook scenarios |
|
|
69
|
-
| `ProductWithDepartment` | `Search/products/data-generators/products.generators.json` | getDepartments → createProduct | Product/Search scenarios |
|
|
70
|
-
|
|
71
|
-
---
|
|
72
|
-
|
|
73
|
-
## Auto-Cleanup — Design (Not Yet Implemented)
|
|
74
|
-
|
|
75
|
-
### Status
|
|
76
|
-
- **V1 implemented then removed** in `0.0.47` — CleanupTracker + DataCleanup were too tightly coupled
|
|
77
|
-
- **V2 planned** — proper redesign needed
|
|
78
|
-
|
|
79
|
-
### Why Cleanup Was Removed
|
|
80
|
-
1. `cleanupTracker` fixture added complexity to all step definitions (extra parameter)
|
|
81
|
-
2. Cleanup ran inside fixture teardown — failures were hard to debug
|
|
82
|
-
3. REST API cleanup needed auth that wasn't available in the cleanup context
|
|
83
|
-
4. No way to control cleanup order for cross-entity dependencies
|
|
84
|
-
|
|
85
|
-
### V2 Design Principles
|
|
86
|
-
1. **Cleanup config stays in generator JSON** — `cleanup` property on each step (same as V1)
|
|
87
|
-
2. **Separate cleanup phase** — not in fixture teardown, but as explicit post-scenario hook
|
|
88
|
-
3. **Auth-aware** — cleanup uses the same `actorInfo` that created the data
|
|
89
|
-
4. **Configurable** — cleanup can be disabled per scenario or globally
|
|
90
|
-
5. **Non-blocking** — cleanup failures never fail the test
|
|
91
|
-
|
|
92
|
-
### Cleanup Types (unchanged from V1 design)
|
|
93
|
-
|
|
94
|
-
#### Type 1: `oas` — DG service delete
|
|
95
|
-
```json
|
|
96
|
-
"cleanup": {
|
|
97
|
-
"type": "oas",
|
|
98
|
-
"operationId": "support.Contact.deleteContact",
|
|
99
|
-
"idPath": "$.id"
|
|
100
|
-
}
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
#### Type 2: `api` — Direct REST API DELETE
|
|
104
|
-
```json
|
|
105
|
-
"cleanup": {
|
|
106
|
-
"type": "api",
|
|
107
|
-
"method": "DELETE",
|
|
108
|
-
"apiPath": "/api/v1/contracts/{id}",
|
|
109
|
-
"idPath": "$.id"
|
|
110
|
-
}
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
#### Type 3: `api` — Disable via PATCH
|
|
114
|
-
```json
|
|
115
|
-
"cleanup": {
|
|
116
|
-
"type": "api",
|
|
117
|
-
"method": "PATCH",
|
|
118
|
-
"apiPath": "/api/v1/webhooks/{id}",
|
|
119
|
-
"idPath": "$.id",
|
|
120
|
-
"body": { "isActive": false }
|
|
121
|
-
}
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
#### No cleanup — read-only operations
|
|
125
|
-
Steps without `cleanup` property are skipped (e.g., `getDepartments`).
|
|
126
|
-
|
|
127
|
-
### V2 Implementation Plan
|
|
128
|
-
|
|
129
|
-
1. **CleanupManager** (replaces CleanupTracker + DataCleanup)
|
|
130
|
-
- Single class managing both tracking and execution
|
|
131
|
-
- Runs after scenario via `testSetup` hook (not fixture teardown)
|
|
132
|
-
- Uses `actorInfo` from the generation step for auth
|
|
133
|
-
|
|
134
|
-
2. **Config flag** in `uat.config.js`:
|
|
135
|
-
```javascript
|
|
136
|
-
autoCleanup: true, // default: true
|
|
137
|
-
cleanupTimeout: 30000 // per-entity timeout
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
3. **Per-scenario opt-out** via tag:
|
|
141
|
-
```gherkin
|
|
142
|
-
@skip_cleanup
|
|
143
|
-
Scenario: Test that needs data to persist
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
4. **Cleanup order**: reverse of creation (dependent entities first)
|
|
147
|
-
|
|
148
|
-
---
|
|
149
|
-
|
|
150
|
-
## Seed Data System — Design (Planned)
|
|
151
|
-
|
|
152
|
-
See `SEED_DATA_PLAN.md` in the consumer repo for the full design.
|
|
153
|
-
|
|
154
|
-
### Summary
|
|
155
|
-
- **Edition-scoped** — data maps to edition tiers, not portal names
|
|
156
|
-
- **Profile-based** — support creating data as specific profiles (agent login)
|
|
157
|
-
- **OAS + REST** — both API types supported
|
|
158
|
-
- **Runs before scenarios** — in `page.js` fixture after login
|
|
159
|
-
- **Idempotent** — skips existing data, creates only missing
|
|
160
|
-
|
|
161
|
-
---
|
|
162
|
-
|
|
163
|
-
## Multi-DC Portability — Design (Planned)
|
|
164
|
-
|
|
165
|
-
See `MULTI_DC_STRATEGY.md` in the consumer repo for the full design.
|
|
166
|
-
|
|
167
|
-
### Summary
|
|
168
|
-
- **`capability` field** on each portal for DC-agnostic resolution
|
|
169
|
-
- **Department aliases** in portal config for cross-DC mapping
|
|
170
|
-
- **Framework resolves** by `capability` first, `orgName` fallback
|
|
171
|
-
- **Same feature files** work across all DCs
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
exports.validateGenerators = validateGenerators;
|
|
8
|
-
var _path = _interopRequireDefault(require("path"));
|
|
9
|
-
var _fs = _interopRequireDefault(require("fs"));
|
|
10
|
-
var _logger = require("../../utils/logger");
|
|
11
|
-
var _readConfigFile = require("../playwright/readConfigFile");
|
|
12
|
-
function matchesPattern(filename, pattern) {
|
|
13
|
-
const regex = new RegExp('^' + pattern.replace(/\./g, '\\.').replace(/\*/g, '.*') + '$');
|
|
14
|
-
return regex.test(filename);
|
|
15
|
-
}
|
|
16
|
-
function findGeneratorFiles(dir, pattern, results = []) {
|
|
17
|
-
const entries = _fs.default.readdirSync(dir, {
|
|
18
|
-
withFileTypes: true
|
|
19
|
-
});
|
|
20
|
-
for (const entry of entries) {
|
|
21
|
-
const fullPath = _path.default.join(dir, entry.name);
|
|
22
|
-
if (entry.isDirectory()) {
|
|
23
|
-
findGeneratorFiles(fullPath, pattern, results);
|
|
24
|
-
} else if (matchesPattern(entry.name, pattern)) {
|
|
25
|
-
results.push(fullPath);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
return results;
|
|
29
|
-
}
|
|
30
|
-
function validateGenerators(modulesRoot) {
|
|
31
|
-
if (!_fs.default.existsSync(modulesRoot)) {
|
|
32
|
-
_logger.Logger.log(_logger.Logger.INFO_TYPE, `Modules directory not found: ${modulesRoot}. Skipping generator validation.`);
|
|
33
|
-
return {
|
|
34
|
-
valid: true,
|
|
35
|
-
duplicates: []
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
const {
|
|
39
|
-
generatorFilePattern: pattern = '*.generators.json'
|
|
40
|
-
} = (0, _readConfigFile.generateConfigFromFile)();
|
|
41
|
-
const generatorMap = {};
|
|
42
|
-
const generatorFiles = findGeneratorFiles(modulesRoot, pattern);
|
|
43
|
-
for (const filePath of generatorFiles) {
|
|
44
|
-
try {
|
|
45
|
-
const data = _fs.default.readFileSync(filePath, 'utf8');
|
|
46
|
-
const generatorObj = JSON.parse(data);
|
|
47
|
-
if (generatorObj.generators) {
|
|
48
|
-
for (const name of Object.keys(generatorObj.generators)) {
|
|
49
|
-
if (!generatorMap[name]) {
|
|
50
|
-
generatorMap[name] = [];
|
|
51
|
-
}
|
|
52
|
-
generatorMap[name].push(filePath);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
} catch (err) {
|
|
56
|
-
_logger.Logger.log(_logger.Logger.FAILURE_TYPE, `Failed to parse generator file: ${filePath} - ${err.message}`);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
const duplicates = Object.entries(generatorMap).filter(([, files]) => files.length > 1).map(([name, files]) => ({
|
|
60
|
-
name,
|
|
61
|
-
files
|
|
62
|
-
}));
|
|
63
|
-
if (duplicates.length > 0) {
|
|
64
|
-
_logger.Logger.log(_logger.Logger.FAILURE_TYPE, 'Duplicate generator names found:');
|
|
65
|
-
for (const dup of duplicates) {
|
|
66
|
-
_logger.Logger.log(_logger.Logger.FAILURE_TYPE, ` Generator "${dup.name}" defined in:`);
|
|
67
|
-
for (const file of dup.files) {
|
|
68
|
-
_logger.Logger.log(_logger.Logger.FAILURE_TYPE, ` - ${file}`);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
return {
|
|
72
|
-
valid: false,
|
|
73
|
-
duplicates
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
const generatorCount = Object.keys(generatorMap).length;
|
|
77
|
-
_logger.Logger.log(_logger.Logger.SUCCESS_TYPE, `Generator validation passed. ${generatorCount} unique generators found across ${generatorFiles.length} generator files.`);
|
|
78
|
-
return {
|
|
79
|
-
valid: true,
|
|
80
|
-
duplicates: []
|
|
81
|
-
};
|
|
82
|
-
}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
exports.default = generateReport;
|
|
8
|
-
var _child_process = require("child_process");
|
|
9
|
-
var _path = _interopRequireDefault(require("path"));
|
|
10
|
-
var _logger = require("../../utils/logger");
|
|
11
|
-
var _rootPath = require("../../utils/rootPath");
|
|
12
|
-
var _readConfigFile = require("./readConfigFile");
|
|
13
|
-
async function generateReport() {
|
|
14
|
-
// await preProcessReport()
|
|
15
|
-
const userArgs = process.argv.slice(3);
|
|
16
|
-
const playwrightPath = _path.default.resolve((0, _rootPath.getExecutableBinaryPath)('playwright'));
|
|
17
|
-
const command = playwrightPath;
|
|
18
|
-
const {
|
|
19
|
-
reportPath: htmlPath
|
|
20
|
-
} = (0, _readConfigFile.generateConfigFromFile)();
|
|
21
|
-
const args = ['show-report', htmlPath].concat(userArgs);
|
|
22
|
-
const childProcess = (0, _child_process.spawn)(command, args, {
|
|
23
|
-
stdio: 'inherit'
|
|
24
|
-
});
|
|
25
|
-
childProcess.on('error', error => {
|
|
26
|
-
_logger.Logger.log(_logger.Logger.FAILURE_TYPE, error);
|
|
27
|
-
});
|
|
28
|
-
childProcess.on('exit', (code, signal) => {
|
|
29
|
-
_logger.Logger.log(_logger.Logger.FAILURE_TYPE, `Child Process Exited with Code ${code} and Signal ${signal}`);
|
|
30
|
-
process.exit();
|
|
31
|
-
});
|
|
32
|
-
process.on('exit', () => {
|
|
33
|
-
_logger.Logger.log(_logger.Logger.INFO_TYPE, 'Terminating Playwright Process...');
|
|
34
|
-
childProcess.kill();
|
|
35
|
-
return;
|
|
36
|
-
});
|
|
37
|
-
process.on('SIGINT', () => {
|
|
38
|
-
_logger.Logger.log(_logger.Logger.INFO_TYPE, 'Cleaning up...');
|
|
39
|
-
childProcess.kill();
|
|
40
|
-
process.exit();
|
|
41
|
-
});
|
|
42
|
-
}
|