codeceptjs 3.5.0 → 3.5.1-2.beta.7

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 (273) hide show
  1. package/README.md +24 -25
  2. package/lib/actor.js +6 -3
  3. package/lib/ai.js +12 -3
  4. package/lib/cli.js +12 -2
  5. package/lib/codecept.js +4 -0
  6. package/lib/colorUtils.js +10 -0
  7. package/lib/command/definitions.js +2 -7
  8. package/lib/command/dryRun.js +2 -1
  9. package/lib/command/info.js +24 -0
  10. package/lib/command/init.js +51 -5
  11. package/lib/command/run-multiple/collection.js +17 -5
  12. package/lib/command/run-multiple.js +4 -2
  13. package/lib/command/run-workers.js +66 -4
  14. package/lib/command/run.js +7 -0
  15. package/lib/command/workers/runTests.js +39 -0
  16. package/lib/data/context.js +14 -6
  17. package/lib/event.js +4 -0
  18. package/lib/helper/ApiDataFactory.js +2 -1
  19. package/lib/helper/Appium.js +73 -24
  20. package/lib/helper/Expect.js +422 -0
  21. package/lib/helper/FileSystem.js +1 -1
  22. package/lib/helper/GraphQL.js +25 -0
  23. package/lib/helper/Nightmare.js +9 -4
  24. package/lib/helper/OpenAI.js +14 -10
  25. package/lib/helper/Playwright.js +1205 -288
  26. package/lib/helper/Protractor.js +11 -6
  27. package/lib/helper/Puppeteer.js +173 -61
  28. package/lib/helper/TestCafe.js +44 -9
  29. package/lib/helper/WebDriver.js +231 -82
  30. package/lib/helper/errors/ElementNotFound.js +2 -1
  31. package/lib/helper/extras/PlaywrightReactVueLocator.js +38 -0
  32. package/lib/helper/scripts/blurElement.js +17 -0
  33. package/lib/helper/scripts/focusElement.js +17 -0
  34. package/lib/helper/scripts/highlightElement.js +2 -2
  35. package/lib/html.js +3 -3
  36. package/lib/interfaces/bdd.js +1 -1
  37. package/lib/interfaces/gherkin.js +37 -3
  38. package/lib/interfaces/scenarioConfig.js +1 -0
  39. package/lib/locator.js +17 -4
  40. package/lib/mochaFactory.js +2 -1
  41. package/lib/output.js +1 -1
  42. package/lib/pause.js +12 -9
  43. package/lib/plugin/autoLogin.js +45 -10
  44. package/lib/plugin/heal.js +47 -17
  45. package/lib/plugin/retryFailedStep.js +10 -1
  46. package/lib/plugin/retryTo.js +2 -4
  47. package/lib/plugin/selenoid.js +6 -1
  48. package/lib/plugin/standardActingHelpers.js +0 -2
  49. package/lib/plugin/stepByStepReport.js +2 -2
  50. package/lib/plugin/tryTo.js +5 -7
  51. package/lib/plugin/wdio.js +0 -1
  52. package/lib/recorder.js +20 -9
  53. package/lib/session.js +1 -1
  54. package/lib/step.js +30 -11
  55. package/lib/ui.js +1 -0
  56. package/lib/utils.js +18 -1
  57. package/lib/workers.js +28 -3
  58. package/package.json +108 -98
  59. package/translations/de-DE.js +5 -0
  60. package/translations/fr-FR.js +14 -1
  61. package/translations/it-IT.js +1 -0
  62. package/translations/ja-JP.js +5 -0
  63. package/translations/pl-PL.js +5 -0
  64. package/translations/pt-BR.js +1 -0
  65. package/translations/ru-RU.js +1 -0
  66. package/translations/zh-CN.js +5 -0
  67. package/translations/zh-TW.js +5 -0
  68. package/typings/index.d.ts +8 -6
  69. package/typings/promiseBasedTypes.d.ts +784 -822
  70. package/typings/types.d.ts +1214 -727
  71. package/CHANGELOG.md +0 -2492
  72. package/docs/advanced.md +0 -351
  73. package/docs/ai.md +0 -246
  74. package/docs/api.md +0 -323
  75. package/docs/basics.md +0 -980
  76. package/docs/bdd.md +0 -535
  77. package/docs/best.md +0 -237
  78. package/docs/books.md +0 -37
  79. package/docs/bootstrap.md +0 -135
  80. package/docs/build/ApiDataFactory.js +0 -409
  81. package/docs/build/Appium.js +0 -1978
  82. package/docs/build/FileSystem.js +0 -228
  83. package/docs/build/GraphQL.js +0 -204
  84. package/docs/build/GraphQLDataFactory.js +0 -309
  85. package/docs/build/JSONResponse.js +0 -338
  86. package/docs/build/Mochawesome.js +0 -71
  87. package/docs/build/Nightmare.js +0 -2147
  88. package/docs/build/OpenAI.js +0 -122
  89. package/docs/build/Playwright.js +0 -4134
  90. package/docs/build/Polly.js +0 -42
  91. package/docs/build/Protractor.js +0 -2701
  92. package/docs/build/Puppeteer.js +0 -3743
  93. package/docs/build/REST.js +0 -344
  94. package/docs/build/SeleniumWebdriver.js +0 -76
  95. package/docs/build/TestCafe.js +0 -2059
  96. package/docs/build/WebDriver.js +0 -4042
  97. package/docs/changelog.md +0 -2501
  98. package/docs/commands.md +0 -254
  99. package/docs/community-helpers.md +0 -58
  100. package/docs/configuration.md +0 -157
  101. package/docs/continuous-integration.md +0 -22
  102. package/docs/custom-helpers.md +0 -306
  103. package/docs/data.md +0 -375
  104. package/docs/detox.md +0 -235
  105. package/docs/docker.md +0 -137
  106. package/docs/email.md +0 -183
  107. package/docs/examples.md +0 -149
  108. package/docs/helpers/ApiDataFactory.md +0 -266
  109. package/docs/helpers/Appium.md +0 -1317
  110. package/docs/helpers/Detox.md +0 -586
  111. package/docs/helpers/FileSystem.md +0 -152
  112. package/docs/helpers/GraphQL.md +0 -130
  113. package/docs/helpers/GraphQLDataFactory.md +0 -226
  114. package/docs/helpers/JSONResponse.md +0 -254
  115. package/docs/helpers/Mochawesome.md +0 -8
  116. package/docs/helpers/MockRequest.md +0 -377
  117. package/docs/helpers/Nightmare.md +0 -1258
  118. package/docs/helpers/OpenAI.md +0 -70
  119. package/docs/helpers/Playwright.md +0 -2250
  120. package/docs/helpers/Polly.md +0 -44
  121. package/docs/helpers/Puppeteer-firefox.md +0 -86
  122. package/docs/helpers/Puppeteer.md +0 -2147
  123. package/docs/helpers/REST.md +0 -218
  124. package/docs/helpers/TestCafe.md +0 -1224
  125. package/docs/helpers/WebDriver.md +0 -2325
  126. package/docs/hooks.md +0 -340
  127. package/docs/index.md +0 -111
  128. package/docs/installation.md +0 -75
  129. package/docs/internal-api.md +0 -265
  130. package/docs/locators.md +0 -331
  131. package/docs/mobile-react-native-locators.md +0 -67
  132. package/docs/mobile.md +0 -344
  133. package/docs/nightmare.md +0 -223
  134. package/docs/pageobjects.md +0 -291
  135. package/docs/parallel.md +0 -288
  136. package/docs/playwright.md +0 -609
  137. package/docs/plugins.md +0 -1225
  138. package/docs/puppeteer.md +0 -316
  139. package/docs/quickstart.md +0 -163
  140. package/docs/react.md +0 -69
  141. package/docs/reports.md +0 -392
  142. package/docs/secrets.md +0 -36
  143. package/docs/shadow.md +0 -68
  144. package/docs/shared/keys.mustache +0 -31
  145. package/docs/shared/react.mustache +0 -1
  146. package/docs/testcafe.md +0 -174
  147. package/docs/translation.md +0 -247
  148. package/docs/tutorial.md +0 -271
  149. package/docs/typescript.md +0 -180
  150. package/docs/ui.md +0 -59
  151. package/docs/videos.md +0 -28
  152. package/docs/visual.md +0 -202
  153. package/docs/vue.md +0 -121
  154. package/docs/webapi/amOnPage.mustache +0 -11
  155. package/docs/webapi/appendField.mustache +0 -11
  156. package/docs/webapi/attachFile.mustache +0 -12
  157. package/docs/webapi/checkOption.mustache +0 -13
  158. package/docs/webapi/clearCookie.mustache +0 -10
  159. package/docs/webapi/clearField.mustache +0 -9
  160. package/docs/webapi/click.mustache +0 -25
  161. package/docs/webapi/clickLink.mustache +0 -8
  162. package/docs/webapi/closeCurrentTab.mustache +0 -7
  163. package/docs/webapi/closeOtherTabs.mustache +0 -8
  164. package/docs/webapi/dontSee.mustache +0 -11
  165. package/docs/webapi/dontSeeCheckboxIsChecked.mustache +0 -10
  166. package/docs/webapi/dontSeeCookie.mustache +0 -8
  167. package/docs/webapi/dontSeeCurrentUrlEquals.mustache +0 -10
  168. package/docs/webapi/dontSeeElement.mustache +0 -8
  169. package/docs/webapi/dontSeeElementInDOM.mustache +0 -8
  170. package/docs/webapi/dontSeeInCurrentUrl.mustache +0 -4
  171. package/docs/webapi/dontSeeInField.mustache +0 -11
  172. package/docs/webapi/dontSeeInSource.mustache +0 -8
  173. package/docs/webapi/dontSeeInTitle.mustache +0 -8
  174. package/docs/webapi/doubleClick.mustache +0 -13
  175. package/docs/webapi/downloadFile.mustache +0 -12
  176. package/docs/webapi/dragAndDrop.mustache +0 -9
  177. package/docs/webapi/dragSlider.mustache +0 -11
  178. package/docs/webapi/executeAsyncScript.mustache +0 -24
  179. package/docs/webapi/executeScript.mustache +0 -26
  180. package/docs/webapi/fillField.mustache +0 -16
  181. package/docs/webapi/forceClick.mustache +0 -28
  182. package/docs/webapi/forceRightClick.mustache +0 -18
  183. package/docs/webapi/grabAllWindowHandles.mustache +0 -7
  184. package/docs/webapi/grabAttributeFrom.mustache +0 -10
  185. package/docs/webapi/grabAttributeFromAll.mustache +0 -9
  186. package/docs/webapi/grabBrowserLogs.mustache +0 -9
  187. package/docs/webapi/grabCookie.mustache +0 -11
  188. package/docs/webapi/grabCssPropertyFrom.mustache +0 -11
  189. package/docs/webapi/grabCssPropertyFromAll.mustache +0 -10
  190. package/docs/webapi/grabCurrentUrl.mustache +0 -9
  191. package/docs/webapi/grabCurrentWindowHandle.mustache +0 -6
  192. package/docs/webapi/grabDataFromPerformanceTiming.mustache +0 -20
  193. package/docs/webapi/grabElementBoundingRect.mustache +0 -20
  194. package/docs/webapi/grabGeoLocation.mustache +0 -8
  195. package/docs/webapi/grabHTMLFrom.mustache +0 -10
  196. package/docs/webapi/grabHTMLFromAll.mustache +0 -9
  197. package/docs/webapi/grabNumberOfOpenTabs.mustache +0 -8
  198. package/docs/webapi/grabNumberOfVisibleElements.mustache +0 -9
  199. package/docs/webapi/grabPageScrollPosition.mustache +0 -8
  200. package/docs/webapi/grabPopupText.mustache +0 -5
  201. package/docs/webapi/grabSource.mustache +0 -8
  202. package/docs/webapi/grabTextFrom.mustache +0 -10
  203. package/docs/webapi/grabTextFromAll.mustache +0 -9
  204. package/docs/webapi/grabTitle.mustache +0 -8
  205. package/docs/webapi/grabValueFrom.mustache +0 -9
  206. package/docs/webapi/grabValueFromAll.mustache +0 -8
  207. package/docs/webapi/moveCursorTo.mustache +0 -12
  208. package/docs/webapi/openNewTab.mustache +0 -7
  209. package/docs/webapi/pressKey.mustache +0 -12
  210. package/docs/webapi/pressKeyDown.mustache +0 -12
  211. package/docs/webapi/pressKeyUp.mustache +0 -12
  212. package/docs/webapi/pressKeyWithKeyNormalization.mustache +0 -60
  213. package/docs/webapi/refreshPage.mustache +0 -6
  214. package/docs/webapi/resizeWindow.mustache +0 -6
  215. package/docs/webapi/rightClick.mustache +0 -14
  216. package/docs/webapi/saveElementScreenshot.mustache +0 -10
  217. package/docs/webapi/saveScreenshot.mustache +0 -12
  218. package/docs/webapi/say.mustache +0 -10
  219. package/docs/webapi/scrollIntoView.mustache +0 -11
  220. package/docs/webapi/scrollPageToBottom.mustache +0 -6
  221. package/docs/webapi/scrollPageToTop.mustache +0 -6
  222. package/docs/webapi/scrollTo.mustache +0 -12
  223. package/docs/webapi/see.mustache +0 -11
  224. package/docs/webapi/seeAttributesOnElements.mustache +0 -9
  225. package/docs/webapi/seeCheckboxIsChecked.mustache +0 -10
  226. package/docs/webapi/seeCookie.mustache +0 -8
  227. package/docs/webapi/seeCssPropertiesOnElements.mustache +0 -9
  228. package/docs/webapi/seeCurrentUrlEquals.mustache +0 -11
  229. package/docs/webapi/seeElement.mustache +0 -8
  230. package/docs/webapi/seeElementInDOM.mustache +0 -8
  231. package/docs/webapi/seeInCurrentUrl.mustache +0 -8
  232. package/docs/webapi/seeInField.mustache +0 -12
  233. package/docs/webapi/seeInPopup.mustache +0 -8
  234. package/docs/webapi/seeInSource.mustache +0 -7
  235. package/docs/webapi/seeInTitle.mustache +0 -8
  236. package/docs/webapi/seeNumberOfElements.mustache +0 -11
  237. package/docs/webapi/seeNumberOfVisibleElements.mustache +0 -10
  238. package/docs/webapi/seeTextEquals.mustache +0 -9
  239. package/docs/webapi/seeTitleEquals.mustache +0 -8
  240. package/docs/webapi/selectOption.mustache +0 -21
  241. package/docs/webapi/setCookie.mustache +0 -16
  242. package/docs/webapi/setGeoLocation.mustache +0 -12
  243. package/docs/webapi/switchTo.mustache +0 -9
  244. package/docs/webapi/switchToNextTab.mustache +0 -10
  245. package/docs/webapi/switchToPreviousTab.mustache +0 -10
  246. package/docs/webapi/type.mustache +0 -21
  247. package/docs/webapi/uncheckOption.mustache +0 -13
  248. package/docs/webapi/wait.mustache +0 -8
  249. package/docs/webapi/waitForClickable.mustache +0 -11
  250. package/docs/webapi/waitForDetached.mustache +0 -10
  251. package/docs/webapi/waitForElement.mustache +0 -11
  252. package/docs/webapi/waitForEnabled.mustache +0 -6
  253. package/docs/webapi/waitForFunction.mustache +0 -17
  254. package/docs/webapi/waitForInvisible.mustache +0 -10
  255. package/docs/webapi/waitForText.mustache +0 -13
  256. package/docs/webapi/waitForValue.mustache +0 -10
  257. package/docs/webapi/waitForVisible.mustache +0 -10
  258. package/docs/webapi/waitInUrl.mustache +0 -9
  259. package/docs/webapi/waitNumberOfVisibleElements.mustache +0 -10
  260. package/docs/webapi/waitToHide.mustache +0 -10
  261. package/docs/webapi/waitUrlEquals.mustache +0 -10
  262. package/docs/webdriver.md +0 -657
  263. package/docs/wiki/Books-&-Posts.md +0 -27
  264. package/docs/wiki/Community-Helpers-&-Plugins.md +0 -49
  265. package/docs/wiki/Converting-Playwright-to-Istanbul-Coverage.md +0 -29
  266. package/docs/wiki/Examples.md +0 -139
  267. package/docs/wiki/Google-Summer-of-Code-(GSoC)-2020.md +0 -68
  268. package/docs/wiki/Home.md +0 -16
  269. package/docs/wiki/Release-Process.md +0 -24
  270. package/docs/wiki/Roadmap.md +0 -23
  271. package/docs/wiki/Tests.md +0 -1393
  272. package/docs/wiki/Upgrading-to-CodeceptJS-3.md +0 -153
  273. package/docs/wiki/Videos.md +0 -19
@@ -0,0 +1,422 @@
1
+ const chai = require('chai');
2
+ const output = require('../output');
3
+
4
+ const { expect } = chai;
5
+
6
+ chai.use(require('chai-string'));
7
+ // @ts-ignore
8
+ chai.use(require('chai-exclude'));
9
+ chai.use(require('chai-match-pattern'));
10
+
11
+ /**
12
+ * This helper allows performing assertions based on Chai.
13
+ *
14
+ * ### Examples
15
+ *
16
+ * Zero-configuration when paired with other helpers like REST, Playwright:
17
+ *
18
+ * ```js
19
+ * // inside codecept.conf.js
20
+ *{
21
+ * helpers: {
22
+ * Playwright: {...},
23
+ * Expect: {},
24
+ * }
25
+ *}
26
+ * ```
27
+ *
28
+ * ## Methods
29
+ */
30
+ class ExpectHelper {
31
+ /**
32
+ *
33
+ * @param {*} actualValue
34
+ * @param {*} expectedValue
35
+ * @param {*} [customErrorMsg]
36
+ */
37
+ expectEqual(actualValue, expectedValue, customErrorMsg = '') {
38
+ // @ts-ignore
39
+ output.step(`I expect "${JSON.stringify(actualValue)}" to equal "${JSON.stringify(expectedValue)}"`);
40
+ return expect(actualValue, customErrorMsg).to.equal(expectedValue);
41
+ }
42
+
43
+ /**
44
+ *
45
+ * @param {*} actualValue
46
+ * @param {*} expectedValue
47
+ * @param {*} [customErrorMsg]
48
+ */
49
+ expectNotEqual(actualValue, expectedValue, customErrorMsg = '') {
50
+ // @ts-ignore
51
+ output.step(`I expect "${JSON.stringify(actualValue)}" to not equal "${JSON.stringify(expectedValue)}"`);
52
+ return expect(actualValue, customErrorMsg).not.to.equal(expectedValue);
53
+ }
54
+
55
+ /**
56
+ *
57
+ * @param {*} actualValue
58
+ * @param {*} expectedValue
59
+ * @param {*} [customErrorMsg]
60
+
61
+ */
62
+ expectDeepEqual(actualValue, expectedValue, customErrorMsg = '') {
63
+ // @ts-ignore
64
+ output.step(`I expect "${JSON.stringify(actualValue)}" to deep equal "${JSON.stringify(expectedValue)}"`);
65
+ return expect(actualValue, customErrorMsg).to.deep.equal(expectedValue);
66
+ }
67
+
68
+ /**
69
+ *
70
+ * @param {*} actualValue
71
+ * @param {*} expectedValue
72
+ * @param {*} [customErrorMsg]
73
+ */
74
+ expectNotDeepEqual(actualValue, expectedValue, customErrorMsg = '') {
75
+ // @ts-ignore
76
+ output.step(`I expect "${JSON.stringify(actualValue)}" to not deep equal "${JSON.stringify(expectedValue)}"`);
77
+ return expect(actualValue, customErrorMsg).to.not.deep.equal(expectedValue);
78
+ }
79
+
80
+ /**
81
+ *
82
+ * @param {*} actualValue
83
+ * @param {*} expectedValueToContain
84
+ * @param {*} [customErrorMsg]
85
+ */
86
+ expectContain(actualValue, expectedValueToContain, customErrorMsg = '') {
87
+ // @ts-ignore
88
+ output.step(`I expect "${JSON.stringify(actualValue)}" to contain "${JSON.stringify(expectedValueToContain)}"`);
89
+ return expect(actualValue, customErrorMsg).to.contain(
90
+ expectedValueToContain,
91
+ );
92
+ }
93
+
94
+ /**
95
+ *
96
+ * @param {*} actualValue
97
+ * @param {*} expectedValueToNotContain
98
+ * @param {*} [customErrorMsg]
99
+ */
100
+ expectNotContain(
101
+ actualValue,
102
+ expectedValueToNotContain,
103
+ customErrorMsg = '',
104
+ ) {
105
+ // @ts-ignore
106
+ output.step(`I expect "${JSON.stringify(actualValue)}" to not contain "${JSON.stringify(expectedValueToNotContain)}"`);
107
+ return expect(actualValue, customErrorMsg).not.to.contain(
108
+ expectedValueToNotContain,
109
+ );
110
+ }
111
+
112
+ /**
113
+ *
114
+ * @param {*} actualValue
115
+ * @param {*} expectedValueToStartWith
116
+ * @param {*} [customErrorMsg]
117
+ */
118
+ expectStartsWith(actualValue, expectedValueToStartWith, customErrorMsg = '') {
119
+ // @ts-ignore
120
+ output.step(`I expect "${JSON.stringify(actualValue)}" to start with "${JSON.stringify(expectedValueToStartWith)}"`);
121
+ return expect(actualValue, customErrorMsg).to.startsWith(
122
+ expectedValueToStartWith,
123
+ );
124
+ }
125
+
126
+ /**
127
+ *
128
+ * @param {*} actualValue
129
+ * @param {*} expectedValueToNotStartWith
130
+ * @param {*} [customErrorMsg]
131
+ */
132
+ expectNotStartsWith(
133
+ actualValue,
134
+ expectedValueToNotStartWith,
135
+ customErrorMsg = '',
136
+ ) {
137
+ // @ts-ignore
138
+ output.step(`I expect "${JSON.stringify(actualValue)}" to not start with "${JSON.stringify(expectedValueToNotStartWith)}"`);
139
+ return expect(actualValue, customErrorMsg).not.to.startsWith(
140
+ expectedValueToNotStartWith,
141
+ );
142
+ }
143
+
144
+ /**
145
+ * @param {*} actualValue
146
+ * @param {*} expectedValueToEndWith
147
+ * @param {*} [customErrorMsg]
148
+ */
149
+ expectEndsWith(actualValue, expectedValueToEndWith, customErrorMsg = '') {
150
+ // @ts-ignore
151
+ output.step(`I expect "${JSON.stringify(actualValue)}" to end with "${JSON.stringify(expectedValueToEndWith)}"`);
152
+ return expect(actualValue, customErrorMsg).to.endsWith(
153
+ expectedValueToEndWith,
154
+ );
155
+ }
156
+
157
+ /**
158
+ * @param {*} actualValue
159
+ * @param {*} expectedValueToNotEndWith
160
+ * @param {*} [customErrorMsg]
161
+ */
162
+ expectNotEndsWith(
163
+ actualValue,
164
+ expectedValueToNotEndWith,
165
+ customErrorMsg = '',
166
+ ) {
167
+ // @ts-ignore
168
+ output.step(`I expect "${JSON.stringify(actualValue)}" to not end with "${JSON.stringify(expectedValueToNotEndWith)}"`);
169
+ return expect(actualValue, customErrorMsg).not.to.endsWith(
170
+ expectedValueToNotEndWith,
171
+ );
172
+ }
173
+
174
+ /**
175
+ * @param {*} targetData
176
+ * @param {*} jsonSchema
177
+ * @param {*} [customErrorMsg]
178
+ */
179
+ expectJsonSchema(targetData, jsonSchema, customErrorMsg = '') {
180
+ // @ts-ignore
181
+ output.step(`I expect "${JSON.stringify(targetData)}" to match this JSON schema "${JSON.stringify(jsonSchema)}"`);
182
+ chai.use(require('chai-json-schema'));
183
+ return expect(targetData, customErrorMsg).to.be.jsonSchema(jsonSchema);
184
+ }
185
+
186
+ /**
187
+ * @param {*} targetData
188
+ * @param {*} jsonSchema
189
+ * @param {*} [customErrorMsg]
190
+ * @param {*} ajvOptions Pass AJV options
191
+ */
192
+ expectJsonSchemaUsingAJV(
193
+ targetData,
194
+ jsonSchema,
195
+ customErrorMsg = '',
196
+ ajvOptions = { allErrors: true },
197
+ ) {
198
+ // @ts-ignore
199
+ output.step(`I expect "${JSON.stringify(targetData)}" to match this JSON schema using AJV "${JSON.stringify(jsonSchema)}"`);
200
+ chai.use(require('chai-json-schema-ajv').create(ajvOptions));
201
+ return expect(targetData, customErrorMsg).to.be.jsonSchema(jsonSchema);
202
+ }
203
+
204
+ /**
205
+ * @param {*} targetData
206
+ * @param {*} propertyName
207
+ * @param {*} [customErrorMsg]
208
+ */
209
+ expectHasProperty(targetData, propertyName, customErrorMsg = '') {
210
+ // @ts-ignore
211
+ output.step(`I expect "${JSON.stringify(targetData)}" to have property: "${JSON.stringify(propertyName)}"`);
212
+ return expect(targetData, customErrorMsg).to.have.property(propertyName);
213
+ }
214
+
215
+ /**
216
+ * @param {*} targetData
217
+ * @param {*} propertyName
218
+ * @param {*} [customErrorMsg]
219
+ */
220
+ expectHasAProperty(targetData, propertyName, customErrorMsg = '') {
221
+ // @ts-ignore
222
+ output.step(`I expect "${JSON.stringify(targetData)}" to have a property: "${JSON.stringify(propertyName)}"`);
223
+ return expect(targetData, customErrorMsg).to.have.a.property(propertyName);
224
+ }
225
+
226
+ /**
227
+ * @param {*} targetData
228
+ * @param {*} type
229
+ * @param {*} [customErrorMsg]
230
+ */
231
+ expectToBeA(targetData, type, customErrorMsg = '') {
232
+ // @ts-ignore
233
+ output.step(`I expect "${JSON.stringify(targetData)}" to be a "${JSON.stringify(type)}"`);
234
+ return expect(targetData, customErrorMsg).to.be.a(type);
235
+ }
236
+
237
+ /**
238
+ * @param {*} targetData
239
+ * @param {*} type
240
+ * @param {*} [customErrorMsg]
241
+ */
242
+ expectToBeAn(targetData, type, customErrorMsg = '') {
243
+ // @ts-ignore
244
+ output.step(`I expect "${JSON.stringify(targetData)}" to be an "${JSON.stringify(type)}"`);
245
+ return expect(targetData, customErrorMsg).to.be.an(type);
246
+ }
247
+
248
+ /**
249
+ * @param {*} targetData
250
+ * @param {*} regex
251
+ * @param {*} [customErrorMsg]
252
+ */
253
+ expectMatchRegex(targetData, regex, customErrorMsg = '') {
254
+ // @ts-ignore
255
+ output.step(`I expect "${JSON.stringify(targetData)}" to match the regex "${JSON.stringify(regex)}"`);
256
+ return expect(targetData, customErrorMsg).to.match(regex);
257
+ }
258
+
259
+ /**
260
+ * @param {*} targetData
261
+ * @param {*} length
262
+ * @param {*} [customErrorMsg]
263
+ */
264
+ expectLengthOf(targetData, length, customErrorMsg = '') {
265
+ // @ts-ignore
266
+ output.step(`I expect "${JSON.stringify(targetData)}" to have length of "${JSON.stringify(length)}"`);
267
+ return expect(targetData, customErrorMsg).to.have.lengthOf(length);
268
+ }
269
+
270
+ /**
271
+ * @param {*} targetData
272
+ * @param {*} [customErrorMsg]
273
+ */
274
+ expectEmpty(targetData, customErrorMsg = '') {
275
+ // @ts-ignore
276
+ output.step(`I expect "${JSON.stringify(targetData)}" to be empty`);
277
+ return expect(targetData, customErrorMsg).to.be.empty;
278
+ }
279
+
280
+ /**
281
+ * @param {*} targetData
282
+ * @param {*} [customErrorMsg]
283
+ */
284
+ expectTrue(targetData, customErrorMsg = '') {
285
+ // @ts-ignore
286
+ output.step(`I expect "${JSON.stringify(targetData)}" to be true`);
287
+ return expect(targetData, customErrorMsg).to.be.true;
288
+ }
289
+
290
+ /**
291
+ * @param {*} targetData
292
+ * @param {*} [customErrorMsg]
293
+ */
294
+ expectFalse(targetData, customErrorMsg = '') {
295
+ // @ts-ignore
296
+ output.step(`I expect "${JSON.stringify(targetData)}" to be false`);
297
+ return expect(targetData, customErrorMsg).to.be.false;
298
+ }
299
+
300
+ /**
301
+ * @param {*} targetData
302
+ * @param {*} aboveThan
303
+ * @param {*} [customErrorMsg]
304
+ */
305
+ expectAbove(targetData, aboveThan, customErrorMsg = '') {
306
+ // @ts-ignore
307
+ output.step(`I expect "${JSON.stringify(targetData)}" to be above ${JSON.stringify(aboveThan)}`);
308
+ return expect(targetData, customErrorMsg).to.be.above(aboveThan);
309
+ }
310
+
311
+ /**
312
+ * @param {*} targetData
313
+ * @param {*} belowThan
314
+ * @param {*} [customErrorMsg]
315
+ */
316
+ expectBelow(targetData, belowThan, customErrorMsg = '') {
317
+ // @ts-ignore
318
+ output.step(`I expect "${JSON.stringify(targetData)}" to be below ${JSON.stringify(belowThan)}`);
319
+ return expect(targetData, customErrorMsg).to.be.below(belowThan);
320
+ }
321
+
322
+ /**
323
+ * @param {*} targetData
324
+ * @param {*} lengthAboveThan
325
+ * @param {*} [customErrorMsg]
326
+ */
327
+ expectLengthAboveThan(targetData, lengthAboveThan, customErrorMsg = '') {
328
+ // @ts-ignore
329
+ output.step(`I expect "${JSON.stringify(targetData)}" to have length of above ${JSON.stringify(lengthAboveThan)}`);
330
+ return expect(targetData, customErrorMsg).to.have.lengthOf.above(
331
+ lengthAboveThan,
332
+ );
333
+ }
334
+
335
+ /**
336
+ * @param {*} targetData
337
+ * @param {*} lengthBelowThan
338
+ * @param {*} [customErrorMsg]
339
+ */
340
+ expectLengthBelowThan(targetData, lengthBelowThan, customErrorMsg = '') {
341
+ // @ts-ignore
342
+ output.step(`I expect "${JSON.stringify(targetData)}" to have length of below ${JSON.stringify(lengthBelowThan)}`);
343
+ return expect(targetData, customErrorMsg).to.have.lengthOf.below(
344
+ lengthBelowThan,
345
+ );
346
+ }
347
+
348
+ /**
349
+ * @param {*} actualValue
350
+ * @param {*} expectedValue
351
+ * @param {*} [customErrorMsg]
352
+ */
353
+ expectEqualIgnoreCase(actualValue, expectedValue, customErrorMsg = '') {
354
+ // @ts-ignore
355
+ output.step(`I expect and ingore case "${JSON.stringify(actualValue)}" to equal "${JSON.stringify(expectedValue)}"`);
356
+ return expect(actualValue, customErrorMsg).to.equalIgnoreCase(
357
+ expectedValue,
358
+ );
359
+ }
360
+
361
+ /**
362
+ * expects members of two arrays are deeply equal
363
+ * @param {*} actualValue
364
+ * @param {*} expectedValue
365
+ * @param {*} [customErrorMsg]
366
+ */
367
+ expectDeepMembers(actualValue, expectedValue, customErrorMsg = '') {
368
+ // @ts-ignore
369
+ output.step(`I expect members of "${JSON.stringify(actualValue)}" and "${JSON.stringify(expectedValue)}" arrays are deeply equal`);
370
+ return expect(actualValue, customErrorMsg).to.have.deep.members(
371
+ expectedValue,
372
+ );
373
+ }
374
+
375
+ /**
376
+ * expects an array to be a superset of another array
377
+ * @param {*} superset
378
+ * @param {*} set
379
+ * @param {*} [customErrorMsg]
380
+ */
381
+ expectDeepIncludeMembers(superset, set, customErrorMsg = '') {
382
+ // @ts-ignore
383
+ output.step(`I expect "${JSON.stringify(superset)}" array to be a superset of "${JSON.stringify(set)}" array`);
384
+ return expect(superset, customErrorMsg).to.deep.include.members(
385
+ set,
386
+ );
387
+ }
388
+
389
+ /**
390
+ * expects members of two JSON objects are deeply equal excluding some properties
391
+ * @param {*} actualValue
392
+ * @param {*} expectedValue
393
+ * @param {*} fieldsToExclude
394
+ * @param {*} [customErrorMsg]
395
+ */
396
+ expectDeepEqualExcluding(
397
+ actualValue,
398
+ expectedValue,
399
+ fieldsToExclude,
400
+ customErrorMsg = '',
401
+ ) {
402
+ // @ts-ignore
403
+ output.step(`I expect members of "${JSON.stringify(actualValue)}" and "${JSON.stringify(expectedValue)}" JSON objects are deeply equal excluding properties: ${JSON.stringify(fieldsToExclude)}`);
404
+ return expect(actualValue, customErrorMsg)
405
+ .excludingEvery(fieldsToExclude)
406
+ .to.deep.equal(expectedValue);
407
+ }
408
+
409
+ /**
410
+ * expects a JSON object matches a provided pattern
411
+ * @param {*} actualValue
412
+ * @param {*} expectedPattern
413
+ * @param {*} [customErrorMsg]
414
+ */
415
+ expectMatchesPattern(actualValue, expectedPattern, customErrorMsg = '') {
416
+ // @ts-ignore
417
+ output.step(`I expect "${JSON.stringify(actualValue)}" to match the ${JSON.stringify(expectedPattern)} pattern`);
418
+ return expect(actualValue, customErrorMsg).to.matchPattern(expectedPattern);
419
+ }
420
+ }
421
+
422
+ module.exports = ExpectHelper;
@@ -52,7 +52,7 @@ class FileSystem extends Helper {
52
52
  }
53
53
 
54
54
  /**
55
- * Writes test to file
55
+ * Writes text to file
56
56
  * @param {string} name
57
57
  * @param {string} text
58
58
  */
@@ -81,6 +81,8 @@ class GraphQL extends Helper {
81
81
  'Content-Type': 'application/json',
82
82
  });
83
83
 
84
+ request.headers = { ...this.headers, ...request.headers };
85
+
84
86
  if (this.config.onRequest) {
85
87
  await this.config.onRequest(request);
86
88
  }
@@ -200,5 +202,28 @@ class GraphQL extends Helper {
200
202
  _setRequestTimeout(newTimeout) {
201
203
  this.options.timeout = newTimeout;
202
204
  }
205
+
206
+ /**
207
+ * Sets request headers for all requests of this test
208
+ *
209
+ * @param {object} headers headers list
210
+ */
211
+ haveRequestHeaders(headers) {
212
+ this.headers = { ...this.headers, ...headers };
213
+ }
214
+
215
+ /**
216
+ * Adds a header for Bearer authentication
217
+ *
218
+ * ```js
219
+ * // we use secret function to hide token from logs
220
+ * I.amBearerAuthenticated(secret('heregoestoken'))
221
+ * ```
222
+ *
223
+ * @param {string | CodeceptJS.Secret} accessToken Bearer access token
224
+ */
225
+ amBearerAuthenticated(accessToken) {
226
+ this.haveRequestHeaders({ Authorization: `Bearer ${accessToken}` });
227
+ }
203
228
  }
204
229
  module.exports = GraphQL;
@@ -702,14 +702,16 @@ class Nightmare extends Helper {
702
702
  * {{> seeInField }}
703
703
  */
704
704
  async seeInField(field, value) {
705
- return proceedSeeInField.call(this, 'assert', field, value);
705
+ const _value = (typeof value === 'boolean') ? value : value.toString();
706
+ return proceedSeeInField.call(this, 'assert', field, _value);
706
707
  }
707
708
 
708
709
  /**
709
710
  * {{> dontSeeInField }}
710
711
  */
711
712
  async dontSeeInField(field, value) {
712
- return proceedSeeInField.call(this, 'negate', field, value);
713
+ const _value = (typeof value === 'boolean') ? value : value.toString();
714
+ return proceedSeeInField.call(this, 'negate', field, _value);
713
715
  }
714
716
 
715
717
  /**
@@ -1261,8 +1263,11 @@ class Nightmare extends Helper {
1261
1263
  const body = document.body;
1262
1264
  const html = document.documentElement;
1263
1265
  window.scrollTo(0, Math.max(
1264
- body.scrollHeight, body.offsetHeight,
1265
- html.clientHeight, html.scrollHeight, html.offsetHeight
1266
+ body.scrollHeight,
1267
+ body.offsetHeight,
1268
+ html.clientHeight,
1269
+ html.scrollHeight,
1270
+ html.offsetHeight
1266
1271
  ));
1267
1272
  });
1268
1273
  /* eslint-enable */
@@ -25,7 +25,9 @@ class OpenAI extends Helper {
25
25
  chunkSize: 80000,
26
26
  };
27
27
  this.options = { ...this.options, ...config };
28
+ }
28
29
 
30
+ _beforeSuite() {
29
31
  const helpers = Container.helpers();
30
32
 
31
33
  for (const helperName of standardActingHelpers) {
@@ -37,16 +39,16 @@ class OpenAI extends Helper {
37
39
  }
38
40
 
39
41
  /**
40
- * Asks the OpenAI GPT language model a question based on the provided prompt within the context of the current page's HTML.
41
- *
42
- * ```js
43
- * I.askGptOnPage('what does this page do?');
44
- * ```
45
- *
46
- * @async
47
- * @param {string} prompt - The question or prompt to ask the GPT model.
48
- * @returns {Promise<string>} - A Promise that resolves to the generated responses from the GPT model, joined by newlines.
49
- */
42
+ * Asks the OpenAI GPT language model a question based on the provided prompt within the context of the current page's HTML.
43
+ *
44
+ * ```js
45
+ * I.askGptOnPage('what does this page do?');
46
+ * ```
47
+ *
48
+ * @async
49
+ * @param {string} prompt - The question or prompt to ask the GPT model.
50
+ * @returns {Promise<string>} - A Promise that resolves to the generated responses from the GPT model, joined by newlines.
51
+ */
50
52
  async askGptOnPage(prompt) {
51
53
  const html = await this.helper.grabSource();
52
54
 
@@ -120,3 +122,5 @@ class OpenAI extends Helper {
120
122
  return response;
121
123
  }
122
124
  }
125
+
126
+ module.exports = OpenAI;