@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,437 @@
|
|
|
1
|
+
# Layout Builder steps
|
|
2
|
+
|
|
3
|
+
17 steps, defined in `tests/step-definitions/drupal-layout-builder.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 | `When I add a basic "4 Cols" section at the end of layout` |
|
|
10
|
+
| 2 | `When I save the section` |
|
|
11
|
+
| 3 | `When I add section gutters` |
|
|
12
|
+
| 4 | `When I select the "Edge to Edge" container type` |
|
|
13
|
+
| 5 | `When I select the "md" "33% 67%" section breakpoint` |
|
|
14
|
+
| 6 | `When I select the "Primary" section background color` |
|
|
15
|
+
| 7 | `When I select the "Dark" section text color` |
|
|
16
|
+
| 8 | `When I set the alignment to "End"` |
|
|
17
|
+
| 9 | `When I uncheck the Edge to Edge Background` |
|
|
18
|
+
| 10 | `And I select "Site branding" from the "Block" dropdown` |
|
|
19
|
+
| 11 | `When I check the box "Editor"` |
|
|
20
|
+
| 12 | `When I uncheck the box "Editor"` |
|
|
21
|
+
| 13 | `When I select the "Male" radio button` |
|
|
22
|
+
| 14 | `When I select the radio button "Published"` |
|
|
23
|
+
| 15 | `And I expand the field "edit-menu"` |
|
|
24
|
+
| 16 | `When I press the confirm button in modal` |
|
|
25
|
+
| 17 | `When I click the delete button` |
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 1. When I add a basic "4 Cols" section at the end of layout
|
|
30
|
+
|
|
31
|
+
Add a basic section (with an optional layout, default "1 Col") at the end of
|
|
32
|
+
the Layout Builder layout.
|
|
33
|
+
|
|
34
|
+
Ports VarbaseContext::iAddABasicSectionAtTheEndOfLayout.
|
|
35
|
+
|
|
36
|
+
**Keyword**: `When`
|
|
37
|
+
|
|
38
|
+
**Pattern**
|
|
39
|
+
|
|
40
|
+
```js
|
|
41
|
+
/^(?:I |we )*add a basic(?: "([^"]*)")? section at the end of layout$/
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**Examples**
|
|
45
|
+
|
|
46
|
+
```gherkin
|
|
47
|
+
When I add a basic "4 Cols" section at the end of layout
|
|
48
|
+
And I add a basic section at the end of layout
|
|
49
|
+
When I add a basic "2 Cols" section at the end of layout
|
|
50
|
+
And we add a basic section at the end of layout
|
|
51
|
+
When I add a basic "3 Cols" section at the end of layout
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 2. When I save the section
|
|
55
|
+
|
|
56
|
+
Save (add) the currently configured Layout Builder section.
|
|
57
|
+
|
|
58
|
+
Ports VarbaseContext::iSaveTheSection (clicks the "Add section" submit).
|
|
59
|
+
|
|
60
|
+
**Keyword**: `When`
|
|
61
|
+
|
|
62
|
+
**Pattern**
|
|
63
|
+
|
|
64
|
+
```js
|
|
65
|
+
/^(?:I |we )*save the section$/
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**Examples**
|
|
69
|
+
|
|
70
|
+
```gherkin
|
|
71
|
+
When I save the section
|
|
72
|
+
And I save the section
|
|
73
|
+
When we save the section
|
|
74
|
+
Given I save the section
|
|
75
|
+
And we save the section
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## 3. When I add section gutters
|
|
79
|
+
|
|
80
|
+
Add gutters to the section being configured (checks "With Gutters").
|
|
81
|
+
|
|
82
|
+
Ports VarbaseContext::iAddSectionGutters.
|
|
83
|
+
|
|
84
|
+
**Keyword**: `When`
|
|
85
|
+
|
|
86
|
+
**Pattern**
|
|
87
|
+
|
|
88
|
+
```js
|
|
89
|
+
/^(?:I |we )*add section gutters$/
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Examples**
|
|
93
|
+
|
|
94
|
+
```gherkin
|
|
95
|
+
When I add section gutters
|
|
96
|
+
And I add section gutters
|
|
97
|
+
When we add section gutters
|
|
98
|
+
Given I add section gutters
|
|
99
|
+
And we add section gutters
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## 4. When I select the "Edge to Edge" container type
|
|
103
|
+
|
|
104
|
+
Select a section container type (and optional Boxed width).
|
|
105
|
+
|
|
106
|
+
Ports VarbaseContext::iSelectTheContainerType / iSelectTheContainerWidth.
|
|
107
|
+
|
|
108
|
+
**Keyword**: `When`
|
|
109
|
+
|
|
110
|
+
**Pattern**
|
|
111
|
+
|
|
112
|
+
```js
|
|
113
|
+
/^(?:I |we )*select the "([^"]*)" container type(?: with a "([^"]*)" width)?$/
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Examples**
|
|
117
|
+
|
|
118
|
+
```gherkin
|
|
119
|
+
When I select the "Edge to Edge" container type
|
|
120
|
+
And I select the "Boxed" container type with a "Tiny" width
|
|
121
|
+
When I select the "Full" container type
|
|
122
|
+
And I select the "Boxed" container type with a "Narrow" width
|
|
123
|
+
When we select the "Edge to Edge" container type
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## 5. When I select the "md" "33% 67%" section breakpoint
|
|
127
|
+
|
|
128
|
+
Select a section breakpoint column ratio for a given screen size.
|
|
129
|
+
|
|
130
|
+
Ports VarbaseContext::iSelectTheSectionBreakpoint.
|
|
131
|
+
|
|
132
|
+
**Keyword**: `When`
|
|
133
|
+
|
|
134
|
+
**Pattern**
|
|
135
|
+
|
|
136
|
+
```js
|
|
137
|
+
/^(?:I |we )*select the "([^"]*)" "([^"]*)" section breakpoint$/
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
**Examples**
|
|
141
|
+
|
|
142
|
+
```gherkin
|
|
143
|
+
When I select the "md" "33% 67%" section breakpoint
|
|
144
|
+
And I select the "xs" "75% 25%" section breakpoint
|
|
145
|
+
When I select the "lg" "50% 50%" section breakpoint
|
|
146
|
+
And I select the "sm" "100%" section breakpoint
|
|
147
|
+
When we select the "md" "67% 33%" section breakpoint
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## 6. When I select the "Primary" section background color
|
|
151
|
+
|
|
152
|
+
Select a section background color.
|
|
153
|
+
|
|
154
|
+
Ports VarbaseContext::iSelectTheSectionBackgroundColor (opens Background,
|
|
155
|
+
switches to the color tab, clicks the color label).
|
|
156
|
+
|
|
157
|
+
**Keyword**: `When`
|
|
158
|
+
|
|
159
|
+
**Pattern**
|
|
160
|
+
|
|
161
|
+
```js
|
|
162
|
+
/^(?:I |we )*select the "([^"]*)" section background color$/
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
**Examples**
|
|
166
|
+
|
|
167
|
+
```gherkin
|
|
168
|
+
When I select the "Primary" section background color
|
|
169
|
+
And I select the "Light" section background color
|
|
170
|
+
When I select the "Dark" section background color
|
|
171
|
+
And we select the "Info" section background color
|
|
172
|
+
When I select the "White" section background color
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## 7. When I select the "Dark" section text color
|
|
176
|
+
|
|
177
|
+
Select a section text color.
|
|
178
|
+
|
|
179
|
+
Ports VarbaseContext::iSelectTheSectionTextColor.
|
|
180
|
+
|
|
181
|
+
**Keyword**: `When`
|
|
182
|
+
|
|
183
|
+
**Pattern**
|
|
184
|
+
|
|
185
|
+
```js
|
|
186
|
+
/^(?:I |we )*select the "([^"]*)" section text color$/
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
**Examples**
|
|
190
|
+
|
|
191
|
+
```gherkin
|
|
192
|
+
When I select the "Dark" section text color
|
|
193
|
+
And I select the "White" section text color
|
|
194
|
+
When I select the "Primary" section text color
|
|
195
|
+
And we select the "Light" section text color
|
|
196
|
+
When I select the "Muted" section text color
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## 8. When I set the alignment to "End"
|
|
200
|
+
|
|
201
|
+
Set the section text alignment.
|
|
202
|
+
|
|
203
|
+
Ports VarbaseContext::iSetTheAlignmentTo.
|
|
204
|
+
|
|
205
|
+
**Keyword**: `When`
|
|
206
|
+
|
|
207
|
+
**Pattern**
|
|
208
|
+
|
|
209
|
+
```js
|
|
210
|
+
/^(?:I |we )*set the alignment to "([^"]*)"$/
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
**Examples**
|
|
214
|
+
|
|
215
|
+
```gherkin
|
|
216
|
+
When I set the alignment to "End"
|
|
217
|
+
And I set the alignment to "Start"
|
|
218
|
+
When I set the alignment to "Center"
|
|
219
|
+
And we set the alignment to "Justify"
|
|
220
|
+
When I set the alignment to "End"
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
## 9. When I uncheck the Edge to Edge Background
|
|
224
|
+
|
|
225
|
+
Uncheck the section "Edge to Edge Background" option.
|
|
226
|
+
|
|
227
|
+
Ports VarbaseContext::iUncheckTheEdgeToEdgeBackground.
|
|
228
|
+
|
|
229
|
+
**Keyword**: `When`
|
|
230
|
+
|
|
231
|
+
**Pattern**
|
|
232
|
+
|
|
233
|
+
```js
|
|
234
|
+
/^(?:I |we )*uncheck the Edge to Edge Background$/
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
**Examples**
|
|
238
|
+
|
|
239
|
+
```gherkin
|
|
240
|
+
When I uncheck the Edge to Edge Background
|
|
241
|
+
And I uncheck the Edge to Edge Background
|
|
242
|
+
When we uncheck the Edge to Edge Background
|
|
243
|
+
Given I uncheck the Edge to Edge Background
|
|
244
|
+
And we uncheck the Edge to Edge Background
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
## 10. And I select "Site branding" from the "Block" dropdown
|
|
248
|
+
|
|
249
|
+
Select an option (by its visible option text, falling back to value) from a
|
|
250
|
+
<select> resolved by its visible label, or a partial name / id when the label
|
|
251
|
+
is ambiguous. Needed for paragraph subform selects whose label is a single
|
|
252
|
+
word (e.g. "Block", "Webform") — the Varbase E2E core "select from" step treats a
|
|
253
|
+
single-word target as a name/id, never a label, and the subform select's DOM
|
|
254
|
+
id carries a random "--XXXX" suffix so it cannot be addressed by a fixed #id.
|
|
255
|
+
|
|
256
|
+
**Keyword**: `When`
|
|
257
|
+
|
|
258
|
+
**Pattern**
|
|
259
|
+
|
|
260
|
+
```js
|
|
261
|
+
/^(?:I |we )*select "([^"]*)" from the "([^"]*)" dropdown$/
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
**Examples**
|
|
265
|
+
|
|
266
|
+
```gherkin
|
|
267
|
+
And I select "Site branding" from the "Block" dropdown
|
|
268
|
+
And I select "Contact" from the "Webform" dropdown
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
## 11. When I check the box "Editor"
|
|
272
|
+
|
|
273
|
+
Check a checkbox by its visible label (or id / name / css selector).
|
|
274
|
+
|
|
275
|
+
Ports the Varbase suite's `I check the box "..."`. Varbase E2E core only
|
|
276
|
+
offers `I check "..."`; the profile features use "check the box", so this
|
|
277
|
+
matches that phrasing. Resolves the control by label text first (Drupal
|
|
278
|
+
renders role permission / field labels), then falls back to id / name / css.
|
|
279
|
+
|
|
280
|
+
**Keyword**: `When`
|
|
281
|
+
|
|
282
|
+
**Pattern**
|
|
283
|
+
|
|
284
|
+
```js
|
|
285
|
+
/^(?:I |we )*check the box "([^"]*)"$/
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
**Examples**
|
|
289
|
+
|
|
290
|
+
```gherkin
|
|
291
|
+
When I check the box "Editor"
|
|
292
|
+
And I check the box "Site Admin"
|
|
293
|
+
When we check the box "Content Admin"
|
|
294
|
+
And I check the box "Super Admin"
|
|
295
|
+
Given I check the box "SEO Admin"
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
## 12. When I uncheck the box "Editor"
|
|
299
|
+
|
|
300
|
+
Uncheck a checkbox by its visible label (or id / name / css selector).
|
|
301
|
+
|
|
302
|
+
Ports the Varbase suite's `I uncheck the box "..."`.
|
|
303
|
+
|
|
304
|
+
**Keyword**: `When`
|
|
305
|
+
|
|
306
|
+
**Pattern**
|
|
307
|
+
|
|
308
|
+
```js
|
|
309
|
+
/^(?:I |we )*uncheck the box "([^"]*)"$/
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
**Examples**
|
|
313
|
+
|
|
314
|
+
```gherkin
|
|
315
|
+
When I uncheck the box "Editor"
|
|
316
|
+
And I uncheck the box "Subscribe"
|
|
317
|
+
When we uncheck the box "Site Admin"
|
|
318
|
+
And I uncheck the box "Enable"
|
|
319
|
+
Given I uncheck the box "Published"
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
## 13. When I select the "Male" radio button
|
|
323
|
+
|
|
324
|
+
Select a radio button by its visible label text.
|
|
325
|
+
|
|
326
|
+
Ports VarbaseContext::iSelectTheRadioButton (`@When /^I select the "..."
|
|
327
|
+
radio button$/`): finds the <label> whose text matches, follows its `for`
|
|
328
|
+
attribute to the input, and selects it.
|
|
329
|
+
|
|
330
|
+
**Keyword**: `When`
|
|
331
|
+
|
|
332
|
+
**Pattern**
|
|
333
|
+
|
|
334
|
+
```js
|
|
335
|
+
/^(?:I |we )*select the "([^"]*)" radio button$/
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
**Examples**
|
|
339
|
+
|
|
340
|
+
```gherkin
|
|
341
|
+
When I select the "Male" radio button
|
|
342
|
+
And I select the "Female" radio button
|
|
343
|
+
When we select the "Yes" radio button
|
|
344
|
+
And I select the "Unpublished" radio button
|
|
345
|
+
Given I select the "Published" radio button
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
## 14. When I select the radio button "Published"
|
|
349
|
+
|
|
350
|
+
Select a radio button by its visible label text (alternate phrasing).
|
|
351
|
+
|
|
352
|
+
**Keyword**: `When`
|
|
353
|
+
|
|
354
|
+
**Pattern**
|
|
355
|
+
|
|
356
|
+
```js
|
|
357
|
+
/^(?:I |we )*select the radio button "([^"]*)"$/
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
**Examples**
|
|
361
|
+
|
|
362
|
+
```gherkin
|
|
363
|
+
When I select the radio button "Published"
|
|
364
|
+
And I select the radio button "Draft"
|
|
365
|
+
When we select the radio button "Needs Review"
|
|
366
|
+
And I select the radio button "Archived"
|
|
367
|
+
Given I select the radio button "Yes"
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
## 15. And I expand the field "edit-menu"
|
|
371
|
+
|
|
372
|
+
Open a collapsed <details>/fieldset by its element id so its inner fields
|
|
373
|
+
become interactable (e.g. the node form "Menu settings", the entityqueue
|
|
374
|
+
form widget).
|
|
375
|
+
|
|
376
|
+
**Keyword**: `When`
|
|
377
|
+
|
|
378
|
+
**Pattern**
|
|
379
|
+
|
|
380
|
+
```js
|
|
381
|
+
/^(?:I |we )*expand the field "([^"]*)"$/
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
**Examples**
|
|
385
|
+
|
|
386
|
+
```gherkin
|
|
387
|
+
And I expand the field "edit-menu"
|
|
388
|
+
And I expand the field "edit-entityqueue-form-widget"
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
## 16. When I press the confirm button in modal
|
|
392
|
+
|
|
393
|
+
Press the confirm (Restore / OK / primary) button in a jQuery UI modal.
|
|
394
|
+
|
|
395
|
+
Ports VarbaseContext::iPressTheConfirmButton (used by trash restore).
|
|
396
|
+
|
|
397
|
+
**Keyword**: `When`
|
|
398
|
+
|
|
399
|
+
**Pattern**
|
|
400
|
+
|
|
401
|
+
```js
|
|
402
|
+
/^(?:I |we )*press the confirm button in modal$/
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
**Examples**
|
|
406
|
+
|
|
407
|
+
```gherkin
|
|
408
|
+
When I press the confirm button in modal
|
|
409
|
+
And I press the confirm button in modal
|
|
410
|
+
When we press the confirm button in modal
|
|
411
|
+
Given I press the confirm button in modal
|
|
412
|
+
And we press the confirm button in modal
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
## 17. When I click the delete button
|
|
416
|
+
|
|
417
|
+
Click the first "Delete" button on the page (action link or submit).
|
|
418
|
+
|
|
419
|
+
Ports VarbaseContext::iClickTheDeleteButton.
|
|
420
|
+
|
|
421
|
+
**Keyword**: `When`
|
|
422
|
+
|
|
423
|
+
**Pattern**
|
|
424
|
+
|
|
425
|
+
```js
|
|
426
|
+
/^(?:I |we )*click the delete button$/
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
**Examples**
|
|
430
|
+
|
|
431
|
+
```gherkin
|
|
432
|
+
When I click the delete button
|
|
433
|
+
And I click the delete button
|
|
434
|
+
When we click the delete button
|
|
435
|
+
Given I click the delete button
|
|
436
|
+
And we click the delete button
|
|
437
|
+
```
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Media library steps
|
|
2
|
+
|
|
3
|
+
4 steps, defined in `tests/step-definitions/drupal-media.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 | `When I submit the media library dialog` |
|
|
10
|
+
| 2 | `And I open the "field_image" media library` |
|
|
11
|
+
| 3 | `And I select the media "Embed Flag Earth"` |
|
|
12
|
+
| 4 | `And I insert the selected media` |
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 1. When I submit the media library dialog
|
|
17
|
+
|
|
18
|
+
Submit the Media Library dialog (the "Insert selected" action).
|
|
19
|
+
|
|
20
|
+
Ports VarbaseContext::iSubmitMediaLibraryDialog.
|
|
21
|
+
|
|
22
|
+
**Keyword**: `When`
|
|
23
|
+
|
|
24
|
+
**Pattern**
|
|
25
|
+
|
|
26
|
+
```js
|
|
27
|
+
/^(?:I |we )*submit (?:the )?media library dialog$/
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**Examples**
|
|
31
|
+
|
|
32
|
+
```gherkin
|
|
33
|
+
When I submit the media library dialog
|
|
34
|
+
And I submit the media library dialog
|
|
35
|
+
When we submit the media library dialog
|
|
36
|
+
Given I submit the media library dialog
|
|
37
|
+
And we submit media library dialog
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 2. And I open the "field_image" media library
|
|
41
|
+
|
|
42
|
+
Open the Media Library widget of a specific field by its machine name.
|
|
43
|
+
|
|
44
|
+
On Drupal 11.4 the media-library "Add media" open button renders with a
|
|
45
|
+
random "--XXXX" id suffix, and a single paragraph subform can contain several
|
|
46
|
+
"Add media" buttons (e.g. the text_and_image bundle has both field_image and
|
|
47
|
+
a bp_image field), so neither the old fixed id nor the "Add media" label is
|
|
48
|
+
unique. Match the visible open button whose id contains "<field>-open-button".
|
|
49
|
+
|
|
50
|
+
**Keyword**: `When`
|
|
51
|
+
|
|
52
|
+
**Pattern**
|
|
53
|
+
|
|
54
|
+
```js
|
|
55
|
+
/^(?:I |we )*open the "([^"]*)" media library$/
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Examples**
|
|
59
|
+
|
|
60
|
+
```gherkin
|
|
61
|
+
And I open the "field_image" media library
|
|
62
|
+
And I open the "field_media_single" media library
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## 3. And I select the media "Embed Flag Earth"
|
|
66
|
+
|
|
67
|
+
Select a Media Library grid item by its "Select <name>" checkbox, tolerating
|
|
68
|
+
duplicate items. A retried upload scenario (cucumber `retry: 1`) can leave two
|
|
69
|
+
media with the same name, so Varbase E2E's built-in "I check" would strict-fail on
|
|
70
|
+
two identically labelled checkboxes — pick the first.
|
|
71
|
+
|
|
72
|
+
**Keyword**: `When`
|
|
73
|
+
|
|
74
|
+
**Pattern**
|
|
75
|
+
|
|
76
|
+
```js
|
|
77
|
+
/^(?:I |we )*select the media "([^"]*)"$/
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Examples**
|
|
81
|
+
|
|
82
|
+
```gherkin
|
|
83
|
+
And I select the media "Embed Flag Earth"
|
|
84
|
+
And I select the media "Flag Earth"
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## 4. And I insert the selected media
|
|
88
|
+
|
|
89
|
+
Insert the currently selected item(s) in the open Media Library dialog.
|
|
90
|
+
The dialog submit ("Insert selected") is cloned by jQuery UI into the dialog
|
|
91
|
+
button pane, so the original form button is hidden; target the visible one.
|
|
92
|
+
Replaces the old `press "dialog-submit" by its "id"` which no longer resolves
|
|
93
|
+
on Drupal 11.4 (the media dialog button has no "dialog-submit" id).
|
|
94
|
+
|
|
95
|
+
**Keyword**: `When`
|
|
96
|
+
|
|
97
|
+
**Pattern**
|
|
98
|
+
|
|
99
|
+
```js
|
|
100
|
+
/^(?:I |we )*insert the selected media$/
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Examples**
|
|
104
|
+
|
|
105
|
+
```gherkin
|
|
106
|
+
And I insert the selected media
|
|
107
|
+
```
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Content moderation steps
|
|
2
|
+
|
|
3
|
+
3 steps, defined in `tests/step-definitions/drupal-moderation.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 | `When I open the moderation sidebar` |
|
|
10
|
+
| 2 | `Then the moderation sidebar should show "Draft"` |
|
|
11
|
+
| 3 | `Then the moderation sidebar should not show "Archived"` |
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 1. When I open the moderation sidebar
|
|
16
|
+
|
|
17
|
+
Open the moderation sidebar from the administration toolbar / tasks.
|
|
18
|
+
|
|
19
|
+
Ports VarbaseContext::iOpenTheModerationSidebar.
|
|
20
|
+
|
|
21
|
+
**Keyword**: `When`
|
|
22
|
+
|
|
23
|
+
**Pattern**
|
|
24
|
+
|
|
25
|
+
```js
|
|
26
|
+
/^(?:I |we )*(?:open (?:the )?moderation sidebar|click on tasks in the toolbar)$/
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**Examples**
|
|
30
|
+
|
|
31
|
+
```gherkin
|
|
32
|
+
When I open the moderation sidebar
|
|
33
|
+
And I open moderation sidebar
|
|
34
|
+
When I click on tasks in the toolbar
|
|
35
|
+
And click on tasks in the toolbar
|
|
36
|
+
When we open the moderation sidebar
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## 2. Then the moderation sidebar should show "Draft"
|
|
40
|
+
|
|
41
|
+
Assert the moderation sidebar shows the given text for the current revision.
|
|
42
|
+
|
|
43
|
+
**Keyword**: `Then`
|
|
44
|
+
|
|
45
|
+
**Pattern**
|
|
46
|
+
|
|
47
|
+
```js
|
|
48
|
+
/^(?:the )?moderation sidebar should show "([^"]*)"$/
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Examples**
|
|
52
|
+
|
|
53
|
+
```gherkin
|
|
54
|
+
Then the moderation sidebar should show "Draft"
|
|
55
|
+
And moderation sidebar should show "Published"
|
|
56
|
+
Then the moderation sidebar should show "Needs Review"
|
|
57
|
+
And the moderation sidebar should show "Archived"
|
|
58
|
+
Then moderation sidebar should show "Latest version"
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## 3. Then the moderation sidebar should not show "Archived"
|
|
62
|
+
|
|
63
|
+
Assert the moderation sidebar does not show the given text for the current revision.
|
|
64
|
+
|
|
65
|
+
**Keyword**: `Then`
|
|
66
|
+
|
|
67
|
+
**Pattern**
|
|
68
|
+
|
|
69
|
+
```js
|
|
70
|
+
/^(?:the )?moderation sidebar should not show "([^"]*)"$/
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Examples**
|
|
74
|
+
|
|
75
|
+
```gherkin
|
|
76
|
+
Then the moderation sidebar should not show "Archived"
|
|
77
|
+
And moderation sidebar should not show "Delete"
|
|
78
|
+
Then the moderation sidebar should not show "Published"
|
|
79
|
+
And the moderation sidebar should not show "Unpublish"
|
|
80
|
+
Then moderation sidebar should not show "Needs Review"
|
|
81
|
+
```
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Paragraphs steps
|
|
2
|
+
|
|
3
|
+
1 step, defined in `tests/step-definitions/drupal-paragraphs.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 | `When I select the "Text" paragraph component` |
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 1. When I select the "Text" paragraph component
|
|
14
|
+
|
|
15
|
+
Select a paragraph component in the "Add component" dialog.
|
|
16
|
+
|
|
17
|
+
Ports VarbaseContext::iSelectTheParagraphComponent: clicks the add button in
|
|
18
|
+
the paragraphs-add-dialog whose name matches the component.
|
|
19
|
+
|
|
20
|
+
**Keyword**: `When`
|
|
21
|
+
|
|
22
|
+
**Pattern**
|
|
23
|
+
|
|
24
|
+
```js
|
|
25
|
+
/^(?:I |we )*select the "([^"]*)" paragraph component$/
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Examples**
|
|
29
|
+
|
|
30
|
+
```gherkin
|
|
31
|
+
When I select the "Text" paragraph component
|
|
32
|
+
And I select the "Modal" paragraph component
|
|
33
|
+
When we select the "Drupal block" paragraph component
|
|
34
|
+
And I select the "Rich Text" paragraph component
|
|
35
|
+
Given I select the "Accordion" paragraph component
|
|
36
|
+
```
|