codeceptjs 4.0.0-beta.2 → 4.0.0-beta.20

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 (209) hide show
  1. package/README.md +133 -120
  2. package/bin/codecept.js +107 -96
  3. package/bin/test-server.js +64 -0
  4. package/docs/webapi/clearCookie.mustache +1 -1
  5. package/docs/webapi/click.mustache +5 -1
  6. package/lib/actor.js +71 -103
  7. package/lib/ai.js +159 -188
  8. package/lib/assert/empty.js +22 -24
  9. package/lib/assert/equal.js +30 -37
  10. package/lib/assert/error.js +14 -14
  11. package/lib/assert/include.js +43 -48
  12. package/lib/assert/throws.js +11 -11
  13. package/lib/assert/truth.js +22 -22
  14. package/lib/assert.js +20 -18
  15. package/lib/codecept.js +262 -162
  16. package/lib/colorUtils.js +50 -52
  17. package/lib/command/check.js +206 -0
  18. package/lib/command/configMigrate.js +56 -51
  19. package/lib/command/definitions.js +96 -109
  20. package/lib/command/dryRun.js +77 -79
  21. package/lib/command/generate.js +234 -194
  22. package/lib/command/gherkin/init.js +42 -33
  23. package/lib/command/gherkin/snippets.js +76 -74
  24. package/lib/command/gherkin/steps.js +20 -17
  25. package/lib/command/info.js +74 -38
  26. package/lib/command/init.js +301 -290
  27. package/lib/command/interactive.js +41 -32
  28. package/lib/command/list.js +28 -27
  29. package/lib/command/run-multiple/chunk.js +51 -48
  30. package/lib/command/run-multiple/collection.js +5 -5
  31. package/lib/command/run-multiple/run.js +5 -1
  32. package/lib/command/run-multiple.js +97 -97
  33. package/lib/command/run-rerun.js +19 -25
  34. package/lib/command/run-workers.js +68 -92
  35. package/lib/command/run.js +39 -27
  36. package/lib/command/utils.js +80 -64
  37. package/lib/command/workers/runTests.js +388 -226
  38. package/lib/config.js +109 -50
  39. package/lib/container.js +641 -261
  40. package/lib/data/context.js +60 -61
  41. package/lib/data/dataScenarioConfig.js +47 -47
  42. package/lib/data/dataTableArgument.js +32 -32
  43. package/lib/data/table.js +22 -22
  44. package/lib/effects.js +307 -0
  45. package/lib/element/WebElement.js +327 -0
  46. package/lib/els.js +160 -0
  47. package/lib/event.js +173 -163
  48. package/lib/globals.js +141 -0
  49. package/lib/heal.js +89 -85
  50. package/lib/helper/AI.js +131 -41
  51. package/lib/helper/ApiDataFactory.js +107 -75
  52. package/lib/helper/Appium.js +542 -404
  53. package/lib/helper/FileSystem.js +100 -79
  54. package/lib/helper/GraphQL.js +44 -43
  55. package/lib/helper/GraphQLDataFactory.js +52 -52
  56. package/lib/helper/JSONResponse.js +126 -88
  57. package/lib/helper/Mochawesome.js +54 -29
  58. package/lib/helper/Playwright.js +2547 -1316
  59. package/lib/helper/Puppeteer.js +1578 -1181
  60. package/lib/helper/REST.js +209 -68
  61. package/lib/helper/WebDriver.js +1482 -1342
  62. package/lib/helper/errors/ConnectionRefused.js +6 -6
  63. package/lib/helper/errors/ElementAssertion.js +11 -16
  64. package/lib/helper/errors/ElementNotFound.js +5 -9
  65. package/lib/helper/errors/RemoteBrowserConnectionRefused.js +5 -5
  66. package/lib/helper/extras/Console.js +11 -11
  67. package/lib/helper/extras/PlaywrightLocator.js +110 -0
  68. package/lib/helper/extras/PlaywrightPropEngine.js +18 -18
  69. package/lib/helper/extras/PlaywrightReactVueLocator.js +17 -8
  70. package/lib/helper/extras/PlaywrightRestartOpts.js +25 -11
  71. package/lib/helper/extras/Popup.js +22 -22
  72. package/lib/helper/extras/React.js +27 -28
  73. package/lib/helper/network/actions.js +36 -42
  74. package/lib/helper/network/utils.js +78 -84
  75. package/lib/helper/scripts/blurElement.js +5 -5
  76. package/lib/helper/scripts/focusElement.js +5 -5
  77. package/lib/helper/scripts/highlightElement.js +8 -8
  78. package/lib/helper/scripts/isElementClickable.js +34 -34
  79. package/lib/helper.js +2 -3
  80. package/lib/history.js +23 -19
  81. package/lib/hooks.js +8 -8
  82. package/lib/html.js +94 -104
  83. package/lib/index.js +38 -27
  84. package/lib/listener/config.js +30 -23
  85. package/lib/listener/emptyRun.js +54 -0
  86. package/lib/listener/enhancedGlobalRetry.js +110 -0
  87. package/lib/listener/exit.js +16 -18
  88. package/lib/listener/globalRetry.js +70 -0
  89. package/lib/listener/globalTimeout.js +181 -0
  90. package/lib/listener/helpers.js +76 -51
  91. package/lib/listener/mocha.js +10 -11
  92. package/lib/listener/result.js +11 -0
  93. package/lib/listener/retryEnhancer.js +85 -0
  94. package/lib/listener/steps.js +71 -59
  95. package/lib/listener/store.js +20 -0
  96. package/lib/locator.js +214 -197
  97. package/lib/mocha/asyncWrapper.js +274 -0
  98. package/lib/mocha/bdd.js +167 -0
  99. package/lib/mocha/cli.js +341 -0
  100. package/lib/mocha/factory.js +163 -0
  101. package/lib/mocha/featureConfig.js +89 -0
  102. package/lib/mocha/gherkin.js +231 -0
  103. package/lib/mocha/hooks.js +121 -0
  104. package/lib/mocha/index.js +21 -0
  105. package/lib/mocha/inject.js +46 -0
  106. package/lib/{interfaces → mocha}/scenarioConfig.js +58 -34
  107. package/lib/mocha/suite.js +89 -0
  108. package/lib/mocha/test.js +184 -0
  109. package/lib/mocha/types.d.ts +42 -0
  110. package/lib/mocha/ui.js +242 -0
  111. package/lib/output.js +141 -71
  112. package/lib/parser.js +47 -44
  113. package/lib/pause.js +173 -145
  114. package/lib/plugin/analyze.js +403 -0
  115. package/lib/plugin/{autoLogin.js → auth.js} +178 -79
  116. package/lib/plugin/autoDelay.js +36 -40
  117. package/lib/plugin/coverage.js +131 -78
  118. package/lib/plugin/customLocator.js +22 -21
  119. package/lib/plugin/customReporter.js +53 -0
  120. package/lib/plugin/enhancedRetryFailedStep.js +99 -0
  121. package/lib/plugin/heal.js +101 -110
  122. package/lib/plugin/htmlReporter.js +3648 -0
  123. package/lib/plugin/pageInfo.js +140 -0
  124. package/lib/plugin/pauseOnFail.js +12 -11
  125. package/lib/plugin/retryFailedStep.js +82 -47
  126. package/lib/plugin/screenshotOnFail.js +111 -92
  127. package/lib/plugin/stepByStepReport.js +159 -101
  128. package/lib/plugin/stepTimeout.js +20 -25
  129. package/lib/plugin/subtitles.js +38 -38
  130. package/lib/recorder.js +193 -130
  131. package/lib/rerun.js +94 -49
  132. package/lib/result.js +238 -0
  133. package/lib/retryCoordinator.js +207 -0
  134. package/lib/secret.js +20 -18
  135. package/lib/session.js +95 -89
  136. package/lib/step/base.js +239 -0
  137. package/lib/step/comment.js +10 -0
  138. package/lib/step/config.js +50 -0
  139. package/lib/step/func.js +46 -0
  140. package/lib/step/helper.js +50 -0
  141. package/lib/step/meta.js +99 -0
  142. package/lib/step/record.js +74 -0
  143. package/lib/step/retry.js +11 -0
  144. package/lib/step/section.js +55 -0
  145. package/lib/step.js +18 -329
  146. package/lib/steps.js +54 -0
  147. package/lib/store.js +38 -7
  148. package/lib/template/heal.js +3 -12
  149. package/lib/template/prompts/generatePageObject.js +31 -0
  150. package/lib/template/prompts/healStep.js +13 -0
  151. package/lib/template/prompts/writeStep.js +9 -0
  152. package/lib/test-server.js +334 -0
  153. package/lib/timeout.js +60 -0
  154. package/lib/transform.js +8 -8
  155. package/lib/translation.js +34 -21
  156. package/lib/utils/loaderCheck.js +124 -0
  157. package/lib/utils/mask_data.js +47 -0
  158. package/lib/utils/typescript.js +237 -0
  159. package/lib/utils.js +411 -228
  160. package/lib/workerStorage.js +37 -34
  161. package/lib/workers.js +532 -296
  162. package/package.json +124 -95
  163. package/translations/de-DE.js +5 -3
  164. package/translations/fr-FR.js +5 -4
  165. package/translations/index.js +22 -12
  166. package/translations/it-IT.js +4 -3
  167. package/translations/ja-JP.js +4 -3
  168. package/translations/nl-NL.js +76 -0
  169. package/translations/pl-PL.js +4 -3
  170. package/translations/pt-BR.js +4 -3
  171. package/translations/ru-RU.js +4 -3
  172. package/translations/utils.js +10 -0
  173. package/translations/zh-CN.js +4 -3
  174. package/translations/zh-TW.js +4 -3
  175. package/typings/index.d.ts +546 -185
  176. package/typings/promiseBasedTypes.d.ts +150 -875
  177. package/typings/types.d.ts +547 -992
  178. package/lib/cli.js +0 -249
  179. package/lib/dirname.js +0 -5
  180. package/lib/helper/Expect.js +0 -425
  181. package/lib/helper/ExpectHelper.js +0 -399
  182. package/lib/helper/MockServer.js +0 -223
  183. package/lib/helper/Nightmare.js +0 -1411
  184. package/lib/helper/Protractor.js +0 -1835
  185. package/lib/helper/SoftExpectHelper.js +0 -381
  186. package/lib/helper/TestCafe.js +0 -1410
  187. package/lib/helper/clientscripts/nightmare.js +0 -213
  188. package/lib/helper/testcafe/testControllerHolder.js +0 -42
  189. package/lib/helper/testcafe/testcafe-utils.js +0 -63
  190. package/lib/interfaces/bdd.js +0 -98
  191. package/lib/interfaces/featureConfig.js +0 -69
  192. package/lib/interfaces/gherkin.js +0 -195
  193. package/lib/listener/artifacts.js +0 -19
  194. package/lib/listener/retry.js +0 -68
  195. package/lib/listener/timeout.js +0 -109
  196. package/lib/mochaFactory.js +0 -110
  197. package/lib/plugin/allure.js +0 -15
  198. package/lib/plugin/commentStep.js +0 -136
  199. package/lib/plugin/debugErrors.js +0 -67
  200. package/lib/plugin/eachElement.js +0 -127
  201. package/lib/plugin/fakerTransform.js +0 -49
  202. package/lib/plugin/retryTo.js +0 -121
  203. package/lib/plugin/selenoid.js +0 -371
  204. package/lib/plugin/standardActingHelpers.js +0 -9
  205. package/lib/plugin/tryTo.js +0 -105
  206. package/lib/plugin/wdio.js +0 -246
  207. package/lib/scenario.js +0 -222
  208. package/lib/ui.js +0 -238
  209. package/lib/within.js +0 -70
@@ -1,119 +1,117 @@
1
- import { getConfig, getTestRoot } from './utils.js';
2
- import Config from '../config.js';
3
- import Codecept from '../codecept.js';
4
- import { output } from '../output.js';
5
- import * as event from '../event.js';
6
- import { store } from '../store.js';
7
- import container from '../container.js';
8
- import colors from "chalk";
9
- import figures from "figures";
1
+ import { getConfig, getTestRoot } from './utils.js'
2
+ import Config from '../config.js'
3
+ import Codecept from '../codecept.js'
4
+ import output from '../output.js'
5
+ import event from '../event.js'
6
+ import store from '../store.js'
7
+ import Container from '../container.js'
10
8
 
11
9
  export default async function (test, options) {
12
- if (options.grep) process.env.grep = options.grep.toLowerCase();
13
- const configFile = options.config;
14
- let codecept;
10
+ if (options.grep) process.env.grep = options.grep
11
+ const configFile = options.config
12
+ let codecept
15
13
 
16
- const testRoot = getTestRoot(configFile);
17
- let config = getConfig(configFile);
14
+ const testRoot = getTestRoot(configFile)
15
+ let config = await getConfig(configFile)
18
16
  if (options.override) {
19
- config = Config.append(JSON.parse(options.override));
17
+ config = Config.append(JSON.parse(options.override))
20
18
  }
21
19
 
22
20
  if (config.plugins) {
23
21
  // disable all plugins by default, they can be enabled with -p option
24
22
  for (const plugin in config.plugins) {
25
23
  // if `-p all` is passed, then enabling all plugins, otherwise plugins could be enabled by `-p customLocator,commentStep,tryTo`
26
- config.plugins[plugin].enabled = options.plugins === 'all';
24
+ config.plugins[plugin].enabled = options.plugins === 'all'
27
25
  }
28
26
  }
29
27
 
30
28
  try {
31
- codecept = new Codecept(config, options);
32
- codecept.init(testRoot);
29
+ codecept = new Codecept(config, options)
30
+ await codecept.init(testRoot)
33
31
 
34
- if (options.bootstrap) await codecept.bootstrap();
32
+ if (options.bootstrap) await codecept.bootstrap()
35
33
 
36
- codecept.loadTests();
37
- store.dryRun = true;
34
+ codecept.loadTests()
35
+ store.dryRun = true
38
36
 
39
37
  if (!options.steps && !options.verbose && !options.debug) {
40
- printTests(codecept.testFiles);
41
- return;
38
+ await printTests(codecept.testFiles)
39
+ return
42
40
  }
43
- event.dispatcher.on(event.all.result, printFooter);
44
- codecept.run(test);
41
+ event.dispatcher.on(event.all.result, printFooter)
42
+ await codecept.run(test)
45
43
  } catch (err) {
46
- console.error(err);
47
- process.exit(1);
44
+ console.error(err)
45
+ process.exit(1)
48
46
  }
49
47
  }
50
48
 
51
- function printTests(files) {
52
- output.print(output.styles.debug(`Tests from ${global.codecept_dir}:`));
53
- output.print();
49
+ async function printTests(files) {
50
+ const { default: figures } = await import('figures')
51
+ const { default: colors } = await import('chalk')
54
52
 
55
- const mocha = container.mocha();
56
- mocha.files = files;
57
- mocha.loadFiles();
53
+ output.print(output.styles.debug(`Tests from ${global.codecept_dir}:`))
54
+ output.print()
58
55
 
59
- let numOfTests = 0;
60
- let numOfSuites = 0;
61
- let outputString = '';
62
- const filterBy = process.env.grep ? process.env.grep.toLowerCase() : undefined;
56
+ const mocha = Container.mocha()
57
+ mocha.files = files
58
+ mocha.loadFiles()
63
59
 
60
+ let numOfTests = 0
61
+ let numOfSuites = 0
62
+ let outputString = ''
63
+ const filterBy = process.env.grep
64
+
65
+ let filterRegex
64
66
  if (filterBy) {
65
- for (const suite of mocha.suite.suites) {
66
- const currentSuite = suite.title;
67
- if (suite.title.toLowerCase().includes(filterBy)) {
68
- outputString += `${colors.white.bold(suite.title)} -- ${output.styles.log(suite.file || '')} -- ${mocha.suite.suites.length} tests\n`;
69
- numOfSuites++;
70
- }
67
+ try {
68
+ filterRegex = new RegExp(filterBy, 'i') // Case-insensitive matching
69
+ } catch (err) {
70
+ console.error(`Invalid grep pattern: ${filterBy}`)
71
+ process.exit(1)
72
+ }
73
+ }
71
74
 
72
- for (const test of suite.tests) {
73
- if (test.title.toLowerCase().includes(filterBy)) {
74
- numOfTests++;
75
- outputString += `${colors.white.bold(test.parent.title)} -- ${output.styles.log(test.parent.file || '')} -- ${mocha.suite.suites.length} tests\n`;
76
- outputString += ` ${output.styles.scenario(figures.checkboxOff)} ${test.title}\n`;
77
- }
78
- }
75
+ for (const suite of mocha.suite.suites) {
76
+ const suiteMatches = filterRegex ? filterRegex.test(suite.title) : true
77
+ let suiteHasMatchingTests = false
78
+
79
+ if (suiteMatches) {
80
+ outputString += `${colors.white.bold(suite.title)} -- ${output.styles.log(suite.file || '')}\n`
81
+ suiteHasMatchingTests = true
82
+ numOfSuites++
79
83
  }
80
- numOfSuites = countSuites(outputString);
81
- } else {
82
- for (const suite of mocha.suite.suites) {
83
- output.print(`${colors.white.bold(suite.title)} -- ${output.styles.log(suite.file || '')} -- ${mocha.suite.suites.length} tests`);
84
- numOfSuites++;
85
-
86
- for (const test of suite.tests) {
87
- numOfTests++;
88
- output.print(` ${output.styles.scenario(figures.checkboxOff)} ${test.title}`);
84
+
85
+ for (const test of suite.tests) {
86
+ const testMatches = filterRegex ? filterRegex.test(test.title) : true
87
+
88
+ if (testMatches) {
89
+ if (!suiteMatches && !suiteHasMatchingTests) {
90
+ outputString += `${colors.white.bold(suite.title)} -- ${output.styles.log(suite.file || '')}\n`
91
+ suiteHasMatchingTests = true
92
+ numOfSuites++
93
+ }
94
+
95
+ numOfTests++
96
+ outputString += ` ${output.styles.scenario(figures.checkboxOff)} ${test.title}\n`
89
97
  }
90
98
  }
91
99
  }
92
100
 
93
- output.print(removeDuplicates(outputString));
94
- output.print('');
95
- output.success(` Total: ${numOfSuites} suites | ${numOfTests} tests `);
96
- printFooter();
97
- process.exit(0);
101
+ output.print(removeDuplicates(outputString))
102
+ output.print('')
103
+ output.success(` Total: ${numOfSuites} suites | ${numOfTests} tests `)
104
+ printFooter()
105
+ process.exit(0)
98
106
  }
99
107
 
100
108
  function printFooter() {
101
- output.print();
102
- output.print('--- DRY MODE: No tests were executed ---');
109
+ output.print()
110
+ output.print('--- DRY MODE: No tests were executed ---')
103
111
  }
104
112
 
105
113
  function removeDuplicates(inputString) {
106
- const array = inputString.split('\n');
107
- const uniqueLines = [...new Set(array)];
108
- const resultString = uniqueLines.join('\n');
109
-
110
- return resultString;
111
- }
112
-
113
- function countSuites(inputString) {
114
- const array = inputString.split('\n');
115
-
116
- const uniqueLines = [...new Set(array)];
117
- const res = uniqueLines.filter(item => item.includes('-- '));
118
- return res.length;
114
+ const array = inputString.split('\n')
115
+ const uniqueLines = [...new Set(array)]
116
+ return uniqueLines.join('\n')
119
117
  }