codeceptjs 4.0.0-rc.2 → 4.0.0-rc.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 (294) hide show
  1. package/README.md +39 -27
  2. package/bin/codecept.js +15 -2
  3. package/bin/codeceptq.js +49 -0
  4. package/bin/mcp-server.js +1187 -0
  5. package/docs/advanced.md +201 -0
  6. package/docs/agents.md +159 -0
  7. package/docs/ai.md +537 -0
  8. package/docs/aitrace.md +266 -0
  9. package/docs/api.md +332 -0
  10. package/docs/assertions.md +415 -0
  11. package/docs/auth.md +318 -0
  12. package/docs/basics.md +424 -0
  13. package/docs/bdd.md +539 -0
  14. package/docs/best.md +240 -0
  15. package/docs/bootstrap.md +132 -0
  16. package/docs/commands.md +352 -0
  17. package/docs/community-helpers.md +63 -0
  18. package/docs/configuration.md +230 -0
  19. package/docs/continuous-integration.md +497 -0
  20. package/docs/custom-helpers.md +297 -0
  21. package/docs/data.md +448 -0
  22. package/docs/debugging.md +332 -0
  23. package/docs/detox.md +235 -0
  24. package/docs/docker.md +136 -0
  25. package/docs/effects.md +179 -0
  26. package/docs/element-based-testing.md +295 -0
  27. package/docs/element-selection.md +125 -0
  28. package/docs/els.md +328 -0
  29. package/docs/examples.md +161 -0
  30. package/docs/heal.md +213 -0
  31. package/docs/helpers/ApiDataFactory.md +267 -0
  32. package/docs/helpers/Appium.md +1405 -0
  33. package/docs/helpers/Detox.md +665 -0
  34. package/docs/helpers/ExpectHelper.md +275 -0
  35. package/docs/helpers/FileSystem.md +152 -0
  36. package/docs/helpers/GraphQL.md +152 -0
  37. package/docs/helpers/GraphQLDataFactory.md +226 -0
  38. package/docs/helpers/JSONResponse.md +255 -0
  39. package/docs/helpers/Mochawesome.md +8 -0
  40. package/docs/helpers/MockRequest.md +377 -0
  41. package/docs/helpers/MockServer.md +212 -0
  42. package/docs/helpers/Playwright.md +2969 -0
  43. package/docs/helpers/Polly.md +44 -0
  44. package/docs/helpers/Protractor.md +1769 -0
  45. package/docs/helpers/Puppeteer-firefox.md +86 -0
  46. package/docs/helpers/Puppeteer.md +2690 -0
  47. package/docs/helpers/REST.md +289 -0
  48. package/docs/helpers/SoftExpectHelper.md +352 -0
  49. package/docs/helpers/WebDriver.md +2682 -0
  50. package/docs/hooks.md +339 -0
  51. package/docs/index.md +111 -0
  52. package/docs/installation.md +83 -0
  53. package/docs/internal-api.md +265 -0
  54. package/docs/internal-test-server.md +89 -0
  55. package/docs/locators.md +355 -0
  56. package/docs/mcp.md +485 -0
  57. package/docs/migration-4.md +556 -0
  58. package/docs/mobile.md +338 -0
  59. package/docs/pageobjects.md +399 -0
  60. package/docs/parallel.md +585 -0
  61. package/docs/playwright.md +714 -0
  62. package/docs/plugins.md +866 -0
  63. package/docs/puppeteer.md +314 -0
  64. package/docs/quickstart.md +120 -0
  65. package/docs/react.md +70 -0
  66. package/docs/reports.md +483 -0
  67. package/docs/retry.md +274 -0
  68. package/docs/secrets.md +150 -0
  69. package/docs/sessions.md +80 -0
  70. package/docs/shadow.md +68 -0
  71. package/docs/test-structure.md +275 -0
  72. package/docs/timeouts.md +183 -0
  73. package/docs/translation.md +247 -0
  74. package/docs/tutorial.md +271 -0
  75. package/docs/typescript.md +374 -0
  76. package/docs/web-element.md +251 -0
  77. package/docs/webdriver.md +708 -0
  78. package/docs/within.md +55 -0
  79. package/lib/ai.js +3 -2
  80. package/lib/aria.js +260 -0
  81. package/lib/assertions.js +18 -0
  82. package/lib/codecept.js +26 -23
  83. package/lib/command/check.js +2 -1
  84. package/lib/command/dryRun.js +24 -5
  85. package/lib/command/generate.js +2 -0
  86. package/lib/command/gherkin/snippets.js +5 -4
  87. package/lib/command/init.js +248 -269
  88. package/lib/command/list.js +150 -10
  89. package/lib/command/query.js +218 -0
  90. package/lib/command/run-multiple.js +2 -0
  91. package/lib/command/run-workers.js +2 -0
  92. package/lib/command/run.js +1 -1
  93. package/lib/command/workers/runTests.js +10 -10
  94. package/lib/config.js +77 -4
  95. package/lib/container.js +114 -17
  96. package/lib/effects.js +17 -0
  97. package/lib/element/WebElement.js +246 -2
  98. package/lib/els.js +12 -6
  99. package/lib/globals.js +32 -19
  100. package/lib/heal.js +4 -3
  101. package/lib/helper/ApiDataFactory.js +2 -1
  102. package/lib/helper/Appium.js +8 -8
  103. package/lib/helper/FileSystem.js +3 -2
  104. package/lib/helper/GraphQLDataFactory.js +2 -1
  105. package/lib/helper/Playwright.js +228 -162
  106. package/lib/helper/Puppeteer.js +208 -76
  107. package/lib/helper/WebDriver.js +173 -68
  108. package/lib/helper/errors/MultipleElementsFound.js +27 -110
  109. package/lib/helper/errors/NonFocusedType.js +8 -0
  110. package/lib/helper/extras/Download.js +45 -0
  111. package/lib/helper/extras/PlaywrightReactVueLocator.js +45 -36
  112. package/lib/helper/extras/elementSelection.js +58 -0
  113. package/lib/helper/extras/focusCheck.js +43 -0
  114. package/lib/helper/extras/richTextEditor.js +178 -0
  115. package/lib/helper/scripts/dropFile.js +11 -0
  116. package/lib/history.js +3 -2
  117. package/lib/html.js +103 -16
  118. package/lib/index.js +9 -1
  119. package/lib/listener/config.js +6 -4
  120. package/lib/listener/emptyRun.js +2 -1
  121. package/lib/listener/globalRetry.js +32 -6
  122. package/lib/listener/helpers.js +4 -1
  123. package/lib/listener/mocha.js +2 -1
  124. package/lib/listener/pageobjects.js +43 -0
  125. package/lib/listener/result.js +3 -2
  126. package/lib/locator.js +126 -3
  127. package/lib/mocha/cli.js +14 -2
  128. package/lib/mocha/factory.js +7 -2
  129. package/lib/mocha/inject.js +1 -1
  130. package/lib/mocha/scenarioConfig.js +2 -1
  131. package/lib/mocha/ui.js +5 -6
  132. package/lib/parser.js +2 -2
  133. package/lib/pause.js +38 -4
  134. package/lib/plugin/aiTrace.js +453 -0
  135. package/lib/plugin/analyze.js +1 -1
  136. package/lib/plugin/auth.js +3 -3
  137. package/lib/plugin/browser.js +77 -0
  138. package/lib/plugin/expose.js +159 -0
  139. package/lib/plugin/heal.js +44 -1
  140. package/lib/plugin/pageInfo.js +53 -49
  141. package/lib/plugin/pause.js +131 -0
  142. package/lib/plugin/pauseOnFail.js +10 -34
  143. package/lib/plugin/retryFailedStep.js +28 -19
  144. package/lib/plugin/screencast.js +287 -0
  145. package/lib/plugin/screenshot.js +563 -0
  146. package/lib/plugin/screenshotOnFail.js +8 -171
  147. package/lib/rerun.js +2 -1
  148. package/lib/result.js +2 -1
  149. package/lib/step/base.js +3 -2
  150. package/lib/step/config.js +15 -2
  151. package/lib/step/record.js +2 -2
  152. package/lib/store.js +72 -3
  153. package/lib/translation.js +2 -1
  154. package/lib/utils/mask_data.js +2 -1
  155. package/lib/utils/pluginParser.js +151 -0
  156. package/lib/utils/trace.js +297 -0
  157. package/lib/utils.js +77 -3
  158. package/lib/workers.js +52 -22
  159. package/package.json +19 -13
  160. package/typings/index.d.ts +19 -5
  161. package/docs/webapi/amOnPage.mustache +0 -11
  162. package/docs/webapi/appendField.mustache +0 -11
  163. package/docs/webapi/attachFile.mustache +0 -12
  164. package/docs/webapi/blur.mustache +0 -18
  165. package/docs/webapi/checkOption.mustache +0 -13
  166. package/docs/webapi/clearCookie.mustache +0 -9
  167. package/docs/webapi/clearField.mustache +0 -9
  168. package/docs/webapi/click.mustache +0 -29
  169. package/docs/webapi/clickLink.mustache +0 -8
  170. package/docs/webapi/closeCurrentTab.mustache +0 -7
  171. package/docs/webapi/closeOtherTabs.mustache +0 -8
  172. package/docs/webapi/dontSee.mustache +0 -11
  173. package/docs/webapi/dontSeeCheckboxIsChecked.mustache +0 -10
  174. package/docs/webapi/dontSeeCookie.mustache +0 -8
  175. package/docs/webapi/dontSeeCurrentPathEquals.mustache +0 -10
  176. package/docs/webapi/dontSeeCurrentUrlEquals.mustache +0 -10
  177. package/docs/webapi/dontSeeElement.mustache +0 -8
  178. package/docs/webapi/dontSeeElementInDOM.mustache +0 -8
  179. package/docs/webapi/dontSeeInCurrentUrl.mustache +0 -4
  180. package/docs/webapi/dontSeeInField.mustache +0 -11
  181. package/docs/webapi/dontSeeInSource.mustache +0 -8
  182. package/docs/webapi/dontSeeInTitle.mustache +0 -8
  183. package/docs/webapi/dontSeeTraffic.mustache +0 -13
  184. package/docs/webapi/doubleClick.mustache +0 -13
  185. package/docs/webapi/downloadFile.mustache +0 -12
  186. package/docs/webapi/dragAndDrop.mustache +0 -9
  187. package/docs/webapi/dragSlider.mustache +0 -11
  188. package/docs/webapi/executeAsyncScript.mustache +0 -24
  189. package/docs/webapi/executeScript.mustache +0 -26
  190. package/docs/webapi/fillField.mustache +0 -16
  191. package/docs/webapi/flushNetworkTraffics.mustache +0 -5
  192. package/docs/webapi/focus.mustache +0 -13
  193. package/docs/webapi/forceClick.mustache +0 -28
  194. package/docs/webapi/forceRightClick.mustache +0 -18
  195. package/docs/webapi/grabAllWindowHandles.mustache +0 -7
  196. package/docs/webapi/grabAttributeFrom.mustache +0 -10
  197. package/docs/webapi/grabAttributeFromAll.mustache +0 -9
  198. package/docs/webapi/grabBrowserLogs.mustache +0 -9
  199. package/docs/webapi/grabCookie.mustache +0 -11
  200. package/docs/webapi/grabCssPropertyFrom.mustache +0 -11
  201. package/docs/webapi/grabCssPropertyFromAll.mustache +0 -10
  202. package/docs/webapi/grabCurrentUrl.mustache +0 -9
  203. package/docs/webapi/grabCurrentWindowHandle.mustache +0 -6
  204. package/docs/webapi/grabDataFromPerformanceTiming.mustache +0 -20
  205. package/docs/webapi/grabElementBoundingRect.mustache +0 -20
  206. package/docs/webapi/grabGeoLocation.mustache +0 -8
  207. package/docs/webapi/grabHTMLFrom.mustache +0 -10
  208. package/docs/webapi/grabHTMLFromAll.mustache +0 -9
  209. package/docs/webapi/grabNumberOfOpenTabs.mustache +0 -8
  210. package/docs/webapi/grabNumberOfVisibleElements.mustache +0 -9
  211. package/docs/webapi/grabPageScrollPosition.mustache +0 -8
  212. package/docs/webapi/grabPopupText.mustache +0 -5
  213. package/docs/webapi/grabRecordedNetworkTraffics.mustache +0 -10
  214. package/docs/webapi/grabSource.mustache +0 -8
  215. package/docs/webapi/grabTextFrom.mustache +0 -10
  216. package/docs/webapi/grabTextFromAll.mustache +0 -9
  217. package/docs/webapi/grabTitle.mustache +0 -8
  218. package/docs/webapi/grabValueFrom.mustache +0 -9
  219. package/docs/webapi/grabValueFromAll.mustache +0 -8
  220. package/docs/webapi/grabWebElement.mustache +0 -9
  221. package/docs/webapi/grabWebElements.mustache +0 -9
  222. package/docs/webapi/moveCursorTo.mustache +0 -12
  223. package/docs/webapi/openNewTab.mustache +0 -7
  224. package/docs/webapi/pressKey.mustache +0 -12
  225. package/docs/webapi/pressKeyDown.mustache +0 -12
  226. package/docs/webapi/pressKeyUp.mustache +0 -12
  227. package/docs/webapi/pressKeyWithKeyNormalization.mustache +0 -60
  228. package/docs/webapi/refreshPage.mustache +0 -6
  229. package/docs/webapi/resizeWindow.mustache +0 -6
  230. package/docs/webapi/rightClick.mustache +0 -14
  231. package/docs/webapi/saveElementScreenshot.mustache +0 -10
  232. package/docs/webapi/saveScreenshot.mustache +0 -12
  233. package/docs/webapi/say.mustache +0 -10
  234. package/docs/webapi/scrollIntoView.mustache +0 -11
  235. package/docs/webapi/scrollPageToBottom.mustache +0 -6
  236. package/docs/webapi/scrollPageToTop.mustache +0 -6
  237. package/docs/webapi/scrollTo.mustache +0 -12
  238. package/docs/webapi/see.mustache +0 -11
  239. package/docs/webapi/seeAttributesOnElements.mustache +0 -9
  240. package/docs/webapi/seeCheckboxIsChecked.mustache +0 -10
  241. package/docs/webapi/seeCookie.mustache +0 -8
  242. package/docs/webapi/seeCssPropertiesOnElements.mustache +0 -9
  243. package/docs/webapi/seeCurrentPathEquals.mustache +0 -10
  244. package/docs/webapi/seeCurrentUrlEquals.mustache +0 -11
  245. package/docs/webapi/seeElement.mustache +0 -8
  246. package/docs/webapi/seeElementInDOM.mustache +0 -8
  247. package/docs/webapi/seeInCurrentUrl.mustache +0 -8
  248. package/docs/webapi/seeInField.mustache +0 -12
  249. package/docs/webapi/seeInPopup.mustache +0 -8
  250. package/docs/webapi/seeInSource.mustache +0 -7
  251. package/docs/webapi/seeInTitle.mustache +0 -8
  252. package/docs/webapi/seeNumberOfElements.mustache +0 -11
  253. package/docs/webapi/seeNumberOfVisibleElements.mustache +0 -10
  254. package/docs/webapi/seeTextEquals.mustache +0 -9
  255. package/docs/webapi/seeTitleEquals.mustache +0 -8
  256. package/docs/webapi/seeTraffic.mustache +0 -36
  257. package/docs/webapi/selectOption.mustache +0 -21
  258. package/docs/webapi/setCookie.mustache +0 -16
  259. package/docs/webapi/setGeoLocation.mustache +0 -12
  260. package/docs/webapi/startRecordingTraffic.mustache +0 -8
  261. package/docs/webapi/startRecordingWebSocketMessages.mustache +0 -8
  262. package/docs/webapi/stopRecordingTraffic.mustache +0 -5
  263. package/docs/webapi/stopRecordingWebSocketMessages.mustache +0 -7
  264. package/docs/webapi/switchTo.mustache +0 -9
  265. package/docs/webapi/switchToNextTab.mustache +0 -10
  266. package/docs/webapi/switchToPreviousTab.mustache +0 -10
  267. package/docs/webapi/type.mustache +0 -21
  268. package/docs/webapi/uncheckOption.mustache +0 -13
  269. package/docs/webapi/wait.mustache +0 -8
  270. package/docs/webapi/waitForClickable.mustache +0 -11
  271. package/docs/webapi/waitForCookie.mustache +0 -9
  272. package/docs/webapi/waitForDetached.mustache +0 -10
  273. package/docs/webapi/waitForDisabled.mustache +0 -6
  274. package/docs/webapi/waitForElement.mustache +0 -11
  275. package/docs/webapi/waitForEnabled.mustache +0 -6
  276. package/docs/webapi/waitForFunction.mustache +0 -17
  277. package/docs/webapi/waitForInvisible.mustache +0 -10
  278. package/docs/webapi/waitForNumberOfTabs.mustache +0 -9
  279. package/docs/webapi/waitForText.mustache +0 -13
  280. package/docs/webapi/waitForValue.mustache +0 -10
  281. package/docs/webapi/waitForVisible.mustache +0 -10
  282. package/docs/webapi/waitInUrl.mustache +0 -9
  283. package/docs/webapi/waitNumberOfVisibleElements.mustache +0 -10
  284. package/docs/webapi/waitToHide.mustache +0 -10
  285. package/docs/webapi/waitUrlEquals.mustache +0 -10
  286. package/lib/helper/AI.js +0 -214
  287. package/lib/listener/enhancedGlobalRetry.js +0 -110
  288. package/lib/plugin/enhancedRetryFailedStep.js +0 -99
  289. package/lib/plugin/htmlReporter.js +0 -3648
  290. package/lib/plugin/stepByStepReport.js +0 -427
  291. package/lib/plugin/subtitles.js +0 -89
  292. package/lib/retryCoordinator.js +0 -207
  293. package/typings/promiseBasedTypes.d.ts +0 -9469
  294. package/typings/types.d.ts +0 -11402
@@ -0,0 +1,265 @@
1
+ ---
2
+ permalink: /internal-api
3
+ title: Internal API
4
+ ---
5
+
6
+ ## Concepts
7
+
8
+ In this guide we will overview the internal API of CodeceptJS.
9
+ This knowledge is required for customization, writing plugins, etc.
10
+
11
+ CodeceptJS exposes its internal API as named exports of the `codeceptjs` package. Import only what you need:
12
+
13
+ ```js
14
+ import { recorder, event, output, container, config } from 'codeceptjs'
15
+ ```
16
+
17
+ > Older code may have relied on a global `codeceptjs` object (`const { recorder } = codeceptjs`). That global only exists under `noGlobals: false` (the deprecated 3.x default) — prefer named imports.
18
+
19
+ These internal objects are available:
20
+
21
+ * [`codecept`](https://github.com/Codeception/CodeceptJS/blob/master/lib/codecept.js): test runner class
22
+ * [`config`](https://github.com/Codeception/CodeceptJS/blob/master/lib/config.js): current codecept config
23
+ * [`event`](https://github.com/Codeception/CodeceptJS/blob/master/lib/event.js): event listener
24
+ * [`recorder`](https://github.com/Codeception/CodeceptJS/blob/master/lib/recorder.js): global promise chain
25
+ * [`output`](https://github.com/Codeception/CodeceptJS/blob/master/lib/output.js): internal printer
26
+ * [`container`](https://github.com/Codeception/CodeceptJS/blob/master/lib/container.js): dependency injection container for tests, includes current helpers and support objects
27
+ * [`helper`](https://github.com/Codeception/CodeceptJS/blob/master/lib/helper.js): basic helper class
28
+ * [`actor`](https://github.com/Codeception/CodeceptJS/blob/master/lib/actor.js): basic actor (I) class
29
+
30
+ [API reference](https://github.com/Codeception/CodeceptJS/tree/master/docs/api) is available on GitHub.
31
+ Also please check the source code of corresponding modules.
32
+
33
+ ### Container
34
+
35
+ CodeceptJS has a dependency injection container with helpers and support objects.
36
+ They can be retrieved from the container:
37
+
38
+ ```js
39
+ import { container } from 'codeceptjs';
40
+
41
+ // get object with all helpers
42
+ const helpers = container.helpers();
43
+
44
+ // get helper by name
45
+ const { WebDriver } = container.helpers();
46
+
47
+ // get support objects
48
+ const supportObjects = container.support();
49
+
50
+ // get support object by name
51
+ const { UserPage } = container.support();
52
+
53
+ // get all registered plugins
54
+ const plugins = container.plugins();
55
+ ```
56
+
57
+ New objects can also be added to container in runtime:
58
+
59
+ ```js
60
+ import { container } from 'codeceptjs';
61
+ import UserPage from './pages/user.js';
62
+
63
+ container.append({
64
+ helpers: { // add helper
65
+ MyHelper: new MyHelper({ config1: 'val1' });
66
+ },
67
+ support: { // add page object
68
+ UserPage,
69
+ }
70
+ })
71
+ ```
72
+
73
+ > Use this trick to define custom objects inside `boostrap` script
74
+
75
+ The container also contains the current Mocha instance:
76
+
77
+ ```js
78
+ const mocha = container.mocha();
79
+ ```
80
+
81
+ ### Event Listeners
82
+
83
+ CodeceptJS provides a module with an [event dispatcher and set of predefined events](https://github.com/Codeception/CodeceptJS/blob/master/lib/event.js).
84
+
85
+ It can be required from codeceptjs package if it is installed locally.
86
+
87
+ ```js
88
+ import { event } from 'codeceptjs';
89
+
90
+ export default function() {
91
+
92
+ event.dispatcher.on(event.test.before, function (test) {
93
+
94
+ console.log('--- I am before test --');
95
+
96
+ });
97
+ }
98
+ ```
99
+
100
+ Available events:
101
+
102
+ * `event.test.before(test)` - *async* when `Before` hooks from helpers and from test is executed
103
+ * `event.test.after(test)` - *async* after each test
104
+ * `event.test.started(test)` - *sync* at the very beginning of a test.
105
+ * `event.test.passed(test)` - *sync* when test passed
106
+ * `event.test.failed(test, error)` - *sync* when test failed
107
+ * `event.test.finished(test)` - *sync* when test finished
108
+ * `event.suite.before(suite)` - *async* before a suite
109
+ * `event.suite.after(suite)` - *async* after a suite
110
+ * `event.step.before(step)` - *async* when the step is scheduled for execution
111
+ * `event.step.after(step)`- *async* after a step
112
+ * `event.step.started(step)` - *sync* when step starts.
113
+ * `event.step.passed(step)` - *sync* when step passed.
114
+ * `event.step.failed(step, err)` - *sync* when step failed.
115
+ * `event.step.finished(step)` - *sync* when step finishes.
116
+ * `event.step.comment(step)` - *sync* fired for comments like `I.say`.
117
+ * `event.all.before` - before running tests
118
+ * `event.all.after` - after running tests
119
+ * `event.all.result` - when results are printed
120
+ * `event.workers.before` - before spawning workers in parallel run
121
+ * `event.workers.after` - after workers finished in parallel run
122
+ * `event.workers.result` - test results after workers finished in parallel run
123
+
124
+
125
+ > *sync* - means that event is fired in the moment of the action happening.
126
+ *async* - means that event is fired when an action is scheduled. Use `recorder` to schedule your actions.
127
+
128
+ For further reference look for [currently available listeners](https://github.com/Codeception/CodeceptJS/tree/master/lib/listener) using the event system.
129
+
130
+
131
+ ### Recorder
132
+
133
+ To inject asynchronous functions in a test or before/after a test you can subscribe to corresponding event and register a function inside a recorder object. [Recorder](https://github.com/Codeception/CodeceptJS/blob/master/lib/recorder.js) represents a global promises chain.
134
+
135
+ Provide a function in the first parameter, a function must be async or must return a promise:
136
+
137
+ ```js
138
+ import { event, recorder } from 'codeceptjs';
139
+ import request from 'request';
140
+
141
+ export default function() {
142
+
143
+ event.dispatcher.on(event.test.before, function (test) {
144
+
145
+ recorder.add('create fixture data via API', function() {
146
+ return new Promise((doneFn, errFn) => {
147
+ request({
148
+ baseUrl: 'http://api.site.com/',
149
+ method: 'POST',
150
+ url: '/users',
151
+ json: { name: 'john', email: 'john@john.com' }
152
+ }), (err, httpResponse, body) => {
153
+ if (err) return errFn(err);
154
+ doneFn();
155
+ }
156
+ });
157
+ }
158
+ });
159
+ }
160
+ ```
161
+
162
+ ### Config
163
+
164
+ CodeceptJS config can be accessed from `import { config } from 'codeceptjs'` then `config.get()`:
165
+
166
+ ```js
167
+ import { config } from 'codeceptjs';
168
+
169
+ // config object has access to all values of the current config file
170
+
171
+ if (config.get().myKey == 'value') {
172
+ // run something
173
+ }
174
+ ```
175
+
176
+
177
+ ### Output
178
+
179
+ Output module provides four verbosity levels. Depending on the mode you can have different information printed using corresponding functions.
180
+
181
+ * `default`: prints basic information using `output.print`
182
+ * `steps`: toggled by `--steps` option, prints step execution
183
+ * `debug`: toggled by `--debug` option, prints steps, and debug information with `output.debug`
184
+ * `verbose`: toggled by `--verbose` prints debug information and internal logs with `output.log`
185
+
186
+ It is recommended to avoid `console.log` and use output.* methods for printing.
187
+
188
+ ```js
189
+ import { output } from 'codeceptjs';
190
+
191
+ output.print('This is basic information');
192
+ output.debug('This is debug information');
193
+ output.log('This is verbose logging information');
194
+ ```
195
+
196
+ #### Test Object
197
+
198
+ The test events are providing a test object with following properties:
199
+
200
+ * `title` title of the test
201
+ * `body` test function as a string
202
+ * `opts` additional test options like retries, and others
203
+ * `pending` true if test is scheduled for execution and false if a test has finished
204
+ * `tags` array of tags for this test
205
+ * `artifacts` list of files attached to this test. Screenshots, videos and other files can be saved here and shared accross different reporters
206
+ * `file` path to a file with a test
207
+ * `steps` array of executed steps (available only in `test.passed`, `test.failed`, `test.finished` event)
208
+ * `skipInfo` additional test options when test skipped
209
+ * * `message` string with reason for skip
210
+ * * `description` string with test body
211
+ and others
212
+
213
+ #### Step Object
214
+
215
+ Step events provide step objects with following fields:
216
+
217
+ * `name` name of a step, like 'see', 'click', and others
218
+ * `actor` current actor, in most cases it is `I`
219
+ * `helper` current helper instance used to execute this step
220
+ * `helperMethod` corresponding helper method, in most cases is the same as `name`
221
+ * `status` status of a step (passed or failed)
222
+ * `prefix` if a step is executed inside `within` block contain within text, like: 'Within .js-signup-form'.
223
+ * `args` passed arguments
224
+
225
+ Whenever you execute tests with `--verbose` option you will see registered events and promises executed by a recorder.
226
+
227
+ ## Custom Runner
228
+
229
+ You can run CodeceptJS tests from your script.
230
+
231
+ ```js
232
+ import { codecept as Codecept } from 'codeceptjs';
233
+
234
+ // define main config
235
+ const config = {
236
+ helpers: {
237
+ WebDriver: {
238
+ browser: 'chrome',
239
+ url: 'http://localhost'
240
+ }
241
+ }
242
+ };
243
+
244
+ const opts = { steps: true };
245
+
246
+ // run CodeceptJS inside async function
247
+ (async () => {
248
+ const codecept = new Codecept(config, options);
249
+ codecept.init(__dirname);
250
+
251
+ try {
252
+ await codecept.bootstrap();
253
+ codecept.loadTests('**_test.js');
254
+ // run tests
255
+ await codecept.run(test);
256
+ } catch (err) {
257
+ printError(err);
258
+ process.exitCode = 1;
259
+ } finally {
260
+ await codecept.teardown();
261
+ }
262
+ })();
263
+ ```
264
+
265
+ > Also, you can run tests inside workers in a custom scripts. Please refer to the [parallel execution](/parallel) guide for more details.
@@ -0,0 +1,89 @@
1
+ # Internal API Test Server
2
+
3
+ This directory contains the internal API test server implementation that replaces the third-party `json-server` dependency.
4
+
5
+ ## Files
6
+
7
+ - `lib/test-server.js` - Main TestServer class implementation
8
+ - `bin/test-server.js` - CLI script to run the server standalone
9
+
10
+ ## Usage
11
+
12
+ ### As npm script:
13
+
14
+ ```bash
15
+ npm run test-server
16
+ ```
17
+
18
+ ### Directly:
19
+
20
+ ```bash
21
+ node bin/test-server.js [options] [db-file]
22
+ ```
23
+
24
+ ### Options:
25
+
26
+ - `-p, --port <port>` - Port to listen on (default: 8010)
27
+ - `--host <host>` - Host to bind to (default: 0.0.0.0)
28
+ - `db-file` - Path to JSON database file (default: test/data/rest/db.json)
29
+
30
+ ## Features
31
+
32
+ - **Full REST API compatibility** with json-server
33
+ - **Automatic file watching** - Reloads data when db.json file changes
34
+ - **CORS support** - Allows cross-origin requests for testing
35
+ - **Custom headers support** - Handles special headers like X-Test
36
+ - **File upload endpoints** - Basic file upload simulation
37
+ - **Express.js based** - Uses familiar Express.js framework
38
+
39
+ ## API Endpoints
40
+
41
+ The server provides the same API endpoints as json-server:
42
+
43
+ ### Users
44
+
45
+ - `GET /user` - Get user data
46
+ - `POST /user` - Create/update user
47
+ - `PATCH /user` - Partially update user
48
+ - `PUT /user` - Replace user
49
+
50
+ ### Posts
51
+
52
+ - `GET /posts` - Get all posts
53
+ - `GET /posts/:id` - Get specific post
54
+ - `POST /posts` - Create new post
55
+ - `PUT /posts/:id` - Replace specific post
56
+ - `PATCH /posts/:id` - Partially update specific post
57
+ - `DELETE /posts/:id` - Delete specific post
58
+
59
+ ### Comments
60
+
61
+ - `GET /comments` - Get all comments
62
+ - `POST /comments` - Create new comment
63
+ - `DELETE /comments/:id` - Delete specific comment
64
+
65
+ ### Utility
66
+
67
+ - `GET /headers` - Return request headers (for testing)
68
+ - `POST /headers` - Return request headers (for testing)
69
+ - `POST /upload` - File upload simulation
70
+ - `POST /_reload` - Manually reload database file
71
+
72
+ ## Migration from json-server
73
+
74
+ This server is designed as a drop-in replacement for json-server. The key differences:
75
+
76
+ 1. **No CLI options** - Configuration is done through constructor options or CLI args
77
+ 2. **Automatic file watching** - No need for `--watch` flag
78
+ 3. **Built-in middleware** - Headers and CORS are handled automatically
79
+ 4. **Simpler file upload** - Basic implementation without full multipart support
80
+
81
+ ## Testing
82
+
83
+ The server is used by the following test suites:
84
+
85
+ - `test/rest/REST_test.js` - REST helper tests
86
+ - `test/rest/ApiDataFactory_test.js` - API data factory tests
87
+ - `test/helper/JSONResponse_test.js` - JSON response helper tests
88
+
89
+ All tests pass with the internal server, proving full compatibility.