@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.
- package/AGENTS.md +148 -0
- package/CLAUDE.md +544 -0
- package/README.md +22 -0
- package/bin/generate-reports.js +363 -0
- package/bin/init-varbase-e2e.js +330 -0
- package/bin/postinstall.js +26 -0
- package/cucumber.js +125 -0
- package/docs/00-quick-start.md +102 -0
- package/docs/01-getting-started.md +102 -0
- package/docs/02-bbr-smart-waits.md +77 -0
- package/docs/03-selector-registry.md +95 -0
- package/docs/04-step-reference.md +801 -0
- package/docs/05-web-first-assertions.md +91 -0
- package/docs/06-network-and-dialogs.md +83 -0
- package/docs/07-auth-state.md +75 -0
- package/docs/08-clock-mocking.md +59 -0
- package/docs/09-api-testing.md +114 -0
- package/docs/10-accessibility.md +167 -0
- package/docs/11-debugging.md +129 -0
- package/docs/12-ai-agent-guide.md +338 -0
- package/docs/13-faq.md +236 -0
- package/docs/14-recipes-cookbook.md +255 -0
- package/docs/15-tag-conventions.md +76 -0
- package/docs/16-ci-cd.md +90 -0
- package/docs/README.md +125 -0
- package/docs/advanced-screenshots/then-i-save-fullscreen-screenshot.md +36 -0
- package/docs/advanced-screenshots/then-i-save-width-x-height-screenshot.md +34 -0
- package/docs/advanced-screenshots/when-i-save-screenshot-name-filename.md +45 -0
- package/docs/advanced-screenshots.md +52 -0
- package/docs/advanced-selectors.md +18 -0
- package/docs/api-step-definitions.md +45 -0
- package/docs/global-settings.md +267 -0
- package/docs/install-varbase-e2e/ddev-varbase-e2e.md +52 -0
- package/docs/install-varbase-e2e.md +34 -0
- package/docs/overview.md +40 -0
- package/docs/step-definitions/given-i-am-anonymous-user.md +67 -0
- package/docs/step-definitions/given-i-am-homepage.md +68 -0
- package/docs/step-definitions/given-i-am-specific-page.md +72 -0
- package/docs/step-definitions/then-i-should-be.md +56 -0
- package/docs/step-definitions/then-i-should-see.md +62 -0
- package/docs/step-definitions/then-item-checkbox.md +54 -0
- package/docs/step-definitions/then-item-link-should-contain-url.md +84 -0
- package/docs/step-definitions/then-item-should-contain.md +67 -0
- package/docs/step-definitions/then-radio-button-value-should-be-selected.md +68 -0
- package/docs/step-definitions/then-response-status-code-should-be-number.md +69 -0
- package/docs/step-definitions/then-value-radio-button-selected.md +62 -0
- package/docs/step-definitions/when-i-attach-file-file-name-element.md +71 -0
- package/docs/step-definitions/when-i-check-checkbox.md +60 -0
- package/docs/step-definitions/when-i-click-link.md +51 -0
- package/docs/step-definitions/when-i-click-operation-text-row.md +71 -0
- package/docs/step-definitions/when-i-fill.md +59 -0
- package/docs/step-definitions/when-i-go-homepage.md +60 -0
- package/docs/step-definitions/when-i-go-specific-page.md +67 -0
- package/docs/step-definitions/when-i-move-backward-one-page.md +49 -0
- package/docs/step-definitions/when-i-move-forward-one-page.md +58 -0
- package/docs/step-definitions/when-i-press-button.md +58 -0
- package/docs/step-definitions/when-i-reload-page.md +51 -0
- package/docs/step-definitions/when-i-scroll.md +73 -0
- package/docs/step-definitions/when-i-select-option-select-list.md +53 -0
- package/docs/step-definitions/when-i-select-radio-button-value.md +62 -0
- package/docs/step-definitions/when-i-uncheck-checkbox.md +57 -0
- package/docs/step-definitions/when-i-wait-ajax-finish.md +64 -0
- package/docs/step-definitions/when-i-wait.md +62 -0
- package/docs/step-definitions.md +82 -0
- package/docs/steps/README.md +137 -0
- package/docs/steps/a11y.md +731 -0
- package/docs/steps/action.md +181 -0
- package/docs/steps/api.md +679 -0
- package/docs/steps/assertion.md +328 -0
- package/docs/steps/auth.md +108 -0
- package/docs/steps/clock.md +171 -0
- package/docs/steps/cookie.md +293 -0
- package/docs/steps/debug.md +52 -0
- package/docs/steps/dialog.md +226 -0
- package/docs/steps/drupal-canvas.md +414 -0
- package/docs/steps/drupal-ckeditor.md +118 -0
- package/docs/steps/drupal-core.md +688 -0
- package/docs/steps/drupal-layout-builder.md +437 -0
- package/docs/steps/drupal-media.md +107 -0
- package/docs/steps/drupal-moderation.md +81 -0
- package/docs/steps/drupal-paragraphs.md +36 -0
- package/docs/steps/element.md +455 -0
- package/docs/steps/field.md +648 -0
- package/docs/steps/file-download.md +235 -0
- package/docs/steps/form.md +344 -0
- package/docs/steps/iframe.md +248 -0
- package/docs/steps/input.md +220 -0
- package/docs/steps/javascript.md +111 -0
- package/docs/steps/keyboard.md +107 -0
- package/docs/steps/link.md +217 -0
- package/docs/steps/metatag.md +99 -0
- package/docs/steps/modal.md +232 -0
- package/docs/steps/navigation.md +275 -0
- package/docs/steps/network.md +284 -0
- package/docs/steps/path.md +203 -0
- package/docs/steps/response.md +102 -0
- package/docs/steps/responsive.md +139 -0
- package/docs/steps/rest.md +140 -0
- package/docs/steps/screenshot.md +211 -0
- package/docs/steps/scroll.md +266 -0
- package/docs/steps/selectors.md +848 -0
- package/docs/steps/storage.md +254 -0
- package/docs/steps/table.md +216 -0
- package/docs/steps/varbase.md +391 -0
- package/docs/steps/video.md +111 -0
- package/docs/steps/wait.md +553 -0
- package/docs/steps/web-first.md +289 -0
- package/docs/steps/xml.md +505 -0
- package/docs/steps/yaml.md +951 -0
- package/examples/a11y.html +31 -0
- package/examples/about-us.html +11 -0
- package/examples/account.html +32 -0
- package/examples/ajax-wait-examples.html +147 -0
- package/examples/contact-us.html +10 -0
- package/examples/cookies.html +10 -0
- package/examples/date.html +12 -0
- package/examples/dynamic-examples.html +498 -0
- package/examples/element.html +11 -0
- package/examples/example-api.json +28 -0
- package/examples/existing-page.html +11 -0
- package/examples/field.html +24 -0
- package/examples/index.html +37 -0
- package/examples/keyboard.html +11 -0
- package/examples/links.html +9 -0
- package/examples/modal.html +14 -0
- package/examples/path.html +3 -0
- package/examples/table.html +13 -0
- package/examples/test--modal-dialogs.html +252 -0
- package/examples/test--then--i-should--not--see-text-in-element.html +48 -0
- package/examples/test--then--i-should--see-text-in-element.html +48 -0
- package/examples/test--then--i-should--see-text-matching-pattern.html +31 -0
- package/examples/test--then--i-should-see-text-in-table-row.html +232 -0
- package/examples/test--then--the-checkbox-checked.html +68 -0
- package/examples/test--then--the-element-should_not-contain-cssproperty.html +47 -0
- package/examples/test--then--the-link-should-contain.html +21 -0
- package/examples/test--when--i-additionally-select.html +27 -0
- package/examples/test--when--i-attach-file-to-feild.html +50 -0
- package/examples/test--when--i-check-uncheck-checkbox.html +47 -0
- package/examples/test--when--i-click-link.html +18 -0
- package/examples/test--when--i-click-text-in-table-row.html +178 -0
- package/examples/test--when--i-fill-in.html +48 -0
- package/examples/test--when--i-press-button.html +31 -0
- package/examples/test--when--i-reload-page.html +27 -0
- package/examples/test--when--i-scroll-functionality.html +177 -0
- package/examples/test--when--i-scroll-left-right-functionality.html +149 -0
- package/examples/test--when--i-select-option-from-dropdownlist.html +35 -0
- package/examples/test--when--i-select-radio-button.html +95 -0
- package/examples/test--when-i-wait-max-of-time.html +39 -0
- package/examples/test--when-i-wait-page-until-is-loaded.html +47 -0
- package/examples/test--when-i-wait-specific-time.html +39 -0
- package/examples/test-acceptable-url-path.html +11 -0
- package/examples/video-demo.html +43 -0
- package/package.json +56 -0
- package/playwright.config.ts +39 -0
- package/tests/assets/test-document.pdf +14 -0
- package/tests/assets/vardot.png +0 -0
- package/tests/features/a11y.feature +39 -0
- package/tests/features/ajax-wait-examples.feature +24 -0
- package/tests/features/api-step-definitions-individual.feature +185 -0
- package/tests/features/complete-api-testing-examples.feature +205 -0
- package/tests/features/cookie.feature +13 -0
- package/tests/features/date.feature +11 -0
- package/tests/features/dynamic-content-examples.feature +156 -0
- package/tests/features/element.feature +16 -0
- package/tests/features/field.feature +25 -0
- package/tests/features/keyboard.feature +10 -0
- package/tests/features/link.feature +11 -0
- package/tests/features/modal-advanced-example.feature +54 -0
- package/tests/features/modal-basic-example.feature +42 -0
- package/tests/features/modal-error-handling-example.feature +37 -0
- package/tests/features/modal.feature +11 -0
- package/tests/features/path.feature +16 -0
- package/tests/features/response.feature +8 -0
- package/tests/features/responsive.feature +10 -0
- package/tests/features/table.feature +18 -0
- package/tests/features/test--given--i-am-an-anonymous-user.feature +10 -0
- package/tests/features/test--given--i-am-on-homepage.feature +16 -0
- package/tests/features/test--then--i-save-screenshot.feature +33 -0
- package/tests/features/test--then--i-see-locator.feature +320 -0
- package/tests/features/test--then--i-should--not--see-text-in-element.feature +13 -0
- package/tests/features/test--then--i-should--see-text-in-element-by-attr.feature +10 -0
- package/tests/features/test--then--i-should--see-text-in-element.feature +10 -0
- package/tests/features/test--then--i-should--see-text-matching-pattern-in-element.feature +13 -0
- package/tests/features/test--then--i-should--see-text-matching-pattern.feature +18 -0
- package/tests/features/test--then--i-should-be-on-page.feature +10 -0
- package/tests/features/test--then--i-should-be-on-the-homepage.feature +10 -0
- package/tests/features/test--then--i-should-not-see-an-element-by-attr.feature +8 -0
- package/tests/features/test--then--i-should-not-see-an-element.feature +8 -0
- package/tests/features/test--then--i-should-see-an-element-by-attr.feature +8 -0
- package/tests/features/test--then--i-should-see-an-element.feature +8 -0
- package/tests/features/test--then--i-should-see-n-elements.feature +24 -0
- package/tests/features/test--then--i-should-see-text-in-table-row.feature +96 -0
- package/tests/features/test--then--print-current-url-and-response.feature +21 -0
- package/tests/features/test--then--the-checkbox-is-checked.feature +18 -0
- package/tests/features/test--then--the-checkbox-should-be-checked.feature +16 -0
- package/tests/features/test--then--the-element-should-contain-cssproperty.feature +9 -0
- package/tests/features/test--then--the-element-should-not-contain-cssproperty.feature +10 -0
- package/tests/features/test--then--the-field-should-contain-value.feature +11 -0
- package/tests/features/test--then--the-response-should-contain.feature +11 -0
- package/tests/features/test--then--the-response-status-code-should-be.feature +31 -0
- package/tests/features/test--then--the-url-should-match.feature +7 -0
- package/tests/features/test--then-the-link-should-contain-by-attribute.feature +18 -0
- package/tests/features/test--then-the-link-should-contain.feature +7 -0
- package/tests/features/test--when--i-additionally-select.feature +30 -0
- package/tests/features/test--when--i-attach-file-to-feild.feature +9 -0
- package/tests/features/test--when--i-check-checkbox.feature +21 -0
- package/tests/features/test--when--i-click-link-by-attribute.feature +21 -0
- package/tests/features/test--when--i-click-link.feature +9 -0
- package/tests/features/test--when--i-click-text-in-table-row.feature +37 -0
- package/tests/features/test--when--i-fill-in-by-attr.feature +31 -0
- package/tests/features/test--when--i-fill-in-table-by-attr.feature +19 -0
- package/tests/features/test--when--i-fill-in.feature +32 -0
- package/tests/features/test--when--i-follow.feature +22 -0
- package/tests/features/test--when--i-go-to-homepage.feature +9 -0
- package/tests/features/test--when--i-move-forward-backward-one-page.feature +14 -0
- package/tests/features/test--when--i-press-button-by-attribute.feature +18 -0
- package/tests/features/test--when--i-press-button.feature +13 -0
- package/tests/features/test--when--i-reload-page.feature +11 -0
- package/tests/features/test--when--i-scroll-left-right.feature +48 -0
- package/tests/features/test--when--i-scroll.feature +48 -0
- package/tests/features/test--when--i-select-option-from-dropdownlist.feature +21 -0
- package/tests/features/test--when--i-select-radio-button.feature +37 -0
- package/tests/features/test--when--i-wait-page-is-loaded.feature +8 -0
- package/tests/features/test--when--i-wait-time.feature +21 -0
- package/tests/features/video.feature +18 -0
- package/tests/features/wait.feature +7 -0
- package/tests/features/yaml.feature +102 -0
- package/tests/selectors/_canonical-keys.json +113 -0
- package/tests/selectors/back-end-selectors.json +19 -0
- package/tests/selectors/cms-contentful-admin.json +35 -0
- package/tests/selectors/cms-craft-admin.json +39 -0
- package/tests/selectors/cms-drupal-cms-gin.json +56 -0
- package/tests/selectors/cms-drupal-core-claro.json +50 -0
- package/tests/selectors/cms-generic-admin.json +34 -0
- package/tests/selectors/cms-ghost-admin.json +34 -0
- package/tests/selectors/cms-joomla-admin.json +41 -0
- package/tests/selectors/cms-magento2-admin.json +32 -0
- package/tests/selectors/cms-prestashop-admin.json +38 -0
- package/tests/selectors/cms-shopify-admin.json +25 -0
- package/tests/selectors/cms-strapi-admin.json +42 -0
- package/tests/selectors/cms-typo3-admin.json +41 -0
- package/tests/selectors/cms-woocommerce-front.json +50 -0
- package/tests/selectors/cms-wordpress-admin.json +31 -0
- package/tests/selectors/framework-ant-design.json +80 -0
- package/tests/selectors/framework-bootstrap.json +86 -0
- package/tests/selectors/framework-bulma.json +74 -0
- package/tests/selectors/framework-chakra.json +58 -0
- package/tests/selectors/framework-foundation.json +51 -0
- package/tests/selectors/framework-material-ui.json +72 -0
- package/tests/selectors/framework-shadcn.json +51 -0
- package/tests/selectors/framework-tailwind.json +40 -0
- package/tests/selectors/framework-vuetify.json +61 -0
- package/tests/selectors/front-end-selectors.json +16 -0
- package/tests/selectors/homepage-selectors.json +13 -0
- package/tests/step-definitions/a11y.steps.js +800 -0
- package/tests/step-definitions/action.steps.js +167 -0
- package/tests/step-definitions/api.steps.js +732 -0
- package/tests/step-definitions/assertion.steps.js +352 -0
- package/tests/step-definitions/auth.steps.js +126 -0
- package/tests/step-definitions/clock.steps.js +128 -0
- package/tests/step-definitions/cookie.steps.js +216 -0
- package/tests/step-definitions/debug.steps.js +39 -0
- package/tests/step-definitions/dialog.steps.js +193 -0
- package/tests/step-definitions/drupal-canvas.steps.js +764 -0
- package/tests/step-definitions/drupal-ckeditor.steps.js +108 -0
- package/tests/step-definitions/drupal-core.steps.js +665 -0
- package/tests/step-definitions/drupal-helpers.js +371 -0
- package/tests/step-definitions/drupal-layout-builder.steps.js +466 -0
- package/tests/step-definitions/drupal-media.steps.js +99 -0
- package/tests/step-definitions/drupal-moderation.steps.js +71 -0
- package/tests/step-definitions/drupal-paragraphs.steps.js +50 -0
- package/tests/step-definitions/element.steps.js +356 -0
- package/tests/step-definitions/field.steps.js +653 -0
- package/tests/step-definitions/file-download.steps.js +211 -0
- package/tests/step-definitions/form.steps.js +333 -0
- package/tests/step-definitions/iframe.steps.js +228 -0
- package/tests/step-definitions/input.steps.js +202 -0
- package/tests/step-definitions/javascript.steps.js +232 -0
- package/tests/step-definitions/keyboard.steps.js +112 -0
- package/tests/step-definitions/link.steps.js +142 -0
- package/tests/step-definitions/metatag.steps.js +91 -0
- package/tests/step-definitions/modal.steps.js +244 -0
- package/tests/step-definitions/navigation.steps.js +218 -0
- package/tests/step-definitions/network.steps.js +280 -0
- package/tests/step-definitions/path.steps.js +141 -0
- package/tests/step-definitions/response.steps.js +98 -0
- package/tests/step-definitions/responsive.steps.js +125 -0
- package/tests/step-definitions/rest.steps.js +111 -0
- package/tests/step-definitions/screenshot.steps.js +423 -0
- package/tests/step-definitions/scroll.steps.js +189 -0
- package/tests/step-definitions/selectors.steps.js +1003 -0
- package/tests/step-definitions/storage.steps.js +194 -0
- package/tests/step-definitions/table.steps.js +181 -0
- package/tests/step-definitions/varbase-e2e.js +897 -0
- package/tests/step-definitions/varbase.steps.js +458 -0
- package/tests/step-definitions/video.steps.js +178 -0
- package/tests/step-definitions/wait.steps.js +400 -0
- package/tests/step-definitions/web-first.steps.js +298 -0
- package/tests/step-definitions/xml.steps.js +411 -0
- package/tests/step-definitions/yaml.steps.js +913 -0
- 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
|
+
```
|