| name | test |
| description | Run E2E tests for React, Vue, and Svelte frameworks. Use when testing components, verifying changes, or before committing. |
Test Runner
Runs Playwright Component Tests across all frameworks.
When to Use
- After implementing or modifying components
- Before committing changes
- When verifying cross-framework compatibility
- When user asks to run tests
- When checking test coverage
Quick Commands
| Command | Description |
|---|---|
bun run test:ct |
Run all framework tests |
bun run test:ct:react |
Run React tests only |
bun run test:ct:vue |
Run Vue tests only |
bun run test:ct:svelte |
Run Svelte tests only |
Instructions
1. Determine Test Scope
Based on user request or changed files:
| Changed Path | Tests to Run |
|---|---|
packages/core/** |
All frameworks |
packages/react/** |
React only |
packages/vue/** |
Vue only |
packages/svelte/** |
Svelte only |
tests/ct/scenarios/** |
All frameworks |
tests/ct/react/** |
React only |
tests/ct/vue/** |
Vue only |
tests/ct/svelte/** |
Svelte only |
2. Run Tests
All Frameworks
bun run test:ct
Single Framework
bun run test:ct:react
bun run test:ct:vue
bun run test:ct:svelte
Specific Browser
bun run test:ct:react --project=chromium
bun run test:ct:react --project=firefox
bun run test:ct:react --project=webkit
Specific Test File
bun run test:ct:react tests/ct/react/specs/Editor.spec.tsx
Debug Mode (Headed)
bun run test:ct:react --headed
3. Analyze Results
Success Output
Running X tests using Y workers
✓ ComponentName › test description (XXms)
...
X passed (Y.Zs)
Failure Output
✗ ComponentName › test description (XXms)
Error: expect(locator).toBeVisible()
Locator: ...
Expected: visible
Received: hidden
4. Report Format
## Test Results
### Summary
- **React**: ✅ X passed / ❌ Y failed
- **Vue**: ✅ X passed / ❌ Y failed
- **Svelte**: ✅ X passed / ❌ Y failed
### Failures (if any)
| Framework | Test | Error |
|-----------|------|-------|
| React | ComponentName › test | Error message |
### Next Steps
- [ ] Fix failing tests
- [ ] Run tests again
Coverage Check
When user asks about test coverage, check if all components and hooks/composables/runes are covered by tests.
1. List Implementations
Run these commands to list all implementations:
# React
ls packages/react/src/components/*.tsx | xargs -I {} basename {} .tsx
ls packages/react/src/hooks/*.ts | xargs -I {} basename {} .ts
# Vue
ls packages/vue/src/components/*.vue | xargs -I {} basename {} .vue
ls packages/vue/src/composables/*.ts | xargs -I {} basename {} .ts
# Svelte
ls packages/svelte/src/components/*.svelte | xargs -I {} basename {} .svelte
ls packages/svelte/src/runes/*.ts | xargs -I {} basename {} .ts
2. List Test Specs
ls tests/ct/react/specs/*.tsx tests/ct/vue/specs/*.ts tests/ct/svelte/specs/*.ts | xargs -I {} basename {}
3. Check Coverage
For each implementation, determine coverage status:
| Status | Meaning |
|---|---|
| ✅ Direct | Has dedicated test spec |
| ✅ Indirect | Tested through parent component |
| ⚠️ Style-only | Pure styling, may not need test |
| ❌ Missing | Needs test |
4. Coverage Mapping
Components
| Component | Test Spec | Coverage Type |
|---|---|---|
| EditorRoot | Editor.spec | Direct |
| EditorContent | Editor.spec | Direct |
| BubbleMenu | BubbleMenu.spec | Direct |
| BubbleMenuToolbar | BubbleMenu.spec | Indirect |
| BubbleMenuButton | BubbleMenu.spec | Indirect |
| BubbleMenuLinkEditor | BubbleMenu.spec | Indirect |
| BubbleMenuDivider | - | Style-only |
| SlashMenu | SlashMenu.spec | Direct |
| SlashMenuItem | SlashMenu.spec | Indirect |
| SlashMenuEmpty | SlashMenu.spec | Indirect |
Hooks / Composables / Runes
| Function | Test Spec | Coverage Type |
|---|---|---|
| useVizelEditor | Editor.spec | Indirect |
| useEditorState | - | Missing |
| createSlashMenuRenderer | SlashMenu.spec | Indirect |
5. Coverage Report Format
## Test Coverage Report
### Components
| Component | React | Vue | Svelte | Status |
|-----------|:-----:|:---:|:------:|--------|
| EditorRoot | ✅ | ✅ | ✅ | Direct |
| BubbleMenu | ✅ | ✅ | ✅ | Direct |
| SlashMenu | ✅ | ✅ | ✅ | Direct |
### Hooks / Composables / Runes
| Function | React | Vue | Svelte | Status |
|----------|:-----:|:---:|:------:|--------|
| useVizelEditor | ✅ | ✅ | ✅ | Indirect |
| useEditorState | ❌ | ❌ | ❌ | Missing |
### Summary
- Components: X/Y covered (Z%)
- Hooks/Composables/Runes: X/Y covered (Z%)
### Recommendations
- [ ] Add tests for missing items
- [ ] Consider if style-only components need tests
Troubleshooting
Browser Not Installed
bunx playwright install chromium
# or install all browsers
bunx playwright install
Test Timeout
Increase timeout in test:
test("slow test", async ({ mount, page }) => {
test.setTimeout(30000); // 30 seconds
// ...
});
Element Not Found
Check if element is rendered to document.body (portal):
// Inside component
const element = component.locator(".selector");
// Portal/popup (rendered to body)
const popup = page.locator(".selector");
Common Patterns
Run Tests for Changed Files
# Get changed files
git diff --name-only HEAD~1
# Run relevant tests based on changes
bun run test:ct:react # if React files changed
Run Before Commit
# Quick check with single browser
bun run test:ct --project=chromium
Full CI-like Test
# All frameworks, all browsers
bun run test:ct