@testspectra/cli 1.0.70 → 1.1.0-rc.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/LICENSE.md +48 -0
- package/README.md +36 -270
- package/bin/spectra.js +1 -1
- package/bin/testspectra-runner +0 -0
- package/demo-app/assets/index-BGllUp7o.js +140 -0
- package/demo-app/assets/index-BhlW-eXG.css +1 -0
- package/demo-app/index.html +2 -2
- package/dist/.tsbuildinfo +1 -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 +422 -0
- package/dist/commands/__tests__/run.test.d.ts +1 -0
- package/dist/commands/__tests__/run.test.js +277 -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/demo.js +21 -11
- 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/lint.d.ts +5 -0
- package/dist/commands/lint.js +55 -0
- package/dist/commands/refactor.d.ts +9 -0
- package/dist/commands/refactor.js +172 -0
- package/dist/commands/run.d.ts +23 -2
- package/dist/commands/run.js +321 -111
- package/dist/commands/skills.d.ts +9 -0
- package/dist/commands/skills.js +28 -0
- 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 +46 -43
- package/dist/config/loader.d.ts +1 -1
- package/dist/config/loader.js +40 -25
- package/dist/config/schema.d.ts +117 -54
- package/dist/config/schema.js +41 -35
- 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 +384 -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 +151 -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/linter/__tests__/anonymous-export.test.d.ts +1 -0
- package/dist/linter/__tests__/anonymous-export.test.js +184 -0
- package/dist/linter/__tests__/shared-lib-boundary.test.d.ts +1 -0
- package/dist/linter/__tests__/shared-lib-boundary.test.js +270 -0
- package/dist/linter/__tests__/spec-schema.test.d.ts +1 -0
- package/dist/linter/__tests__/spec-schema.test.js +369 -0
- package/dist/linter/__tests__/step-parity.test.d.ts +1 -0
- package/dist/linter/__tests__/step-parity.test.js +372 -0
- package/dist/linter/discovery.d.ts +30 -0
- package/dist/linter/discovery.js +249 -0
- package/dist/linter/extractor.d.ts +66 -0
- package/dist/linter/extractor.js +235 -0
- package/dist/linter/index.d.ts +7 -0
- package/dist/linter/index.js +7 -0
- package/dist/linter/parser.d.ts +24 -0
- package/dist/linter/parser.js +219 -0
- package/dist/linter/schemas/spec.schema.d.ts +83 -0
- package/dist/linter/schemas/spec.schema.js +150 -0
- package/dist/linter/schemas/suite.schema.d.ts +59 -0
- package/dist/linter/schemas/suite.schema.js +83 -0
- package/dist/linter/spec-linter.d.ts +23 -0
- package/dist/linter/spec-linter.js +595 -0
- package/dist/linter/types.d.ts +28 -0
- package/dist/linter/types.js +1 -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 +873 -0
- package/dist/refactor/index.d.ts +1 -0
- package/dist/refactor/index.js +1 -0
- package/dist/refactor/refactor-engine.d.ts +50 -0
- package/dist/refactor/refactor-engine.js +587 -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 +101 -45
- package/dist/runner/reporter.d.ts +32 -2
- package/dist/runner/reporter.js +423 -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/__tests__/api-server.test.d.ts +1 -0
- package/dist/utils/__tests__/api-server.test.js +62 -0
- package/dist/utils/__tests__/demo-server.test.d.ts +1 -0
- package/dist/utils/__tests__/demo-server.test.js +35 -0
- package/dist/utils/api-server.d.ts +19 -0
- package/dist/utils/api-server.js +134 -0
- package/dist/utils/demo-server.d.ts +5 -0
- package/dist/utils/demo-server.js +46 -36
- package/package.json +24 -13
- package/templates/default/CLAUDE.md +12 -5
- package/templates/default/fixtures/apiData.json +24 -0
- package/templates/default/package.json +12 -3
- package/templates/default/page-objects/MatchersPage/mobile.ts +53 -17
- package/templates/default/page-objects/MatchersPage/web.ts +17 -2
- package/templates/default/page-objects/NavigationPage/mobile.ts +11 -2
- package/templates/default/page-objects/NavigationPage/web.ts +1 -1
- package/templates/default/page-objects/PlaygroundPage/mobile.ts +28 -18
- package/templates/default/page-objects/PlaygroundPage/web.ts +4 -2
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/mobile.test.ts +53 -0
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/spec.md +19 -0
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/web.test.ts +31 -0
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/android.test.ts +3 -0
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/common.test.ts +3 -0
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/mobile.test.ts +27 -0
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/spec.md +19 -0
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/web.test.ts +26 -0
- package/templates/default/specs/ApiInterception/TC-0012-direct-and-late-response/common.test.ts +33 -0
- package/templates/default/specs/ApiInterception/TC-0012-direct-and-late-response/spec.md +22 -0
- package/templates/default/specs/ApiInterception/TC-0013-real-network-call-recorded/common.test.ts +27 -0
- package/templates/default/specs/ApiInterception/TC-0013-real-network-call-recorded/spec.md +20 -0
- package/templates/default/specs/ApiInterception/TC-0015-mock-server-sent-events/spec.md +24 -0
- package/templates/default/specs/ApiInterception/TC-0015-mock-server-sent-events/web.test.ts +26 -0
- package/templates/default/specs/ApiInterception/TC-0016-bypass-websocket-with-app-level-mock/spec.md +37 -0
- package/templates/default/specs/ApiInterception/TC-0016-bypass-websocket-with-app-level-mock/web.test.ts +21 -0
- package/templates/default/specs/ApiInterception/TC-0017-bypass-captcha-with-test-mode-flag/spec.md +29 -0
- package/templates/default/specs/ApiInterception/TC-0017-bypass-captcha-with-test-mode-flag/web.test.ts +16 -0
- package/templates/default/specs/ApiInterception/suite.md +10 -0
- package/templates/default/specs/ApiSeeding/TC-0014-seed-and-cleanup-via-hooks/common.test.ts +30 -0
- package/templates/default/specs/ApiSeeding/TC-0014-seed-and-cleanup-via-hooks/spec.md +23 -0
- package/templates/default/specs/ApiSeeding/hooks/after/common.hook.ts +16 -0
- package/templates/default/specs/ApiSeeding/hooks/before/common.hook.ts +28 -0
- package/templates/default/specs/ApiSeeding/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/spec.md +5 -0
- 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/common.test.ts +26 -0
- package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/spec.md +7 -0
- 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/spec.md +5 -0
- package/templates/default/specs/ContentMatchers/TC-0006-collections-and-empty/web.test.ts +9 -4
- package/templates/default/specs/DeepLink/TC-0018-navigate-via-deep-link/mobile.test.ts +28 -0
- package/templates/default/specs/DeepLink/TC-0018-navigate-via-deep-link/spec.md +29 -0
- package/templates/default/specs/DeepLink/suite.md +9 -0
- 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/spec.md +5 -0
- 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/spec.md +7 -0
- package/templates/default/specs/ElementMatchers/TC-0004-states-and-attributes/web.test.ts +27 -6
- package/templates/default/specs/ElementMatchers/suite.md +2 -1
- package/templates/default/specs/PermissionRationale/TC-0010-camera-permission-allow/mobile.test.ts +26 -0
- package/templates/default/specs/PermissionRationale/TC-0010-camera-permission-allow/spec.md +22 -0
- package/templates/default/specs/PermissionRationale/TC-0011-camera-permission-deny/mobile.test.ts +13 -0
- package/templates/default/specs/PermissionRationale/TC-0011-camera-permission-deny/spec.md +20 -0
- package/templates/default/specs/PermissionRationale/suite.md +9 -0
- package/templates/default/specs/Playground/TC-0001-form-controls/mobile.test.ts +4 -1
- package/templates/default/specs/Playground/TC-0001-form-controls/spec.md +6 -0
- package/templates/default/specs/Playground/TC-0001-form-controls/web.test.ts +4 -4
- package/templates/default/specs/Playground/TC-0002-toggle-elements/mobile.test.ts +4 -1
- package/templates/default/specs/Playground/TC-0002-toggle-elements/spec.md +6 -0
- package/templates/default/specs/Playground/TC-0002-toggle-elements/web.test.ts +3 -3
- package/templates/default/spectra.config.ts +21 -15
- package/templates/default/support/actions/fillCredentials/mobile.action.ts +3 -3
- package/templates/default/support/actions/fillCredentials/web.action.ts +1 -1
- package/templates/default/support/steps/togglePlaygroundStates/mobile.step.ts +3 -1
- package/templates/default/support/steps/togglePlaygroundStates/web.step.ts +3 -3
- package/templates/default/support/steps/verifyPlaygroundState/mobile.step.ts +4 -2
- package/templates/default/support/steps/verifyPlaygroundState/web.step.ts +4 -4
- package/templates/default/tsconfig.json +3 -1
- package/templates/nx/.nx/workspace-data/70094CFD-E89B-57A1-9619-2FC5F4963C54.db +0 -0
- package/templates/nx/.nx/workspace-data/70094CFD-E89B-57A1-9619-2FC5F4963C54.db-shm +0 -0
- package/templates/nx/.nx/workspace-data/70094CFD-E89B-57A1-9619-2FC5F4963C54.db-wal +0 -0
- package/templates/nx/.nx/workspace-data/d/daemon.log +4306 -0
- package/templates/nx/.nx/workspace-data/d/server-process.json +3 -0
- package/templates/nx/.nx/workspace-data/file-map.json +452 -0
- package/templates/nx/.nx/workspace-data/lockfile.hash +1 -0
- package/templates/nx/.nx/workspace-data/nx_files.nxt +0 -0
- package/templates/nx/.nx/workspace-data/parsed-lock-file.json +13485 -0
- package/templates/nx/.nx/workspace-data/project-graph.json +14389 -0
- package/templates/nx/CLAUDE.md +2 -2
- package/templates/nx/package.json +6 -4
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0008-fetch-mocking/mobile.test.ts +27 -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 +24 -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/mobile.test.ts +1 -1
- 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/mobile.test.ts +1 -1
- package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0005-text-and-values/web.test.ts +15 -5
- package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0006-collections-and-empty/mobile.test.ts +1 -1
- package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0006-collections-and-empty/web.test.ts +9 -4
- package/templates/nx/packages/matchers/e2e/specs/ElementMatchers/TC-0003-visibility-and-dom/mobile.test.ts +1 -1
- 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/mobile.test.ts +1 -1
- 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/mobile.test.ts +1 -1
- package/templates/nx/packages/playground/e2e/specs/Playground/TC-0001-form-controls/web.test.ts +4 -4
- package/templates/nx/packages/playground/e2e/specs/Playground/TC-0002-toggle-elements/mobile.test.ts +1 -1
- package/templates/nx/packages/playground/e2e/specs/Playground/TC-0002-toggle-elements/web.test.ts +3 -3
- 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 +13 -1
- package/templates/nx/shared/testing/page-objects/MatchersPage/web.ts +85 -17
- package/templates/nx/shared/testing/page-objects/NavigationPage/mobile.ts +1 -1
- package/templates/nx/shared/testing/page-objects/NavigationPage/web.ts +1 -1
- package/templates/nx/shared/testing/page-objects/PlaygroundPage/mobile.ts +1 -1
- package/templates/nx/shared/testing/page-objects/PlaygroundPage/web.ts +4 -2
- package/templates/nx/shared/testing/project.json +19 -0
- package/templates/nx/shared/testing/support/actions/fillCredentials/mobile.action.ts +1 -1
- package/templates/nx/shared/testing/support/actions/fillCredentials/web.action.ts +1 -1
- package/templates/nx/shared/testing/support/steps/togglePlaygroundStates/mobile.step.ts +1 -1
- package/templates/nx/shared/testing/support/steps/togglePlaygroundStates/web.step.ts +3 -3
- package/templates/nx/shared/testing/support/steps/verifyPlaygroundState/mobile.step.ts +2 -2
- package/templates/nx/shared/testing/support/steps/verifyPlaygroundState/web.step.ts +4 -4
- package/templates/nx/spectra.config.ts +19 -13
- 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/specs/ContentMatchers/TC-0005-text-and-values/mobile.test.ts +0 -3
- package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/web.test.ts +0 -7
- 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,26 @@
|
|
|
1
|
+
// A single common.test.ts, not a web.test.ts/mobile.test.ts pair — the orchestrator's test-case
|
|
2
|
+
// discovery recognizes "common" as a platform stem for every target (web, android, ios, mobile),
|
|
3
|
+
// so this one file runs unmodified on all of them. This works here because every Spectra.*
|
|
4
|
+
// command below is genuinely platform-agnostic (the DSL layer has zero platform branching by
|
|
5
|
+
// design) and MatchersPage's selectors are already abstracted per-platform behind identically-
|
|
6
|
+
// named getters — nothing in this specific test depends on a page origin, a native-only gesture,
|
|
7
|
+
// or a browser-chrome-only assertion (see TC-0013's real-network test for a case that CAN'T be
|
|
8
|
+
// shared this way: Android has no implicit page origin to resolve a relative fetch URL against,
|
|
9
|
+
// so the URL itself has to differ per platform even though the commands stay identical).
|
|
10
|
+
it("Verify exact text, substring text, and input values", async () => {
|
|
11
|
+
await MatchersPage.open("text");
|
|
12
|
+
|
|
13
|
+
// Text assertions (positive and negative)
|
|
14
|
+
await MatchersPage.exactText.shouldHaveText(Fixture.playgroundData.welcomeText);
|
|
15
|
+
await MatchersPage.exactText.shouldNotHaveText("Unexpected Text");
|
|
16
|
+
|
|
17
|
+
await MatchersPage.partialText.shouldContainText("Welcome");
|
|
18
|
+
await MatchersPage.partialText.shouldNotContainText("Goodbye");
|
|
19
|
+
|
|
20
|
+
// Value assertions (positive and negative)
|
|
21
|
+
await MatchersPage.emailInput.shouldHaveValue(Fixture.playgroundData.defaultEmail);
|
|
22
|
+
await MatchersPage.emailInput.shouldNotHaveValue("wrong.user@testspectra.dev");
|
|
23
|
+
|
|
24
|
+
await MatchersPage.tokenInput.shouldContainValue("JWT_");
|
|
25
|
+
await MatchersPage.tokenInput.shouldNotContainValue("EXPIRED_SESSION");
|
|
26
|
+
});
|
|
@@ -10,3 +10,10 @@ coverage:
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
# Verify exact text, substring text, and input values
|
|
13
|
+
|
|
14
|
+
## Test Steps
|
|
15
|
+
1. Open text matchers section in matchers page
|
|
16
|
+
2. Verify exact text matches playground welcome text
|
|
17
|
+
3. Verify partial text contains welcome keyword
|
|
18
|
+
4. Verify email input value matches default email
|
|
19
|
+
5. Verify token input value contains JWT prefix
|
package/templates/default/specs/ContentMatchers/TC-0006-collections-and-empty/mobile.test.ts
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
-
it("
|
|
1
|
+
it("Verify collection lengths, counts, and empty lists", 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
|
-
it("
|
|
1
|
+
it("Verify collection lengths, counts, and empty lists", 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
|
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
it("Navigate directly to a native route via Spectra.navigate() and an Android deep link", async () => {
|
|
2
|
+
// The orchestrator's own bootstrap launches the app (fire-and-forget, ~1.5s wait) before any
|
|
3
|
+
// test code runs at all — other tests never notice because their first action is a click()
|
|
4
|
+
// with its own generous poll budget, which absorbs whatever's left of the cold start. This
|
|
5
|
+
// test's first action is Spectra.navigate() itself, which is also fire-and-forget and has no
|
|
6
|
+
// such budget, so without this it races the deep-link intent against the app's own still-in-
|
|
7
|
+
// progress initial boot. Waiting for the home screen to actually be up first avoids that race.
|
|
8
|
+
await Spectra.get("~toggle-sidebar-btn").waitForElement(30000);
|
|
9
|
+
|
|
10
|
+
// No prior navigation, no button clicks — this jumps straight to the route via
|
|
11
|
+
// `adb shell am start`, exactly like opening the app from a push notification or an
|
|
12
|
+
// external link would.
|
|
13
|
+
await Spectra.navigate("testspectra-demo://deeplink-target");
|
|
14
|
+
await Spectra.get("~deeplink-target-marker").waitForElement(10000);
|
|
15
|
+
|
|
16
|
+
await Spectra.get("~deeplink-target-marker").shouldHaveText("deeplink-target");
|
|
17
|
+
await Spectra.get("~deeplink-received-message").shouldHaveText("(none)");
|
|
18
|
+
|
|
19
|
+
await Spectra.get("~back-to-home-btn").click();
|
|
20
|
+
|
|
21
|
+
// Deep links can carry query params — assert they survive the intent all the way to the screen.
|
|
22
|
+
await Spectra.navigate("testspectra-demo://deeplink-target?message=hello-from-deep-link");
|
|
23
|
+
|
|
24
|
+
await Spectra.get("~deeplink-received-message").waitForElement(10000);
|
|
25
|
+
await Spectra.get("~deeplink-received-message").shouldHaveText("hello-from-deep-link");
|
|
26
|
+
|
|
27
|
+
await Spectra.get("~back-to-home-btn").click();
|
|
28
|
+
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: TC-0018-navigate-via-deep-link
|
|
3
|
+
title: Navigate directly to a native route via Spectra.navigate() and an Android deep link
|
|
4
|
+
priority: High
|
|
5
|
+
caseType: Positive
|
|
6
|
+
status: ready-for-automation
|
|
7
|
+
coverage:
|
|
8
|
+
web: unsupported
|
|
9
|
+
mobile: automated
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Navigate directly to a native route via Spectra.navigate() and an Android deep link
|
|
13
|
+
|
|
14
|
+
On Android, `Spectra.navigate(uri)` runs `adb shell am start -a android.intent.action.VIEW -d
|
|
15
|
+
<uri>` against the app's own registered scheme (`testspectra-demo://`, declared in
|
|
16
|
+
`app.json`/`AndroidManifest.xml`) — jumping straight to a route without walking through the UI
|
|
17
|
+
first, the same way a push notification or an external link would open the app in production.
|
|
18
|
+
|
|
19
|
+
Web coverage is `unsupported`: on web, `Spectra.navigate()` already does the equivalent thing
|
|
20
|
+
via a normal URL (see any other TC's `browser.url(...)`/`Spectra.navigate(...)` call) — there's no
|
|
21
|
+
separate "deep link" concept to demonstrate there.
|
|
22
|
+
|
|
23
|
+
## Test Steps
|
|
24
|
+
1. Wait for the app home screen to finish booting
|
|
25
|
+
2. Navigate via a deep link to the target route without query params
|
|
26
|
+
3. Assert the target marker is shown and the received message is "(none)"
|
|
27
|
+
4. Navigate via a deep link carrying a query-param message
|
|
28
|
+
5. Assert the received message matches the deep-link param
|
|
29
|
+
6. Return to the home screen
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
-
it("
|
|
1
|
+
it("Verify element visibility and existence matchers", 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("
|
|
1
|
+
it("Verify element visibility and existence matchers", 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("
|
|
1
|
+
it("Verify button state, checkbox, radio and attributes", 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
|
});
|
|
@@ -10,3 +10,10 @@ coverage:
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
# Verify button state, checkbox, radio and attributes
|
|
13
|
+
|
|
14
|
+
## Test Steps
|
|
15
|
+
1. Open element state section in matchers page
|
|
16
|
+
2. Assert submit button is enabled and disabled button is disabled
|
|
17
|
+
3. Assert terms checkbox is not checked
|
|
18
|
+
4. Assert active tab has is-active class
|
|
19
|
+
5. Assert navigation link has correct href attribute
|
|
@@ -1,8 +1,29 @@
|
|
|
1
|
-
it("
|
|
1
|
+
it("Verify button state, checkbox, radio and attributes", 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
|
});
|
package/templates/default/specs/PermissionRationale/TC-0010-camera-permission-allow/mobile.test.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
it("Confirm custom rationale dialog Allow triggers real permission request and grants camera access", async () => {
|
|
2
|
+
// Navigate to the dedicated permission-rationale route (real router path, not a hash/scroll
|
|
3
|
+
// section) via the header link.
|
|
4
|
+
await Spectra.get("~nav-to-permission-demo").click();
|
|
5
|
+
|
|
6
|
+
await Spectra.get("~permission-status-text").shouldHaveText("Not requested");
|
|
7
|
+
|
|
8
|
+
await Spectra.get("~request-camera-permission-btn").click();
|
|
9
|
+
|
|
10
|
+
// The custom rationale dialog appears first — no real permission dialog yet.
|
|
11
|
+
await Spectra.get("~rationale-allow-btn").shouldBeVisible();
|
|
12
|
+
|
|
13
|
+
await Spectra.get("~rationale-allow-btn").click();
|
|
14
|
+
|
|
15
|
+
// Confirming the custom dialog triggers the real Android permission request. Grant it
|
|
16
|
+
// on-demand right now, exactly like a real device automation flow would — the app itself
|
|
17
|
+
// is resilient to the resulting race (see permission-rationale.tsx's recheck loop), so the
|
|
18
|
+
// status still lands on "Granted" below regardless of exactly when this call resolves
|
|
19
|
+
// relative to the OS dialog.
|
|
20
|
+
await Spectra.grantPermission("android.permission.CAMERA");
|
|
21
|
+
|
|
22
|
+
await Spectra.get("~permission-status-text").shouldHaveText("Granted");
|
|
23
|
+
|
|
24
|
+
// Return to the home screen so later suites in the same batch don't inherit this route.
|
|
25
|
+
await Spectra.get("~back-to-home-btn").click();
|
|
26
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: TC-0010-camera-permission-allow
|
|
3
|
+
title: Confirm custom rationale dialog Allow triggers real permission request and grants camera access
|
|
4
|
+
priority: High
|
|
5
|
+
caseType: Positive
|
|
6
|
+
status: ready-for-automation
|
|
7
|
+
coverage:
|
|
8
|
+
web: unsupported
|
|
9
|
+
mobile: automated
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Confirm custom rationale dialog Allow triggers real permission request and grants camera access
|
|
13
|
+
|
|
14
|
+
## Test Steps
|
|
15
|
+
1. Navigate to the permission rationale demo route
|
|
16
|
+
2. Assert the initial status is "Not requested"
|
|
17
|
+
3. Click the request camera permission button
|
|
18
|
+
4. Assert the custom rationale dialog appears
|
|
19
|
+
5. Click Allow
|
|
20
|
+
6. Grant the real camera permission on demand
|
|
21
|
+
7. Assert the status becomes "Granted"
|
|
22
|
+
8. Return to the home screen
|
package/templates/default/specs/PermissionRationale/TC-0011-camera-permission-deny/mobile.test.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
it("Confirm custom rationale dialog Deny never triggers the real permission request", async () => {
|
|
2
|
+
await Spectra.get("~nav-to-permission-demo").click();
|
|
3
|
+
|
|
4
|
+
await Spectra.get("~request-camera-permission-btn").click();
|
|
5
|
+
await Spectra.get("~rationale-deny-btn").shouldBeVisible();
|
|
6
|
+
await Spectra.get("~rationale-deny-btn").click();
|
|
7
|
+
|
|
8
|
+
// Deliberately never calls the real permission API — the status must reflect the custom
|
|
9
|
+
// dialog's own decision, not any OS-level request.
|
|
10
|
+
await Spectra.get("~permission-status-text").shouldHaveText("Declined in rationale dialog");
|
|
11
|
+
|
|
12
|
+
await Spectra.get("~back-to-home-btn").click();
|
|
13
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: TC-0011-camera-permission-deny
|
|
3
|
+
title: Confirm custom rationale dialog Deny never triggers the real permission request
|
|
4
|
+
priority: High
|
|
5
|
+
caseType: Negative
|
|
6
|
+
status: ready-for-automation
|
|
7
|
+
coverage:
|
|
8
|
+
web: unsupported
|
|
9
|
+
mobile: automated
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Confirm custom rationale dialog Deny never triggers the real permission request
|
|
13
|
+
|
|
14
|
+
## Test Steps
|
|
15
|
+
1. Navigate to the permission rationale demo route
|
|
16
|
+
2. Click the request camera permission button
|
|
17
|
+
3. Assert the custom rationale dialog appears
|
|
18
|
+
4. Click Deny
|
|
19
|
+
5. Assert the status reflects the dialog's own decision without any real permission request
|
|
20
|
+
6. Return to the home screen
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
it("
|
|
1
|
+
it("Verify playground form inputs and default states", 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
|
});
|
|
@@ -10,3 +10,9 @@ coverage:
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
# Verify playground form inputs and default states
|
|
13
|
+
|
|
14
|
+
## Test Steps
|
|
15
|
+
1. @step:verifyPlaygroundState
|
|
16
|
+
2. Verify playground email input has default email
|
|
17
|
+
3. Verify token input contains JWT token
|
|
18
|
+
4. Verify exact welcome text matches playground data
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
it("
|
|
1
|
+
it("Verify playground form inputs and default states", 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("
|
|
1
|
+
it("Verify typing credentials and updating playground inputs", 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
|
});
|
|
@@ -10,3 +10,9 @@ coverage:
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
# Verify typing credentials and updating playground inputs
|
|
13
|
+
|
|
14
|
+
## Test Steps
|
|
15
|
+
1. Open playground page
|
|
16
|
+
2. Fill credentials into email and token input fields
|
|
17
|
+
3. Verify email input contains updated email
|
|
18
|
+
4. Verify token input contains updated session token
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
it("
|
|
1
|
+
it("Verify typing credentials and updating playground inputs", 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
|
});
|
|
@@ -4,7 +4,7 @@ export default defineConfig({
|
|
|
4
4
|
webConfig: {
|
|
5
5
|
baseUrl: "http://localhost:5173",
|
|
6
6
|
maxConcurrentSessions: "1",
|
|
7
|
-
|
|
7
|
+
headless: true,
|
|
8
8
|
implicitWait: "5000",
|
|
9
9
|
pageLoadTimeout: "30000",
|
|
10
10
|
scriptTimeout: "30000",
|
|
@@ -18,32 +18,38 @@ export default defineConfig({
|
|
|
18
18
|
},
|
|
19
19
|
],
|
|
20
20
|
androidConfig: {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
deviceName: "emulator-5554",
|
|
25
|
-
automationName: "UiAutomator2",
|
|
26
|
-
appPackage: "",
|
|
27
|
-
appActivity: "",
|
|
28
|
-
autoGrantPermissions: true,
|
|
21
|
+
driverServer: "tcp://127.0.0.1:8200",
|
|
22
|
+
appPackage: "dev.testspectra.demoapp",
|
|
23
|
+
appActivity: "dev.testspectra.demoapp.MainActivity",
|
|
29
24
|
noReset: false,
|
|
30
25
|
implicitWait: "10000",
|
|
31
26
|
parallelizationMode: "suite",
|
|
27
|
+
devices: [
|
|
28
|
+
{
|
|
29
|
+
id: "emulator-5554",
|
|
30
|
+
name: "Pixel 8a Emulator",
|
|
31
|
+
version: "14.0",
|
|
32
|
+
systemPort: 8200,
|
|
33
|
+
},
|
|
34
|
+
],
|
|
32
35
|
},
|
|
33
36
|
iosConfig: {
|
|
34
37
|
appiumServer: "http://127.0.0.1:4723",
|
|
35
|
-
platformName: "iOS",
|
|
36
|
-
platformVersion: "16.0",
|
|
37
|
-
deviceName: "iPhone 14",
|
|
38
38
|
automationName: "XCUITest",
|
|
39
39
|
bundleId: "",
|
|
40
|
-
udid: "auto",
|
|
41
|
-
xcodeOrgId: "",
|
|
42
|
-
xcodeSigningId: "iPhone Developer",
|
|
43
40
|
autoAcceptAlerts: true,
|
|
44
41
|
noReset: false,
|
|
45
42
|
implicitWait: "10000",
|
|
46
43
|
parallelizationMode: "suite",
|
|
44
|
+
devices: [
|
|
45
|
+
{
|
|
46
|
+
id: "iphone-15-pro",
|
|
47
|
+
name: "iPhone 15 Pro Simulator",
|
|
48
|
+
version: "17.0",
|
|
49
|
+
udid: "auto",
|
|
50
|
+
wdaLocalPort: 8100,
|
|
51
|
+
},
|
|
52
|
+
],
|
|
47
53
|
},
|
|
48
54
|
loadConfig: {
|
|
49
55
|
virtualUsers: "10",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export default async function
|
|
2
|
-
await this.get("~
|
|
3
|
-
await this.get("~
|
|
1
|
+
export default async function (this: any, email: string, token: string) {
|
|
2
|
+
await this.get("~pg-email-input").type(email);
|
|
3
|
+
await this.get("~pg-token-input").type(token);
|
|
4
4
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export default async function
|
|
1
|
+
export default async function (this: any, email: string, token: string) {
|
|
2
2
|
await this.get("#demo-email-input-pg").type(email);
|
|
3
3
|
await this.get("#demo-token-input-pg").type(token);
|
|
4
4
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export default async function
|
|
1
|
+
export default async function () {
|
|
2
2
|
await PlaygroundPage.open();
|
|
3
|
-
await PlaygroundPage.hiddenElement.
|
|
4
|
-
await PlaygroundPage.existingElement.
|
|
3
|
+
await PlaygroundPage.hiddenElement.shouldBeVisible();
|
|
4
|
+
await PlaygroundPage.existingElement.shouldExist();
|
|
5
5
|
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
export default async function
|
|
1
|
+
export default async function () {
|
|
2
2
|
await PlaygroundPage.open();
|
|
3
|
-
await PlaygroundPage.visibleElement.
|
|
3
|
+
await PlaygroundPage.visibleElement.shouldBeVisible();
|
|
4
|
+
await PlaygroundPage.enabledButton.shouldBeEnabled();
|
|
5
|
+
await PlaygroundPage.termsCheckbox.shouldBeChecked();
|
|
4
6
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export default async function
|
|
1
|
+
export default async function () {
|
|
2
2
|
await PlaygroundPage.open();
|
|
3
|
-
await PlaygroundPage.visibleElement.
|
|
4
|
-
await PlaygroundPage.enabledButton.
|
|
5
|
-
await PlaygroundPage.termsCheckbox.
|
|
3
|
+
await PlaygroundPage.visibleElement.shouldBeVisible();
|
|
4
|
+
await PlaygroundPage.enabledButton.shouldBeEnabled();
|
|
5
|
+
await PlaygroundPage.termsCheckbox.shouldBeChecked();
|
|
6
6
|
}
|
|
Binary file
|