# Mosaic Stack - QA & Test Coverage Report

**Date:** 2026-02-05
**Scope:** All workspaces (api, web, orchestrator, coordinator, packages)
**Total Test Files:** 552 | **Total Test Cases:** ~3,685

---

## Overall Test Health

| Workspace         | Tests  | Files | Coverage              | Grade  | Key Issue                             |
| ----------------- | ------ | ----- | --------------------- | ------ | ------------------------------------- |
| apps/orchestrator | ~452   | 19    | 85% enforced          | **A**  | Near-complete, well-structured        |
| apps/api          | ~2,174 | 143   | Not enforced          | **B-** | 21 untested services, weak assertions |
| apps/web          | ~555   | 51    | 85% on components/lib | **C+** | 76 untested components, 23 skipped    |
| apps/coordinator  | ~504   | 23    | **16% reported**      | **D**  | Coverage crisis despite test files    |
| packages/shared   | ~25    | 1     | N/A                   | **B+** | Adequate for scope                    |
| packages/ui       | ~15    | 1     | N/A                   | **D+** | 9 of 10 components untested           |

---

## Critical Coverage Gaps

### GAP-1: Coordinator 16% Line Coverage [CRITICAL - Priority 10/10]

Despite having 23 test files and ~504 test cases, the coordinator reports only 16% line coverage with 14 of 22 source files at 0% execution. Files at 0% include the core `coordinator.py`, `queue.py`, `webhook.py`, `security.py`, `parser.py`, and `metrics.py`.

**Root Cause (likely):** Tests import types/models but mock everything, so actual source code never executes; or coverage run only executes a subset of tests.

**Action:** Run `cd apps/coordinator && python -m pytest tests/ -v --cov=src --cov-report=term-missing` and diagnose.

### GAP-2: knowledge.service.ts - 916 Lines, No Tests [CRITICAL - Priority 9/10]

The largest service file in the API has no direct unit tests. Core CRUD operations, pagination, filtering, slug generation, cache invalidation, and embedding queue integration are all untested. Only version-specific tests exist.

**Regressions at risk:** Pagination off-by-one, slug collision handling, stale cache after updates, embedding queue not triggered.

### GAP-3: admin.guard.ts - Security Guard, No Tests [CRITICAL - Priority 9/10]

This guard determines system admin access by checking workspace ownership. No tests verify it correctly grants/denies admin access.

**Regressions at risk:** Non-admin users gaining admin access, valid admins locked out, missing ForbiddenException.

### GAP-4: embeddings.service.ts - 249 Lines, Raw SQL, No Tests [CRITICAL - Priority 9/10]

Uses raw SQL for pgvector operations. No tests exist for embedding validation, vector SQL construction, or similarity search.

**Regressions at risk:** SQL injection through embedding data, invalid vector dimensions, wrong search results.

### GAP-5: widget-data.service.ts - 695 Lines, No Tests [HIGH - Priority 8/10]

Second-largest untested file. Fetches data from multiple sources for dashboard widgets.

### GAP-6: ideas.service.ts - 321 Lines, No Tests [HIGH - Priority 8/10]

User-facing CRUD feature with domain/project associations and activity logging.

---

## Untested Files by Workspace

### apps/api - 21 Untested Service/Controller Files

| File                                          | Lines | Risk     |
| --------------------------------------------- | ----- | -------- |
| knowledge/knowledge.service.ts                | 916   | HIGH     |
| widgets/widget-data.service.ts                | 695   | HIGH     |
| ideas/ideas.service.ts                        | 321   | HIGH     |
| database/embeddings.service.ts                | 249   | HIGH     |
| ideas/ideas.controller.ts                     | 123   | MEDIUM   |
| widgets/widgets.controller.ts                 | 129   | MEDIUM   |
| widgets/widgets.service.ts                    | 59    | MEDIUM   |
| users/preferences.service.ts                  | 99    | MEDIUM   |
| users/preferences.controller.ts               | 56    | MEDIUM   |
| common/throttler/throttler-storage.service.ts | 80+   | MEDIUM   |
| auth/guards/admin.guard.ts                    | 46    | SECURITY |
| federation/audit.service.ts                   | 80+   | LOW      |
| common/throttler/throttler-api-key.guard.ts   | -     | MEDIUM   |
| knowledge/import-export.controller.ts         | -     | MEDIUM   |
| knowledge/knowledge.controller.ts             | -     | MEDIUM   |
| knowledge/stats.controller.ts                 | -     | LOW      |
| knowledge/queues/embedding-queue.service.ts   | -     | MEDIUM   |
| layouts/layouts.controller.ts                 | -     | LOW      |
| cron/cron.controller.ts                       | -     | LOW      |
| bridge/parser/command-parser.service.ts       | -     | MEDIUM   |
| app.service.ts                                | -     | LOW      |

Additionally, 22 DTO directories lack validation tests.

### apps/web - 76 Untested Component/Page Files

**Critical pages (user-facing routes):**

- Main dashboard page.tsx
- Calendar page
- Knowledge page + 5 sub-pages
- Federation connections + 2 sub-pages
- Settings (4 sub-pages)

**Critical components:**

- Chat system: Chat.tsx, ChatInput.tsx, MessageList.tsx, ConversationSidebar.tsx, BackendStatusBanner.tsx
- Dashboard widgets: DomainOverview, QuickCapture, RecentTasks, UpcomingEvents
- HUD system: HUD.tsx, WidgetGrid.tsx, WidgetRenderer.tsx, WidgetWrapper.tsx
- Knowledge: EntryCard, EntryList, EntryViewer, EntryFilters, VersionHistory, ImportExportActions, StatsDashboard
- Navigation.tsx
- Workspace: WorkspaceCard, WorkspaceSettings, MemberList, InviteMember
- Team: TeamCard, TeamMemberList, TeamSettings

**Untested API client modules (11 files):**

- chat.ts, domains.ts, events.ts, federation.ts, ideas.ts, knowledge.ts, personalities.ts, teams.ts, api.ts, auth-client.ts

**Untested hooks:** useChat.ts, useLayout.ts

### apps/orchestrator - 1 Untested File

- health/health.service.ts (minimal risk)

### packages/ui - 9 Untested Components

- Avatar, Badge, Card, Input, Modal, Select, Textarea, Toast (only Button tested)

---

## 23 Skipped Tests (apps/web)

| File                        | Count | Reason                                                   |
| --------------------------- | ----- | -------------------------------------------------------- |
| CalendarWidget.test.tsx     | 5     | Component migrated from setTimeout mock data to real API |
| TasksWidget.test.tsx        | 6     | Same - setTimeout mock data mismatch                     |
| QuickCaptureWidget.test.tsx | 3     | Submit and keyboard shortcut tests                       |
| LinkAutocomplete.test.tsx   | 9     | Debounce search, keyboard nav, link insertion, dropdown  |

**Action:** Re-enable and update tests to match current component implementations.

---

## Test Anti-Patterns Found

### Placeholder Assertions (expect(true).toBe(true))

| File                                | Line     | Context                 |
| ----------------------------------- | -------- | ----------------------- |
| ChatOverlay.test.tsx                | 259, 267 | Responsive design tests |
| rejection-handler.service.spec.ts   | 307      | Notification sending    |
| semantic-search.integration.spec.ts | 122      | Conditional branch      |

**Impact:** Tests always pass, provide zero regression protection.

### Sole toBeDefined() Assertions (30+ instances)

Most concerning in:

- `llm-telemetry.decorator.spec.ts` -- 6 tests verify decorator doesn't throw but never check span attributes
- `federation/query.service.spec.ts` -- 8 tests
- `federation/query.controller.spec.ts` -- 3 tests
- `layouts.service.spec.ts` -- 2 tests
- `workspace-settings.service.spec.ts` -- 1 test

**Impact:** Tests verify existence but not correctness. Regressions slip through.

### Testing Implementation Details Instead of Behavior

- `cors.spec.ts` -- Tests CORS by asserting on JS objects, not actual HTTP headers/middleware
- `Button.test.tsx` -- Asserts on CSS class names (`bg-blue-600`) instead of behavior

**Impact:** Tests break on implementation changes even when behavior is correct.

### Potential Flaky Patterns

setTimeout-based timing in 5 test files:

- `runner-jobs.service.spec.ts:620,833`
- `semantic-search.integration.spec.ts:153`
- `mcp/stdio-transport.spec.ts` (6 instances)
- `coordinator-integration.service.concurrency.spec.ts:170`
- `health.controller.spec.ts:63` (1100ms wait)

---

## Missing Test Categories

### No Playwright E2E Tests

The project documents Playwright as the E2E framework but no playwright.config.ts or E2E test files exist.

### No DTO Validation Tests

22 DTO directories lack validation testing. DTOs define input validation rules via class-validator decorators, but these are never tested in isolation.

### Limited Integration Tests

Only 8 integration test files exist across the entire codebase. Most module interactions are untested.

---

## Recommended Test Additions (Priority Order)

| Priority | Item                                 | Effort | Impact                           |
| -------- | ------------------------------------ | ------ | -------------------------------- |
| P0       | Investigate coordinator 16% coverage | 2hr    | Unblocks all coordinator testing |
| P0       | knowledge.service.ts unit tests      | 4hr    | Covers largest untested service  |
| P0       | admin.guard.ts unit tests            | 1hr    | Security-critical                |
| P0       | embeddings.service.ts unit tests     | 2hr    | Raw SQL validation               |
| P1       | widget-data.service.ts unit tests    | 3hr    | Dashboard reliability            |
| P1       | ideas.service.ts unit tests          | 2hr    | User-facing CRUD                 |
| P1       | Re-enable 23 skipped widget tests    | 2hr    | Immediate coverage gain          |
| P1       | Replace placeholder assertions       | 1hr    | Fix false-positive tests         |
| P2       | Chat system component tests          | 3hr    | Core user interaction            |
| P2       | API client module tests (11 files)   | 3hr    | Request/response validation      |
| P2       | Throttler storage tests              | 2hr    | Security infrastructure          |
| P2       | Preferences service tests            | 1hr    | User settings                    |
| P3       | Strengthen toBeDefined-only tests    | 2hr    | Better regression detection      |
| P3       | UI package component tests           | 3hr    | Design system reliability        |
| P3       | Playwright E2E setup + smoke tests   | 4hr    | End-to-end confidence            |

**Estimated total effort: ~5-6 days for P0+P1 items**

---

## Positive Test Observations

1. **Orchestrator is exemplary** -- 452 tests, near-complete coverage, behavioral testing, good mocking
2. **Federation security tests are thorough** -- Crypto, signature, timeout, workspace access, capability guard
3. **API client test (web) is comprehensive** -- 721 lines covering error handling, retries, auth
4. **Sanitization utilities well-tested** -- XSS prevention, log sanitization, query builder
5. **Coverage thresholds enforced** -- 85% on orchestrator and web components/lib
6. **Concurrency tests exist** -- coordinator-integration and runner-jobs
7. **Good test infrastructure** -- Shared fixtures, proper NestJS testing module usage
