@testspectra/cli 1.1.8-rc.2 → 1.1.8-rc.20
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/README.md +47 -0
- package/bin/spectra.js +0 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/commands/__tests__/run-e2e.test.js +49 -49
- package/dist/commands/add.js +2 -1
- package/dist/commands/devices.js +1 -0
- package/dist/commands/doctor.js +1 -0
- package/dist/commands/init.js +150 -149
- package/dist/commands/install.js +2 -0
- package/dist/commands/license.js +1 -0
- package/dist/commands/test.js +5 -3
- package/dist/generator/__tests__/tsconfig-isolation.test.js +2 -1
- package/dist/generator/__tests__/type-generator.test.js +38 -0
- package/dist/generator/tsconfig-generator.js +1 -1
- package/dist/generator/type-generator.d.ts +5 -2
- package/dist/generator/type-generator.js +14 -17
- package/dist/index.js +11 -11
- package/dist/linter/__tests__/component-test-imports.test.js +51 -51
- package/dist/linter/__tests__/shared-lib-boundary.test.js +15 -15
- package/dist/linter/__tests__/spec-schema.test.js +167 -167
- package/dist/linter/discovery.d.ts +3 -3
- package/dist/linter/discovery.js +5 -5
- package/dist/linter/schemas/spec.schema.d.ts +2 -2
- package/dist/linter/schemas/suite.schema.d.ts +4 -4
- package/dist/runner/bridge.js +53 -4
- package/package.json +34 -29
- package/templates/default/CLAUDE.md +16 -16
- 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 +2 -2
- package/templates/default/page-objects/AuthPage/mobile.ts +5 -5
- package/templates/default/page-objects/AuthPage/web.ts +10 -10
- package/templates/default/page-objects/MatchersPage/mobile.ts +70 -70
- package/templates/default/page-objects/MatchersPage/web.ts +43 -43
- 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 -42
- package/templates/default/page-objects/PlaygroundPage/web.ts +31 -31
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/mobile.test.ts +53 -53
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/spec.md +19 -19
- package/templates/default/specs/ApiInterception/TC-0008-fetch-mocking/web.test.ts +31 -31
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/android.test.ts +3 -3
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/common.test.ts +3 -3
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/mobile.test.ts +27 -27
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/spec.md +19 -19
- package/templates/default/specs/ApiInterception/TC-0009-post-mocking/web.test.ts +26 -26
- package/templates/default/specs/ApiInterception/TC-0012-direct-and-late-response/common.test.ts +30 -30
- package/templates/default/specs/ApiInterception/TC-0012-direct-and-late-response/spec.md +22 -22
- package/templates/default/specs/ApiInterception/TC-0013-real-network-call-recorded/common.test.ts +27 -27
- package/templates/default/specs/ApiInterception/TC-0013-real-network-call-recorded/spec.md +20 -20
- package/templates/default/specs/ApiInterception/TC-0015-mock-server-sent-events/spec.md +24 -24
- package/templates/default/specs/ApiInterception/TC-0015-mock-server-sent-events/web.test.ts +26 -26
- package/templates/default/specs/ApiInterception/TC-0016-bypass-websocket-with-app-level-mock/spec.md +37 -37
- package/templates/default/specs/ApiInterception/TC-0016-bypass-websocket-with-app-level-mock/web.test.ts +21 -21
- package/templates/default/specs/ApiInterception/TC-0017-bypass-captcha-with-test-mode-flag/spec.md +29 -29
- package/templates/default/specs/ApiInterception/TC-0017-bypass-captcha-with-test-mode-flag/web.test.ts +16 -16
- package/templates/default/specs/ApiInterception/suite.md +10 -10
- package/templates/default/specs/ApiSeeding/TC-0014-seed-and-cleanup-via-hooks/common.test.ts +30 -30
- package/templates/default/specs/ApiSeeding/TC-0014-seed-and-cleanup-via-hooks/spec.md +23 -23
- package/templates/default/specs/ApiSeeding/hooks/after/common.hook.ts +16 -16
- package/templates/default/specs/ApiSeeding/hooks/before/common.hook.ts +28 -28
- package/templates/default/specs/ApiSeeding/suite.md +9 -9
- package/templates/default/specs/Authentication/TC-0021-seed-authenticated-session/mobile.test.ts +7 -7
- package/templates/default/specs/Authentication/TC-0021-seed-authenticated-session/spec.md +19 -19
- package/templates/default/specs/Authentication/TC-0021-seed-authenticated-session/web.test.ts +9 -9
- package/templates/default/specs/Authentication/suite.md +9 -9
- 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 -17
- 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 -17
- package/templates/default/specs/BrowserContext/TC-0022-history-navigation/spec.md +28 -28
- package/templates/default/specs/BrowserContext/TC-0022-history-navigation/web.test.ts +26 -26
- package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/common.test.ts +26 -26
- package/templates/default/specs/ContentMatchers/TC-0005-text-and-values/spec.md +19 -19
- 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 -17
- 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 -14
- package/templates/default/specs/ContentMatchers/TC-0020-scoped-element-access/spec.md +21 -21
- package/templates/default/specs/DeepLink/TC-0018-navigate-via-deep-link/mobile.test.ts +28 -28
- package/templates/default/specs/DeepLink/TC-0018-navigate-via-deep-link/spec.md +29 -29
- package/templates/default/specs/DeepLink/suite.md +9 -9
- 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 -17
- 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 -19
- package/templates/default/specs/ElementMatchers/TC-0004-states-and-attributes/web.test.ts +29 -29
- package/templates/default/specs/ElementMatchers/suite.md +10 -10
- package/templates/default/specs/EnvironmentConfig/TC-0019-read-custom-environment-variable/common.test.ts +5 -5
- package/templates/default/specs/EnvironmentConfig/TC-0019-read-custom-environment-variable/spec.md +16 -16
- package/templates/default/specs/EnvironmentConfig/suite.md +9 -9
- package/templates/default/specs/PermissionRationale/TC-0010-camera-permission-allow/mobile.test.ts +26 -26
- package/templates/default/specs/PermissionRationale/TC-0010-camera-permission-allow/spec.md +22 -22
- package/templates/default/specs/PermissionRationale/TC-0011-camera-permission-deny/mobile.test.ts +13 -13
- package/templates/default/specs/PermissionRationale/TC-0011-camera-permission-deny/spec.md +20 -20
- package/templates/default/specs/PermissionRationale/suite.md +9 -9
- 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 -18
- 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 -18
- package/templates/default/specs/Playground/TC-0002-toggle-elements/web.test.ts +6 -6
- package/templates/default/spectra.config.ts +52 -52
- 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 -9
- package/templates/default/support/actions/seedSession/web.action.ts +13 -13
- 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-shm → 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 +6269 -1577
- package/templates/nx/.nx/workspace-data/file-map.json +129 -129
- package/templates/nx/.nx/workspace-data/lockfile.hash +1 -1
- package/templates/nx/.nx/workspace-data/nx_files.nxt +0 -0
- package/templates/nx/.nx/workspace-data/parsed-lock-file.json +535 -535
- package/templates/nx/.nx/workspace-data/project-graph.json +589 -590
- package/templates/nx/CLAUDE.md +10 -10
- package/templates/nx/package.json +2 -2
- package/templates/nx/packages/matchers/e2e/project.json +2 -2
- package/templates/nx/packages/matchers/e2e/specs/ApiInterception/TC-0008-fetch-mocking/mobile.test.ts +27 -27
- 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 -24
- 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 -5
- package/templates/nx/packages/matchers/e2e/specs/EnvironmentConfig/TC-0019-read-custom-environment-variable/spec.md +16 -16
- package/templates/nx/packages/matchers/e2e/specs/EnvironmentConfig/suite.md +9 -9
- package/templates/nx/packages/playground/e2e/project.json +2 -2
- 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 -91
- 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 +18 -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 -52
- package/templates/react-component/.cursorrules +17 -17
- package/templates/react-component/.vscode/extensions.json +5 -5
- package/templates/react-component/CLAUDE.md +14 -14
- package/templates/react-component/README.md +69 -69
- package/templates/react-component/fixtures/component-mock.json +12 -12
- package/templates/react-component/global-hooks/after/web.hook.ts +3 -3
- package/templates/react-component/global-hooks/before/web.hook.ts +3 -3
- package/templates/react-component/package.json +27 -27
- package/templates/react-component/page-objects/BadgeComponent/web.ts +23 -23
- package/templates/react-component/page-objects/ButtonComponent/web.ts +23 -23
- package/templates/react-component/page-objects/InputComponent/web.ts +13 -13
- package/templates/react-component/specs/BadgeComponent/TC-0002-badge-severities-and-dot/spec.md +18 -18
- package/templates/react-component/specs/BadgeComponent/TC-0002-badge-severities-and-dot/web.test.tsx +11 -11
- package/templates/react-component/specs/BadgeComponent/TC-0006-badge-success-with-dot/spec.md +18 -18
- package/templates/react-component/specs/BadgeComponent/TC-0006-badge-success-with-dot/web.test.tsx +10 -10
- package/templates/react-component/specs/BadgeComponent/TC-0007-badge-by-severity-lookup/spec.md +18 -18
- package/templates/react-component/specs/BadgeComponent/TC-0007-badge-by-severity-lookup/web.test.tsx +16 -16
- package/templates/react-component/specs/BadgeComponent/suite.md +12 -12
- package/templates/react-component/specs/ButtonComponent/TC-0001-button-rendering-and-click/spec.md +19 -19
- package/templates/react-component/specs/ButtonComponent/TC-0001-button-rendering-and-click/web.test.tsx +28 -28
- package/templates/react-component/specs/ButtonComponent/TC-0004-disabled-button-not-clickable/spec.md +19 -19
- package/templates/react-component/specs/ButtonComponent/TC-0004-disabled-button-not-clickable/web.test.tsx +22 -22
- package/templates/react-component/specs/ButtonComponent/TC-0005-button-renders-icon/spec.md +18 -18
- package/templates/react-component/specs/ButtonComponent/TC-0005-button-renders-icon/web.test.tsx +8 -8
- package/templates/react-component/specs/ButtonComponent/suite.md +12 -12
- package/templates/react-component/specs/InputComponent/TC-0003-input-typing-and-clear/spec.md +20 -20
- package/templates/react-component/specs/InputComponent/TC-0003-input-typing-and-clear/web.test.tsx +28 -28
- package/templates/react-component/specs/InputComponent/TC-0008-disabled-input-not-editable/spec.md +18 -18
- package/templates/react-component/specs/InputComponent/TC-0008-disabled-input-not-editable/web.test.tsx +9 -9
- package/templates/react-component/specs/InputComponent/suite.md +12 -12
- package/templates/react-component/spectra.config.ts +27 -27
- package/templates/react-component/src/components/Badge/Badge.tsx +60 -60
- package/templates/react-component/src/components/Button/Button.tsx +57 -57
- package/templates/react-component/src/components/Input/Input.tsx +41 -41
- package/templates/react-component/src/test-utils.tsx +23 -23
- package/templates/react-component/support/actions/fillInputField/web.action.ts +9 -9
- package/templates/react-component/support/steps/verifyButtonState/web.step.ts +12 -12
- package/bin/.testspectra-runner.hash +0 -1
- package/bin/testspectra-runner.exe +0 -0
- package/templates/nx/.nx/workspace-data/59842386-c7c4-44ca-b2c2-20e1700bd13d.db-wal +0 -0
- package/templates/nx/.nx/workspace-data/d/server-process.json +0 -3
- /package/templates/nx/.nx/workspace-data/{59842386-c7c4-44ca-b2c2-20e1700bd13d.db → 70094CFD-E89B-57A1-9619-2FC5F4963C54.db} +0 -0
|
@@ -1,17 +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`).
|
|
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`).
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
{
|
|
2
|
-
"recommendations": [
|
|
3
|
-
"testspectra.testspectra-vscode"
|
|
4
|
-
]
|
|
5
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"recommendations": [
|
|
3
|
+
"testspectra.testspectra-vscode"
|
|
4
|
+
]
|
|
5
|
+
}
|
|
@@ -1,14 +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()`.
|
|
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()`.
|
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
# TestSpectra React Component Testing Template
|
|
2
|
-
|
|
3
|
-
A high-performance, real-browser React component testing template powered by **TestSpectra**, **WebdriverIO Browser Runner**, and **Testing Library**.
|
|
4
|
-
|
|
5
|
-
## 🚀 Features
|
|
6
|
-
|
|
7
|
-
- **Direct Component Mounting**: Mount TSX components directly in real Chromium/Blink engines using `@testing-library/react`.
|
|
8
|
-
- **Zero Mock Browser**: Real layout calculations, CSS rendering, focus states, and browser events without JSDOM/HappyDOM limitations.
|
|
9
|
-
- **Fast Vite HMR Core**: Instant test startup powered by Vite bundler inside the browser runner.
|
|
10
|
-
- **TestSpectra Matchers**: Comprehensive semantic assertions (`.shouldBeVisible()`, `.shouldExist()`, `expect(el).toHaveText()`).
|
|
11
|
-
|
|
12
|
-
## 📁 Directory Structure
|
|
13
|
-
|
|
14
|
-
```
|
|
15
|
-
.
|
|
16
|
-
├── spectra.config.ts # TestSpectra centralized configuration
|
|
17
|
-
├── wdio.conf.ts # WebdriverIO Browser Runner + Vite config
|
|
18
|
-
├── tsconfig.json # TypeScript configuration for JSX & runner types
|
|
19
|
-
└── src/
|
|
20
|
-
├── components/ # React components and tests
|
|
21
|
-
│ ├── Button/
|
|
22
|
-
│ │ ├── Button.tsx
|
|
23
|
-
│ │ └── Button.test.tsx
|
|
24
|
-
│ ├── Badge/
|
|
25
|
-
│ │ ├── Badge.tsx
|
|
26
|
-
│ │ └── Badge.test.tsx
|
|
27
|
-
│ └── Input/
|
|
28
|
-
│ ├── Input.tsx
|
|
29
|
-
│ └── Input.test.tsx
|
|
30
|
-
└── test-utils.tsx # Common testing helpers & providers
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
## 🛠️ Usage & Commands
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
# Run all component tests
|
|
37
|
-
pnpm test
|
|
38
|
-
|
|
39
|
-
# Run component tests in headless mode
|
|
40
|
-
pnpm run test:headless
|
|
41
|
-
|
|
42
|
-
# Run tests in high-concurrency chunked worker mode
|
|
43
|
-
pnpm run test:chunked
|
|
44
|
-
|
|
45
|
-
# Type check
|
|
46
|
-
pnpm run type-check
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
## 📝 Writing Component Tests
|
|
50
|
-
|
|
51
|
-
```tsx
|
|
52
|
-
import React from 'react';
|
|
53
|
-
import { render } from '@testing-library/react';
|
|
54
|
-
import { expect, $ } from '@wdio/globals';
|
|
55
|
-
import { Button } from './Button';
|
|
56
|
-
|
|
57
|
-
describe('Button Component', () => {
|
|
58
|
-
it('renders label and handles user clicks', async () => {
|
|
59
|
-
let clicked = false;
|
|
60
|
-
render(<Button label="Submit" onClick={() => (clicked = true)} />);
|
|
61
|
-
|
|
62
|
-
const button = await $('button=Submit');
|
|
63
|
-
await expect(button).toBeDisplayed();
|
|
64
|
-
|
|
65
|
-
await button.click();
|
|
66
|
-
expect(clicked).toBe(true);
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
```
|
|
1
|
+
# TestSpectra React Component Testing Template
|
|
2
|
+
|
|
3
|
+
A high-performance, real-browser React component testing template powered by **TestSpectra**, **WebdriverIO Browser Runner**, and **Testing Library**.
|
|
4
|
+
|
|
5
|
+
## 🚀 Features
|
|
6
|
+
|
|
7
|
+
- **Direct Component Mounting**: Mount TSX components directly in real Chromium/Blink engines using `@testing-library/react`.
|
|
8
|
+
- **Zero Mock Browser**: Real layout calculations, CSS rendering, focus states, and browser events without JSDOM/HappyDOM limitations.
|
|
9
|
+
- **Fast Vite HMR Core**: Instant test startup powered by Vite bundler inside the browser runner.
|
|
10
|
+
- **TestSpectra Matchers**: Comprehensive semantic assertions (`.shouldBeVisible()`, `.shouldExist()`, `expect(el).toHaveText()`).
|
|
11
|
+
|
|
12
|
+
## 📁 Directory Structure
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
.
|
|
16
|
+
├── spectra.config.ts # TestSpectra centralized configuration
|
|
17
|
+
├── wdio.conf.ts # WebdriverIO Browser Runner + Vite config
|
|
18
|
+
├── tsconfig.json # TypeScript configuration for JSX & runner types
|
|
19
|
+
└── src/
|
|
20
|
+
├── components/ # React components and tests
|
|
21
|
+
│ ├── Button/
|
|
22
|
+
│ │ ├── Button.tsx
|
|
23
|
+
│ │ └── Button.test.tsx
|
|
24
|
+
│ ├── Badge/
|
|
25
|
+
│ │ ├── Badge.tsx
|
|
26
|
+
│ │ └── Badge.test.tsx
|
|
27
|
+
│ └── Input/
|
|
28
|
+
│ ├── Input.tsx
|
|
29
|
+
│ └── Input.test.tsx
|
|
30
|
+
└── test-utils.tsx # Common testing helpers & providers
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 🛠️ Usage & Commands
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# Run all component tests
|
|
37
|
+
pnpm test
|
|
38
|
+
|
|
39
|
+
# Run component tests in headless mode
|
|
40
|
+
pnpm run test:headless
|
|
41
|
+
|
|
42
|
+
# Run tests in high-concurrency chunked worker mode
|
|
43
|
+
pnpm run test:chunked
|
|
44
|
+
|
|
45
|
+
# Type check
|
|
46
|
+
pnpm run type-check
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## 📝 Writing Component Tests
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
import React from 'react';
|
|
53
|
+
import { render } from '@testing-library/react';
|
|
54
|
+
import { expect, $ } from '@wdio/globals';
|
|
55
|
+
import { Button } from './Button';
|
|
56
|
+
|
|
57
|
+
describe('Button Component', () => {
|
|
58
|
+
it('renders label and handles user clicks', async () => {
|
|
59
|
+
let clicked = false;
|
|
60
|
+
render(<Button label="Submit" onClick={() => (clicked = true)} />);
|
|
61
|
+
|
|
62
|
+
const button = await $('button=Submit');
|
|
63
|
+
await expect(button).toBeDisplayed();
|
|
64
|
+
|
|
65
|
+
await button.click();
|
|
66
|
+
expect(clicked).toBe(true);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
```
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
{
|
|
2
|
-
"user": {
|
|
3
|
-
"name": "Alex Mercer",
|
|
4
|
-
"role": "Developer",
|
|
5
|
-
"status": "active"
|
|
6
|
-
},
|
|
7
|
-
"labels": {
|
|
8
|
-
"save": "Save Changes",
|
|
9
|
-
"cancel": "Cancel",
|
|
10
|
-
"delete": "Delete Item"
|
|
11
|
-
}
|
|
12
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"user": {
|
|
3
|
+
"name": "Alex Mercer",
|
|
4
|
+
"role": "Developer",
|
|
5
|
+
"status": "active"
|
|
6
|
+
},
|
|
7
|
+
"labels": {
|
|
8
|
+
"save": "Save Changes",
|
|
9
|
+
"cancel": "Cancel",
|
|
10
|
+
"delete": "Delete Item"
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export default async function () {
|
|
2
|
-
// Global after hook for web component testing suite
|
|
3
|
-
}
|
|
1
|
+
export default async function () {
|
|
2
|
+
// Global after hook for web component testing suite
|
|
3
|
+
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export default async function () {
|
|
2
|
-
// Global before hook for web component testing suite
|
|
3
|
-
}
|
|
1
|
+
export default async function () {
|
|
2
|
+
// Global before hook for web component testing suite
|
|
3
|
+
}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@testspectra/template-react-component",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"private": true,
|
|
5
|
-
"type": "module",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"test": "spectra test",
|
|
8
|
-
"test:headed": "spectra test --headed",
|
|
9
|
-
"spectra": "spectra",
|
|
10
|
-
"doctor": "spectra doctor",
|
|
11
|
-
"watch": "spectra watch",
|
|
12
|
-
"type-check": "tsc -b",
|
|
13
|
-
"sync-types": "spectra sync-types",
|
|
14
|
-
"postinstall": "spectra sync-types"
|
|
15
|
-
},
|
|
16
|
-
"devDependencies": {
|
|
17
|
-
"@testspectra/cli": "
|
|
18
|
-
"@testspectra/matchers": "
|
|
19
|
-
"@testspectra/react": "
|
|
20
|
-
"@types/node": "^20.14.0",
|
|
21
|
-
"@types/react": "^18.3.3",
|
|
22
|
-
"@types/react-dom": "^18.3.0",
|
|
23
|
-
"react": "^18.3.1",
|
|
24
|
-
"react-dom": "^18.3.1",
|
|
25
|
-
"typescript": "^5.4.5"
|
|
26
|
-
}
|
|
27
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@testspectra/template-react-component",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"test": "spectra test",
|
|
8
|
+
"test:headed": "spectra test --headed",
|
|
9
|
+
"spectra": "spectra",
|
|
10
|
+
"doctor": "spectra doctor",
|
|
11
|
+
"watch": "spectra watch",
|
|
12
|
+
"type-check": "tsc -b",
|
|
13
|
+
"sync-types": "spectra sync-types",
|
|
14
|
+
"postinstall": "spectra sync-types"
|
|
15
|
+
},
|
|
16
|
+
"devDependencies": {
|
|
17
|
+
"@testspectra/cli": "^1.1.8-rc.20",
|
|
18
|
+
"@testspectra/matchers": "^1.1.8-rc.20",
|
|
19
|
+
"@testspectra/react": "^1.1.8-rc.20",
|
|
20
|
+
"@types/node": "^20.14.0",
|
|
21
|
+
"@types/react": "^18.3.3",
|
|
22
|
+
"@types/react-dom": "^18.3.0",
|
|
23
|
+
"react": "^18.3.1",
|
|
24
|
+
"react-dom": "^18.3.1",
|
|
25
|
+
"typescript": "^5.4.5"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
class BadgeComponent {
|
|
2
|
-
/** Root badge element */
|
|
3
|
-
get root() {
|
|
4
|
-
return Spectra.get("[data-testid='testspectra-badge']");
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
/** Dot indicator element */
|
|
8
|
-
get dot() {
|
|
9
|
-
return Spectra.get("[data-testid='badge-dot']");
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
/** Badge label text element */
|
|
13
|
-
get label() {
|
|
14
|
-
return Spectra.get("[data-testid='badge-label']");
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/** Lookup badge by severity attribute */
|
|
18
|
-
bySeverity(severity: 'info' | 'success' | 'warning' | 'danger') {
|
|
19
|
-
return Spectra.get(`[data-testid='testspectra-badge'][data-severity='${severity}']`);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export default new BadgeComponent();
|
|
1
|
+
class BadgeComponent {
|
|
2
|
+
/** Root badge element */
|
|
3
|
+
get root() {
|
|
4
|
+
return Spectra.get("[data-testid='testspectra-badge']");
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
/** Dot indicator element */
|
|
8
|
+
get dot() {
|
|
9
|
+
return Spectra.get("[data-testid='badge-dot']");
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** Badge label text element */
|
|
13
|
+
get label() {
|
|
14
|
+
return Spectra.get("[data-testid='badge-label']");
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Lookup badge by severity attribute */
|
|
18
|
+
bySeverity(severity: 'info' | 'success' | 'warning' | 'danger') {
|
|
19
|
+
return Spectra.get(`[data-testid='testspectra-badge'][data-severity='${severity}']`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export default new BadgeComponent();
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
class ButtonComponent {
|
|
2
|
-
/** Root button element */
|
|
3
|
-
get root() {
|
|
4
|
-
return Spectra.get("[data-testid='testspectra-button']");
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
/** Label element inside button */
|
|
8
|
-
get label() {
|
|
9
|
-
return Spectra.get("[data-testid='button-label']");
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
/** Optional icon element */
|
|
13
|
-
get icon() {
|
|
14
|
-
return Spectra.get("[data-testid='button-icon']");
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/** Lookup button element by visible text */
|
|
18
|
-
byText(text: string) {
|
|
19
|
-
return Spectra.get(`button*=${text}`);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export default new ButtonComponent();
|
|
1
|
+
class ButtonComponent {
|
|
2
|
+
/** Root button element */
|
|
3
|
+
get root() {
|
|
4
|
+
return Spectra.get("[data-testid='testspectra-button']");
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
/** Label element inside button */
|
|
8
|
+
get label() {
|
|
9
|
+
return Spectra.get("[data-testid='button-label']");
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** Optional icon element */
|
|
13
|
+
get icon() {
|
|
14
|
+
return Spectra.get("[data-testid='button-icon']");
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Lookup button element by visible text */
|
|
18
|
+
byText(text: string) {
|
|
19
|
+
return Spectra.get(`button*=${text}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export default new ButtonComponent();
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
class InputComponent {
|
|
2
|
-
/** Root input element */
|
|
3
|
-
get root() {
|
|
4
|
-
return Spectra.get("[data-testid='testspectra-input']");
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
/** Lookup input element by placeholder substring */
|
|
8
|
-
byPlaceholder(placeholder: string) {
|
|
9
|
-
return Spectra.get(`input[placeholder*='${placeholder}']`);
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export default new InputComponent();
|
|
1
|
+
class InputComponent {
|
|
2
|
+
/** Root input element */
|
|
3
|
+
get root() {
|
|
4
|
+
return Spectra.get("[data-testid='testspectra-input']");
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
/** Lookup input element by placeholder substring */
|
|
8
|
+
byPlaceholder(placeholder: string) {
|
|
9
|
+
return Spectra.get(`input[placeholder*='${placeholder}']`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export default new InputComponent();
|
package/templates/react-component/specs/BadgeComponent/TC-0002-badge-severities-and-dot/spec.md
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: TC-0002
|
|
3
|
-
title: Verify default badge with info severity
|
|
4
|
-
priority: Critical
|
|
5
|
-
caseType: Positive
|
|
6
|
-
status: automated
|
|
7
|
-
coverage:
|
|
8
|
-
web: automated
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# TC-0002: Badge Default Rendering
|
|
12
|
-
|
|
13
|
-
Verify that `<Badge />` renders with the default `info` severity when no `severity` prop is provided.
|
|
14
|
-
|
|
15
|
-
## Test Steps
|
|
16
|
-
|
|
17
|
-
1. Mount `<Badge label="System Active" />`.
|
|
18
|
-
2. Verify the badge is visible, shows the correct label text, and has `data-severity="info"`.
|
|
1
|
+
---
|
|
2
|
+
id: TC-0002
|
|
3
|
+
title: Verify default badge with info severity
|
|
4
|
+
priority: Critical
|
|
5
|
+
caseType: Positive
|
|
6
|
+
status: automated
|
|
7
|
+
coverage:
|
|
8
|
+
web: automated
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# TC-0002: Badge Default Rendering
|
|
12
|
+
|
|
13
|
+
Verify that `<Badge />` renders with the default `info` severity when no `severity` prop is provided.
|
|
14
|
+
|
|
15
|
+
## Test Steps
|
|
16
|
+
|
|
17
|
+
1. Mount `<Badge label="System Active" />`.
|
|
18
|
+
2. Verify the badge is visible, shows the correct label text, and has `data-severity="info"`.
|
package/templates/react-component/specs/BadgeComponent/TC-0002-badge-severities-and-dot/web.test.tsx
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { Badge } from '../../../src/components/Badge/Badge.js';
|
|
2
|
-
import { withProviders } from '../../../src/test-utils.js';
|
|
3
|
-
|
|
4
|
-
it('Verify default badge with info severity', async () => {
|
|
5
|
-
await Spectra.mount(withProviders(<Badge label="System Active" />));
|
|
6
|
-
|
|
7
|
-
// Assert via BadgeComponent component object
|
|
8
|
-
await BadgeComponent.root.shouldBeVisible();
|
|
9
|
-
await BadgeComponent.label.shouldHaveText('System Active');
|
|
10
|
-
await BadgeComponent.root.shouldHaveAttribute('data-severity', 'info');
|
|
11
|
-
});
|
|
1
|
+
import { Badge } from '../../../src/components/Badge/Badge.js';
|
|
2
|
+
import { withProviders } from '../../../src/test-utils.js';
|
|
3
|
+
|
|
4
|
+
it('Verify default badge with info severity', async () => {
|
|
5
|
+
await Spectra.mount(withProviders(<Badge label="System Active" />));
|
|
6
|
+
|
|
7
|
+
// Assert via BadgeComponent component object
|
|
8
|
+
await BadgeComponent.root.shouldBeVisible();
|
|
9
|
+
await BadgeComponent.label.shouldHaveText('System Active');
|
|
10
|
+
await BadgeComponent.root.shouldHaveAttribute('data-severity', 'info');
|
|
11
|
+
});
|
package/templates/react-component/specs/BadgeComponent/TC-0006-badge-success-with-dot/spec.md
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: TC-0006
|
|
3
|
-
title: Verify badge with success severity and dot indicator
|
|
4
|
-
priority: High
|
|
5
|
-
caseType: Positive
|
|
6
|
-
status: automated
|
|
7
|
-
coverage:
|
|
8
|
-
web: automated
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# TC-0006: Badge Success Severity with Dot Indicator
|
|
12
|
-
|
|
13
|
-
Verify that `<Badge />` renders the `success` severity styling and shows a dot indicator when the `dot` prop is set.
|
|
14
|
-
|
|
15
|
-
## Test Steps
|
|
16
|
-
|
|
17
|
-
1. Mount `<Badge label="Completed" severity="success" dot />`.
|
|
18
|
-
2. Verify the badge is visible with `data-severity="success"` and the dot indicator is visible.
|
|
1
|
+
---
|
|
2
|
+
id: TC-0006
|
|
3
|
+
title: Verify badge with success severity and dot indicator
|
|
4
|
+
priority: High
|
|
5
|
+
caseType: Positive
|
|
6
|
+
status: automated
|
|
7
|
+
coverage:
|
|
8
|
+
web: automated
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# TC-0006: Badge Success Severity with Dot Indicator
|
|
12
|
+
|
|
13
|
+
Verify that `<Badge />` renders the `success` severity styling and shows a dot indicator when the `dot` prop is set.
|
|
14
|
+
|
|
15
|
+
## Test Steps
|
|
16
|
+
|
|
17
|
+
1. Mount `<Badge label="Completed" severity="success" dot />`.
|
|
18
|
+
2. Verify the badge is visible with `data-severity="success"` and the dot indicator is visible.
|
package/templates/react-component/specs/BadgeComponent/TC-0006-badge-success-with-dot/web.test.tsx
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { Badge } from '../../../src/components/Badge/Badge.js';
|
|
2
|
-
import { withProviders } from '../../../src/test-utils.js';
|
|
3
|
-
|
|
4
|
-
it('Verify badge with success severity and dot indicator', async () => {
|
|
5
|
-
await Spectra.mount(withProviders(<Badge label="Completed" severity="success" dot />));
|
|
6
|
-
|
|
7
|
-
await BadgeComponent.root.shouldBeVisible();
|
|
8
|
-
await BadgeComponent.root.shouldHaveAttribute('data-severity', 'success');
|
|
9
|
-
await BadgeComponent.dot.shouldBeVisible();
|
|
10
|
-
});
|
|
1
|
+
import { Badge } from '../../../src/components/Badge/Badge.js';
|
|
2
|
+
import { withProviders } from '../../../src/test-utils.js';
|
|
3
|
+
|
|
4
|
+
it('Verify badge with success severity and dot indicator', async () => {
|
|
5
|
+
await Spectra.mount(withProviders(<Badge label="Completed" severity="success" dot />));
|
|
6
|
+
|
|
7
|
+
await BadgeComponent.root.shouldBeVisible();
|
|
8
|
+
await BadgeComponent.root.shouldHaveAttribute('data-severity', 'success');
|
|
9
|
+
await BadgeComponent.dot.shouldBeVisible();
|
|
10
|
+
});
|
package/templates/react-component/specs/BadgeComponent/TC-0007-badge-by-severity-lookup/spec.md
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: TC-0007
|
|
3
|
-
title: Verify dynamic lookup using bySeverity helper
|
|
4
|
-
priority: Medium
|
|
5
|
-
caseType: Positive
|
|
6
|
-
status: automated
|
|
7
|
-
coverage:
|
|
8
|
-
web: automated
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# TC-0007: Badge Lookup by Severity Helper
|
|
12
|
-
|
|
13
|
-
Verify that multiple `<Badge />` instances rendered together can be located individually via `BadgeComponent.bySeverity(...)`.
|
|
14
|
-
|
|
15
|
-
## Test Steps
|
|
16
|
-
|
|
17
|
-
1. Mount two badges: `<Badge label="Warning Alert" severity="warning" />` and `<Badge label="Critical Error" severity="danger" />`.
|
|
18
|
-
2. Verify each badge can be located and is visible via `BadgeComponent.bySeverity('warning')` and `BadgeComponent.bySeverity('danger')`.
|
|
1
|
+
---
|
|
2
|
+
id: TC-0007
|
|
3
|
+
title: Verify dynamic lookup using bySeverity helper
|
|
4
|
+
priority: Medium
|
|
5
|
+
caseType: Positive
|
|
6
|
+
status: automated
|
|
7
|
+
coverage:
|
|
8
|
+
web: automated
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# TC-0007: Badge Lookup by Severity Helper
|
|
12
|
+
|
|
13
|
+
Verify that multiple `<Badge />` instances rendered together can be located individually via `BadgeComponent.bySeverity(...)`.
|
|
14
|
+
|
|
15
|
+
## Test Steps
|
|
16
|
+
|
|
17
|
+
1. Mount two badges: `<Badge label="Warning Alert" severity="warning" />` and `<Badge label="Critical Error" severity="danger" />`.
|
|
18
|
+
2. Verify each badge can be located and is visible via `BadgeComponent.bySeverity('warning')` and `BadgeComponent.bySeverity('danger')`.
|
package/templates/react-component/specs/BadgeComponent/TC-0007-badge-by-severity-lookup/web.test.tsx
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { Badge } from '../../../src/components/Badge/Badge.js';
|
|
2
|
-
import { withProviders } from '../../../src/test-utils.js';
|
|
3
|
-
|
|
4
|
-
it('Verify dynamic lookup using bySeverity helper', async () => {
|
|
5
|
-
await Spectra.mount(
|
|
6
|
-
withProviders(
|
|
7
|
-
<div>
|
|
8
|
-
<Badge label="Warning Alert" severity="warning" />
|
|
9
|
-
<Badge label="Critical Error" severity="danger" />
|
|
10
|
-
</div>,
|
|
11
|
-
),
|
|
12
|
-
);
|
|
13
|
-
|
|
14
|
-
await BadgeComponent.bySeverity('warning').shouldBeVisible();
|
|
15
|
-
await BadgeComponent.bySeverity('danger').shouldBeVisible();
|
|
16
|
-
});
|
|
1
|
+
import { Badge } from '../../../src/components/Badge/Badge.js';
|
|
2
|
+
import { withProviders } from '../../../src/test-utils.js';
|
|
3
|
+
|
|
4
|
+
it('Verify dynamic lookup using bySeverity helper', async () => {
|
|
5
|
+
await Spectra.mount(
|
|
6
|
+
withProviders(
|
|
7
|
+
<div>
|
|
8
|
+
<Badge label="Warning Alert" severity="warning" />
|
|
9
|
+
<Badge label="Critical Error" severity="danger" />
|
|
10
|
+
</div>,
|
|
11
|
+
),
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
await BadgeComponent.bySeverity('warning').shouldBeVisible();
|
|
15
|
+
await BadgeComponent.bySeverity('danger').shouldBeVisible();
|
|
16
|
+
});
|