codeceptjs 3.6.6 → 4.0.0-beta.1

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.
Files changed (151) hide show
  1. package/bin/codecept.js +81 -84
  2. package/lib/actor.js +13 -13
  3. package/lib/ai.js +13 -10
  4. package/lib/assert/empty.js +21 -20
  5. package/lib/assert/equal.js +39 -37
  6. package/lib/assert/error.js +14 -14
  7. package/lib/assert/include.js +47 -46
  8. package/lib/assert/throws.js +11 -13
  9. package/lib/assert/truth.js +22 -19
  10. package/lib/assert.js +2 -4
  11. package/lib/cli.js +49 -57
  12. package/lib/codecept.js +155 -142
  13. package/lib/colorUtils.js +3 -3
  14. package/lib/command/configMigrate.js +52 -58
  15. package/lib/command/definitions.js +89 -88
  16. package/lib/command/dryRun.js +68 -71
  17. package/lib/command/generate.js +188 -197
  18. package/lib/command/gherkin/init.js +16 -27
  19. package/lib/command/gherkin/snippets.js +20 -20
  20. package/lib/command/gherkin/steps.js +8 -8
  21. package/lib/command/info.js +38 -40
  22. package/lib/command/init.js +288 -290
  23. package/lib/command/interactive.js +32 -32
  24. package/lib/command/list.js +26 -26
  25. package/lib/command/run-multiple/chunk.js +5 -5
  26. package/lib/command/run-multiple/collection.js +3 -3
  27. package/lib/command/run-multiple/run.js +2 -6
  28. package/lib/command/run-multiple.js +93 -113
  29. package/lib/command/run-rerun.js +25 -20
  30. package/lib/command/run-workers.js +66 -64
  31. package/lib/command/run.js +29 -26
  32. package/lib/command/utils.js +65 -80
  33. package/lib/command/workers/runTests.js +10 -10
  34. package/lib/config.js +9 -10
  35. package/lib/container.js +48 -40
  36. package/lib/data/context.js +59 -60
  37. package/lib/data/dataScenarioConfig.js +47 -47
  38. package/lib/data/dataTableArgument.js +29 -29
  39. package/lib/data/table.js +20 -26
  40. package/lib/dirname.js +5 -0
  41. package/lib/event.js +167 -163
  42. package/lib/heal.js +17 -13
  43. package/lib/helper/AI.js +41 -130
  44. package/lib/helper/ApiDataFactory.js +69 -73
  45. package/lib/helper/Appium.js +381 -412
  46. package/lib/helper/Expect.js +425 -0
  47. package/lib/helper/ExpectHelper.js +48 -40
  48. package/lib/helper/FileSystem.js +79 -80
  49. package/lib/helper/GraphQL.js +43 -44
  50. package/lib/helper/GraphQLDataFactory.js +50 -50
  51. package/lib/helper/JSONResponse.js +62 -65
  52. package/lib/helper/Mochawesome.js +28 -28
  53. package/lib/helper/MockServer.js +14 -12
  54. package/lib/helper/Nightmare.js +566 -662
  55. package/lib/helper/Playwright.js +1216 -1361
  56. package/lib/helper/Protractor.js +627 -663
  57. package/lib/helper/Puppeteer.js +1128 -1231
  58. package/lib/helper/REST.js +68 -159
  59. package/lib/helper/SoftExpectHelper.js +2 -2
  60. package/lib/helper/TestCafe.js +484 -490
  61. package/lib/helper/WebDriver.js +1156 -1297
  62. package/lib/helper/clientscripts/PollyWebDriverExt.js +1 -1
  63. package/lib/helper/errors/ConnectionRefused.js +1 -1
  64. package/lib/helper/errors/ElementAssertion.js +2 -2
  65. package/lib/helper/errors/ElementNotFound.js +2 -2
  66. package/lib/helper/errors/RemoteBrowserConnectionRefused.js +1 -1
  67. package/lib/helper/extras/Console.js +1 -1
  68. package/lib/helper/extras/PlaywrightPropEngine.js +2 -2
  69. package/lib/helper/extras/PlaywrightReactVueLocator.js +1 -1
  70. package/lib/helper/extras/PlaywrightRestartOpts.js +18 -21
  71. package/lib/helper/extras/Popup.js +1 -1
  72. package/lib/helper/extras/React.js +3 -3
  73. package/lib/helper/network/actions.js +7 -14
  74. package/lib/helper/network/utils.js +2 -3
  75. package/lib/helper/scripts/blurElement.js +1 -1
  76. package/lib/helper/scripts/focusElement.js +1 -1
  77. package/lib/helper/scripts/highlightElement.js +1 -1
  78. package/lib/helper/scripts/isElementClickable.js +1 -1
  79. package/lib/helper/testcafe/testControllerHolder.js +1 -1
  80. package/lib/helper/testcafe/testcafe-utils.js +7 -6
  81. package/lib/helper.js +3 -1
  82. package/lib/history.js +5 -6
  83. package/lib/hooks.js +6 -6
  84. package/lib/html.js +7 -7
  85. package/lib/index.js +41 -25
  86. package/lib/interfaces/bdd.js +64 -47
  87. package/lib/interfaces/featureConfig.js +19 -19
  88. package/lib/interfaces/gherkin.js +118 -124
  89. package/lib/interfaces/scenarioConfig.js +29 -29
  90. package/lib/listener/artifacts.js +9 -9
  91. package/lib/listener/config.js +24 -24
  92. package/lib/listener/exit.js +12 -12
  93. package/lib/listener/helpers.js +42 -42
  94. package/lib/listener/mocha.js +11 -11
  95. package/lib/listener/retry.js +30 -32
  96. package/lib/listener/steps.js +53 -50
  97. package/lib/listener/timeout.js +54 -54
  98. package/lib/locator.js +10 -6
  99. package/lib/mochaFactory.js +15 -18
  100. package/lib/output.js +10 -6
  101. package/lib/parser.js +12 -15
  102. package/lib/pause.js +33 -40
  103. package/lib/plugin/allure.js +15 -15
  104. package/lib/plugin/autoDelay.js +37 -29
  105. package/lib/plugin/autoLogin.js +65 -70
  106. package/lib/plugin/commentStep.js +18 -18
  107. package/lib/plugin/coverage.js +67 -115
  108. package/lib/plugin/customLocator.js +20 -21
  109. package/lib/plugin/debugErrors.js +24 -24
  110. package/lib/plugin/eachElement.js +38 -38
  111. package/lib/plugin/fakerTransform.js +6 -6
  112. package/lib/plugin/heal.js +108 -67
  113. package/lib/plugin/pauseOnFail.js +11 -11
  114. package/lib/plugin/retryFailedStep.js +39 -32
  115. package/lib/plugin/retryTo.js +40 -46
  116. package/lib/plugin/screenshotOnFail.js +87 -109
  117. package/lib/plugin/selenoid.js +118 -131
  118. package/lib/plugin/standardActingHelpers.js +8 -2
  119. package/lib/plugin/stepByStepReport.js +91 -110
  120. package/lib/plugin/stepTimeout.js +23 -24
  121. package/lib/plugin/subtitles.js +35 -34
  122. package/lib/plugin/tryTo.js +30 -40
  123. package/lib/plugin/wdio.js +75 -78
  124. package/lib/recorder.js +17 -14
  125. package/lib/rerun.js +10 -11
  126. package/lib/scenario.js +23 -25
  127. package/lib/secret.js +2 -4
  128. package/lib/session.js +10 -10
  129. package/lib/step.js +9 -12
  130. package/lib/store.js +3 -2
  131. package/lib/transform.js +1 -1
  132. package/lib/translation.js +8 -7
  133. package/lib/ui.js +14 -12
  134. package/lib/utils.js +72 -70
  135. package/lib/within.js +10 -10
  136. package/lib/workerStorage.js +25 -27
  137. package/lib/workers.js +32 -29
  138. package/package.json +53 -51
  139. package/translations/de-DE.js +1 -1
  140. package/translations/fr-FR.js +1 -1
  141. package/translations/index.js +13 -9
  142. package/translations/it-IT.js +1 -1
  143. package/translations/ja-JP.js +1 -1
  144. package/translations/pl-PL.js +1 -1
  145. package/translations/pt-BR.js +1 -1
  146. package/translations/ru-RU.js +1 -1
  147. package/translations/zh-CN.js +1 -1
  148. package/translations/zh-TW.js +1 -1
  149. package/typings/index.d.ts +65 -415
  150. package/typings/promiseBasedTypes.d.ts +32 -0
  151. package/typings/types.d.ts +32 -0
package/lib/data/table.js CHANGED
@@ -4,46 +4,40 @@
4
4
  class DataTable {
5
5
  /** @param {Array<*>} array */
6
6
  constructor(array) {
7
- this.array = array
8
- this.rows = new Array(0)
7
+ this.array = array;
8
+ this.rows = new Array(0);
9
9
  }
10
10
 
11
11
  /** @param {Array<*>} array */
12
12
  add(array) {
13
- if (array.length !== this.array.length)
14
- throw new Error(
15
- `There is too many elements in given data array. Please provide data in this format: ${this.array}`,
16
- )
17
- const tempObj = {}
18
- let arrayCounter = 0
13
+ if (array.length !== this.array.length) throw new Error(`There is too many elements in given data array. Please provide data in this format: ${this.array}`);
14
+ const tempObj = {};
15
+ let arrayCounter = 0;
19
16
  this.array.forEach((elem) => {
20
- tempObj[elem] = array[arrayCounter]
21
- tempObj.toString = () => JSON.stringify(tempObj)
22
- arrayCounter++
23
- })
24
- this.rows.push({ skip: false, data: tempObj })
17
+ tempObj[elem] = array[arrayCounter];
18
+ tempObj.toString = () => JSON.stringify(tempObj);
19
+ arrayCounter++;
20
+ });
21
+ this.rows.push({ skip: false, data: tempObj });
25
22
  }
26
23
 
27
24
  /** @param {Array<*>} array */
28
25
  xadd(array) {
29
- if (array.length !== this.array.length)
30
- throw new Error(
31
- `There is too many elements in given data array. Please provide data in this format: ${this.array}`,
32
- )
33
- const tempObj = {}
34
- let arrayCounter = 0
26
+ if (array.length !== this.array.length) throw new Error(`There is too many elements in given data array. Please provide data in this format: ${this.array}`);
27
+ const tempObj = {};
28
+ let arrayCounter = 0;
35
29
  this.array.forEach((elem) => {
36
- tempObj[elem] = array[arrayCounter]
37
- tempObj.toString = () => JSON.stringify(tempObj)
38
- arrayCounter++
39
- })
40
- this.rows.push({ skip: true, data: tempObj })
30
+ tempObj[elem] = array[arrayCounter];
31
+ tempObj.toString = () => JSON.stringify(tempObj);
32
+ arrayCounter++;
33
+ });
34
+ this.rows.push({ skip: true, data: tempObj });
41
35
  }
42
36
 
43
37
  /** @param {Function} func */
44
38
  filter(func) {
45
- return this.rows.filter((row) => func(row.data))
39
+ return this.rows.filter(row => func(row.data));
46
40
  }
47
41
  }
48
42
 
49
- module.exports = DataTable
43
+ export default DataTable;
package/lib/dirname.js ADDED
@@ -0,0 +1,5 @@
1
+ import { fileURLToPath } from 'url';
2
+ import { dirname } from 'path';
3
+
4
+ const __filename = fileURLToPath(import.meta.url);
5
+ export const __dirname = dirname(__filename);
package/lib/event.js CHANGED
@@ -1,172 +1,176 @@
1
- const debug = require('debug')('codeceptjs:event');
2
- const events = require('events');
3
- const { error } = require('./output');
1
+ import debug from 'debug';
2
+
3
+ import events from 'events';
4
+ import * as output from './output.js';
5
+
6
+ debug('codeceptjs:event');
4
7
 
5
8
  const dispatcher = new events.EventEmitter();
6
9
 
7
10
  dispatcher.setMaxListeners(50);
11
+
8
12
  /**
9
- * @namespace
10
- * @alias event
13
+ * @type {object}
14
+ * @constant
15
+ * @inner
16
+ * @property {'test.start'} started
17
+ * @property {'test.before'} before
18
+ * @property {'test.after'} after
19
+ * @property {'test.passed'} passed
20
+ * @property {'test.failed'} failed
21
+ * @property {'test.finish'} finished
22
+ * @property {'test.skipped'} skipped
11
23
  */
12
- module.exports = {
13
- /**
14
- * @type {NodeJS.EventEmitter}
15
- * @constant
16
- * @inner
17
- */
18
- dispatcher,
19
- /**
20
- * @type {object}
21
- * @constant
22
- * @inner
23
- * @property {'test.start'} started
24
- * @property {'test.before'} before
25
- * @property {'test.after'} after
26
- * @property {'test.passed'} passed
27
- * @property {'test.failed'} failed
28
- * @property {'test.finish'} finished
29
- * @property {'test.skipped'} skipped
30
- */
31
- test: {
32
- started: 'test.start', // sync
33
- before: 'test.before', // async
34
- after: 'test.after', // async
35
- passed: 'test.passed', // sync
36
- failed: 'test.failed', // sync
37
- finished: 'test.finish', // sync
38
- skipped: 'test.skipped', // sync
39
- },
40
- /**
41
- * @type {object}
42
- * @constant
43
- * @inner
44
- * @property {'suite.before'} before
45
- * @property {'suite.after'} after
46
- */
47
- suite: {
48
- before: 'suite.before',
49
- after: 'suite.after',
50
- },
51
- /**
52
- * @type {object}
53
- * @constant
54
- * @inner
55
- * @property {'hook.start'} started
56
- * @property {'hook.passed'} passed
57
- */
58
- hook: {
59
- started: 'hook.start',
60
- passed: 'hook.passed',
61
- failed: 'hook.failed',
62
- },
63
- /**
64
- * @type {object}
65
- * @constant
66
- * @inner
67
- * @property {'step.start'} started
68
- * @property {'step.before'} before
69
- * @property {'step.after'} after
70
- * @property {'step.passed'} passed
71
- * @property {'step.failed'} failed
72
- * @property {'step.finish'} finished
73
- * @property {'step.comment'} comment
74
- */
75
- step: {
76
- before: 'step.before', // async
77
- after: 'step.after', // async
78
- started: 'step.start', // sync
79
- passed: 'step.passed', // sync
80
- failed: 'step.failed', // sync
81
- finished: 'step.finish', // sync
82
- comment: 'step.comment',
83
- },
84
- /**
85
- * @type {object}
86
- * @constant
87
- * @inner
88
- * @property {'suite.before'} before
89
- * @property {'suite.after'} after
90
- */
91
- bddStep: {
92
- before: 'bddStep.before',
93
- after: 'bddStep.after',
94
- started: 'bddStep.started',
95
- finished: 'bddStep.finished',
96
- },
97
- /**
98
- * @type {object}
99
- * @constant
100
- * @inner
101
- * @property {'global.before'} before
102
- * @property {'global.after'} after
103
- * @property {'global.result'} result
104
- * @property {'global.failures'} failures
105
- */
106
- all: {
107
- before: 'global.before',
108
- after: 'global.after',
109
- result: 'global.result',
110
- failures: 'global.failures',
111
- },
112
- /**
113
- * @type {object}
114
- * @constant
115
- * @inner
116
- * @property {'multiple.before'} before
117
- * @property {'multiple.after'} after
118
- */
119
- multiple: {
120
- before: 'multiple.before',
121
- after: 'multiple.after',
122
- },
123
-
124
- /**
125
- * @type {object}
126
- * @constant
127
- * @inner
128
- * @property {'workers.before'} before
129
- * @property {'workers.after'} after
130
- * @property {'workers.result'} result
131
- */
132
- workers: {
133
- before: 'workers.before',
134
- after: 'workers.after',
135
- result: 'workers.result',
136
- },
24
+ export const test = {
25
+ started: 'test.start', // sync
26
+ before: 'test.before', // async
27
+ after: 'test.after', // async
28
+ passed: 'test.passed', // sync
29
+ failed: 'test.failed', // sync
30
+ finished: 'test.finish', // sync
31
+ skipped: 'test.skipped', // sync
32
+ };
137
33
 
138
- /**
139
- * @param {string} event
140
- * @param {*} [param]
141
- */
142
- emit(event, param) {
143
- let msg = `Emitted | ${event}`;
144
- if (param && param.toString()) {
145
- msg += ` (${param.toString()})`;
146
- }
147
- debug(msg);
148
- try {
149
- this.dispatcher.emit.apply(this.dispatcher, arguments);
150
- } catch (err) {
151
- error(`Error processing ${event} event:`);
152
- error(err.stack);
153
- }
154
- },
34
+ /**
35
+ * @type {object}
36
+ * @constant
37
+ * @inner
38
+ * @property {'suite.before'} before
39
+ * @property {'suite.after'} after
40
+ */
41
+ export const suite = {
42
+ before: 'suite.before',
43
+ after: 'suite.after',
44
+ };
45
+ /**
46
+ * @type {object}
47
+ * @constant
48
+ * @inner
49
+ * @property {'hook.start'} started
50
+ * @property {'hook.passed'} passed
51
+ */
52
+ export const hook = {
53
+ started: 'hook.start',
54
+ passed: 'hook.passed',
55
+ failed: 'hook.failed',
56
+ };
57
+ /**
58
+ * @type {object}
59
+ * @constant
60
+ * @inner
61
+ * @property {'step.start'} started
62
+ * @property {'step.before'} before
63
+ * @property {'step.after'} after
64
+ * @property {'step.passed'} passed
65
+ * @property {'step.failed'} failed
66
+ * @property {'step.finish'} finished
67
+ * @property {'step.comment'} comment
68
+ */
69
+ export const step = {
70
+ before: 'step.before', // async
71
+ after: 'step.after', // async
72
+ started: 'step.start', // sync
73
+ passed: 'step.passed', // sync
74
+ failed: 'step.failed', // sync
75
+ finished: 'step.finish', // sync
76
+ comment: 'step.comment',
77
+ };
78
+ /**
79
+ * @type {object}
80
+ * @constant
81
+ * @inner
82
+ * @property {'suite.before'} before
83
+ * @property {'suite.after'} after
84
+ */
85
+ export const bddStep = {
86
+ before: 'bddStep.before',
87
+ after: 'bddStep.after',
88
+ started: 'bddStep.started',
89
+ finished: 'bddStep.finished',
90
+ };
91
+ /**
92
+ * @type {object}
93
+ * @constant
94
+ * @inner
95
+ * @property {'global.before'} before
96
+ * @property {'global.after'} after
97
+ * @property {'global.result'} result
98
+ * @property {'global.failures'} failures
99
+ */
100
+ export const all = {
101
+ before: 'global.before',
102
+ after: 'global.after',
103
+ result: 'global.result',
104
+ failures: 'global.failures',
105
+ };
106
+ /**
107
+ * @type {object}
108
+ * @constant
109
+ * @inner
110
+ * @property {'multiple.before'} before
111
+ * @property {'multiple.after'} after
112
+ */
113
+ export const multiple = {
114
+ before: 'multiple.before',
115
+ after: 'multiple.after',
116
+ };
155
117
 
156
- /** for testing only! */
157
- cleanDispatcher: () => {
158
- let event;
159
- for (event in this.test) {
160
- this.dispatcher.removeAllListeners(this.test[event]);
161
- }
162
- for (event in this.suite) {
163
- this.dispatcher.removeAllListeners(this.test[event]);
164
- }
165
- for (event in this.step) {
166
- this.dispatcher.removeAllListeners(this.test[event]);
167
- }
168
- for (event in this.all) {
169
- this.dispatcher.removeAllListeners(this.test[event]);
170
- }
171
- },
118
+ /**
119
+ * @type {object}
120
+ * @constant
121
+ * @inner
122
+ * @property {'workers.before'} before
123
+ * @property {'workers.after'} after
124
+ * @property {'workers.result'} result
125
+ */
126
+ export const workers = {
127
+ before: 'workers.before',
128
+ after: 'workers.after',
129
+ result: 'workers.result',
172
130
  };
131
+
132
+ /** for testing only! */
133
+ export function cleanDispatcher() {
134
+ let event;
135
+ for (event in test) {
136
+ dispatcher.removeAllListeners(test[event]);
137
+ }
138
+ for (event in suite) {
139
+ dispatcher.removeAllListeners(test[event]);
140
+ }
141
+ for (event in step) {
142
+ dispatcher.removeAllListeners(test[event]);
143
+ }
144
+ for (event in all) {
145
+ dispatcher.removeAllListeners(test[event]);
146
+ }
147
+ }
148
+
149
+ /**
150
+ * @namespace
151
+ * @alias event
152
+ */
153
+ /**
154
+ * @type {NodeJS.EventEmitter}
155
+ * @constant
156
+ * @inner
157
+ */
158
+ export { dispatcher };
159
+
160
+ /**
161
+ * @param {string} event
162
+ * @param {*} [param]
163
+ */
164
+ export function emit(event, param) {
165
+ let msg = `Emitted | ${event}`;
166
+ if (param && param.toString()) {
167
+ msg += ` (${param.toString()})`;
168
+ }
169
+ output.output.debug(msg);
170
+ try {
171
+ dispatcher.emit.apply(dispatcher, arguments);
172
+ } catch (err) {
173
+ output.output.error(`Error processing ${event} event:`);
174
+ output.output.error(err.stack);
175
+ }
176
+ }
package/lib/heal.js CHANGED
@@ -1,9 +1,13 @@
1
- const debug = require('debug')('codeceptjs:heal');
2
- const colors = require('chalk');
3
- const Container = require('./container');
4
- const recorder = require('./recorder');
5
- const output = require('./output');
6
- const event = require('./event');
1
+ import debug from 'debug';
2
+ import colors from 'chalk';
3
+ import Container from './container.js';
4
+ import recorder from './recorder.js';
5
+ import * as event from './event.js';
6
+ import { output } from './output.js';
7
+
8
+ const logger = debug('myapp:server');
9
+
10
+ logger('codeceptjs:heal');
7
11
 
8
12
  /**
9
13
  * @class
@@ -57,7 +61,7 @@ class Heal {
57
61
  const suggestions = [];
58
62
  const recipes = matchRecipes(this.recipes, this.contextName);
59
63
 
60
- debug('Recipes', recipes);
64
+ logger('Recipes', recipes);
61
65
 
62
66
  const currentOutputLevel = output.level();
63
67
  output.level(0);
@@ -96,20 +100,20 @@ class Heal {
96
100
  const suggestions = await this.getCodeSuggestions(failureContext);
97
101
 
98
102
  if (suggestions.length === 0) {
99
- debug('No healing suggestions found');
103
+ logger('No healing suggestions found');
100
104
  throw error;
101
105
  }
102
106
 
103
107
  output.debug(`Received ${suggestions.length} suggestion${suggestions.length === 1 ? '' : 's'}`);
104
108
 
105
- debug(suggestions);
109
+ logger(suggestions);
106
110
 
107
111
  for (const suggestion of suggestions) {
108
112
  for (const codeSnippet of suggestion.snippets) {
109
113
  try {
110
- debug('Executing', codeSnippet);
114
+ logger('Executing', codeSnippet);
111
115
  recorder.catch((e) => {
112
- debug(e);
116
+ logger(e);
113
117
  });
114
118
 
115
119
  if (typeof codeSnippet === 'string') {
@@ -131,7 +135,7 @@ class Heal {
131
135
  // recorder.session.restore();
132
136
  return;
133
137
  } catch (err) {
134
- debug('Failed to execute code', err);
138
+ logger('Failed to execute code', err);
135
139
  recorder.ignoreErr(err); // healing did not help
136
140
  recorder.catchWithoutStop(err);
137
141
  await recorder.promise(); // wait for all promises to resolve
@@ -149,7 +153,7 @@ class Heal {
149
153
 
150
154
  const heal = new Heal();
151
155
 
152
- module.exports = heal;
156
+ export { heal };
153
157
 
154
158
  function matchRecipes(recipes, contextName) {
155
159
  return Object.entries(recipes)