* Fix hand card rotation direction Cards now fan outward correctly instead of curling inward * Update StateRenderer to require MatchScene type for type safety - Change constructor parameter from Phaser.Scene to MatchScene - Update scene property type to MatchScene - Add import for MatchScene type - Update JSDoc example to reflect type-safe constructor * Defer Board creation to StateRenderer for correct rules config - Make board property nullable (Board | null instead of Board?) - Remove Board and createBoard imports (now handled by StateRenderer) - Update setupBoard() to skip Board creation - Add setBoard() method for StateRenderer to call - Update clearBoard() to use null instead of undefined - Add JSDoc explaining why Board creation is deferred * Create Board in StateRenderer with correct layout options - Add Board and createBoard imports - Add board property to StateRenderer - Create Board in render() on first call with correct rules_config - Add debug logging for Board creation and zone creation - Update clear() to destroy Board when clearing - Board now created after we have rules_config from first state * Add fatal error handling with toast notification and auto-redirect - Add 'fatal-error' event to GameBridgeEvents type - Import and initialize useToast in GamePage - Listen for 'fatal-error' event from Phaser - Show error toast that persists until redirect - Show full-screen fatal error overlay with countdown - Auto-redirect to /play after 3 seconds - Update StateRenderer to emit 'fatal-error' when Board creation fails * Gate debug logging with DEV flag - Add DEBUG_RENDERER constant gated by import.meta.env.DEV - Update all console.log statements in StateRenderer to only log in development - Keep console.error and console.warn as they are (always show errors) - Debug logs now only appear during development, not in production * Fix code audit issues - add missing imports and improve error UX Critical fixes: - Add missing gameBridge import to StateRenderer (fixes runtime error in fatal error handler) - Add missing Board type import to MatchScene (fixes TypeScript compilation error) UX improvements: - Replace fatal error auto-redirect with manual 'Return to Menu' button - Add toast notification when resignation fails - Give users unlimited time to read fatal errors before returning Addresses issues found in frontend code audit: - errors.missing-import (StateRenderer.ts:166) - errors.missing-type-import (MatchScene.ts:84) - errors.catch-only-console (GamePage.vue:145) - architecture.missing-fatal-error-handling (GamePage.vue:261) * Add CONTRIBUTING policy and fix pre-existing lint/test errors - Add CONTRIBUTING.md with strict policy: never use --no-verify without approval - Add comprehensive testing documentation (TESTING.md, VISUAL-TEST-GUIDE.md) - Add test-prize-fix.md quick test checklist and verify-fix.sh script Lint fixes (enables pre-commit hooks): - Remove unused imports in 9 files - Fix unused variables (underscore convention) - Replace 'as any' type assertions with proper VisibleGameState types - Add missing CARD_WIDTH_MEDIUM import in layout.spec.ts - All ESLint errors now resolved (only acceptable warnings remain) Test fixes (all 1000 tests now passing): - Fix layout.spec.ts: Add missing CARD_WIDTH_MEDIUM import - Fix PlayPage.spec.ts: Update test to use actual hardcoded UUIDs - Fix useAuth.spec.ts: Mock API profile fetch in initialization tests - Fix PhaserGame.spec.ts: Add scenes export to mock and update createGame call expectations This ensures pre-commit hooks work properly going forward and prevents bypassing TypeScript/lint checks that catch errors early. * Add comprehensive test coverage improvement plan - Create PROJECT_PLAN_TEST_COVERAGE.json with 25 structured tasks - Create TEST_COVERAGE_PLAN.md with executive summary and roadmap - Plan addresses critical gaps: game engine (0%), WebSocket (27%) - 6-week roadmap to reach 85% coverage from current 63% - Target: Phase 1 (weeks 1-3) - critical game engine and network tests - Includes quick wins, production blockers, and success metrics Based on coverage analysis showing: - Strong: Composables (84%), Components (90%), Stores (88%) - Critical gaps: Phaser game engine (~5,500 untested lines) - High priority: WebSocket/multiplayer reliability See TEST_COVERAGE_PLAN.md for overview and week-by-week breakdown. * Add coverage tooling and ignore coverage directory - Add @vitest/coverage-v8 package for coverage analysis - Add coverage/ directory to .gitignore - Used during test coverage analysis for PROJECT_PLAN_TEST_COVERAGE.json
12 KiB
Test Coverage Improvement Plan
Status: Draft
Created: 2026-02-02
Target Completion: 6 weeks
Current Coverage: 63%
Target Coverage: 85%
See PROJECT_PLAN_TEST_COVERAGE.json for full structured plan.
Executive Summary
The Mantimon TCG frontend has excellent test discipline (1000 passing tests) but has critical gaps in the game engine layer:
- ✅ Strong: Composables (84%), Components (90%), Stores (88%)
- ❌ Critical Gap: Game Engine (0% coverage, ~5,500 lines)
- ⚠️ Needs Work: WebSocket (27-45% coverage)
Biggest Risk: Phaser game engine is completely untested - rendering bugs, state sync issues, and visual glitches won't be caught until manual testing or production.
Priority Overview
🔴 Critical (Week 1-3)
| Task | Component | Impact |
|---|---|---|
| TEST-001 | Phaser testing infrastructure | Prerequisite for all game engine tests |
| TEST-002 | MatchScene lifecycle | Core game scene rendering |
| TEST-003 | Board layout & zones | Prize zone bug, zone management |
| TEST-004 | Card rendering | Card display and interactions |
| TEST-005 | StateRenderer sync | Backend ↔ Phaser synchronization |
| TEST-007 | Socket connection | WebSocket reliability |
| TEST-008 | Game action handling | Action queueing and responses |
| TEST-009 | Game management | Create/join game workflows |
Total: ~80 hours, 8 tasks
🟡 High (Week 4)
| Task | Component | Impact |
|---|---|---|
| TEST-006 | Zone classes | Zone types and card management |
| TEST-010 | PreloadScene | Asset loading |
| TEST-011 | HandManager | Drag/drop edge cases |
| TEST-012 | DamageCounter | Damage display |
| TEST-013 | Asset loader | Asset management |
| TEST-014 | ResizeManager | Responsive layout |
Total: ~31 hours, 6 tasks
🟢 Medium/Low (Week 5-6)
- Page tests (HomePage, CampaignPage, MatchPage)
- Edge case tests (user store, drag/drop, deck builder)
- Infrastructure (visual regression, CI coverage, documentation)
Total: ~45 hours, remaining tasks
Week-by-Week Roadmap
Week 1: Foundation (28 hours)
Theme: Phaser Testing Infrastructure & Core Objects
Tasks:
- TEST-001: Create Phaser mocks and test utilities (8h)
- TEST-003: Test Board layout and zones (10h)
- TEST-006: Test Zone base class and subclasses (10h)
Deliverables:
- Phaser testing infrastructure ready
- Board and Zone classes tested
- Game engine coverage: 0% → 20%
Blockers: None - can start immediately
Week 2: Core Engine (32 hours)
Theme: Scenes & State Synchronization
Tasks:
- TEST-002: Test MatchScene initialization (8h)
- TEST-004: Test Card rendering and interactions (12h)
- TEST-005: Test StateRenderer synchronization (12h)
Deliverables:
- MatchScene lifecycle tested
- Card display and interactions tested
- State sync tested (prize zone fix validated!)
- Game engine coverage: 20% → 50%
Blockers: Requires TEST-001 (Week 1)
Week 3: Network Layer (20 hours)
Theme: WebSocket & Multiplayer Reliability
Tasks:
- TEST-007: Test socket connection lifecycle (6h)
- TEST-008: Test game action handling (8h)
- TEST-009: Test game creation/joining (6h)
Deliverables:
- WebSocket reliability tests
- Action queueing tested
- Game management tested
- Socket coverage: 27% → 80%
Blockers: None - independent of game engine
Week 4: Engine Completion (21 hours)
Theme: Remaining Game Components
Tasks:
- TEST-010: Test PreloadScene (4h)
- TEST-011: Test HandManager drag/drop (6h)
- TEST-012: Test DamageCounter (3h)
- TEST-013: Test asset loader (4h)
- TEST-014: Test ResizeManager (4h)
Deliverables:
- All major game components tested
- Game engine coverage: 50% → 65%
- Overall coverage: 63% → 73%
Week 5: Integration & UI (22 hours)
Theme: Pages and Integration Testing
Tasks:
- TEST-016: User store edge cases (3h)
- TEST-017: Drag/drop edge cases (3h)
- TEST-018: Deck builder edge cases (4h)
- TEST-019: Page tests (Home, Campaign, Match) (6h)
- TEST-021: Animation sequences (6h)
Deliverables:
- All pages tested
- Integration scenarios covered
- Overall coverage: 73% → 78%
Week 6: Infrastructure (21 hours)
Theme: Testing Tooling & Documentation
Tasks:
- TEST-022: Visual regression with Playwright (8h)
- TEST-023: CI coverage reporting (3h)
- TEST-024: Testing documentation (4h)
- TEST-020: Socket type guards (2h)
- TEST-015: CardBack tests (2h) (Quick win!)
- TEST-025: Mutation testing (optional) (6h)
Deliverables:
- Visual regression testing enabled
- CI coverage tracking
- Testing guide for team
- Overall coverage: 78% → 82%+
Quick Wins (Do First!)
These tasks are simple and provide immediate value:
- TEST-015: CardBack (2h) - Simple component, easy test, gets game/ coverage started
- TEST-020: Type guards (2h) - Straightforward logic tests, improves socket reliability
- TEST-016: User store (3h) - Boosts coverage from 52% to 90%+
Total: 7 hours for measurable coverage improvement
Production Blockers
These must be tested before production release:
- TEST-005: StateRenderer - State desync bugs cause multiplayer issues
- TEST-007: Socket client - Connection problems make game unplayable
- TEST-008: useGameSocket - Lost/duplicate actions break game flow
Testing Challenges & Solutions
Challenge 1: Phaser Requires WebGL/Canvas
Problem: Phaser games need WebGL/Canvas, jsdom doesn't support it
Solutions:
- Mock Phaser classes - Create minimal mocks (TEST-001)
- Extract logic - Pull game logic out of Phaser into pure functions
- Visual regression - Use Playwright for rendering tests (TEST-022)
- Integration tests - Test via PhaserGame.vue wrapper
Example:
// ❌ Hard to test - logic inside Phaser class
class Card extends Phaser.GameObjects.Sprite {
update() {
if (this.health <= 0) {
this.destroy()
this.scene.addScore(10)
}
}
}
// ✅ Easy to test - logic extracted
function shouldDestroyCard(health: number): boolean {
return health <= 0
}
class Card extends Phaser.GameObjects.Sprite {
update() {
if (shouldDestroyCard(this.health)) {
this.destroy()
this.scene.addScore(10)
}
}
}
Challenge 2: WebSocket State Management
Problem: Real-time behavior, connection state, race conditions
Solutions:
- Mock socket.io-client - Already doing this well
- Test state machines - Focus on state transitions
- Fake timers - Control async timing
- Error injection - Simulate disconnect/reconnect
Challenge 3: Animation Testing
Problem: Animations are async and timing-dependent
Solutions:
- Fake timers - Advance time manually with
vi.useFakeTimers() - Test completion - Verify animation completes, not individual frames
- Integration tests - Test animation sequences end-to-end (TEST-021)
Coverage Targets
| Area | Current | Week 2 | Week 4 | Week 6 | 3 Months |
|---|---|---|---|---|---|
| Overall | 63% | 68% | 73% | 78% | 85% |
| Game Engine | 0% | 40% | 60% | 65% | 80% |
| Composables | 84% | 84% | 86% | 90% | 95% |
| Components | 90% | 90% | 90% | 92% | 95% |
| Stores | 88% | 88% | 90% | 92% | 95% |
| Socket | 27% | 27% | 80% | 85% | 90% |
Getting Started
Option 1: Quick Wins First (Recommended)
Build momentum with easy tasks:
# Week 1 - Quick Wins (7 hours)
npm run test -- src/game/objects/CardBack.spec.ts # Create this
npm run test -- src/socket/types.spec.ts # Expand this
npm run test -- src/stores/user.spec.ts # Expand this
# Result: +5% coverage, confidence boost
Option 2: Critical Path (Production-Focused)
Tackle blockers immediately:
# Week 1-3 - Critical Path (80 hours)
# TEST-001: Phaser infrastructure (8h)
# TEST-002: MatchScene (8h)
# TEST-003: Board (10h)
# TEST-004: Card (12h)
# TEST-005: StateRenderer (12h)
# TEST-007: Socket client (6h)
# TEST-008: useGameSocket (8h)
# TEST-009: useGames (6h)
# Result: Core game and network tested, ready for production
Option 3: Parallel Development (Team of 2-3)
Split work across developers:
# Developer 1: Game Engine
- Week 1: TEST-001, TEST-003, TEST-006
- Week 2: TEST-002, TEST-004, TEST-005
# Developer 2: Network Layer
- Week 1: TEST-007, TEST-008
- Week 2: TEST-009, TEST-010, TEST-011
# Developer 3: UI & Infrastructure
- Week 1: Quick wins (TEST-015, TEST-016, TEST-020)
- Week 2: TEST-019, TEST-021
- Week 3: TEST-022, TEST-023, TEST-024
# Result: Complete in 3 weeks instead of 6
Success Metrics
Week 2 Checkpoint
- Phaser infrastructure works well
- Board tests validate prize zone fix
- StateRenderer tests catch desync bugs
- Coverage: 63% → 68%
Week 4 Checkpoint
- All major game components tested
- WebSocket layer reliable
- Coverage: 68% → 73%
- Team confident in test suite
Week 6 Completion
- Visual regression enabled
- CI coverage tracking
- Testing documentation complete
- Coverage: 73% → 78%
- Ready for production
3 Month Goal
- Coverage: 85%+
- All critical code paths tested
- Mutation testing shows strong tests
- New features include tests by default
Team Resources
Documentation
- TEST-024: Create
src/test/README.mdwith testing patterns - Add Phaser testing examples
- Document common pitfalls and solutions
Infrastructure
- TEST-022: Playwright visual regression
- TEST-023: CI coverage reporting
- TEST-025: Stryker mutation testing (optional)
Training
- Share knowledge as infrastructure is built
- Code review testing PRs thoroughly
- Pair program on first few Phaser tests
Questions & Discussion
Should we aim for 100% coverage?
No. 85% is realistic and valuable. Some code is hard to test:
- Animation frames and tweens
- WebGL rendering details
- Entry points (main.ts, router config)
Focus on logic and state management, not rendering details.
Should we stop feature work to fix coverage?
Depends on priorities. Options:
- Aggressive: Pause features for 2-3 weeks, hit 80% coverage
- Balanced: Dedicate 1-2 days/week to testing, reach 80% in 8-10 weeks
- Maintenance: Add tests alongside features, reach 80% in 3-6 months
Recommendation: Balanced approach - TEST-001 through TEST-009 are critical for production confidence, do those first.
What if tests are too slow?
Strategies:
- Use
vi.mock()liberally - mock Phaser, socket, API - Use
vi.useFakeTimers()- control async timing - Run tests in parallel:
vitest --threads - Use
it.skip()for expensive tests during development - Run full suite in CI only
Next Steps
- Review this plan - Discuss with team, adjust priorities
- Start with TEST-001 - Build Phaser testing infrastructure
- Quick win: TEST-015 - Test CardBack to validate infrastructure
- Tackle critical path - TEST-002 through TEST-009
- Track progress - Update
PROJECT_PLAN_TEST_COVERAGE.jsonas tasks complete
Related Documents
PROJECT_PLAN_TEST_COVERAGE.json- Full structured planTESTING.md- Current testing guide (recently added!)CONTRIBUTING.md- Never use --no-verify policyVISUAL-TEST-GUIDE.md- Visual testing reference
Let's build confidence in our game engine! 🎮✅