@testspectra/cli 1.0.70 → 1.1.1
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/LICENSE.md +48 -0
- package/README.md +36 -270
- package/bin/.testspectra-runner.hash +1 -0
- package/bin/spectra.js +1 -1
- package/bin/testspectra-runner +0 -0
- package/demo-app/assets/index-DPfv5_EF.js +116 -0
- package/demo-app/assets/index-gIwu2EMV.css +1 -0
- package/demo-app/index.html +2 -2
- package/dist/.tsbuildinfo +1 -0
- package/dist/commands/__tests__/cloud-run.test.d.ts +1 -0
- package/dist/commands/__tests__/cloud-run.test.js +93 -0
- package/dist/commands/__tests__/doctor.test.d.ts +1 -0
- package/dist/commands/__tests__/doctor.test.js +39 -0
- package/dist/commands/__tests__/init.test.d.ts +1 -0
- package/dist/commands/__tests__/init.test.js +148 -0
- package/dist/commands/__tests__/license.test.d.ts +1 -0
- package/dist/commands/__tests__/license.test.js +13 -0
- package/dist/commands/__tests__/refactor.test.d.ts +1 -0
- package/dist/commands/__tests__/refactor.test.js +64 -0
- package/dist/commands/__tests__/run-e2e.test.d.ts +1 -0
- package/dist/commands/__tests__/run-e2e.test.js +181 -0
- package/dist/commands/__tests__/run.test.d.ts +1 -0
- package/dist/commands/__tests__/run.test.js +197 -0
- package/dist/commands/__tests__/watch.test.d.ts +1 -0
- package/dist/commands/__tests__/watch.test.js +155 -0
- package/dist/commands/add.js +86 -85
- package/dist/commands/cloud-run.d.ts +11 -0
- package/dist/commands/cloud-run.js +118 -0
- package/dist/commands/demo.js +7 -7
- package/dist/commands/devices.d.ts +14 -2
- package/dist/commands/devices.js +44 -34
- package/dist/commands/doctor.d.ts +3 -1
- package/dist/commands/doctor.js +43 -264
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.js +206 -196
- package/dist/commands/install.d.ts +4 -0
- package/dist/commands/install.js +59 -0
- package/dist/commands/license.d.ts +4 -0
- package/dist/commands/license.js +30 -0
- package/dist/commands/refactor.d.ts +8 -0
- package/dist/commands/refactor.js +78 -0
- package/dist/commands/run.d.ts +22 -1
- package/dist/commands/run.js +252 -109
- package/dist/commands/sync-types.d.ts +4 -0
- package/dist/commands/sync-types.js +14 -0
- package/dist/commands/update.js +39 -43
- package/dist/commands/watch.d.ts +6 -0
- package/dist/commands/watch.js +47 -43
- package/dist/config/loader.d.ts +1 -1
- package/dist/config/loader.js +40 -25
- package/dist/config/schema.d.ts +117 -49
- package/dist/config/schema.js +41 -34
- package/dist/generator/__tests__/tsconfig-isolation.test.d.ts +1 -0
- package/dist/generator/__tests__/tsconfig-isolation.test.js +278 -0
- package/dist/generator/__tests__/type-generator.test.d.ts +1 -0
- package/dist/generator/__tests__/type-generator.test.js +386 -0
- package/dist/generator/index.d.ts +2 -0
- package/dist/generator/index.js +2 -0
- package/dist/generator/tsconfig-generator.d.ts +27 -0
- package/dist/generator/tsconfig-generator.js +391 -0
- package/dist/generator/type-generator.d.ts +36 -0
- package/dist/generator/type-generator.js +644 -0
- package/dist/index.d.ts +9 -5
- package/dist/index.js +124 -51
- package/dist/lifecycle/__tests__/lifecycle-engine.test.d.ts +1 -0
- package/dist/lifecycle/__tests__/lifecycle-engine.test.js +290 -0
- package/dist/lifecycle/hook-discovery.d.ts +24 -0
- package/dist/lifecycle/hook-discovery.js +60 -0
- package/dist/lifecycle/hook-dispatcher.d.ts +34 -0
- package/dist/lifecycle/hook-dispatcher.js +190 -0
- package/dist/lifecycle/index.d.ts +3 -0
- package/dist/lifecycle/index.js +3 -0
- package/dist/lifecycle/parallel-grouping.d.ts +27 -0
- package/dist/lifecycle/parallel-grouping.js +151 -0
- package/dist/mobile/__tests__/android-device-e2e.test.d.ts +1 -0
- package/dist/mobile/__tests__/android-device-e2e.test.js +53 -0
- package/dist/mobile/__tests__/device-pool.test.d.ts +1 -0
- package/dist/mobile/__tests__/device-pool.test.js +97 -0
- package/dist/mobile/device-pool.d.ts +23 -0
- package/dist/mobile/device-pool.js +1 -0
- package/dist/mobile/index.d.ts +1 -0
- package/dist/mobile/index.js +1 -0
- package/dist/refactor/__tests__/refactor-engine.test.d.ts +1 -0
- package/dist/refactor/__tests__/refactor-engine.test.js +175 -0
- package/dist/refactor/index.d.ts +1 -0
- package/dist/refactor/index.js +1 -0
- package/dist/refactor/refactor-engine.d.ts +25 -0
- package/dist/refactor/refactor-engine.js +255 -0
- package/dist/reporter/__tests__/semantic-formatter.test.d.ts +1 -0
- package/dist/reporter/__tests__/semantic-formatter.test.js +73 -0
- package/dist/reporter/semantic-formatter.d.ts +6 -0
- package/dist/reporter/semantic-formatter.js +191 -0
- package/dist/reporter/summary-view.d.ts +12 -0
- package/dist/reporter/summary-view.js +19 -0
- package/dist/reporter/terminal-stream.d.ts +32 -0
- package/dist/reporter/terminal-stream.js +82 -0
- package/dist/reporter/types.d.ts +2 -0
- package/dist/reporter/types.js +1 -0
- package/dist/runner/bridge.d.ts +10 -5
- package/dist/runner/bridge.js +69 -44
- package/dist/runner/reporter.d.ts +30 -2
- package/dist/runner/reporter.js +419 -13
- package/dist/server/demo.js +43 -44
- package/dist/types/generator.d.ts +1 -17
- package/dist/types/generator.js +1 -443
- package/dist/utils/demo-server.js +38 -35
- package/package.json +20 -12
- package/templates/default/CLAUDE.md +7 -5
- package/templates/default/fixtures/apiData.json +24 -0
- package/templates/default/package.json +13 -4
- package/templates/default/page-objects/MatchersPage/mobile.ts +41 -16
- package/templates/default/page-objects/MatchersPage/web.ts +14 -0
- package/templates/default/page-objects/NavigationPage/mobile.ts +10 -1
- package/templates/default/page-objects/PlaygroundPage/mobile.ts +27 -17
- package/templates/default/page-objects/PlaygroundPage/web.ts +2 -0
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/mobile.test.ts +11 -0
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/spec.md +12 -0
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/web.test.ts +27 -0
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/mobile.test.ts +16 -0
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/spec.md +12 -0
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/web.test.ts +24 -0
- package/templates/default/specs/ApiInterception/suite.md +9 -0
- package/templates/default/specs/BrowserContext/TC-0007-title-and-navigation/mobile.test.ts +7 -1
- package/templates/default/specs/BrowserContext/TC-0007-title-and-navigation/web.test.ts +17 -3
- package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/mobile.test.ts +15 -1
- package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/web.test.ts +14 -4
- package/templates/default/specs/ContentMatchers/TC-0006-collections-and-empty/mobile.test.ts +9 -1
- package/templates/default/specs/ContentMatchers/TC-0006-collections-and-empty/web.test.ts +8 -3
- package/templates/default/specs/ElementMatchers/TC-0003-visibility-and-dom/mobile.test.ts +9 -1
- package/templates/default/specs/ElementMatchers/TC-0003-visibility-and-dom/web.test.ts +9 -3
- package/templates/default/specs/ElementMatchers/TC-0004-states-and-attributes/mobile.test.ts +27 -1
- package/templates/default/specs/ElementMatchers/TC-0004-states-and-attributes/web.test.ts +27 -6
- package/templates/default/specs/Playground/TC-0001-form-controls/mobile.test.ts +4 -1
- package/templates/default/specs/Playground/TC-0001-form-controls/web.test.ts +3 -3
- package/templates/default/specs/Playground/TC-0002-toggle-elements/mobile.test.ts +4 -1
- package/templates/default/specs/Playground/TC-0002-toggle-elements/web.test.ts +2 -2
- package/templates/default/spectra.config.ts +21 -14
- package/templates/default/support/actions/fillCredentials/mobile.action.ts +2 -2
- package/templates/default/support/steps/togglePlaygroundStates/mobile.step.ts +2 -0
- package/templates/default/support/steps/togglePlaygroundStates/web.step.ts +2 -2
- package/templates/default/support/steps/verifyPlaygroundState/mobile.step.ts +3 -1
- package/templates/default/support/steps/verifyPlaygroundState/web.step.ts +3 -3
- package/templates/default/tsconfig.json +3 -1
- package/templates/nx/.nx/workspace-data/d/daemon.log +168 -0
- package/templates/nx/CLAUDE.md +2 -2
- package/templates/nx/package.json +7 -5
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0008-fetch-mocking/mobile.test.ts +3 -0
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0008-fetch-mocking/spec.md +12 -0
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0008-fetch-mocking/web.test.ts +27 -0
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0009-post-mocking/mobile.test.ts +3 -0
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0009-post-mocking/spec.md +12 -0
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0009-post-mocking/web.test.ts +24 -0
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/suite.md +9 -0
- package/templates/nx/packages/matchers/e2e/specs/BrowserContext/TC-0007-title-and-navigation/web.test.ts +17 -3
- package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0005-text-and-values/web.test.ts +14 -4
- package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0006-collections-and-empty/web.test.ts +8 -3
- package/templates/nx/packages/matchers/e2e/specs/ElementMatchers/TC-0003-visibility-and-dom/web.test.ts +9 -3
- package/templates/nx/packages/matchers/e2e/specs/ElementMatchers/TC-0004-states-and-attributes/web.test.ts +27 -6
- package/templates/nx/packages/playground/e2e/specs/Playground/TC-0001-form-controls/web.test.ts +3 -3
- package/templates/nx/packages/playground/e2e/specs/Playground/TC-0002-toggle-elements/web.test.ts +2 -2
- package/templates/nx/pnpm-lock.yaml +6663 -0
- package/templates/nx/pnpm-workspace.yaml +2 -1
- package/templates/nx/shared/testing/fixtures/apiData.json +24 -0
- package/templates/nx/shared/testing/page-objects/MatchersPage/mobile.ts +12 -0
- package/templates/nx/shared/testing/page-objects/MatchersPage/web.ts +14 -0
- package/templates/nx/shared/testing/page-objects/PlaygroundPage/web.ts +2 -0
- package/templates/nx/shared/testing/project.json +19 -0
- package/templates/nx/shared/testing/support/steps/togglePlaygroundStates/web.step.ts +2 -2
- package/templates/nx/shared/testing/support/steps/verifyPlaygroundState/mobile.step.ts +1 -1
- package/templates/nx/shared/testing/support/steps/verifyPlaygroundState/web.step.ts +3 -3
- package/templates/nx/spectra.config.ts +19 -12
- package/templates/nx/tsconfig.json +3 -1
- package/demo-app/assets/index-DAUlrHTr.css +0 -1
- package/demo-app/assets/index-DN2Kb0A8.js +0 -100
- package/dist/index.cjs +0 -101
- package/dist/plugin.cjs +0 -575
- package/dist/plugin.d.ts +0 -16
- package/dist/plugin.js +0 -184
- package/dist/step/index.d.ts +0 -6
- package/dist/step/index.js +0 -6
- package/dist/step/matchers.d.ts +0 -14
- package/dist/step/matchers.js +0 -114
- package/dist/step/proto.d.ts +0 -46
- package/dist/step/proto.js +0 -114
- package/dist/step/runner/collection.d.ts +0 -13
- package/dist/step/runner/collection.js +0 -51
- package/dist/step/runner/single.d.ts +0 -21
- package/dist/step/runner/single.js +0 -138
- package/dist/step/spectra.d.ts +0 -34
- package/dist/step/spectra.js +0 -156
- package/dist/step/types.d.ts +0 -32
- package/dist/step/types.js +0 -5
- package/templates/default/tsconfig.spectra.android.json +0 -46
- package/templates/default/tsconfig.spectra.ios.json +0 -46
- package/templates/default/tsconfig.spectra.json +0 -22
- package/templates/default/tsconfig.spectra.web.json +0 -53
- package/templates/nx/fixtures/playgroundData.json +0 -7
- package/templates/nx/global-hooks/after/mobile.hook.ts +0 -3
- package/templates/nx/global-hooks/after/web.hook.ts +0 -3
- package/templates/nx/global-hooks/before/mobile.hook.ts +0 -3
- package/templates/nx/global-hooks/before/web.hook.ts +0 -3
- package/templates/nx/page-objects/MatchersPage/mobile.ts +0 -21
- package/templates/nx/page-objects/MatchersPage/web.ts +0 -23
- package/templates/nx/page-objects/NavigationPage/mobile.ts +0 -5
- package/templates/nx/page-objects/NavigationPage/web.ts +0 -8
- package/templates/nx/page-objects/PlaygroundPage/mobile.ts +0 -26
- package/templates/nx/page-objects/PlaygroundPage/web.ts +0 -29
- package/templates/nx/specs/BrowserContext/TC-0007-title-and-navigation/mobile.test.ts +0 -3
- package/templates/nx/specs/BrowserContext/TC-0007-title-and-navigation/spec.md +0 -12
- package/templates/nx/specs/BrowserContext/TC-0007-title-and-navigation/web.test.ts +0 -5
- package/templates/nx/specs/BrowserContext/suite.md +0 -9
- package/templates/nx/specs/ContentMatchers/TC-0005-text-and-values/mobile.test.ts +0 -3
- package/templates/nx/specs/ContentMatchers/TC-0005-text-and-values/spec.md +0 -12
- package/templates/nx/specs/ContentMatchers/TC-0005-text-and-values/web.test.ts +0 -7
- package/templates/nx/specs/ContentMatchers/TC-0006-collections-and-empty/mobile.test.ts +0 -3
- package/templates/nx/specs/ContentMatchers/TC-0006-collections-and-empty/spec.md +0 -12
- package/templates/nx/specs/ContentMatchers/TC-0006-collections-and-empty/web.test.ts +0 -6
- package/templates/nx/specs/ContentMatchers/suite.md +0 -9
- package/templates/nx/specs/ElementMatchers/TC-0003-visibility-and-dom/mobile.test.ts +0 -3
- package/templates/nx/specs/ElementMatchers/TC-0003-visibility-and-dom/spec.md +0 -12
- package/templates/nx/specs/ElementMatchers/TC-0003-visibility-and-dom/web.test.ts +0 -5
- package/templates/nx/specs/ElementMatchers/TC-0004-states-and-attributes/mobile.test.ts +0 -3
- package/templates/nx/specs/ElementMatchers/TC-0004-states-and-attributes/spec.md +0 -12
- package/templates/nx/specs/ElementMatchers/TC-0004-states-and-attributes/web.test.ts +0 -8
- package/templates/nx/specs/ElementMatchers/hooks/after/mobile.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/after/web.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/afterEach/mobile.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/afterEach/web.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/before/mobile.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/before/web.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/beforeEach/mobile.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/hooks/beforeEach/web.hook.ts +0 -1
- package/templates/nx/specs/ElementMatchers/suite.md +0 -9
- package/templates/nx/specs/Playground/TC-0001-form-controls/mobile.test.ts +0 -3
- package/templates/nx/specs/Playground/TC-0001-form-controls/spec.md +0 -12
- package/templates/nx/specs/Playground/TC-0001-form-controls/web.test.ts +0 -6
- package/templates/nx/specs/Playground/TC-0002-toggle-elements/mobile.test.ts +0 -3
- package/templates/nx/specs/Playground/TC-0002-toggle-elements/spec.md +0 -12
- package/templates/nx/specs/Playground/TC-0002-toggle-elements/web.test.ts +0 -6
- package/templates/nx/specs/Playground/hooks/after/mobile.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/after/web.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/afterEach/mobile.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/afterEach/web.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/before/mobile.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/before/web.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/beforeEach/mobile.hook.ts +0 -1
- package/templates/nx/specs/Playground/hooks/beforeEach/web.hook.ts +0 -1
- package/templates/nx/specs/Playground/suite.md +0 -9
- package/templates/nx/support/actions/fillCredentials/mobile.action.ts +0 -4
- package/templates/nx/support/actions/fillCredentials/web.action.ts +0 -4
- package/templates/nx/support/steps/togglePlaygroundStates/mobile.step.ts +0 -3
- package/templates/nx/support/steps/togglePlaygroundStates/step.md +0 -7
- package/templates/nx/support/steps/togglePlaygroundStates/web.step.ts +0 -5
- package/templates/nx/support/steps/verifyPlaygroundState/mobile.step.ts +0 -4
- package/templates/nx/support/steps/verifyPlaygroundState/step.md +0 -7
- package/templates/nx/support/steps/verifyPlaygroundState/web.step.ts +0 -6
- package/templates/nx/tsconfig.spectra.android.json +0 -39
- package/templates/nx/tsconfig.spectra.ios.json +0 -39
- package/templates/nx/tsconfig.spectra.json +0 -25
- package/templates/nx/tsconfig.spectra.shared.json +0 -25
- package/templates/nx/tsconfig.spectra.web.json +0 -45
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/after/mobile.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/after/web.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/afterEach/mobile.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/afterEach/web.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/before/mobile.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/before/web.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/beforeEach/mobile.hook.ts +0 -0
- /package/templates/{nx/specs/BrowserContext → default/specs/ApiInterception}/hooks/beforeEach/web.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/after/mobile.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/after/web.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/afterEach/mobile.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/afterEach/web.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/before/mobile.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/before/web.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/beforeEach/mobile.hook.ts +0 -0
- /package/templates/nx/{specs/ContentMatchers → packages/matchers/e2e/specs/ApiInterception}/hooks/beforeEach/web.hook.ts +0 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"mockPosts": [
|
|
3
|
+
{
|
|
4
|
+
"id": 1,
|
|
5
|
+
"title": "Mocked Post 1 - TestSpectra Matchers",
|
|
6
|
+
"body": "First mocked post body for verifying GET API interception in TestSpectra."
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"id": 2,
|
|
10
|
+
"title": "Mocked Post 2 - Cross-Platform Automation",
|
|
11
|
+
"body": "Second mocked post body for verifying collection and item assertions."
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
"mockNewPost": {
|
|
15
|
+
"title": "TestSpectra Automated Post",
|
|
16
|
+
"body": "End-to-End API mock verification with browser.intercept command."
|
|
17
|
+
},
|
|
18
|
+
"mockPostResponse": {
|
|
19
|
+
"id": 101,
|
|
20
|
+
"title": "TestSpectra Automated Post",
|
|
21
|
+
"body": "End-to-End API mock verification with browser.intercept command.",
|
|
22
|
+
"userId": 1
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -5,11 +5,20 @@
|
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"test": "spectra run",
|
|
8
|
-
"
|
|
8
|
+
"test:web": "spectra run -t web",
|
|
9
|
+
"test:mobile": "spectra run -t mobile",
|
|
10
|
+
"test:android": "spectra run -t android",
|
|
11
|
+
"test:ios": "spectra run -t ios",
|
|
12
|
+
"spectra": "spectra",
|
|
13
|
+
"doctor": "spectra doctor",
|
|
14
|
+
"watch": "spectra watch",
|
|
15
|
+
"type-check": "tsc -b",
|
|
16
|
+
"sync-types": "spectra sync-types",
|
|
17
|
+
"postinstall": "spectra sync-types"
|
|
9
18
|
},
|
|
10
19
|
"devDependencies": {
|
|
11
|
-
"@testspectra/cli": "
|
|
12
|
-
"@testspectra/matchers": "
|
|
20
|
+
"@testspectra/cli": "link:../..",
|
|
21
|
+
"@testspectra/matchers": "link:../../../tools/matchers",
|
|
13
22
|
"@types/node": "^20.14.0",
|
|
14
23
|
"@wdio/cli": "^9.2.8",
|
|
15
24
|
"@wdio/local-runner": "^9.2.8",
|
|
@@ -20,4 +29,4 @@
|
|
|
20
29
|
"webdriverio": "^9.2.8",
|
|
21
30
|
"typescript": "^5.4.5"
|
|
22
31
|
}
|
|
23
|
-
}
|
|
32
|
+
}
|
|
@@ -1,21 +1,46 @@
|
|
|
1
1
|
export class MatchersPage {
|
|
2
|
-
get visibleElement() { return Spectra.get("~
|
|
3
|
-
get hiddenElement() { return Spectra.get("~
|
|
4
|
-
get existingElement() { return Spectra.get("~
|
|
5
|
-
get
|
|
6
|
-
get
|
|
7
|
-
get
|
|
8
|
-
get
|
|
9
|
-
get
|
|
10
|
-
get
|
|
11
|
-
get
|
|
12
|
-
get
|
|
13
|
-
get
|
|
14
|
-
get
|
|
15
|
-
get
|
|
16
|
-
get
|
|
2
|
+
get visibleElement() { return Spectra.get("~visible-element"); }
|
|
3
|
+
get hiddenElement() { return Spectra.get("~hidden-element"); }
|
|
4
|
+
get existingElement() { return Spectra.get("~existing-element"); }
|
|
5
|
+
get removableElement() { return Spectra.get("~removable-element"); }
|
|
6
|
+
get submitButton() { return Spectra.get("~submit-button"); }
|
|
7
|
+
get disabledButton() { return Spectra.get("~disabled-button"); }
|
|
8
|
+
get checkbox() { return Spectra.get("~terms-checkbox"); }
|
|
9
|
+
get radio() { return Spectra.get("~mode-radio"); }
|
|
10
|
+
get emailInput() { return Spectra.get("~email-input"); }
|
|
11
|
+
get tokenInput() { return Spectra.get("~token-input"); }
|
|
12
|
+
get exactText() { return Spectra.get("~exact-text"); }
|
|
13
|
+
get partialText() { return Spectra.get("~partial-text"); }
|
|
14
|
+
get activeTab() { return Spectra.get("~active-tab"); }
|
|
15
|
+
get navLink() { return Spectra.get("~nav-link"); }
|
|
16
|
+
get styledElement() { return Spectra.get("~styled-element"); }
|
|
17
|
+
get focusInput() { return Spectra.get("~focus-input"); }
|
|
18
|
+
get productCards() { return Spectra.getAll("~product-item-1, ~product-item-2, ~product-item-3, ~product-item-4"); }
|
|
19
|
+
get emptyList() { return Spectra.getAll("~empty-list-item"); }
|
|
17
20
|
|
|
18
|
-
|
|
21
|
+
// API Demo elements
|
|
22
|
+
get fetchApiButton() { return Spectra.get("~fetch-api-btn"); }
|
|
23
|
+
get fetchStatusBadge() { return Spectra.get("~fetch-status-badge"); }
|
|
24
|
+
get fetchedItems() { return Spectra.getAll("~api-post-item"); }
|
|
25
|
+
get fetchLoadingIndicator() { return Spectra.get("~fetch-loading-indicator"); }
|
|
26
|
+
get postTitleInput() { return Spectra.get("~post-title-input"); }
|
|
27
|
+
get postBodyInput() { return Spectra.get("~post-body-input"); }
|
|
28
|
+
get submitPostButton() { return Spectra.get("~submit-post-btn"); }
|
|
29
|
+
get postStatusBadge() { return Spectra.get("~post-status-badge"); }
|
|
30
|
+
get postSuccessBanner() { return Spectra.get("~post-success-banner"); }
|
|
31
|
+
get postResponseJson() { return Spectra.get("~post-response-json"); }
|
|
32
|
+
|
|
33
|
+
async open(section = "") {
|
|
34
|
+
try {
|
|
35
|
+
const isDrawerOpen = await Spectra.get("~close-sidebar-btn").isDisplayed().catch(() => false);
|
|
36
|
+
if (!isDrawerOpen) {
|
|
37
|
+
await Spectra.get("~toggle-sidebar-btn").click();
|
|
38
|
+
}
|
|
39
|
+
if (section) {
|
|
40
|
+
await Spectra.get(`~nav-item-${section}`).click();
|
|
41
|
+
}
|
|
42
|
+
} catch {}
|
|
43
|
+
}
|
|
19
44
|
}
|
|
20
45
|
|
|
21
46
|
export default new MatchersPage();
|
|
@@ -12,9 +12,23 @@ export class MatchersPage {
|
|
|
12
12
|
get partialText() { return Spectra.get("#demo-partial-text"); }
|
|
13
13
|
get activeTab() { return Spectra.get("#demo-active-tab"); }
|
|
14
14
|
get navLink() { return Spectra.get("#demo-nav-link"); }
|
|
15
|
+
get styledElement() { return Spectra.get("#demo-styled-el"); }
|
|
16
|
+
get focusInput() { return Spectra.get("#demo-focus-input"); }
|
|
15
17
|
get productCards() { return Spectra.getAll(".demo-product-card"); }
|
|
16
18
|
get emptyList() { return Spectra.getAll("#demo-empty-list > *"); }
|
|
17
19
|
|
|
20
|
+
// API Interception & Mocking elements
|
|
21
|
+
get fetchApiButton() { return Spectra.get("#fetch-api-btn"); }
|
|
22
|
+
get fetchStatusBadge() { return Spectra.get("#fetch-status-badge"); }
|
|
23
|
+
get fetchedItems() { return Spectra.getAll(".api-fetched-item"); }
|
|
24
|
+
get fetchLoadingIndicator() { return Spectra.get("#fetch-loading-indicator"); }
|
|
25
|
+
get postTitleInput() { return Spectra.get("#post-input-title"); }
|
|
26
|
+
get postBodyInput() { return Spectra.get("#post-input-body"); }
|
|
27
|
+
get submitPostButton() { return Spectra.get("#submit-post-btn"); }
|
|
28
|
+
get postStatusBadge() { return Spectra.get("#post-status-badge"); }
|
|
29
|
+
get postSuccessBanner() { return Spectra.get("#post-success-banner"); }
|
|
30
|
+
get postResponseJson() { return Spectra.get("#post-response-json"); }
|
|
31
|
+
|
|
18
32
|
async open(section = "") {
|
|
19
33
|
await browser.url("/" + (section ? "#" + section : ""));
|
|
20
34
|
}
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
export class NavigationPage {
|
|
2
|
-
get sidebarLinks() {
|
|
2
|
+
get sidebarLinks() {
|
|
3
|
+
return Spectra.getAll(
|
|
4
|
+
"~nav-item-overview, ~nav-item-element-matchers, ~nav-item-visibility, ~nav-item-existence, ~nav-item-state, ~nav-item-value, ~nav-item-text, ~nav-item-class-attr, ~nav-item-browser-matchers, ~nav-item-url, ~nav-item-title, ~nav-item-collection-matchers, ~nav-item-length, ~nav-item-api-matchers, ~nav-item-api-fetch, ~nav-item-api-post, ~nav-item-playground"
|
|
5
|
+
);
|
|
6
|
+
}
|
|
7
|
+
get toggleSidebarButton() { return Spectra.get("~toggle-sidebar-btn"); }
|
|
8
|
+
get closeSidebarButton() { return Spectra.get("~close-sidebar-btn"); }
|
|
9
|
+
get overviewLink() { return Spectra.get("~nav-item-overview"); }
|
|
10
|
+
get visibilityLink() { return Spectra.get("~nav-item-visibility"); }
|
|
11
|
+
get playgroundLink() { return Spectra.get("~nav-item-playground"); }
|
|
3
12
|
}
|
|
4
13
|
|
|
5
14
|
export default new NavigationPage();
|
|
@@ -1,22 +1,32 @@
|
|
|
1
1
|
export class PlaygroundPage {
|
|
2
|
-
get visibleElement() { return Spectra.get("~
|
|
3
|
-
get hiddenElement() { return Spectra.get("~
|
|
4
|
-
get existingElement() { return Spectra.get("~
|
|
5
|
-
get removedElement() { return Spectra.get("~
|
|
6
|
-
get enabledButton() { return Spectra.get("~
|
|
7
|
-
get disabledButton() { return Spectra.get("~
|
|
8
|
-
get termsCheckbox() { return Spectra.get("~
|
|
9
|
-
get modeRadio() { return Spectra.get("~
|
|
10
|
-
get emailInput() { return Spectra.get("~
|
|
11
|
-
get tokenInput() { return Spectra.get("~
|
|
12
|
-
get exactText() { return Spectra.get("~
|
|
13
|
-
get partialText() { return Spectra.get("~
|
|
14
|
-
get activeTab() { return Spectra.get("~
|
|
15
|
-
get navLink() { return Spectra.get("~
|
|
16
|
-
get
|
|
17
|
-
get
|
|
2
|
+
get visibleElement() { return Spectra.get("~playground-visible"); }
|
|
3
|
+
get hiddenElement() { return Spectra.get("~playground-hidden"); }
|
|
4
|
+
get existingElement() { return Spectra.get("~playground-existing"); }
|
|
5
|
+
get removedElement() { return Spectra.get("~playground-removable"); }
|
|
6
|
+
get enabledButton() { return Spectra.get("~enabled-button"); }
|
|
7
|
+
get disabledButton() { return Spectra.get("~disabled-button"); }
|
|
8
|
+
get termsCheckbox() { return Spectra.get("~terms-checkbox"); }
|
|
9
|
+
get modeRadio() { return Spectra.get("~mode-radio"); }
|
|
10
|
+
get emailInput() { return Spectra.get("~email-input"); }
|
|
11
|
+
get tokenInput() { return Spectra.get("~token-input"); }
|
|
12
|
+
get exactText() { return Spectra.get("~exact-text-el"); }
|
|
13
|
+
get partialText() { return Spectra.get("~partial-text-el"); }
|
|
14
|
+
get activeTab() { return Spectra.get("~active-tab-el"); }
|
|
15
|
+
get navLink() { return Spectra.get("~nav-link-el"); }
|
|
16
|
+
get styledElement() { return Spectra.get("~playground-styled-element"); }
|
|
17
|
+
get focusInput() { return Spectra.get("~playground-focus-input"); }
|
|
18
|
+
get productItems() { return Spectra.getAll("~product-item-1, ~product-item-2, ~product-item-3, ~product-item-4"); }
|
|
19
|
+
get emptyList() { return Spectra.getAll("~empty-list-el-item"); }
|
|
18
20
|
|
|
19
|
-
async open() {
|
|
21
|
+
async open() {
|
|
22
|
+
try {
|
|
23
|
+
const isDrawerOpen = await Spectra.get("~close-sidebar-btn").isDisplayed().catch(() => false);
|
|
24
|
+
if (!isDrawerOpen) {
|
|
25
|
+
await Spectra.get("~toggle-sidebar-btn").click();
|
|
26
|
+
}
|
|
27
|
+
await Spectra.get("~nav-item-playground").click();
|
|
28
|
+
} catch {}
|
|
29
|
+
}
|
|
20
30
|
async fillCredentials(email = Fixture.playgroundData.defaultEmail, token = Fixture.playgroundData.defaultToken) {
|
|
21
31
|
await this.emailInput.type(email);
|
|
22
32
|
await this.tokenInput.type(token);
|
|
@@ -13,6 +13,8 @@ export class PlaygroundPage {
|
|
|
13
13
|
get partialText() { return Spectra.get("#demo-partial-text-pg"); }
|
|
14
14
|
get activeTab() { return Spectra.get("#demo-active-tab-pg"); }
|
|
15
15
|
get navLink() { return Spectra.get("#demo-nav-link-pg"); }
|
|
16
|
+
get styledElement() { return Spectra.get("#demo-styled-el-pg"); }
|
|
17
|
+
get focusInput() { return Spectra.get("#demo-focus-input-pg"); }
|
|
16
18
|
get productItems() { return Spectra.getAll(".demo-product-item"); }
|
|
17
19
|
get emptyList() { return Spectra.getAll("#demo-empty-list-pg > *"); }
|
|
18
20
|
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
it("should verify GET API fetch response items and state on Mobile", async () => {
|
|
2
|
+
// Navigate to API Fetch section
|
|
3
|
+
await MatchersPage.open("api-fetch");
|
|
4
|
+
|
|
5
|
+
// Trigger fetch button in mobile demo app
|
|
6
|
+
await MatchersPage.fetchApiButton.click();
|
|
7
|
+
|
|
8
|
+
// Assert status badge and response items rendered
|
|
9
|
+
await MatchersPage.fetchStatusBadge.shouldHaveText("200 OK");
|
|
10
|
+
await MatchersPage.fetchedItems.shouldHaveLengthGreaterThan(0);
|
|
11
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: TC-0008-fetch-mocking
|
|
3
|
+
title: Mock and assert GET API requests using browser.intercept
|
|
4
|
+
priority: High
|
|
5
|
+
caseType: Positive
|
|
6
|
+
status: ready-for-automation
|
|
7
|
+
coverage:
|
|
8
|
+
web: automated
|
|
9
|
+
mobile: automated
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Mock and assert GET API requests using browser.intercept
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
it("should mock GET API response using browser.intercept and verify rendered items", async () => {
|
|
2
|
+
// Navigate to API Fetch section
|
|
3
|
+
await MatchersPage.open("api-fetch");
|
|
4
|
+
|
|
5
|
+
// Setup API interception with Fixture data
|
|
6
|
+
const mock = await browser.intercept(
|
|
7
|
+
"/api/posts",
|
|
8
|
+
"GET",
|
|
9
|
+
Fixture.apiData.mockPosts
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
// Trigger fetch button
|
|
13
|
+
await MatchersPage.fetchApiButton.click();
|
|
14
|
+
|
|
15
|
+
// Assert status and mocked elements
|
|
16
|
+
await MatchersPage.fetchStatusBadge.shouldHaveText("200 OK");
|
|
17
|
+
await MatchersPage.fetchedItems.shouldHaveLength(Fixture.apiData.mockPosts.length);
|
|
18
|
+
await MatchersPage.fetchedItems.first().shouldContainText(Fixture.apiData.mockPosts[0].title);
|
|
19
|
+
|
|
20
|
+
// Dynamically update fixture response
|
|
21
|
+
await mock.respondWith([
|
|
22
|
+
{ id: 99, title: "Dynamic Updated Mock Title", body: "Updated on the fly" }
|
|
23
|
+
]);
|
|
24
|
+
await MatchersPage.fetchApiButton.click();
|
|
25
|
+
await MatchersPage.fetchedItems.shouldHaveLength(1);
|
|
26
|
+
await MatchersPage.fetchedItems.first().shouldContainText("Dynamic Updated Mock Title");
|
|
27
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
it("should verify POST API form submission and response payload on Mobile", async () => {
|
|
2
|
+
// Navigate to API POST section
|
|
3
|
+
await MatchersPage.open("api-post");
|
|
4
|
+
|
|
5
|
+
// Fill in form fields from Fixture
|
|
6
|
+
await MatchersPage.postTitleInput.type(Fixture.apiData.mockNewPost.title);
|
|
7
|
+
await MatchersPage.postBodyInput.type(Fixture.apiData.mockNewPost.body);
|
|
8
|
+
|
|
9
|
+
// Submit POST form
|
|
10
|
+
await MatchersPage.submitPostButton.click();
|
|
11
|
+
|
|
12
|
+
// Assert response elements and status badge
|
|
13
|
+
await MatchersPage.postStatusBadge.shouldHaveText("201 Created");
|
|
14
|
+
await MatchersPage.postSuccessBanner.shouldBeVisible();
|
|
15
|
+
await MatchersPage.postResponseJson.shouldContainText(Fixture.apiData.mockNewPost.title);
|
|
16
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: TC-0009-post-mocking
|
|
3
|
+
title: Mock and assert POST API requests using browser.intercept
|
|
4
|
+
priority: High
|
|
5
|
+
caseType: Positive
|
|
6
|
+
status: ready-for-automation
|
|
7
|
+
coverage:
|
|
8
|
+
web: automated
|
|
9
|
+
mobile: automated
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Mock and assert POST API requests using browser.intercept
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
it("should mock POST API submission using browser.intercept and verify created response", async () => {
|
|
2
|
+
// Navigate to API POST section
|
|
3
|
+
await MatchersPage.open("api-post");
|
|
4
|
+
|
|
5
|
+
// Setup POST API interception with status 201
|
|
6
|
+
await browser.intercept(
|
|
7
|
+
"/api/posts",
|
|
8
|
+
"POST",
|
|
9
|
+
Fixture.apiData.mockPostResponse,
|
|
10
|
+
{ statusCode: 201 }
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
// Fill in form fields from Fixture
|
|
14
|
+
await MatchersPage.postTitleInput.type(Fixture.apiData.mockNewPost.title);
|
|
15
|
+
await MatchersPage.postBodyInput.type(Fixture.apiData.mockNewPost.body);
|
|
16
|
+
|
|
17
|
+
// Submit POST form
|
|
18
|
+
await MatchersPage.submitPostButton.click();
|
|
19
|
+
|
|
20
|
+
// Assert response elements and status
|
|
21
|
+
await MatchersPage.postStatusBadge.shouldHaveText("201 Created");
|
|
22
|
+
await MatchersPage.postSuccessBanner.shouldBeVisible();
|
|
23
|
+
await MatchersPage.postResponseJson.shouldContainText(Fixture.apiData.mockNewPost.title);
|
|
24
|
+
});
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
-
it("should verify
|
|
1
|
+
it("should verify mobile screen navigation and component collections on Mobile", async () => {
|
|
2
2
|
await MatchersPage.open();
|
|
3
|
+
|
|
4
|
+
// Navigation sidebar collection verification
|
|
5
|
+
await NavigationPage.sidebarLinks.shouldHaveLengthGreaterThan(0);
|
|
6
|
+
|
|
7
|
+
// Close sidebar drawer
|
|
8
|
+
await NavigationPage.closeSidebarButton.click();
|
|
3
9
|
});
|
|
@@ -1,5 +1,19 @@
|
|
|
1
|
-
it("should verify browser page title and navigation
|
|
1
|
+
it("should verify browser page title, URL, diagnostics, and navigation on Web", async () => {
|
|
2
2
|
await MatchersPage.open();
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
|
|
4
|
+
// Browser title assertions
|
|
5
|
+
await Spectra.browser.shouldHaveTitle("TestSpectra — Matchers API Reference");
|
|
6
|
+
await Spectra.browser.shouldContainTitle("TestSpectra");
|
|
7
|
+
|
|
8
|
+
// Browser URL assertions
|
|
9
|
+
const currentUrl = await browser.getUrl();
|
|
10
|
+
await Spectra.browser.shouldHaveUrl(currentUrl);
|
|
11
|
+
await Spectra.browser.shouldContainUrl("localhost:5173");
|
|
12
|
+
|
|
13
|
+
// Page lifecycle and console error diagnostics
|
|
14
|
+
await Spectra.browser.shouldBeLoaded();
|
|
15
|
+
await Spectra.browser.shouldHaveNoConsoleErrors();
|
|
16
|
+
|
|
17
|
+
// Navigation sidebar collection verification
|
|
18
|
+
await NavigationPage.sidebarLinks.shouldHaveLengthGreaterThan(0);
|
|
5
19
|
});
|
|
@@ -1,3 +1,17 @@
|
|
|
1
|
-
it("should verify text on Mobile", async () => {
|
|
1
|
+
it("should verify text and value matchers on Mobile", async () => {
|
|
2
2
|
await MatchersPage.open("text");
|
|
3
|
+
|
|
4
|
+
// Text assertions (positive and negative)
|
|
5
|
+
await MatchersPage.exactText.shouldHaveText(Fixture.playgroundData.welcomeText);
|
|
6
|
+
await MatchersPage.exactText.shouldNotHaveText("Unexpected Text");
|
|
7
|
+
|
|
8
|
+
await MatchersPage.partialText.shouldContainText("Welcome");
|
|
9
|
+
await MatchersPage.partialText.shouldNotContainText("Goodbye");
|
|
10
|
+
|
|
11
|
+
// Value assertions (positive and negative)
|
|
12
|
+
await MatchersPage.emailInput.shouldHaveValue(Fixture.playgroundData.defaultEmail);
|
|
13
|
+
await MatchersPage.emailInput.shouldNotHaveValue("wrong.user@testspectra.dev");
|
|
14
|
+
|
|
15
|
+
await MatchersPage.tokenInput.shouldContainValue("JWT_");
|
|
16
|
+
await MatchersPage.tokenInput.shouldNotContainValue("EXPIRED_SESSION");
|
|
3
17
|
});
|
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
it("should verify text and value matchers on Web", async () => {
|
|
2
2
|
await MatchersPage.open("text");
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
await MatchersPage.
|
|
6
|
-
await MatchersPage.
|
|
3
|
+
|
|
4
|
+
// Text assertions (positive and negative)
|
|
5
|
+
await MatchersPage.exactText.shouldHaveText(Fixture.playgroundData.welcomeText);
|
|
6
|
+
await MatchersPage.exactText.shouldNotHaveText("Unexpected Text");
|
|
7
|
+
|
|
8
|
+
await MatchersPage.partialText.shouldContainText("Welcome");
|
|
9
|
+
await MatchersPage.partialText.shouldNotContainText("Goodbye");
|
|
10
|
+
|
|
11
|
+
// Value assertions (positive and negative)
|
|
12
|
+
await MatchersPage.emailInput.shouldHaveValue(Fixture.playgroundData.defaultEmail);
|
|
13
|
+
await MatchersPage.emailInput.shouldNotHaveValue("wrong.user@testspectra.dev");
|
|
14
|
+
|
|
15
|
+
await MatchersPage.tokenInput.shouldContainValue("JWT_");
|
|
16
|
+
await MatchersPage.tokenInput.shouldNotContainValue("EXPIRED_SESSION");
|
|
7
17
|
});
|
package/templates/default/specs/ContentMatchers/TC-0006-collections-and-empty/mobile.test.ts
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
-
it("should verify collection
|
|
1
|
+
it("should verify collection lengths and empty lists on Mobile", async () => {
|
|
2
2
|
await MatchersPage.open("length");
|
|
3
|
+
|
|
4
|
+
// Receiver assertion methods
|
|
5
|
+
await MatchersPage.productCards.shouldHaveLength(4);
|
|
6
|
+
await MatchersPage.productCards.shouldNotHaveLength(0);
|
|
7
|
+
await MatchersPage.productCards.shouldHaveLengthGreaterThan(0);
|
|
8
|
+
await MatchersPage.productCards.shouldHaveLengthLessThan(10);
|
|
9
|
+
await MatchersPage.emptyList.shouldBeEmpty();
|
|
10
|
+
await MatchersPage.productCards.shouldNotBeEmpty();
|
|
3
11
|
});
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
it("should verify collection lengths and empty lists on Web", async () => {
|
|
2
2
|
await MatchersPage.open("length");
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
await MatchersPage.
|
|
3
|
+
|
|
4
|
+
// Receiver assertion methods
|
|
5
|
+
await MatchersPage.productCards.shouldHaveLength(4);
|
|
6
|
+
await MatchersPage.productCards.shouldNotHaveLength(0);
|
|
7
|
+
await MatchersPage.productCards.shouldHaveLengthGreaterThan(0);
|
|
8
|
+
await MatchersPage.productCards.shouldHaveLengthLessThan(10);
|
|
9
|
+
await MatchersPage.emptyList.shouldBeEmpty();
|
|
10
|
+
await MatchersPage.productCards.shouldNotBeEmpty();
|
|
6
11
|
});
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
-
it("should verify visibility on Mobile", async () => {
|
|
1
|
+
it("should verify visibility and DOM existence matchers on Mobile", async () => {
|
|
2
2
|
await MatchersPage.open("visibility");
|
|
3
|
+
|
|
4
|
+
// Element visibility (positive and negative)
|
|
5
|
+
await MatchersPage.visibleElement.shouldBeVisible();
|
|
6
|
+
await MatchersPage.hiddenElement.shouldNotBeVisible();
|
|
7
|
+
|
|
8
|
+
// DOM existence (positive and negative)
|
|
9
|
+
await MatchersPage.existingElement.shouldExist();
|
|
10
|
+
await Spectra.get("~non-existent-element").shouldNotExist();
|
|
3
11
|
});
|
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
it("should verify
|
|
1
|
+
it("should verify visibility and DOM existence matchers on Web", async () => {
|
|
2
2
|
await MatchersPage.open("visibility");
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
|
|
4
|
+
// Element visibility (positive and negative)
|
|
5
|
+
await MatchersPage.visibleElement.shouldBeVisible();
|
|
6
|
+
await MatchersPage.hiddenElement.shouldNotBeVisible();
|
|
7
|
+
|
|
8
|
+
// DOM existence (positive and negative)
|
|
9
|
+
await MatchersPage.existingElement.shouldExist();
|
|
10
|
+
await Spectra.get("#demo-non-existent-el").shouldNotExist();
|
|
5
11
|
});
|
package/templates/default/specs/ElementMatchers/TC-0004-states-and-attributes/mobile.test.ts
CHANGED
|
@@ -1,3 +1,29 @@
|
|
|
1
|
-
it("should verify
|
|
1
|
+
it("should verify interactivity states, classes, attributes, and styling on Mobile", async () => {
|
|
2
2
|
await MatchersPage.open("state");
|
|
3
|
+
|
|
4
|
+
// Interactivity & state assertions
|
|
5
|
+
await MatchersPage.submitButton.shouldBeEnabled();
|
|
6
|
+
await MatchersPage.submitButton.shouldBeClickable();
|
|
7
|
+
|
|
8
|
+
await MatchersPage.disabledButton.shouldBeDisabled();
|
|
9
|
+
await MatchersPage.disabledButton.shouldNotBeClickable();
|
|
10
|
+
|
|
11
|
+
// Checked states
|
|
12
|
+
await MatchersPage.checkbox.shouldNotBeChecked();
|
|
13
|
+
await MatchersPage.radio.shouldBeChecked();
|
|
14
|
+
|
|
15
|
+
// Focus states
|
|
16
|
+
await MatchersPage.focusInput.shouldNotBeFocused();
|
|
17
|
+
await MatchersPage.focusInput.click();
|
|
18
|
+
await MatchersPage.focusInput.shouldBeFocused();
|
|
19
|
+
|
|
20
|
+
// Class, Attribute, and CSS assertions
|
|
21
|
+
await MatchersPage.activeTab.shouldHaveClass("is-active");
|
|
22
|
+
await MatchersPage.activeTab.shouldNotHaveClass("is-hidden");
|
|
23
|
+
|
|
24
|
+
await MatchersPage.navLink.shouldHaveAttribute("accessibilityLabel", "nav-link");
|
|
25
|
+
await MatchersPage.navLink.shouldNotHaveAttribute("disabled");
|
|
26
|
+
|
|
27
|
+
await MatchersPage.styledElement.shouldHaveCss("color", "rgba(239,68,68,1)");
|
|
28
|
+
await MatchersPage.styledElement.shouldNotHaveCss("color", "rgba(0,0,255,1)");
|
|
3
29
|
});
|
|
@@ -1,8 +1,29 @@
|
|
|
1
|
-
it("should verify
|
|
1
|
+
it("should verify interactivity states, classes, attributes, and CSS styling on Web", async () => {
|
|
2
2
|
await MatchersPage.open("state");
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
await MatchersPage.
|
|
6
|
-
await MatchersPage.
|
|
7
|
-
|
|
3
|
+
|
|
4
|
+
// Interactivity & state assertions
|
|
5
|
+
await MatchersPage.submitButton.shouldBeEnabled();
|
|
6
|
+
await MatchersPage.submitButton.shouldBeClickable();
|
|
7
|
+
|
|
8
|
+
await MatchersPage.disabledButton.shouldBeDisabled();
|
|
9
|
+
await MatchersPage.disabledButton.shouldNotBeClickable();
|
|
10
|
+
|
|
11
|
+
// Checked states
|
|
12
|
+
await MatchersPage.checkbox.shouldNotBeChecked();
|
|
13
|
+
await MatchersPage.radio.shouldBeChecked();
|
|
14
|
+
|
|
15
|
+
// Focus states
|
|
16
|
+
await MatchersPage.focusInput.shouldNotBeFocused();
|
|
17
|
+
await MatchersPage.focusInput.click();
|
|
18
|
+
await MatchersPage.focusInput.shouldBeFocused();
|
|
19
|
+
|
|
20
|
+
// Class, Attribute, and CSS assertions
|
|
21
|
+
await MatchersPage.activeTab.shouldHaveClass("is-active");
|
|
22
|
+
await MatchersPage.activeTab.shouldNotHaveClass("is-hidden");
|
|
23
|
+
|
|
24
|
+
await MatchersPage.navLink.shouldHaveAttribute("href", Fixture.playgroundData.dashboardHref);
|
|
25
|
+
await MatchersPage.navLink.shouldNotHaveAttribute("disabled");
|
|
26
|
+
|
|
27
|
+
await MatchersPage.styledElement.shouldHaveCss("color", "rgba(239,68,68,1)");
|
|
28
|
+
await MatchersPage.styledElement.shouldNotHaveCss("color", "rgba(0,0,255,1)");
|
|
8
29
|
});
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
it("should verify playground states (Mobile)", async () => {
|
|
1
|
+
it("should verify live playground form inputs and default states (Mobile)", async () => {
|
|
2
2
|
await Step.verifyPlaygroundState();
|
|
3
|
+
await PlaygroundPage.emailInput.shouldHaveValue(Fixture.playgroundData.defaultEmail);
|
|
4
|
+
await PlaygroundPage.tokenInput.shouldContainValue("JWT_");
|
|
5
|
+
await PlaygroundPage.exactText.shouldHaveText(Fixture.playgroundData.welcomeText);
|
|
3
6
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
it("should verify live playground form inputs and default states (Web)", async () => {
|
|
2
2
|
await Step.verifyPlaygroundState();
|
|
3
|
-
await PlaygroundPage.emailInput.
|
|
4
|
-
await PlaygroundPage.tokenInput.
|
|
5
|
-
await PlaygroundPage.exactText.
|
|
3
|
+
await PlaygroundPage.emailInput.shouldHaveValue(Fixture.playgroundData.defaultEmail);
|
|
4
|
+
await PlaygroundPage.tokenInput.shouldContainValue("JWT_");
|
|
5
|
+
await PlaygroundPage.exactText.shouldHaveText(Fixture.playgroundData.welcomeText);
|
|
6
6
|
});
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
it("should
|
|
1
|
+
it("should update input values and verify updated state (Mobile)", async () => {
|
|
2
2
|
await PlaygroundPage.open();
|
|
3
|
+
await PlaygroundPage.fillCredentials("qa.expert@testspectra.dev", "JWT_custom_session_token");
|
|
4
|
+
await PlaygroundPage.emailInput.shouldHaveValue("qa.expert@testspectra.dev");
|
|
5
|
+
await PlaygroundPage.tokenInput.shouldContainValue("JWT_custom_session_token");
|
|
3
6
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
it("should update input values and verify updated state (Web)", async () => {
|
|
2
2
|
await PlaygroundPage.open();
|
|
3
3
|
await PlaygroundPage.fillCredentials("qa.expert@testspectra.dev", "JWT_custom_session_token");
|
|
4
|
-
await PlaygroundPage.emailInput.
|
|
5
|
-
await PlaygroundPage.tokenInput.
|
|
4
|
+
await PlaygroundPage.emailInput.shouldHaveValue("qa.expert@testspectra.dev");
|
|
5
|
+
await PlaygroundPage.tokenInput.shouldContainValue("JWT_custom_session_token");
|
|
6
6
|
});
|