@testspectra/cli 1.1.7 → 1.1.8-rc.2
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/bin/.testspectra-runner.hash +1 -1
- package/bin/spectra.js +0 -0
- package/bin/testspectra-runner.exe +0 -0
- package/demo-app/assets/index-BhlW-eXG.css +1 -0
- package/demo-app/assets/index-DOtRypCa.js +154 -0
- package/demo-app/index.html +2 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/commands/__tests__/run-e2e.test.js +270 -29
- package/dist/commands/__tests__/run.test.js +92 -16
- package/dist/commands/demo.js +17 -7
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.js +154 -149
- package/dist/commands/lint.d.ts +5 -0
- package/dist/commands/lint.js +55 -0
- package/dist/commands/refactor.d.ts +2 -1
- package/dist/commands/refactor.js +129 -35
- package/dist/commands/run.d.ts +2 -3
- package/dist/commands/run.js +93 -28
- package/dist/commands/skills.d.ts +9 -0
- package/dist/commands/skills.js +28 -0
- package/dist/commands/sync-types.js +1 -0
- package/dist/commands/test.d.ts +17 -0
- package/dist/commands/test.js +104 -0
- package/dist/commands/watch.js +9 -3
- package/dist/config/loader.js +1 -1
- package/dist/config/schema.d.ts +5 -114
- package/dist/config/schema.js +1 -17
- package/dist/generator/__tests__/tsconfig-isolation.test.js +6 -2
- package/dist/generator/__tests__/type-generator.test.js +1 -1
- package/dist/generator/tsconfig-generator.js +44 -16
- package/dist/generator/type-generator.d.ts +24 -1
- package/dist/generator/type-generator.js +104 -8
- package/dist/index.d.ts +1 -1
- package/dist/index.js +76 -40
- package/dist/linter/__tests__/anonymous-export.test.js +184 -0
- package/dist/linter/__tests__/component-test-imports.test.d.ts +1 -0
- package/dist/linter/__tests__/component-test-imports.test.js +115 -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 +67 -0
- package/dist/linter/extractor.js +245 -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 +630 -0
- package/dist/linter/types.d.ts +28 -0
- package/dist/linter/types.js +1 -0
- package/dist/refactor/__tests__/refactor-engine.test.js +698 -0
- package/dist/refactor/refactor-engine.d.ts +25 -0
- package/dist/refactor/refactor-engine.js +374 -42
- package/dist/reporter/semantic-formatter.js +22 -2
- package/dist/reporter/types.d.ts +1 -1
- package/dist/runner/bridge.d.ts +1 -1
- package/dist/runner/bridge.js +34 -21
- package/dist/runner/reporter.d.ts +2 -0
- package/dist/runner/reporter.js +11 -3
- 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 +179 -0
- package/dist/utils/demo-server.d.ts +5 -0
- package/dist/utils/demo-server.js +8 -1
- package/package.json +29 -25
- package/templates/default/CLAUDE.md +16 -11
- package/templates/default/global-hooks/after/mobile.hook.ts +3 -3
- package/templates/default/global-hooks/after/web.hook.ts +3 -3
- package/templates/default/global-hooks/before/mobile.hook.ts +3 -3
- package/templates/default/global-hooks/before/web.hook.ts +3 -3
- package/templates/default/package.json +3 -3
- package/templates/default/page-objects/AuthPage/mobile.ts +5 -0
- package/templates/default/page-objects/AuthPage/web.ts +10 -0
- package/templates/default/page-objects/MatchersPage/mobile.ts +70 -46
- package/templates/default/page-objects/MatchersPage/web.ts +43 -37
- package/templates/default/page-objects/NavigationPage/mobile.ts +14 -14
- package/templates/default/page-objects/NavigationPage/web.ts +8 -8
- package/templates/default/page-objects/PlaygroundPage/mobile.ts +42 -36
- package/templates/default/page-objects/PlaygroundPage/web.ts +31 -31
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/mobile.test.ts +53 -11
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/spec.md +19 -12
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/web.test.ts +31 -27
- 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 -16
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/spec.md +19 -12
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/web.test.ts +26 -24
- package/templates/default/specs/ApiInterception/TC-0012-direct-and-late-response/common.test.ts +30 -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 -9
- 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/Authentication/TC-0021-seed-authenticated-session/mobile.test.ts +7 -0
- package/templates/default/specs/Authentication/TC-0021-seed-authenticated-session/spec.md +19 -0
- package/templates/default/specs/Authentication/TC-0021-seed-authenticated-session/web.test.ts +9 -0
- package/templates/default/specs/Authentication/suite.md +9 -0
- package/templates/default/specs/BrowserContext/TC-0007-title-and-navigation/mobile.test.ts +9 -9
- package/templates/default/specs/BrowserContext/TC-0007-title-and-navigation/spec.md +17 -12
- package/templates/default/specs/BrowserContext/TC-0007-title-and-navigation/web.test.ts +19 -19
- package/templates/default/specs/BrowserContext/TC-0022-history-navigation/mobile.test.ts +17 -0
- package/templates/default/specs/BrowserContext/TC-0022-history-navigation/spec.md +28 -0
- package/templates/default/specs/BrowserContext/TC-0022-history-navigation/web.test.ts +26 -0
- 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 +19 -12
- package/templates/default/specs/ContentMatchers/TC-0006-collections-and-empty/mobile.test.ts +11 -11
- package/templates/default/specs/ContentMatchers/TC-0006-collections-and-empty/spec.md +17 -12
- package/templates/default/specs/ContentMatchers/TC-0006-collections-and-empty/web.test.ts +11 -11
- package/templates/default/specs/ContentMatchers/TC-0020-scoped-element-access/common.test.ts +14 -0
- package/templates/default/specs/ContentMatchers/TC-0020-scoped-element-access/spec.md +21 -0
- 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 +11 -11
- package/templates/default/specs/ElementMatchers/TC-0003-visibility-and-dom/spec.md +17 -12
- package/templates/default/specs/ElementMatchers/TC-0003-visibility-and-dom/web.test.ts +11 -11
- package/templates/default/specs/ElementMatchers/TC-0004-states-and-attributes/mobile.test.ts +29 -29
- package/templates/default/specs/ElementMatchers/TC-0004-states-and-attributes/spec.md +19 -12
- package/templates/default/specs/ElementMatchers/TC-0004-states-and-attributes/web.test.ts +29 -29
- package/templates/default/specs/ElementMatchers/suite.md +10 -9
- package/templates/default/specs/EnvironmentConfig/TC-0019-read-custom-environment-variable/common.test.ts +5 -0
- package/templates/default/specs/EnvironmentConfig/TC-0019-read-custom-environment-variable/spec.md +16 -0
- package/templates/default/specs/EnvironmentConfig/suite.md +9 -0
- 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 +6 -6
- package/templates/default/specs/Playground/TC-0001-form-controls/spec.md +18 -12
- package/templates/default/specs/Playground/TC-0001-form-controls/web.test.ts +6 -6
- package/templates/default/specs/Playground/TC-0002-toggle-elements/mobile.test.ts +6 -6
- package/templates/default/specs/Playground/TC-0002-toggle-elements/spec.md +18 -12
- package/templates/default/specs/Playground/TC-0002-toggle-elements/web.test.ts +6 -6
- package/templates/default/spectra.config.ts +52 -68
- package/templates/default/support/actions/fillCredentials/mobile.action.ts +4 -4
- package/templates/default/support/actions/fillCredentials/web.action.ts +4 -4
- package/templates/default/support/actions/seedSession/mobile.action.ts +9 -0
- package/templates/default/support/actions/seedSession/web.action.ts +13 -0
- package/templates/default/support/steps/togglePlaygroundStates/mobile.step.ts +5 -5
- package/templates/default/support/steps/togglePlaygroundStates/web.step.ts +5 -5
- package/templates/default/support/steps/verifyPlaygroundState/mobile.step.ts +6 -6
- package/templates/default/support/steps/verifyPlaygroundState/web.step.ts +6 -6
- package/templates/nx/.nx/workspace-data/59842386-c7c4-44ca-b2c2-20e1700bd13d.db +0 -0
- package/templates/nx/.nx/workspace-data/59842386-c7c4-44ca-b2c2-20e1700bd13d.db-shm +0 -0
- package/templates/nx/.nx/workspace-data/59842386-c7c4-44ca-b2c2-20e1700bd13d.db-wal +0 -0
- package/templates/nx/.nx/workspace-data/d/daemon.log +1577 -168
- package/templates/nx/.nx/workspace-data/d/server-process.json +3 -0
- package/templates/nx/.nx/workspace-data/file-map.json +464 -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 +10 -10
- package/templates/nx/package.json +3 -3
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0008-fetch-mocking/mobile.test.ts +27 -3
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0008-fetch-mocking/web.test.ts +27 -27
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0009-post-mocking/mobile.test.ts +24 -3
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0009-post-mocking/web.test.ts +24 -24
- package/templates/nx/packages/matchers/e2e/specs/BrowserContext/TC-0007-title-and-navigation/mobile.test.ts +3 -3
- package/templates/nx/packages/matchers/e2e/specs/BrowserContext/TC-0007-title-and-navigation/web.test.ts +19 -19
- package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0005-text-and-values/mobile.test.ts +3 -3
- package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0005-text-and-values/web.test.ts +17 -17
- package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0006-collections-and-empty/mobile.test.ts +3 -3
- package/templates/nx/packages/matchers/e2e/specs/ContentMatchers/TC-0006-collections-and-empty/web.test.ts +11 -11
- package/templates/nx/packages/matchers/e2e/specs/ElementMatchers/TC-0003-visibility-and-dom/mobile.test.ts +3 -3
- package/templates/nx/packages/matchers/e2e/specs/ElementMatchers/TC-0003-visibility-and-dom/web.test.ts +11 -11
- package/templates/nx/packages/matchers/e2e/specs/ElementMatchers/TC-0004-states-and-attributes/mobile.test.ts +3 -3
- package/templates/nx/packages/matchers/e2e/specs/ElementMatchers/TC-0004-states-and-attributes/web.test.ts +29 -29
- package/templates/nx/packages/matchers/e2e/specs/EnvironmentConfig/TC-0019-read-custom-environment-variable/common.test.ts +5 -0
- package/templates/nx/packages/matchers/e2e/specs/EnvironmentConfig/TC-0019-read-custom-environment-variable/spec.md +16 -0
- package/templates/nx/packages/matchers/e2e/specs/EnvironmentConfig/suite.md +9 -0
- package/templates/nx/packages/playground/e2e/specs/Playground/TC-0001-form-controls/mobile.test.ts +3 -3
- package/templates/nx/packages/playground/e2e/specs/Playground/TC-0001-form-controls/web.test.ts +6 -6
- package/templates/nx/packages/playground/e2e/specs/Playground/TC-0002-toggle-elements/mobile.test.ts +3 -3
- package/templates/nx/packages/playground/e2e/specs/Playground/TC-0002-toggle-elements/web.test.ts +6 -6
- package/templates/nx/pnpm-lock.yaml +6663 -6663
- package/templates/nx/pnpm-workspace.yaml +9 -9
- package/templates/nx/shared/testing/page-objects/MatchersPage/mobile.ts +33 -33
- package/templates/nx/shared/testing/page-objects/MatchersPage/web.ts +91 -37
- package/templates/nx/shared/testing/page-objects/NavigationPage/mobile.ts +5 -5
- package/templates/nx/shared/testing/page-objects/NavigationPage/web.ts +8 -8
- package/templates/nx/shared/testing/page-objects/PlaygroundPage/mobile.ts +26 -26
- package/templates/nx/shared/testing/page-objects/PlaygroundPage/web.ts +31 -31
- package/templates/nx/shared/testing/project.json +19 -19
- package/templates/nx/shared/testing/support/actions/fillCredentials/mobile.action.ts +4 -4
- package/templates/nx/shared/testing/support/actions/fillCredentials/web.action.ts +4 -4
- package/templates/nx/shared/testing/support/steps/togglePlaygroundStates/mobile.step.ts +3 -3
- package/templates/nx/shared/testing/support/steps/togglePlaygroundStates/web.step.ts +5 -5
- package/templates/nx/shared/testing/support/steps/verifyPlaygroundState/mobile.step.ts +4 -4
- package/templates/nx/shared/testing/support/steps/verifyPlaygroundState/web.step.ts +6 -6
- package/templates/nx/spectra.config.ts +52 -68
- package/templates/react-component/.cursorrules +17 -0
- package/templates/react-component/.vscode/extensions.json +5 -0
- package/templates/react-component/CLAUDE.md +14 -0
- package/templates/react-component/README.md +69 -0
- package/templates/react-component/fixtures/component-mock.json +12 -0
- package/templates/react-component/global-hooks/after/web.hook.ts +3 -0
- package/templates/react-component/global-hooks/before/web.hook.ts +3 -0
- package/templates/react-component/package.json +27 -0
- package/templates/react-component/page-objects/BadgeComponent/web.ts +23 -0
- package/templates/react-component/page-objects/ButtonComponent/web.ts +23 -0
- package/templates/react-component/page-objects/InputComponent/web.ts +13 -0
- package/templates/react-component/specs/BadgeComponent/TC-0002-badge-severities-and-dot/spec.md +18 -0
- package/templates/react-component/specs/BadgeComponent/TC-0002-badge-severities-and-dot/web.test.tsx +11 -0
- package/templates/react-component/specs/BadgeComponent/TC-0006-badge-success-with-dot/spec.md +18 -0
- package/templates/react-component/specs/BadgeComponent/TC-0006-badge-success-with-dot/web.test.tsx +10 -0
- package/templates/react-component/specs/BadgeComponent/TC-0007-badge-by-severity-lookup/spec.md +18 -0
- package/templates/react-component/specs/BadgeComponent/TC-0007-badge-by-severity-lookup/web.test.tsx +16 -0
- package/templates/react-component/specs/BadgeComponent/suite.md +12 -0
- package/templates/react-component/specs/ButtonComponent/TC-0001-button-rendering-and-click/spec.md +19 -0
- package/templates/react-component/specs/ButtonComponent/TC-0001-button-rendering-and-click/web.test.tsx +28 -0
- package/templates/react-component/specs/ButtonComponent/TC-0004-disabled-button-not-clickable/spec.md +19 -0
- package/templates/react-component/specs/ButtonComponent/TC-0004-disabled-button-not-clickable/web.test.tsx +22 -0
- package/templates/react-component/specs/ButtonComponent/TC-0005-button-renders-icon/spec.md +18 -0
- package/templates/react-component/specs/ButtonComponent/TC-0005-button-renders-icon/web.test.tsx +8 -0
- package/templates/react-component/specs/ButtonComponent/suite.md +12 -0
- package/templates/react-component/specs/InputComponent/TC-0003-input-typing-and-clear/spec.md +20 -0
- package/templates/react-component/specs/InputComponent/TC-0003-input-typing-and-clear/web.test.tsx +28 -0
- package/templates/react-component/specs/InputComponent/TC-0008-disabled-input-not-editable/spec.md +18 -0
- package/templates/react-component/specs/InputComponent/TC-0008-disabled-input-not-editable/web.test.tsx +9 -0
- package/templates/react-component/specs/InputComponent/suite.md +12 -0
- package/templates/react-component/spectra.config.ts +27 -0
- package/templates/react-component/src/components/Badge/Badge.tsx +60 -0
- package/templates/react-component/src/components/Button/Button.tsx +57 -0
- package/templates/react-component/src/components/Input/Input.tsx +41 -0
- package/templates/react-component/src/test-utils.tsx +23 -0
- package/templates/react-component/support/actions/fillInputField/web.action.ts +9 -0
- package/templates/react-component/support/steps/verifyButtonState/web.step.ts +12 -0
- package/templates/react-component/tsconfig.json +8 -0
- package/bin/testspectra-runner +0 -0
- package/demo-app/assets/index-DPfv5_EF.js +0 -116
- package/demo-app/assets/index-gIwu2EMV.css +0 -1
- package/dist/commands/__tests__/cloud-run.test.js +0 -93
- package/dist/commands/cloud-run.d.ts +0 -13
- package/dist/commands/cloud-run.js +0 -120
- package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/mobile.test.ts +0 -17
- package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/web.test.ts +0 -17
- /package/dist/{commands/__tests__/cloud-run.test.d.ts → linter/__tests__/anonymous-export.test.d.ts} +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
packages:
|
|
2
|
-
- "packages/**/*"
|
|
3
|
-
- "shared/**/*"
|
|
4
|
-
allowBuilds:
|
|
5
|
-
chromedriver: true
|
|
6
|
-
edgedriver: true
|
|
7
|
-
esbuild: true
|
|
8
|
-
geckodriver: true
|
|
9
|
-
nx: true
|
|
1
|
+
packages:
|
|
2
|
+
- "packages/**/*"
|
|
3
|
+
- "shared/**/*"
|
|
4
|
+
allowBuilds:
|
|
5
|
+
chromedriver: true
|
|
6
|
+
edgedriver: true
|
|
7
|
+
esbuild: true
|
|
8
|
+
geckodriver: true
|
|
9
|
+
nx: true
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
|
|
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 submitButton() { return Spectra.get("~submit_button"); }
|
|
6
|
-
get disabledButton() { return Spectra.get("~disabled_button"); }
|
|
7
|
-
get checkbox() { return Spectra.get("~checkbox"); }
|
|
8
|
-
get radio() { return Spectra.get("~radio"); }
|
|
9
|
-
get emailInput() { return Spectra.get("~email_input"); }
|
|
10
|
-
get tokenInput() { return Spectra.get("~token_input"); }
|
|
11
|
-
get exactText() { return Spectra.get("~exact_text"); }
|
|
12
|
-
get partialText() { return Spectra.get("~partial_text"); }
|
|
13
|
-
get activeTab() { return Spectra.get("~active_tab"); }
|
|
14
|
-
get navLink() { return Spectra.get("~nav_link"); }
|
|
15
|
-
get productCards() { return Spectra.getAll("~product_card"); }
|
|
16
|
-
get emptyList() { return Spectra.getAll("~empty_list"); }
|
|
17
|
-
|
|
18
|
-
// API Demo elements
|
|
19
|
-
get fetchApiButton() { return Spectra.get("~fetch_api_btn"); }
|
|
20
|
-
get fetchStatusBadge() { return Spectra.get("~fetch_status_badge"); }
|
|
21
|
-
get fetchedItems() { return Spectra.getAll("~api_fetched_item"); }
|
|
22
|
-
get fetchLoadingIndicator() { return Spectra.get("~fetch_loading_indicator"); }
|
|
23
|
-
get postTitleInput() { return Spectra.get("~post_input_title"); }
|
|
24
|
-
get postBodyInput() { return Spectra.get("~post_input_body"); }
|
|
25
|
-
get submitPostButton() { return Spectra.get("~submit_post_btn"); }
|
|
26
|
-
get postStatusBadge() { return Spectra.get("~post_status_badge"); }
|
|
27
|
-
get postSuccessBanner() { return Spectra.get("~post_success_banner"); }
|
|
28
|
-
get postResponseJson() { return Spectra.get("~post_response_json"); }
|
|
29
|
-
|
|
30
|
-
async open(_section = "") {}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export default new MatchersPage();
|
|
1
|
+
class MatchersPage {
|
|
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 submitButton() { return Spectra.get("~submit_button"); }
|
|
6
|
+
get disabledButton() { return Spectra.get("~disabled_button"); }
|
|
7
|
+
get checkbox() { return Spectra.get("~checkbox"); }
|
|
8
|
+
get radio() { return Spectra.get("~radio"); }
|
|
9
|
+
get emailInput() { return Spectra.get("~email_input"); }
|
|
10
|
+
get tokenInput() { return Spectra.get("~token_input"); }
|
|
11
|
+
get exactText() { return Spectra.get("~exact_text"); }
|
|
12
|
+
get partialText() { return Spectra.get("~partial_text"); }
|
|
13
|
+
get activeTab() { return Spectra.get("~active_tab"); }
|
|
14
|
+
get navLink() { return Spectra.get("~nav_link"); }
|
|
15
|
+
get productCards() { return Spectra.getAll("~product_card"); }
|
|
16
|
+
get emptyList() { return Spectra.getAll("~empty_list"); }
|
|
17
|
+
|
|
18
|
+
// API Demo elements
|
|
19
|
+
get fetchApiButton() { return Spectra.get("~fetch_api_btn"); }
|
|
20
|
+
get fetchStatusBadge() { return Spectra.get("~fetch_status_badge"); }
|
|
21
|
+
get fetchedItems() { return Spectra.getAll("~api_fetched_item"); }
|
|
22
|
+
get fetchLoadingIndicator() { return Spectra.get("~fetch_loading_indicator"); }
|
|
23
|
+
get postTitleInput() { return Spectra.get("~post_input_title"); }
|
|
24
|
+
get postBodyInput() { return Spectra.get("~post_input_body"); }
|
|
25
|
+
get submitPostButton() { return Spectra.get("~submit_post_btn"); }
|
|
26
|
+
get postStatusBadge() { return Spectra.get("~post_status_badge"); }
|
|
27
|
+
get postSuccessBanner() { return Spectra.get("~post_success_banner"); }
|
|
28
|
+
get postResponseJson() { return Spectra.get("~post_response_json"); }
|
|
29
|
+
|
|
30
|
+
async open(_section = "") {}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export default new MatchersPage();
|
|
@@ -1,37 +1,91 @@
|
|
|
1
|
-
|
|
2
|
-
get visibleElement() {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
get
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
get
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
get
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
get
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
get
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
get
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
get
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
get
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
1
|
+
class MatchersPage {
|
|
2
|
+
get visibleElement() {
|
|
3
|
+
return Spectra.get("#demo-visible-el");
|
|
4
|
+
}
|
|
5
|
+
get hiddenElement() {
|
|
6
|
+
return Spectra.get("#demo-hidden-el");
|
|
7
|
+
}
|
|
8
|
+
get existingElement() {
|
|
9
|
+
return Spectra.get("#demo-existing-el");
|
|
10
|
+
}
|
|
11
|
+
get submitButton() {
|
|
12
|
+
return Spectra.get("#demo-submit-btn");
|
|
13
|
+
}
|
|
14
|
+
get disabledButton() {
|
|
15
|
+
return Spectra.get("#demo-disabled-btn");
|
|
16
|
+
}
|
|
17
|
+
get checkbox() {
|
|
18
|
+
return Spectra.get("#demo-checkbox");
|
|
19
|
+
}
|
|
20
|
+
get radio() {
|
|
21
|
+
return Spectra.get("#demo-radio");
|
|
22
|
+
}
|
|
23
|
+
get emailInput() {
|
|
24
|
+
return Spectra.get("#demo-email-input");
|
|
25
|
+
}
|
|
26
|
+
get tokenInput() {
|
|
27
|
+
return Spectra.get("#demo-token-input");
|
|
28
|
+
}
|
|
29
|
+
get exactText() {
|
|
30
|
+
return Spectra.get("#demo-exact-text");
|
|
31
|
+
}
|
|
32
|
+
get partialText() {
|
|
33
|
+
return Spectra.get("#demo-partial-text");
|
|
34
|
+
}
|
|
35
|
+
get activeTab() {
|
|
36
|
+
return Spectra.get("#demo-active-tab");
|
|
37
|
+
}
|
|
38
|
+
get navLink() {
|
|
39
|
+
return Spectra.get("#demo-nav-link");
|
|
40
|
+
}
|
|
41
|
+
get styledElement() {
|
|
42
|
+
return Spectra.get("#demo-styled-el");
|
|
43
|
+
}
|
|
44
|
+
get focusInput() {
|
|
45
|
+
return Spectra.get("#demo-focus-input");
|
|
46
|
+
}
|
|
47
|
+
get productCards() {
|
|
48
|
+
return Spectra.getAll(".demo-product-card");
|
|
49
|
+
}
|
|
50
|
+
get emptyList() {
|
|
51
|
+
return Spectra.getAll("#demo-empty-list > *");
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// API Interception & Mocking elements
|
|
55
|
+
get fetchApiButton() {
|
|
56
|
+
return Spectra.get("#fetch-api-btn");
|
|
57
|
+
}
|
|
58
|
+
get fetchStatusBadge() {
|
|
59
|
+
return Spectra.get("#fetch-status-badge");
|
|
60
|
+
}
|
|
61
|
+
get fetchedItems() {
|
|
62
|
+
return Spectra.getAll(".api-fetched-item");
|
|
63
|
+
}
|
|
64
|
+
get fetchLoadingIndicator() {
|
|
65
|
+
return Spectra.get("#fetch-loading-indicator");
|
|
66
|
+
}
|
|
67
|
+
get postTitleInput() {
|
|
68
|
+
return Spectra.get("#post-input-title");
|
|
69
|
+
}
|
|
70
|
+
get postBodyInput() {
|
|
71
|
+
return Spectra.get("#post-input-body");
|
|
72
|
+
}
|
|
73
|
+
get submitPostButton() {
|
|
74
|
+
return Spectra.get("#submit-post-btn");
|
|
75
|
+
}
|
|
76
|
+
get postStatusBadge() {
|
|
77
|
+
return Spectra.get("#post-status-badge");
|
|
78
|
+
}
|
|
79
|
+
get postSuccessBanner() {
|
|
80
|
+
return Spectra.get("#post-success-banner");
|
|
81
|
+
}
|
|
82
|
+
get postResponseJson() {
|
|
83
|
+
return Spectra.get("#post-response-json");
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async open(section = "") {
|
|
87
|
+
await Spectra.navigate("/" + (section ? "#" + section : ""));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export default new MatchersPage();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
get sidebarLinks() { return Spectra.getAll("~sidebar_link"); }
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
export default new NavigationPage();
|
|
1
|
+
class NavigationPage {
|
|
2
|
+
get sidebarLinks() { return Spectra.getAll("~sidebar_link"); }
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export default new NavigationPage();
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
get sidebarLinks() { return Spectra.getAll("aside a"); }
|
|
3
|
-
get overviewLink() { return Spectra.get("aside a[href='#overview']"); }
|
|
4
|
-
get visibilityLink() { return Spectra.get("aside a[href='#visibility']"); }
|
|
5
|
-
get playgroundLink() { return Spectra.get("aside a[href='#playground']"); }
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export default new NavigationPage();
|
|
1
|
+
class NavigationPage {
|
|
2
|
+
get sidebarLinks() { return Spectra.getAll("aside a"); }
|
|
3
|
+
get overviewLink() { return Spectra.get("aside a[href='#overview']"); }
|
|
4
|
+
get visibilityLink() { return Spectra.get("aside a[href='#visibility']"); }
|
|
5
|
+
get playgroundLink() { return Spectra.get("aside a[href='#playground']"); }
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export default new NavigationPage();
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
|
|
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 removedElement() { return Spectra.get("~removed_element"); }
|
|
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"); }
|
|
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 productItems() { return Spectra.getAll("~product_item"); }
|
|
17
|
-
get emptyList() { return Spectra.getAll("~empty_list"); }
|
|
18
|
-
|
|
19
|
-
async open() {}
|
|
20
|
-
async fillCredentials(email = Fixture.playgroundData.defaultEmail, token = Fixture.playgroundData.defaultToken) {
|
|
21
|
-
await this.emailInput.type(email);
|
|
22
|
-
await this.tokenInput.type(token);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export default new PlaygroundPage();
|
|
1
|
+
class PlaygroundPage {
|
|
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 removedElement() { return Spectra.get("~removed_element"); }
|
|
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"); }
|
|
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 productItems() { return Spectra.getAll("~product_item"); }
|
|
17
|
+
get emptyList() { return Spectra.getAll("~empty_list"); }
|
|
18
|
+
|
|
19
|
+
async open() {}
|
|
20
|
+
async fillCredentials(email = Fixture.playgroundData.defaultEmail, token = Fixture.playgroundData.defaultToken) {
|
|
21
|
+
await this.emailInput.type(email);
|
|
22
|
+
await this.tokenInput.type(token);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export default new PlaygroundPage();
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
get visibleElement() { return Spectra.get("#demo-visible-el-pg"); }
|
|
3
|
-
get hiddenElement() { return Spectra.get("#demo-hidden-el-pg"); }
|
|
4
|
-
get existingElement() { return Spectra.get("#demo-existing-el-pg"); }
|
|
5
|
-
get removedElement() { return Spectra.get("#demo-removed-el-pg"); }
|
|
6
|
-
get enabledButton() { return Spectra.get("#demo-enabled-btn"); }
|
|
7
|
-
get disabledButton() { return Spectra.get("#demo-disabled-btn-pg"); }
|
|
8
|
-
get termsCheckbox() { return Spectra.get("#demo-terms-checkbox"); }
|
|
9
|
-
get modeRadio() { return Spectra.get("#demo-mode-radio"); }
|
|
10
|
-
get emailInput() { return Spectra.get("#demo-email-input-pg"); }
|
|
11
|
-
get tokenInput() { return Spectra.get("#demo-token-input-pg"); }
|
|
12
|
-
get exactText() { return Spectra.get("#demo-exact-text-pg"); }
|
|
13
|
-
get partialText() { return Spectra.get("#demo-partial-text-pg"); }
|
|
14
|
-
get activeTab() { return Spectra.get("#demo-active-tab-pg"); }
|
|
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"); }
|
|
18
|
-
get productItems() { return Spectra.getAll(".demo-product-item"); }
|
|
19
|
-
get emptyList() { return Spectra.getAll("#demo-empty-list-pg > *"); }
|
|
20
|
-
|
|
21
|
-
async open() {
|
|
22
|
-
await
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
async fillCredentials(email = Fixture.playgroundData.defaultEmail, token = Fixture.playgroundData.defaultToken) {
|
|
26
|
-
await this.emailInput.type(email);
|
|
27
|
-
await this.tokenInput.type(token);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export default new PlaygroundPage();
|
|
1
|
+
class PlaygroundPage {
|
|
2
|
+
get visibleElement() { return Spectra.get("#demo-visible-el-pg"); }
|
|
3
|
+
get hiddenElement() { return Spectra.get("#demo-hidden-el-pg"); }
|
|
4
|
+
get existingElement() { return Spectra.get("#demo-existing-el-pg"); }
|
|
5
|
+
get removedElement() { return Spectra.get("#demo-removed-el-pg"); }
|
|
6
|
+
get enabledButton() { return Spectra.get("#demo-enabled-btn"); }
|
|
7
|
+
get disabledButton() { return Spectra.get("#demo-disabled-btn-pg"); }
|
|
8
|
+
get termsCheckbox() { return Spectra.get("#demo-terms-checkbox"); }
|
|
9
|
+
get modeRadio() { return Spectra.get("#demo-mode-radio"); }
|
|
10
|
+
get emailInput() { return Spectra.get("#demo-email-input-pg"); }
|
|
11
|
+
get tokenInput() { return Spectra.get("#demo-token-input-pg"); }
|
|
12
|
+
get exactText() { return Spectra.get("#demo-exact-text-pg"); }
|
|
13
|
+
get partialText() { return Spectra.get("#demo-partial-text-pg"); }
|
|
14
|
+
get activeTab() { return Spectra.get("#demo-active-tab-pg"); }
|
|
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"); }
|
|
18
|
+
get productItems() { return Spectra.getAll(".demo-product-item"); }
|
|
19
|
+
get emptyList() { return Spectra.getAll("#demo-empty-list-pg > *"); }
|
|
20
|
+
|
|
21
|
+
async open() {
|
|
22
|
+
await Spectra.navigate("/#playground");
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async fillCredentials(email = Fixture.playgroundData.defaultEmail, token = Fixture.playgroundData.defaultToken) {
|
|
26
|
+
await this.emailInput.type(email);
|
|
27
|
+
await this.tokenInput.type(token);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export default new PlaygroundPage();
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "shared-testing",
|
|
3
|
-
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
|
4
|
-
"projectType": "library",
|
|
5
|
-
"sourceRoot": "shared/testing",
|
|
6
|
-
"targets": {
|
|
7
|
-
"type-check": {
|
|
8
|
-
"executor": "nx:run-commands",
|
|
9
|
-
"options": {
|
|
10
|
-
"command": "tsc -b",
|
|
11
|
-
"cwd": "."
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
},
|
|
15
|
-
"tags": [
|
|
16
|
-
"scope:shared",
|
|
17
|
-
"type:shared"
|
|
18
|
-
]
|
|
19
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "shared-testing",
|
|
3
|
+
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
|
4
|
+
"projectType": "library",
|
|
5
|
+
"sourceRoot": "shared/testing",
|
|
6
|
+
"targets": {
|
|
7
|
+
"type-check": {
|
|
8
|
+
"executor": "nx:run-commands",
|
|
9
|
+
"options": {
|
|
10
|
+
"command": "tsc -b",
|
|
11
|
+
"cwd": "."
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"tags": [
|
|
16
|
+
"scope:shared",
|
|
17
|
+
"type:shared"
|
|
18
|
+
]
|
|
19
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export default async function
|
|
2
|
-
await this.get("~email_input").type(email);
|
|
3
|
-
await this.get("~token_input").type(token);
|
|
4
|
-
}
|
|
1
|
+
export default async function (this: any, email: string, token: string) {
|
|
2
|
+
await this.get("~email_input").type(email);
|
|
3
|
+
await this.get("~token_input").type(token);
|
|
4
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export default async function
|
|
2
|
-
await this.get("#demo-email-input-pg").type(email);
|
|
3
|
-
await this.get("#demo-token-input-pg").type(token);
|
|
4
|
-
}
|
|
1
|
+
export default async function (this: any, email: string, token: string) {
|
|
2
|
+
await this.get("#demo-email-input-pg").type(email);
|
|
3
|
+
await this.get("#demo-token-input-pg").type(token);
|
|
4
|
+
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export default async function
|
|
2
|
-
await PlaygroundPage.open();
|
|
3
|
-
}
|
|
1
|
+
export default async function () {
|
|
2
|
+
await PlaygroundPage.open();
|
|
3
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export default async function
|
|
2
|
-
await PlaygroundPage.open();
|
|
3
|
-
await PlaygroundPage.hiddenElement.shouldBeVisible();
|
|
4
|
-
await PlaygroundPage.existingElement.shouldExist();
|
|
5
|
-
}
|
|
1
|
+
export default async function () {
|
|
2
|
+
await PlaygroundPage.open();
|
|
3
|
+
await PlaygroundPage.hiddenElement.shouldBeVisible();
|
|
4
|
+
await PlaygroundPage.existingElement.shouldExist();
|
|
5
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export default async function
|
|
2
|
-
await PlaygroundPage.open();
|
|
3
|
-
await PlaygroundPage.visibleElement.shouldBeVisible();
|
|
4
|
-
}
|
|
1
|
+
export default async function () {
|
|
2
|
+
await PlaygroundPage.open();
|
|
3
|
+
await PlaygroundPage.visibleElement.shouldBeVisible();
|
|
4
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export default async function
|
|
2
|
-
await PlaygroundPage.open();
|
|
3
|
-
await PlaygroundPage.visibleElement.shouldBeVisible();
|
|
4
|
-
await PlaygroundPage.enabledButton.shouldBeEnabled();
|
|
5
|
-
await PlaygroundPage.termsCheckbox.shouldBeChecked();
|
|
6
|
-
}
|
|
1
|
+
export default async function () {
|
|
2
|
+
await PlaygroundPage.open();
|
|
3
|
+
await PlaygroundPage.visibleElement.shouldBeVisible();
|
|
4
|
+
await PlaygroundPage.enabledButton.shouldBeEnabled();
|
|
5
|
+
await PlaygroundPage.termsCheckbox.shouldBeChecked();
|
|
6
|
+
}
|
|
@@ -1,68 +1,52 @@
|
|
|
1
|
-
import { defineConfig } from "@testspectra/cli";
|
|
2
|
-
|
|
3
|
-
export default defineConfig({
|
|
4
|
-
webConfig: {
|
|
5
|
-
baseUrl: "http://localhost:5173",
|
|
6
|
-
maxConcurrentSessions: "1",
|
|
7
|
-
headless: true,
|
|
8
|
-
implicitWait: "5000",
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
],
|
|
54
|
-
},
|
|
55
|
-
loadConfig: {
|
|
56
|
-
virtualUsers: "10",
|
|
57
|
-
duration: "1m",
|
|
58
|
-
},
|
|
59
|
-
loadStages: [],
|
|
60
|
-
thresholds: [],
|
|
61
|
-
executionConfig: {
|
|
62
|
-
networkMonitoringEnabled: true,
|
|
63
|
-
fastResponseTime: "200",
|
|
64
|
-
normalResponseTime: "1000",
|
|
65
|
-
monitoredDomains: [],
|
|
66
|
-
environmentVariables: [],
|
|
67
|
-
},
|
|
68
|
-
});
|
|
1
|
+
import { defineConfig } from "@testspectra/cli";
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
webConfig: {
|
|
5
|
+
baseUrl: "http://localhost:5173",
|
|
6
|
+
maxConcurrentSessions: "1",
|
|
7
|
+
headless: true,
|
|
8
|
+
implicitWait: "5000",
|
|
9
|
+
parallelizationMode: "testcase",
|
|
10
|
+
},
|
|
11
|
+
androidConfig: {
|
|
12
|
+
driverServer: "tcp://127.0.0.1:8200",
|
|
13
|
+
appPackage: "",
|
|
14
|
+
appActivity: "",
|
|
15
|
+
noReset: false,
|
|
16
|
+
implicitWait: "10000",
|
|
17
|
+
parallelizationMode: "suite",
|
|
18
|
+
devices: [
|
|
19
|
+
{
|
|
20
|
+
id: "emulator-5554",
|
|
21
|
+
name: "Pixel 7 Pro Emulator",
|
|
22
|
+
version: "14.0",
|
|
23
|
+
systemPort: 8200,
|
|
24
|
+
},
|
|
25
|
+
],
|
|
26
|
+
},
|
|
27
|
+
iosConfig: {
|
|
28
|
+
appiumServer: "http://127.0.0.1:4723",
|
|
29
|
+
automationName: "XCUITest",
|
|
30
|
+
bundleId: "",
|
|
31
|
+
autoAcceptAlerts: true,
|
|
32
|
+
noReset: false,
|
|
33
|
+
implicitWait: "10000",
|
|
34
|
+
parallelizationMode: "suite",
|
|
35
|
+
devices: [
|
|
36
|
+
{
|
|
37
|
+
id: "iphone-15-pro",
|
|
38
|
+
name: "iPhone 15 Pro Simulator",
|
|
39
|
+
version: "17.0",
|
|
40
|
+
udid: "auto",
|
|
41
|
+
wdaLocalPort: 8100,
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
},
|
|
45
|
+
executionConfig: {
|
|
46
|
+
networkMonitoringEnabled: true,
|
|
47
|
+
fastResponseTime: "200",
|
|
48
|
+
normalResponseTime: "1000",
|
|
49
|
+
monitoredDomains: [],
|
|
50
|
+
environmentVariables: { DEMO_API_MODE: "sandbox" },
|
|
51
|
+
},
|
|
52
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# TestSpectra AI Instructions for Cursor
|
|
2
|
+
|
|
3
|
+
You are developing automated tests and React components with the TestSpectra testing framework.
|
|
4
|
+
|
|
5
|
+
## Key Rules & Conventions
|
|
6
|
+
1. **Zero-Import Standard**: Never add manual `import` statements for Page/Component Objects (`ButtonComponent`, `BadgeComponent`, `InputComponent`), Steps (`Step.*`), Fixtures (`Fixture.*`), or Actions (`Spectra.*`). All typings are provided globally and ambiently via `.testspectra/types/`.
|
|
7
|
+
2. **Component Testing Pattern**: Mount React components using `await Spectra.mount(<Component />)` (real JSX and static component imports are allowed in `*.test.tsx` files, unlike zero-import `*.web.test.ts` E2E specs), then inspect and interact using `Spectra.get(...)` / `Spectra.getAll(...)` or Page/Component Objects. Each `Spectra.mount()` call replaces the previous mount automatically — no cleanup command needed. Run via `spectra test` (a separate suite from E2E's `spectra run`).
|
|
8
|
+
3. **Platform Separation**:
|
|
9
|
+
- `web.test.ts` / `web.test.tsx` / `web.ts`: Web / Browser component implementations.
|
|
10
|
+
- `common.test.ts` / `common.ts`: Cross-platform shared implementations.
|
|
11
|
+
4. **CamelCase Naming Convention**:
|
|
12
|
+
- Component Objects (`page-objects/ButtonComponent/`, `page-objects/BadgeComponent/`)
|
|
13
|
+
- Reusable Actions (`support/actions/fillInputField/`)
|
|
14
|
+
- Reusable Steps (`support/steps/verifyButtonState/`)
|
|
15
|
+
5. **Spec-as-Code**:
|
|
16
|
+
- Suites are defined in `specs/<suite-name>/suite.md` with YAML frontmatter (`id`, `name`, `executionOrder`, `tags`).
|
|
17
|
+
- Test cases are defined in `specs/<suite-name>/<TC-ID-slug>/spec.md` with YAML frontmatter (`id`, `title`, `priority`, `coverage`).
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# TestSpectra React Component Testing Workspace
|
|
2
|
+
|
|
3
|
+
## Commands
|
|
4
|
+
- `pnpm test` or `spectra test` — Run the component test suite (bundled Vitest browser mode via `@testspectra/react`)
|
|
5
|
+
- `pnpm run test:headed` — Run component tests with a visible browser window
|
|
6
|
+
- `pnpm run sync-types` — Scan workspace and regenerate ambient `.testspectra/types/`
|
|
7
|
+
- `pnpm run type-check` — Type check with `tsc -b`
|
|
8
|
+
|
|
9
|
+
## Architecture Rules
|
|
10
|
+
|
|
11
|
+
1. Zero-import standard for `Spectra.*`, `ButtonComponent`, `BadgeComponent`, `InputComponent`, `Step.*`, and `Fixture.*` — these stay ambient globals, auto-discovered from `page-objects/`, `support/steps/`, and `fixtures/`.
|
|
12
|
+
2. Component testing uses `Spectra.mount(<Component />)` — real JSX, real static imports for the component under test are allowed and expected in `*.test.tsx` files (unlike `*.web.test.ts` E2E specs). `Spectra.mount()` always replaces whatever was previously mounted; no manual cleanup call is needed between tests.
|
|
13
|
+
3. Component tests are a **separate test suite** from E2E (`spectra run`) — they live in `specs/<Suite>/<TC-ID>/web.test.tsx` alongside `spec.md`, run via `spectra test`, not `spectra run`. See `docs/v2/features/component-testing/react/`.
|
|
14
|
+
4. Assertions use the same TestSpectra DSL as E2E (`Spectra.get().shouldBeVisible()`, `.shouldHaveText()`, etc.) — nothing new to learn beyond `Spectra.mount()`.
|