@vardot/varbase-e2e 2.0.0

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 (301) hide show
  1. package/AGENTS.md +148 -0
  2. package/CLAUDE.md +544 -0
  3. package/README.md +22 -0
  4. package/bin/generate-reports.js +363 -0
  5. package/bin/init-varbase-e2e.js +330 -0
  6. package/bin/postinstall.js +26 -0
  7. package/cucumber.js +125 -0
  8. package/docs/00-quick-start.md +102 -0
  9. package/docs/01-getting-started.md +102 -0
  10. package/docs/02-bbr-smart-waits.md +77 -0
  11. package/docs/03-selector-registry.md +95 -0
  12. package/docs/04-step-reference.md +801 -0
  13. package/docs/05-web-first-assertions.md +91 -0
  14. package/docs/06-network-and-dialogs.md +83 -0
  15. package/docs/07-auth-state.md +75 -0
  16. package/docs/08-clock-mocking.md +59 -0
  17. package/docs/09-api-testing.md +114 -0
  18. package/docs/10-accessibility.md +167 -0
  19. package/docs/11-debugging.md +129 -0
  20. package/docs/12-ai-agent-guide.md +338 -0
  21. package/docs/13-faq.md +236 -0
  22. package/docs/14-recipes-cookbook.md +255 -0
  23. package/docs/15-tag-conventions.md +76 -0
  24. package/docs/16-ci-cd.md +90 -0
  25. package/docs/README.md +125 -0
  26. package/docs/advanced-screenshots/then-i-save-fullscreen-screenshot.md +36 -0
  27. package/docs/advanced-screenshots/then-i-save-width-x-height-screenshot.md +34 -0
  28. package/docs/advanced-screenshots/when-i-save-screenshot-name-filename.md +45 -0
  29. package/docs/advanced-screenshots.md +52 -0
  30. package/docs/advanced-selectors.md +18 -0
  31. package/docs/api-step-definitions.md +45 -0
  32. package/docs/global-settings.md +267 -0
  33. package/docs/install-varbase-e2e/ddev-varbase-e2e.md +52 -0
  34. package/docs/install-varbase-e2e.md +34 -0
  35. package/docs/overview.md +40 -0
  36. package/docs/step-definitions/given-i-am-anonymous-user.md +67 -0
  37. package/docs/step-definitions/given-i-am-homepage.md +68 -0
  38. package/docs/step-definitions/given-i-am-specific-page.md +72 -0
  39. package/docs/step-definitions/then-i-should-be.md +56 -0
  40. package/docs/step-definitions/then-i-should-see.md +62 -0
  41. package/docs/step-definitions/then-item-checkbox.md +54 -0
  42. package/docs/step-definitions/then-item-link-should-contain-url.md +84 -0
  43. package/docs/step-definitions/then-item-should-contain.md +67 -0
  44. package/docs/step-definitions/then-radio-button-value-should-be-selected.md +68 -0
  45. package/docs/step-definitions/then-response-status-code-should-be-number.md +69 -0
  46. package/docs/step-definitions/then-value-radio-button-selected.md +62 -0
  47. package/docs/step-definitions/when-i-attach-file-file-name-element.md +71 -0
  48. package/docs/step-definitions/when-i-check-checkbox.md +60 -0
  49. package/docs/step-definitions/when-i-click-link.md +51 -0
  50. package/docs/step-definitions/when-i-click-operation-text-row.md +71 -0
  51. package/docs/step-definitions/when-i-fill.md +59 -0
  52. package/docs/step-definitions/when-i-go-homepage.md +60 -0
  53. package/docs/step-definitions/when-i-go-specific-page.md +67 -0
  54. package/docs/step-definitions/when-i-move-backward-one-page.md +49 -0
  55. package/docs/step-definitions/when-i-move-forward-one-page.md +58 -0
  56. package/docs/step-definitions/when-i-press-button.md +58 -0
  57. package/docs/step-definitions/when-i-reload-page.md +51 -0
  58. package/docs/step-definitions/when-i-scroll.md +73 -0
  59. package/docs/step-definitions/when-i-select-option-select-list.md +53 -0
  60. package/docs/step-definitions/when-i-select-radio-button-value.md +62 -0
  61. package/docs/step-definitions/when-i-uncheck-checkbox.md +57 -0
  62. package/docs/step-definitions/when-i-wait-ajax-finish.md +64 -0
  63. package/docs/step-definitions/when-i-wait.md +62 -0
  64. package/docs/step-definitions.md +82 -0
  65. package/docs/steps/README.md +137 -0
  66. package/docs/steps/a11y.md +731 -0
  67. package/docs/steps/action.md +181 -0
  68. package/docs/steps/api.md +679 -0
  69. package/docs/steps/assertion.md +328 -0
  70. package/docs/steps/auth.md +108 -0
  71. package/docs/steps/clock.md +171 -0
  72. package/docs/steps/cookie.md +293 -0
  73. package/docs/steps/debug.md +52 -0
  74. package/docs/steps/dialog.md +226 -0
  75. package/docs/steps/drupal-canvas.md +414 -0
  76. package/docs/steps/drupal-ckeditor.md +118 -0
  77. package/docs/steps/drupal-core.md +688 -0
  78. package/docs/steps/drupal-layout-builder.md +437 -0
  79. package/docs/steps/drupal-media.md +107 -0
  80. package/docs/steps/drupal-moderation.md +81 -0
  81. package/docs/steps/drupal-paragraphs.md +36 -0
  82. package/docs/steps/element.md +455 -0
  83. package/docs/steps/field.md +648 -0
  84. package/docs/steps/file-download.md +235 -0
  85. package/docs/steps/form.md +344 -0
  86. package/docs/steps/iframe.md +248 -0
  87. package/docs/steps/input.md +220 -0
  88. package/docs/steps/javascript.md +111 -0
  89. package/docs/steps/keyboard.md +107 -0
  90. package/docs/steps/link.md +217 -0
  91. package/docs/steps/metatag.md +99 -0
  92. package/docs/steps/modal.md +232 -0
  93. package/docs/steps/navigation.md +275 -0
  94. package/docs/steps/network.md +284 -0
  95. package/docs/steps/path.md +203 -0
  96. package/docs/steps/response.md +102 -0
  97. package/docs/steps/responsive.md +139 -0
  98. package/docs/steps/rest.md +140 -0
  99. package/docs/steps/screenshot.md +211 -0
  100. package/docs/steps/scroll.md +266 -0
  101. package/docs/steps/selectors.md +848 -0
  102. package/docs/steps/storage.md +254 -0
  103. package/docs/steps/table.md +216 -0
  104. package/docs/steps/varbase.md +391 -0
  105. package/docs/steps/video.md +111 -0
  106. package/docs/steps/wait.md +553 -0
  107. package/docs/steps/web-first.md +289 -0
  108. package/docs/steps/xml.md +505 -0
  109. package/docs/steps/yaml.md +951 -0
  110. package/examples/a11y.html +31 -0
  111. package/examples/about-us.html +11 -0
  112. package/examples/account.html +32 -0
  113. package/examples/ajax-wait-examples.html +147 -0
  114. package/examples/contact-us.html +10 -0
  115. package/examples/cookies.html +10 -0
  116. package/examples/date.html +12 -0
  117. package/examples/dynamic-examples.html +498 -0
  118. package/examples/element.html +11 -0
  119. package/examples/example-api.json +28 -0
  120. package/examples/existing-page.html +11 -0
  121. package/examples/field.html +24 -0
  122. package/examples/index.html +37 -0
  123. package/examples/keyboard.html +11 -0
  124. package/examples/links.html +9 -0
  125. package/examples/modal.html +14 -0
  126. package/examples/path.html +3 -0
  127. package/examples/table.html +13 -0
  128. package/examples/test--modal-dialogs.html +252 -0
  129. package/examples/test--then--i-should--not--see-text-in-element.html +48 -0
  130. package/examples/test--then--i-should--see-text-in-element.html +48 -0
  131. package/examples/test--then--i-should--see-text-matching-pattern.html +31 -0
  132. package/examples/test--then--i-should-see-text-in-table-row.html +232 -0
  133. package/examples/test--then--the-checkbox-checked.html +68 -0
  134. package/examples/test--then--the-element-should_not-contain-cssproperty.html +47 -0
  135. package/examples/test--then--the-link-should-contain.html +21 -0
  136. package/examples/test--when--i-additionally-select.html +27 -0
  137. package/examples/test--when--i-attach-file-to-feild.html +50 -0
  138. package/examples/test--when--i-check-uncheck-checkbox.html +47 -0
  139. package/examples/test--when--i-click-link.html +18 -0
  140. package/examples/test--when--i-click-text-in-table-row.html +178 -0
  141. package/examples/test--when--i-fill-in.html +48 -0
  142. package/examples/test--when--i-press-button.html +31 -0
  143. package/examples/test--when--i-reload-page.html +27 -0
  144. package/examples/test--when--i-scroll-functionality.html +177 -0
  145. package/examples/test--when--i-scroll-left-right-functionality.html +149 -0
  146. package/examples/test--when--i-select-option-from-dropdownlist.html +35 -0
  147. package/examples/test--when--i-select-radio-button.html +95 -0
  148. package/examples/test--when-i-wait-max-of-time.html +39 -0
  149. package/examples/test--when-i-wait-page-until-is-loaded.html +47 -0
  150. package/examples/test--when-i-wait-specific-time.html +39 -0
  151. package/examples/test-acceptable-url-path.html +11 -0
  152. package/examples/video-demo.html +43 -0
  153. package/package.json +56 -0
  154. package/playwright.config.ts +39 -0
  155. package/tests/assets/test-document.pdf +14 -0
  156. package/tests/assets/vardot.png +0 -0
  157. package/tests/features/a11y.feature +39 -0
  158. package/tests/features/ajax-wait-examples.feature +24 -0
  159. package/tests/features/api-step-definitions-individual.feature +185 -0
  160. package/tests/features/complete-api-testing-examples.feature +205 -0
  161. package/tests/features/cookie.feature +13 -0
  162. package/tests/features/date.feature +11 -0
  163. package/tests/features/dynamic-content-examples.feature +156 -0
  164. package/tests/features/element.feature +16 -0
  165. package/tests/features/field.feature +25 -0
  166. package/tests/features/keyboard.feature +10 -0
  167. package/tests/features/link.feature +11 -0
  168. package/tests/features/modal-advanced-example.feature +54 -0
  169. package/tests/features/modal-basic-example.feature +42 -0
  170. package/tests/features/modal-error-handling-example.feature +37 -0
  171. package/tests/features/modal.feature +11 -0
  172. package/tests/features/path.feature +16 -0
  173. package/tests/features/response.feature +8 -0
  174. package/tests/features/responsive.feature +10 -0
  175. package/tests/features/table.feature +18 -0
  176. package/tests/features/test--given--i-am-an-anonymous-user.feature +10 -0
  177. package/tests/features/test--given--i-am-on-homepage.feature +16 -0
  178. package/tests/features/test--then--i-save-screenshot.feature +33 -0
  179. package/tests/features/test--then--i-see-locator.feature +320 -0
  180. package/tests/features/test--then--i-should--not--see-text-in-element.feature +13 -0
  181. package/tests/features/test--then--i-should--see-text-in-element-by-attr.feature +10 -0
  182. package/tests/features/test--then--i-should--see-text-in-element.feature +10 -0
  183. package/tests/features/test--then--i-should--see-text-matching-pattern-in-element.feature +13 -0
  184. package/tests/features/test--then--i-should--see-text-matching-pattern.feature +18 -0
  185. package/tests/features/test--then--i-should-be-on-page.feature +10 -0
  186. package/tests/features/test--then--i-should-be-on-the-homepage.feature +10 -0
  187. package/tests/features/test--then--i-should-not-see-an-element-by-attr.feature +8 -0
  188. package/tests/features/test--then--i-should-not-see-an-element.feature +8 -0
  189. package/tests/features/test--then--i-should-see-an-element-by-attr.feature +8 -0
  190. package/tests/features/test--then--i-should-see-an-element.feature +8 -0
  191. package/tests/features/test--then--i-should-see-n-elements.feature +24 -0
  192. package/tests/features/test--then--i-should-see-text-in-table-row.feature +96 -0
  193. package/tests/features/test--then--print-current-url-and-response.feature +21 -0
  194. package/tests/features/test--then--the-checkbox-is-checked.feature +18 -0
  195. package/tests/features/test--then--the-checkbox-should-be-checked.feature +16 -0
  196. package/tests/features/test--then--the-element-should-contain-cssproperty.feature +9 -0
  197. package/tests/features/test--then--the-element-should-not-contain-cssproperty.feature +10 -0
  198. package/tests/features/test--then--the-field-should-contain-value.feature +11 -0
  199. package/tests/features/test--then--the-response-should-contain.feature +11 -0
  200. package/tests/features/test--then--the-response-status-code-should-be.feature +31 -0
  201. package/tests/features/test--then--the-url-should-match.feature +7 -0
  202. package/tests/features/test--then-the-link-should-contain-by-attribute.feature +18 -0
  203. package/tests/features/test--then-the-link-should-contain.feature +7 -0
  204. package/tests/features/test--when--i-additionally-select.feature +30 -0
  205. package/tests/features/test--when--i-attach-file-to-feild.feature +9 -0
  206. package/tests/features/test--when--i-check-checkbox.feature +21 -0
  207. package/tests/features/test--when--i-click-link-by-attribute.feature +21 -0
  208. package/tests/features/test--when--i-click-link.feature +9 -0
  209. package/tests/features/test--when--i-click-text-in-table-row.feature +37 -0
  210. package/tests/features/test--when--i-fill-in-by-attr.feature +31 -0
  211. package/tests/features/test--when--i-fill-in-table-by-attr.feature +19 -0
  212. package/tests/features/test--when--i-fill-in.feature +32 -0
  213. package/tests/features/test--when--i-follow.feature +22 -0
  214. package/tests/features/test--when--i-go-to-homepage.feature +9 -0
  215. package/tests/features/test--when--i-move-forward-backward-one-page.feature +14 -0
  216. package/tests/features/test--when--i-press-button-by-attribute.feature +18 -0
  217. package/tests/features/test--when--i-press-button.feature +13 -0
  218. package/tests/features/test--when--i-reload-page.feature +11 -0
  219. package/tests/features/test--when--i-scroll-left-right.feature +48 -0
  220. package/tests/features/test--when--i-scroll.feature +48 -0
  221. package/tests/features/test--when--i-select-option-from-dropdownlist.feature +21 -0
  222. package/tests/features/test--when--i-select-radio-button.feature +37 -0
  223. package/tests/features/test--when--i-wait-page-is-loaded.feature +8 -0
  224. package/tests/features/test--when--i-wait-time.feature +21 -0
  225. package/tests/features/video.feature +18 -0
  226. package/tests/features/wait.feature +7 -0
  227. package/tests/features/yaml.feature +102 -0
  228. package/tests/selectors/_canonical-keys.json +113 -0
  229. package/tests/selectors/back-end-selectors.json +19 -0
  230. package/tests/selectors/cms-contentful-admin.json +35 -0
  231. package/tests/selectors/cms-craft-admin.json +39 -0
  232. package/tests/selectors/cms-drupal-cms-gin.json +56 -0
  233. package/tests/selectors/cms-drupal-core-claro.json +50 -0
  234. package/tests/selectors/cms-generic-admin.json +34 -0
  235. package/tests/selectors/cms-ghost-admin.json +34 -0
  236. package/tests/selectors/cms-joomla-admin.json +41 -0
  237. package/tests/selectors/cms-magento2-admin.json +32 -0
  238. package/tests/selectors/cms-prestashop-admin.json +38 -0
  239. package/tests/selectors/cms-shopify-admin.json +25 -0
  240. package/tests/selectors/cms-strapi-admin.json +42 -0
  241. package/tests/selectors/cms-typo3-admin.json +41 -0
  242. package/tests/selectors/cms-woocommerce-front.json +50 -0
  243. package/tests/selectors/cms-wordpress-admin.json +31 -0
  244. package/tests/selectors/framework-ant-design.json +80 -0
  245. package/tests/selectors/framework-bootstrap.json +86 -0
  246. package/tests/selectors/framework-bulma.json +74 -0
  247. package/tests/selectors/framework-chakra.json +58 -0
  248. package/tests/selectors/framework-foundation.json +51 -0
  249. package/tests/selectors/framework-material-ui.json +72 -0
  250. package/tests/selectors/framework-shadcn.json +51 -0
  251. package/tests/selectors/framework-tailwind.json +40 -0
  252. package/tests/selectors/framework-vuetify.json +61 -0
  253. package/tests/selectors/front-end-selectors.json +16 -0
  254. package/tests/selectors/homepage-selectors.json +13 -0
  255. package/tests/step-definitions/a11y.steps.js +800 -0
  256. package/tests/step-definitions/action.steps.js +167 -0
  257. package/tests/step-definitions/api.steps.js +732 -0
  258. package/tests/step-definitions/assertion.steps.js +352 -0
  259. package/tests/step-definitions/auth.steps.js +126 -0
  260. package/tests/step-definitions/clock.steps.js +128 -0
  261. package/tests/step-definitions/cookie.steps.js +216 -0
  262. package/tests/step-definitions/debug.steps.js +39 -0
  263. package/tests/step-definitions/dialog.steps.js +193 -0
  264. package/tests/step-definitions/drupal-canvas.steps.js +764 -0
  265. package/tests/step-definitions/drupal-ckeditor.steps.js +108 -0
  266. package/tests/step-definitions/drupal-core.steps.js +665 -0
  267. package/tests/step-definitions/drupal-helpers.js +371 -0
  268. package/tests/step-definitions/drupal-layout-builder.steps.js +466 -0
  269. package/tests/step-definitions/drupal-media.steps.js +99 -0
  270. package/tests/step-definitions/drupal-moderation.steps.js +71 -0
  271. package/tests/step-definitions/drupal-paragraphs.steps.js +50 -0
  272. package/tests/step-definitions/element.steps.js +356 -0
  273. package/tests/step-definitions/field.steps.js +653 -0
  274. package/tests/step-definitions/file-download.steps.js +211 -0
  275. package/tests/step-definitions/form.steps.js +333 -0
  276. package/tests/step-definitions/iframe.steps.js +228 -0
  277. package/tests/step-definitions/input.steps.js +202 -0
  278. package/tests/step-definitions/javascript.steps.js +232 -0
  279. package/tests/step-definitions/keyboard.steps.js +112 -0
  280. package/tests/step-definitions/link.steps.js +142 -0
  281. package/tests/step-definitions/metatag.steps.js +91 -0
  282. package/tests/step-definitions/modal.steps.js +244 -0
  283. package/tests/step-definitions/navigation.steps.js +218 -0
  284. package/tests/step-definitions/network.steps.js +280 -0
  285. package/tests/step-definitions/path.steps.js +141 -0
  286. package/tests/step-definitions/response.steps.js +98 -0
  287. package/tests/step-definitions/responsive.steps.js +125 -0
  288. package/tests/step-definitions/rest.steps.js +111 -0
  289. package/tests/step-definitions/screenshot.steps.js +423 -0
  290. package/tests/step-definitions/scroll.steps.js +189 -0
  291. package/tests/step-definitions/selectors.steps.js +1003 -0
  292. package/tests/step-definitions/storage.steps.js +194 -0
  293. package/tests/step-definitions/table.steps.js +181 -0
  294. package/tests/step-definitions/varbase-e2e.js +897 -0
  295. package/tests/step-definitions/varbase.steps.js +458 -0
  296. package/tests/step-definitions/video.steps.js +178 -0
  297. package/tests/step-definitions/wait.steps.js +400 -0
  298. package/tests/step-definitions/web-first.steps.js +298 -0
  299. package/tests/step-definitions/xml.steps.js +411 -0
  300. package/tests/step-definitions/yaml.steps.js +913 -0
  301. package/tsconfig.json +26 -0
@@ -0,0 +1,275 @@
1
+ # Navigation steps
2
+
3
+ 11 steps, defined in `tests/step-definitions/navigation.steps.js`.
4
+
5
+ Cucumber-js loads every `*.steps.js` in that directory automatically — you never `require()` a step file from a feature.
6
+
7
+ | # | Step |
8
+ | --- | --- |
9
+ | 1 | `Given I am an anonymous user` |
10
+ | 2 | `Given I am on homepage` |
11
+ | 3 | `Given I am on "/about-us.html"` |
12
+ | 4 | `When I go to homepage` |
13
+ | 5 | `When I go to "/contact-us.html"` |
14
+ | 6 | `When I move forward one page` |
15
+ | 7 | `When I move backward one page` |
16
+ | 8 | `When I reload` |
17
+ | 9 | `Then I should be on homepage` |
18
+ | 10 | `Then I should be on "/"` |
19
+ | 11 | `Then the url should match "/contact-us.html"` |
20
+
21
+ ---
22
+
23
+ ## 1. Given I am an anonymous user
24
+
25
+ Clear cookies and navigate to the launch URL as an anonymous visitor.
26
+
27
+ **Keyword**: `Given`
28
+
29
+ **Pattern**
30
+
31
+ ```js
32
+ /^(I am |we are )?an anonymous user$/
33
+ ```
34
+
35
+ **Examples**
36
+
37
+ ```gherkin
38
+ Given I am an anonymous user
39
+ Given we are an anonymous user
40
+ Given an anonymous user
41
+ ```
42
+
43
+ ## 2. Given I am on homepage
44
+
45
+ Open the homepage.
46
+
47
+ **Keyword**: `Given`
48
+
49
+ **Pattern**
50
+
51
+ ```js
52
+ /^(I am |we are )?on( the)* (homepage|frontpage)$/
53
+ ```
54
+
55
+ **Examples**
56
+
57
+ ```gherkin
58
+ Given I am on homepage
59
+ Given I am on the homepage
60
+ Given I am on frontpage
61
+ Given I am on the frontpage
62
+ Given we are on homepage
63
+ Given we are on the frontpage
64
+ Given on homepage
65
+ Given on the homepage
66
+ Given on frontpage
67
+ Given on the frontpage
68
+ ```
69
+
70
+ ## 3. Given I am on "/about-us.html"
71
+
72
+ Open a specific page under the launch URL.
73
+
74
+ **Keyword**: `Given`
75
+
76
+ **Pattern**
77
+
78
+ ```js
79
+ /^(I am |we are )*on( the)* "([^"]*)?"( page)*$/
80
+ ```
81
+
82
+ **Examples**
83
+
84
+ ```gherkin
85
+ Given I am on "/about-us.html"
86
+ Given I am on the "/about-us.html" page
87
+ Given we are on "/user/login"
88
+ Given we are on the "/contact-us.html" page
89
+ Given on "/about-us.html"
90
+ Given on the "/about-us.html" page
91
+ Given I am on "https://un.org"
92
+ ```
93
+
94
+ ## 4. When I go to homepage
95
+
96
+ Navigate to the homepage.
97
+
98
+ **Keyword**: `When`
99
+
100
+ **Pattern**
101
+
102
+ ```js
103
+ /^(I go |I navigate |we go |we navigate |navigating )?to( the)* (homepage|frontpage)$/
104
+ ```
105
+
106
+ **Examples**
107
+
108
+ ```gherkin
109
+ When I go to homepage
110
+ When I go to the homepage
111
+ When I navigate to the homepage
112
+ When navigating to the homepage
113
+ When navigating to homepage
114
+ When navigating to the frontpage
115
+ When we go to the homepage
116
+ When we navigate to the homepage
117
+ ```
118
+
119
+ ## 5. When I go to "/contact-us.html"
120
+
121
+ Navigate to a specific page.
122
+
123
+ **Keyword**: `When`
124
+
125
+ **Pattern**
126
+
127
+ ```js
128
+ /^(I go |I navigate |we go |we navigate |navigating )?to "([^"]*)?"$/
129
+ ```
130
+
131
+ **Examples**
132
+
133
+ ```gherkin
134
+ When I go to "/contact-us.html"
135
+ When I go to "/user/login"
136
+ When I navigate to "/admin/dashboard"
137
+ When navigating to "/products"
138
+ When we go to "/products"
139
+ When we navigate to "/terms"
140
+ ```
141
+
142
+ ## 6. When I move forward one page
143
+
144
+ Moves forward one page in browser history.
145
+
146
+ **Keyword**: `When`
147
+
148
+ **Pattern**
149
+
150
+ ```js
151
+ /^(I |we )*move forward one page$/
152
+ ```
153
+
154
+ **Examples**
155
+
156
+ ```gherkin
157
+ When I move forward one page
158
+ When we move forward one page
159
+ And move forward one page
160
+ ```
161
+
162
+ ## 7. When I move backward one page
163
+
164
+ Moves backward one page in browser history.
165
+
166
+ **Keyword**: `When`
167
+
168
+ **Pattern**
169
+
170
+ ```js
171
+ /^(I |we )*move backward one page$/
172
+ ```
173
+
174
+ **Examples**
175
+
176
+ ```gherkin
177
+ When I move backward one page
178
+ When we move backward one page
179
+ And move backward one page
180
+ ```
181
+
182
+ ## 8. When I reload
183
+
184
+ Reloads the current page.
185
+
186
+ **Keyword**: `When`
187
+
188
+ **Pattern**
189
+
190
+ ```js
191
+ /^(I |we )*reload( the)*( page)*$/
192
+ ```
193
+
194
+ **Examples**
195
+
196
+ ```gherkin
197
+ When I reload
198
+ And I reload the page
199
+ And we reload page
200
+ And we reload the page
201
+ ```
202
+
203
+ ## 9. Then I should be on homepage
204
+
205
+ Assert that the current page is or is not the homepage.
206
+
207
+ **Keyword**: `Then`
208
+
209
+ **Pattern**
210
+
211
+ ```js
212
+ /^(I |we )*should( not)* be on( the)* (homepage|frontpage)$/
213
+ ```
214
+
215
+ **Examples**
216
+
217
+ ```gherkin
218
+ Then I should be on homepage
219
+ And I should be on the homepage
220
+ Then I should be on frontpage
221
+ And should be on the homepage
222
+ Then should be on homepage
223
+ And we should be on homepage
224
+ Then should be on frontpage
225
+ And we should be on the homepage
226
+ Then I should not be on homepage
227
+ And I should not be on the homepage
228
+ ```
229
+
230
+ ## 10. Then I should be on "/"
231
+
232
+ Assert that the current path is or is not equal to the specified path.
233
+
234
+ **Keyword**: `Then`
235
+
236
+ **Pattern**
237
+
238
+ ```js
239
+ /^(I |we )*should( not)* be on( the)* "([^"]*)?"( page)*$/
240
+ ```
241
+
242
+ **Examples**
243
+
244
+ ```gherkin
245
+ Then I should be on "/"
246
+ And I should be on "/user/login"
247
+ And I should be on "https://un.org"
248
+ Then we should be on the "/" page
249
+ And we should be on "/user/login"
250
+ Then should be on the "/user/reset" page
251
+ Then I should not be on "/"
252
+ And I should not be on "/user/login"
253
+ And I should not be on "https://un.org"
254
+ And we should not be on the "https://un.org" page
255
+ ```
256
+
257
+ ## 11. Then the url should match "/contact-us.html"
258
+
259
+ Assert that the current URL matches or does not match a regex pattern.
260
+
261
+ **Keyword**: `Then`
262
+
263
+ **Pattern**
264
+
265
+ ```js
266
+ /^(the )*url should( not)* match "([^"]*)?"$/
267
+ ```
268
+
269
+ **Examples**
270
+
271
+ ```gherkin
272
+ Then the url should match "/contact-us.html"
273
+ Then the url should not match "/contact-us.html"
274
+ And the url should match "^https://"
275
+ ```
@@ -0,0 +1,284 @@
1
+ # Network steps
2
+
3
+ 10 steps, defined in `tests/step-definitions/network.steps.js`.
4
+
5
+ Cucumber-js loads every `*.steps.js` in that directory automatically — you never `require()` a step file from a feature.
6
+
7
+ | # | Step |
8
+ | --- | --- |
9
+ | 1 | `Given the URL "**\/api/users" returns the JSON:` |
10
+ | 2 | `Given the URL "**\/api/login" returns status 401 with body "Unauthorized"` |
11
+ | 3 | `Given the URL "**\/analytics.js" is blocked` |
12
+ | 4 | `Given the URL "**\/api/**" is delayed by 1500 ms` |
13
+ | 5 | `Given the network is offline` |
14
+ | 6 | `Given the network is online` |
15
+ | 7 | `Given I start recording network requests` |
16
+ | 8 | `Then a request to "**\/api/users" should have been made` |
17
+ | 9 | `Then a GET request to "**\/api/users" should have been made` |
18
+ | 10 | `Then no request to "**\/tracking" should have been made` |
19
+
20
+ ---
21
+
22
+ ## 1. Given the URL "**\/api/users" returns the JSON:
23
+
24
+ Stub a URL pattern with a JSON response body.
25
+
26
+ Body is sent verbatim with `Content-Type: application/json` and HTTP 200.
27
+
28
+ **Keyword**: `Given`
29
+
30
+ **Pattern**
31
+
32
+ ```js
33
+ /^the URL "([^"]*)" returns the JSON:$/
34
+ ```
35
+
36
+ **Examples**
37
+
38
+ ```gherkin
39
+ Given the URL "**\/api/users" returns the JSON:
40
+ """
41
+ {"users": [{"id": 1, "name": "Alice"}]}
42
+ """
43
+ Given the URL "**\/api/me" returns the JSON:
44
+ """
45
+ {"id": 1, "name": "Alice", "role": "admin"}
46
+ """
47
+ Given the URL "**\/api/products?*" returns the JSON:
48
+ """
49
+ {"items": [], "total": 0}
50
+ """
51
+ Given the URL "https://api.stripe.com/v1/charges" returns the JSON:
52
+ """
53
+ {"id": "ch_test", "status": "succeeded"}
54
+ """
55
+ Given the URL "**\/api/feature-flags" returns the JSON:
56
+ """
57
+ {"darkMode": true, "betaUI": false}
58
+ """
59
+ ```
60
+
61
+ ## 2. Given the URL "**\/api/login" returns status 401 with body "Unauthorized"
62
+
63
+ Stub a URL pattern with a status code and plain-text body.
64
+
65
+ **Keyword**: `Given`
66
+
67
+ **Pattern**
68
+
69
+ ```js
70
+ /^the URL "([^"]*)" returns status (\d+)(?: with body "([^"]*)")?$/
71
+ ```
72
+
73
+ **Examples**
74
+
75
+ ```gherkin
76
+ Given the URL "**\/api/login" returns status 401 with body "Unauthorized"
77
+ Given the URL "**\/api/health" returns status 503
78
+ Given the URL "**\/api/users" returns status 500 with body "Database down"
79
+ Given the URL "**\/api/orders/*" returns status 404
80
+ Given the URL "**\/api/admin/*" returns status 403 with body "Forbidden"
81
+ ```
82
+
83
+ ## 3. Given the URL "**\/analytics.js" is blocked
84
+
85
+ Block a URL pattern entirely (network failure simulation).
86
+
87
+ **Keyword**: `Given`
88
+
89
+ **Pattern**
90
+
91
+ ```js
92
+ /^the URL "([^"]*)" is blocked$/
93
+ ```
94
+
95
+ **Examples**
96
+
97
+ ```gherkin
98
+ Given the URL "**\/analytics.js" is blocked
99
+ Given the URL "**\/google-analytics.com/**" is blocked
100
+ Given the URL "**\/sentry.io/**" is blocked
101
+ Given the URL "*.gif" is blocked
102
+ Given the URL "**\/api/tracking" is blocked
103
+ ```
104
+
105
+ ## 4. Given the URL "**\/api/**" is delayed by 1500 ms
106
+
107
+ Delay matching requests by N milliseconds (slow-network simulation).
108
+
109
+ The request still completes against the real upstream — only its arrival
110
+ time at the page is shifted. Useful for verifying loading-state UI.
111
+
112
+ **Keyword**: `Given`
113
+
114
+ **Pattern**
115
+
116
+ ```js
117
+ /^the URL "([^"]*)" is delayed by (\d+) ?ms$/
118
+ ```
119
+
120
+ **Examples**
121
+
122
+ ```gherkin
123
+ Given the URL "**\/api/**" is delayed by 1500 ms
124
+ Given the URL "**\/api/users" is delayed by 3000 ms
125
+ Given the URL "**\/api/heavy-report" is delayed by 5000 ms
126
+ Given the URL "*.png" is delayed by 500 ms
127
+ Given the URL "**\/api/checkout" is delayed by 2000 ms
128
+ ```
129
+
130
+ ## 5. Given the network is offline
131
+
132
+ Simulate offline mode for the rest of the scenario.
133
+
134
+ **Keyword**: `Given`
135
+
136
+ **Pattern**
137
+
138
+ ```js
139
+ /^the network is offline$/
140
+ ```
141
+
142
+ **Examples**
143
+
144
+ ```gherkin
145
+ Given the network is offline
146
+ Given I am on the homepage
147
+ When the network is offline
148
+ And I follow "Refresh"
149
+ Then I should see "Offline"
150
+ When the network is offline
151
+ And I press "Sync"
152
+ Then I should see "Cannot reach server"
153
+ Given the network is offline
154
+ And I am on "/dashboard"
155
+ Given the network is offline
156
+ When I click "Reload"
157
+ Then "<.error-banner>" should be visible
158
+ ```
159
+
160
+ ## 6. Given the network is online
161
+
162
+ Restore network connectivity after `the network is offline`.
163
+
164
+ **Keyword**: `Given`
165
+
166
+ **Pattern**
167
+
168
+ ```js
169
+ /^the network is online$/
170
+ ```
171
+
172
+ **Examples**
173
+
174
+ ```gherkin
175
+ Given the network is online
176
+ When the network is offline
177
+ And I press "Sync"
178
+ Then I should see "Cannot reach server"
179
+ When the network is online
180
+ And I press "Retry"
181
+ Then I should see "Synced"
182
+ Given the network is online
183
+ And I am on the homepage
184
+ When the network is online
185
+ Given the network is online
186
+ When I follow "Reload"
187
+ Then I should see "Welcome"
188
+ ```
189
+
190
+ ## 7. Given I start recording network requests
191
+
192
+ Start recording every outgoing request for later assertion.
193
+
194
+ **Keyword**: `Given`
195
+
196
+ **Pattern**
197
+
198
+ ```js
199
+ /^(I |we )*start recording network requests$/
200
+ ```
201
+
202
+ **Examples**
203
+
204
+ ```gherkin
205
+ Given I start recording network requests
206
+ Given I start recording network requests
207
+ When I press "Buy now"
208
+ Then a POST request to "**\/api/checkout" should have been made
209
+ Given we start recording network requests
210
+ Given I start recording network requests
211
+ When I follow "Pricing"
212
+ Then no request to "**\/tracking" should have been made
213
+ Given I start recording network requests
214
+ When I scroll to the bottom
215
+ Then a GET request to "**\/api/feed/page=2" should have been made
216
+ ```
217
+
218
+ ## 8. Then a request to "**\/api/users" should have been made
219
+
220
+ Assert at least one request matching a URL pattern was recorded.
221
+
222
+ Patterns use simple `*` wildcards (regex internally).
223
+
224
+ **Keyword**: `Then`
225
+
226
+ **Pattern**
227
+
228
+ ```js
229
+ /^a request to "([^"]*)" should have been made$/
230
+ ```
231
+
232
+ **Examples**
233
+
234
+ ```gherkin
235
+ Then a request to "**\/api/users" should have been made
236
+ Then a request to "**\/api/checkout" should have been made
237
+ Then a request to "**\/api/orders/*" should have been made
238
+ Then a request to "*.css" should have been made
239
+ Then a request to "https://api.example.com/**" should have been made
240
+ ```
241
+
242
+ ## 9. Then a GET request to "**\/api/users" should have been made
243
+
244
+ Assert at least one HTTP-method-specific request was recorded.
245
+
246
+ **Keyword**: `Then`
247
+
248
+ **Pattern**
249
+
250
+ ```js
251
+ /^a (GET|POST|PUT|PATCH|DELETE) request to "([^"]*)" should have been made$/
252
+ ```
253
+
254
+ **Examples**
255
+
256
+ ```gherkin
257
+ Then a GET request to "**\/api/users" should have been made
258
+ Then a POST request to "**\/api/login" should have been made
259
+ Then a PUT request to "**\/api/users/1" should have been made
260
+ Then a PATCH request to "**\/api/orders/*" should have been made
261
+ Then a DELETE request to "**\/api/cart/items/*" should have been made
262
+ ```
263
+
264
+ ## 10. Then no request to "**\/tracking" should have been made
265
+
266
+ Assert NO request matching a URL pattern was recorded.
267
+
268
+ **Keyword**: `Then`
269
+
270
+ **Pattern**
271
+
272
+ ```js
273
+ /^no request to "([^"]*)" should have been made$/
274
+ ```
275
+
276
+ **Examples**
277
+
278
+ ```gherkin
279
+ Then no request to "**\/tracking" should have been made
280
+ Then no request to "**\/google-analytics.com/**" should have been made
281
+ Then no request to "**\/api/admin/**" should have been made
282
+ Then no request to "*.gif" should have been made
283
+ Then no request to "**\/api/v1/legacy/**" should have been made
284
+ ```