oneie
Version:
Build apps, websites, and AI agents in English. Zero-interaction setup for AI agents (Claude Code, Cursor, Windsurf). Download to your computer, run in the cloud, deploy to the edge. Open source and free forever.
1,217 lines (911 loc) • 34.2 kB
Markdown
title: 2 1 Dataprovider Interface
dimension: things
category: tests
tags: agent, ai, architecture, backend, frontend, ontology
related_dimensions: connections, events, groups, knowledge, people
scope: global
created: 2025-11-03
updated: 2025-11-03
version: 1.0.0
ai_context: |
This document is part of the things dimension in the tests category.
Location: one/things/tests/2-1-dataprovider-interface.md
Purpose: Documents test specification: feature 2-1 - dataprovider interface & convexprovider
Related dimensions: connections, events, groups, knowledge, people
For AI agents: Read this to understand 2 1 dataprovider interface.
# Test Specification: Feature 2-1 - DataProvider Interface & ConvexProvider
**Feature ID:** `2-1-dataprovider-interface`
**Plan:** Backend-Agnostic Frontend Architecture
**Status:** Ready for Implementation
**Created:** 2025-10-13
**Quality Agent:** Claude (Intelligence Agent)
## Executive Summary
This document defines comprehensive tests for the DataProvider interface and ConvexProvider implementation BEFORE implementation begins. The tests validate that the backend abstraction layer correctly implements all 6 ontology dimensions while maintaining zero functionality regression from current Convex SDK usage.
**Success Criteria:**
- [ ] 90%+ unit test coverage
- [ ] 80%+ integration test coverage
- [ ] All 6-dimension operations fully tested
- [ ] Performance overhead <10ms per operation
- [ ] Zero TypeScript errors
- [ ] ConvexProvider passes all existing auth tests (50+)
## Test Categories
### Category 1: Interface Contract Tests (Unit)
Tests the DataProvider interface definition and type contracts.
### Category 2: ConvexProvider Tests (Unit)
Tests the ConvexProvider implementation wrapping Convex SDK.
### Category 3: Integration Tests
Tests full data flow through provider with real backend.
### Category 4: Performance Tests
Tests performance overhead of abstraction layer.
### Category 5: Error Handling Tests
Tests typed error patterns and edge cases.
### Category 6: Real-time Subscription Tests
Tests reactive data subscriptions through provider.
## Ontology Coverage Matrix
| Dimension | CRUD Operations | Real-time | Auth | Multi-tenant |
| ------------- | --------------- | --------- | ---- | ------------ |
| Organizations | ✅ | ✅ | ✅ | ✅ |
| People | ✅ | ✅ | ✅ | ✅ |
| Things | ✅ | ✅ | ✅ | ✅ |
| Connections | ✅ | ✅ | ✅ | ✅ |
| Events | ✅ | ✅ | ✅ | ✅ |
| Knowledge | ✅ | ✅ | ✅ | ✅ |
**Total Operations to Test:** 6 dimensions × 5 operations = 30+ test cases
## Category 1: Interface Contract Tests (Unit)
### 1.1 Type Safety Tests
**Test:** DataProvider interface type definitions
```typescript
describe("DataProvider Interface Types", () => {
it("should define all 6-dimension operations", () => {
// Verify interface has: organizations, people, things, connections, events, knowledge
});
it("should type all CRUD operations correctly", () => {
// Verify get, list, create, update, delete signatures
});
it("should use Effect.ts for all operations", () => {
// Verify return types are Effect<Success, Error, Never>
});
it("should define typed errors with _tag pattern", () => {
// Verify ThingNotFoundError, CreateError, QueryError, etc.
});
});
```
**Expected Behavior:**
- All operations return `Effect<T, E, never>`
- All errors extend base `DataProviderError` with `_tag` field
- Type cycle works correctly (no `any` types)
- Autocomplete works in IDE
**Performance:** N/A (type-only)
**Coverage Target:** 100%
### 1.2 Organizations Dimension Tests
**Test Suite:** Organizations CRUD
```typescript
describe("DataProvider.organizations", () => {
it("should get organization by id", async () => {
// Test: provider.organizations.get(orgId)
// Expected: Returns organization or ThingNotFoundError
});
it("should list organizations with filters", async () => {
// Test: provider.organizations.list({ plan: "pro" })
// Expected: Returns filtered array
});
it("should create organization", async () => {
// Test: provider.organizations.create({ name, plan })
// Expected: Returns organization id
});
it("should update organization", async () => {
// Test: provider.organizations.update(id, { plan: "enterprise" })
// Expected: Updates successfully
});
it("should enforce multi-tenant isolation", async () => {
// Test: Org A cannot access Org B's data
// Expected: Returns empty or error
});
});
```
**Expected Behavior:**
- Organizations table correctly mapped to `things` with `type: "organization"`
- Multi-tenant filtering automatic
- Plan validation (starter/pro/enterprise)
- Usage tracking accurate
**Performance:** <10ms per operation
**Coverage Target:** 95%
### 1.3 People Dimension Tests
**Test Suite:** People CRUD & Roles
```typescript
describe("DataProvider.people", () => {
it("should get person by id", async () => {
// Test: provider.people.get(personId)
// Expected: Returns person with role
});
it("should list people by role", async () => {
// Test: provider.people.list({ role: "org_owner" })
// Expected: Returns filtered by role
});
it("should list people by organization", async () => {
// Test: provider.people.list({ organizationId })
// Expected: Returns org members only
});
it("should enforce 4 roles: platform_owner, org_owner, org_user, customer", () => {
// Test: Role validation
// Expected: Rejects invalid roles
});
it("should link people to organizations via connections", async () => {
// Test: provider.connections.create({ person → org, type: "member_of" })
// Expected: Creates membership connection
});
});
```
**Expected Behavior:**
- People represented as `things` with `type: "creator"` and `properties.role`
- Role validation strict (4 roles only)
- Organization membership via `connections`
- Authorization checks included
**Performance:** <10ms per operation
**Coverage Target:** 95%
### 1.4 Things Dimension Tests
**Test Suite:** Things CRUD for all 66 types
```typescript
describe("DataProvider.things", () => {
it("should create thing with correct type", async () => {
// Test: provider.things.create({ type: "blog_post", name, properties })
// Expected: Returns thing id
});
it("should get thing by id", async () => {
// Test: provider.things.get(thingId)
// Expected: Returns thing or ThingNotFoundError
});
it("should list things by type", async () => {
// Test: provider.things.list({ type: "course" })
// Expected: Returns all courses
});
it("should list things by status", async () => {
// Test: provider.things.list({ status: "published" })
// Expected: Returns published things only
});
it("should update thing properties", async () => {
// Test: provider.things.update(id, { properties: {...} })
// Expected: Merges properties correctly
});
it("should soft delete thing (set deletedAt)", async () => {
// Test: provider.things.delete(id)
// Expected: Sets deletedAt timestamp
});
it("should support all 66 thing types", async () => {
// Test: Create one of each type
// Expected: All types validate correctly
});
it("should validate thing type enum", () => {
// Test: Invalid type rejected
// Expected: ThingTypeError
});
});
```
**Expected Behavior:**
- All 66 thing types supported
- Type validation strict
- Properties flexible (any JSON)
- Status lifecycle: draft → active → published → archived
- Soft delete (deletedAt)
**Performance:** <10ms per operation
**Coverage Target:** 90%
### 1.5 Connections Dimension Tests
**Test Suite:** Connections CRUD for all 25 types
```typescript
describe("DataProvider.connections", () => {
it("should create connection between things", async () => {
// Test: provider.connections.create({ fromThingId, toThingId, relationshipType: "owns" })
// Expected: Returns connection id
});
it("should get connection by id", async () => {
// Test: provider.connections.get(connectionId)
// Expected: Returns connection or NotFoundError
});
it("should list connections from a thing", async () => {
// Test: provider.connections.list({ fromThingId })
// Expected: Returns all outgoing connections
});
it("should list connections to a thing", async () => {
// Test: provider.connections.list({ toThingId })
// Expected: Returns all incoming connections
});
it("should list connections by type", async () => {
// Test: provider.connections.list({ relationshipType: "authored" })
// Expected: Returns filtered connections
});
it("should delete connection", async () => {
// Test: provider.connections.delete(connectionId)
// Expected: Removes connection
});
it("should support metadata on connections", async () => {
// Test: Create connection with metadata: { balance: 100 }
// Expected: Metadata stored correctly
});
it("should support temporal validity (validFrom/validTo)", async () => {
// Test: Create connection with validFrom, validTo
// Expected: Timestamps stored
});
it("should support all 25 relationship types", async () => {
// Test: Create one of each type
// Expected: All types validate correctly
});
it("should prevent self-connections (unless justified)", () => {
// Test: fromThingId === toThingId
// Expected: SelfConnectionError (or allow with justification)
});
});
```
**Expected Behavior:**
- All 25 connection types supported
- Bidirectional queries efficient (indexes)
- Metadata flexible (JSON)
- Temporal validity optional
- Self-connections validated
**Performance:** <10ms per operation
**Coverage Target:** 90%
### 1.6 Events Dimension Tests
**Test Suite:** Events CRUD for all 67 types
```typescript
describe("DataProvider.events", () => {
it("should create event with actor and target", async () => {
// Test: provider.events.create({ type: "entity_created", actorId, targetId })
// Expected: Returns event id
});
it("should get event by id", async () => {
// Test: provider.events.get(eventId)
// Expected: Returns event or NotFoundError
});
it("should list events by type", async () => {
// Test: provider.events.list({ type: "payment_event" })
// Expected: Returns filtered events
});
it("should list events by actor", async () => {
// Test: provider.events.list({ actorId })
// Expected: Returns user's actions
});
it("should list events by target", async () => {
// Test: provider.events.list({ targetId })
// Expected: Returns events affecting target
});
it("should list events with time range", async () => {
// Test: provider.events.list({ startTime, endTime })
// Expected: Returns events in range
});
it("should store metadata with events", async () => {
// Test: Create event with metadata: { amount: 100, currency: "USD" }
// Expected: Metadata stored correctly
});
it("should support all 67 event types", async () => {
// Test: Create one of each type
// Expected: All types validate correctly
});
it("should auto-set timestamp if not provided", () => {
// Test: Create event without timestamp
// Expected: Timestamp = Date.now()
});
});
```
**Expected Behavior:**
- All 67 event types supported
- Timestamps immutable
- Metadata flexible (JSON)
- Complete audit trail
- Efficient queries by actor/target/type/time
**Performance:** <10ms per operation
**Coverage Target:** 90%
### 1.7 Knowledge Dimension Tests
**Test Suite:** Knowledge CRUD & RAG
```typescript
describe("DataProvider.knowledge", () => {
it("should create knowledge item (label)", async () => {
// Test: provider.knowledge.create({ knowledgeType: "label", text: "industry:fitness" })
// Expected: Returns knowledge id
});
it("should create knowledge item (chunk with embedding)", async () => {
// Test: provider.knowledge.create({ knowledgeType: "chunk", text, embedding })
// Expected: Returns knowledge id
});
it("should get knowledge by id", async () => {
// Test: provider.knowledge.get(knowledgeId)
// Expected: Returns knowledge or NotFoundError
});
it("should list knowledge by type", async () => {
// Test: provider.knowledge.list({ knowledgeType: "label" })
// Expected: Returns labels only
});
it("should link knowledge to thing", async () => {
// Test: provider.knowledge.link(thingId, knowledgeId, "label")
// Expected: Creates thingKnowledge junction
});
it("should search by embedding (vector search)", async () => {
// Test: provider.knowledge.search(embedding, { limit: 10 })
// Expected: Returns similar chunks
});
it("should filter search by source thing", async () => {
// Test: provider.knowledge.search(embedding, { sourceThingId })
// Expected: Returns chunks from source only
});
it("should support 4 knowledge types: label, document, chunk, vector_only", () => {
// Test: Create each type
// Expected: All types validate
});
});
```
**Expected Behavior:**
- All 4 knowledge types supported
- Vector search efficient (ANN)
- Junction table (thingKnowledge) managed
- Embeddings stored correctly
- Labels searchable
**Performance:** <50ms for vector search, <10ms for others
**Coverage Target:** 85%
## Category 2: ConvexProvider Tests (Unit)
### 2.1 ConvexProvider Implementation Tests
**Test Suite:** ConvexProvider wraps Convex SDK correctly
```typescript
describe("ConvexProvider", () => {
it("should implement DataProvider interface", () => {
// Test: ConvexProvider satisfies DataProvider type
// Expected: TypeScript compiles
});
it("should wrap Convex queries correctly", async () => {
// Test: provider.things.get() calls convex.query(api.queries.things.get)
// Expected: Correct API call
});
it("should wrap Convex mutations correctly", async () => {
// Test: provider.things.create() calls convex.mutation(api.mutations.things.create)
// Expected: Correct API call
});
it("should convert Convex errors to DataProvider errors", async () => {
// Test: Convex error → typed DataProviderError
// Expected: Error has _tag field
});
it("should pass auth context to Convex", async () => {
// Test: Auth token passed to Convex client
// Expected: Authenticated requests
});
it("should support real-time subscriptions", async () => {
// Test: useQuery hook through provider
// Expected: Reactive updates
});
});
```
**Expected Behavior:**
- Zero functionality regression
- All existing Convex queries work
- All existing Convex mutations work
- Error mapping correct
- Auth works identically
**Performance:** <10ms overhead per operation
**Coverage Target:** 95%
### 2.2 ConvexProvider Auth Integration Tests
**Test Suite:** Auth flows through ConvexProvider
```typescript
describe("ConvexProvider Auth", () => {
it("should pass all 50+ existing auth tests", async () => {
// Test: Run entire auth test suite with ConvexProvider
// Expected: All tests pass
});
it("should support email/password auth", async () => {
// Test: Sign up, sign in through provider
// Expected: Works identically to direct Convex
});
it("should support OAuth (GitHub, Google)", async () => {
// Test: OAuth flow through provider
// Expected: Works identically to direct Convex
});
it("should support magic links", async () => {
// Test: Magic link flow through provider
// Expected: Works identically to direct Convex
});
it("should support password reset", async () => {
// Test: Password reset flow through provider
// Expected: Works identically to direct Convex
});
it("should support email verification", async () => {
// Test: Email verification flow through provider
// Expected: Works identically to direct Convex
});
it("should support 2FA (TOTP)", async () => {
// Test: 2FA flow through provider
// Expected: Works identically to direct Convex
});
});
```
**Expected Behavior:**
- All 50+ auth tests pass
- Zero regression in auth functionality
- Better Auth integration unchanged
- Session management identical
**Performance:** Same as baseline
**Coverage Target:** 100% (all existing tests)
## Category 3: Integration Tests
### 3.1 Full Data Flow Tests
**Test Suite:** Complete user journeys through provider
```typescript
describe("DataProvider Integration - Full Flows", () => {
it("should complete user signup → create content → publish flow", async () => {
// 1. Create user (people dimension)
// 2. Create organization (organizations dimension)
// 3. Create membership connection
// 4. Create blog post (things dimension)
// 5. Create ownership connection
// 6. Log creation event
// 7. Publish blog post
// 8. Log publish event
// Expected: Full flow works end-to-end
});
it("should complete token purchase flow", async () => {
// 1. Get user
// 2. Get token
// 3. Create payment (things dimension)
// 4. Create holds_tokens connection
// 5. Log payment_event
// 6. Update token balance
// Expected: Full flow works end-to-end
});
it("should complete course enrollment flow", async () => {
// 1. Get user
// 2. Get course
// 3. Create enrolled_in connection
// 4. Log enrollment event
// 5. Track progress
// Expected: Full flow works end-to-end
});
});
```
**Expected Behavior:**
- Multi-step flows work correctly
- Transactions atomic (if supported)
- Events logged completely
- Connections created correctly
**Performance:** <100ms for full flow
**Coverage Target:** 80%
### 3.2 Multi-Tenant Isolation Tests
**Test Suite:** Organization data isolation
```typescript
describe("DataProvider Integration - Multi-Tenant", () => {
it("should isolate organization data", async () => {
// 1. Create Org A with user A
// 2. Create Org B with user B
// 3. User A creates thing in Org A
// 4. User B tries to access Org A's thing
// Expected: User B cannot access Org A's data
});
it("should isolate organization events", async () => {
// Test: Org A events not visible to Org B
// Expected: Events filtered by organization
});
it("should isolate organization connections", async () => {
// Test: Org A connections not visible to Org B
// Expected: Connections filtered by organization
});
it("should allow platform_owner to access all orgs", async () => {
// Test: Platform owner can query across orgs
// Expected: No isolation for platform_owner role
});
});
```
**Expected Behavior:**
- Perfect data isolation between orgs
- Platform owner has full access
- Org owners have org-level access
- Org users have limited access
**Performance:** <10ms per query (with proper indexes)
**Coverage Target:** 100% (critical security)
### 3.3 Real-time Subscription Tests
**Test Suite:** Reactive data updates
```typescript
describe("DataProvider Integration - Real-time", () => {
it("should update when thing changes", async () => {
// 1. Subscribe to thing via useQuery
// 2. Update thing via mutation
// 3. Verify subscription receives update
// Expected: Reactive update received
});
it("should update when connection added", async () => {
// 1. Subscribe to connections list
// 2. Add new connection
// 3. Verify subscription receives update
// Expected: List updates automatically
});
it("should update when event logged", async () => {
// 1. Subscribe to events list
// 2. Log new event
// 3. Verify subscription receives update
// Expected: List updates automatically
});
it("should unsubscribe correctly", async () => {
// Test: Component unmounts, subscription closes
// Expected: No memory leaks
});
});
```
**Expected Behavior:**
- Real-time updates work correctly
- Subscriptions clean up properly
- No memory leaks
- Performance maintained
**Performance:** <50ms latency for updates
**Coverage Target:** 85%
## Category 4: Performance Tests
### 4.1 Operation Performance Tests
**Test Suite:** Measure provider overhead
```typescript
describe("DataProvider Performance", () => {
it("should add <10ms overhead for get operations", async () => {
// Measure: Direct Convex vs. ConvexProvider
// Expected: <10ms difference
});
it("should add <10ms overhead for list operations", async () => {
// Measure: Direct Convex vs. ConvexProvider
// Expected: <10ms difference
});
it("should add <10ms overhead for create operations", async () => {
// Measure: Direct Convex vs. ConvexProvider
// Expected: <10ms difference
});
it("should add <10ms overhead for update operations", async () => {
// Measure: Direct Convex vs. ConvexProvider
// Expected: <10ms difference
});
it("should add <10ms overhead for delete operations", async () => {
// Measure: Direct Convex vs. ConvexProvider
// Expected: <10ms difference
});
});
```
**Performance Baseline (Direct Convex):**
- Get: ~5ms
- List: ~10ms
- Create: ~15ms
- Update: ~10ms
- Delete: ~8ms
**Performance Target (ConvexProvider):**
- Get: <15ms (<10ms overhead)
- List: <20ms (<10ms overhead)
- Create: <25ms (<10ms overhead)
- Update: <20ms (<10ms overhead)
- Delete: <18ms (<10ms overhead)
**Coverage Target:** 100% (all operations measured)
### 4.2 Large Dataset Performance Tests
**Test Suite:** Performance with scale
```typescript
describe("DataProvider Performance - Scale", () => {
it("should list 1000 things efficiently", async () => {
// Test: List 1000 things
// Expected: <100ms
});
it("should list 1000 connections efficiently", async () => {
// Test: List 1000 connections from a thing
// Expected: <100ms
});
it("should list 1000 events efficiently", async () => {
// Test: List 1000 events for a thing
// Expected: <100ms
});
it("should handle 100 concurrent requests", async () => {
// Test: 100 parallel operations
// Expected: All complete, no errors
});
});
```
**Performance Targets:**
- 1000 items: <100ms
- 10,000 items: <500ms
- 100 concurrent requests: <1000ms total
**Coverage Target:** 80%
## Category 5: Error Handling Tests
### 5.1 Typed Error Tests
**Test Suite:** Error handling patterns
```typescript
describe("DataProvider Error Handling", () => {
it("should throw ThingNotFoundError for missing thing", async () => {
// Test: Get non-existent thing
// Expected: ThingNotFoundError with _tag
});
it("should throw CreateError on creation failure", async () => {
// Test: Create thing with invalid data
// Expected: CreateError with _tag and details
});
it("should throw QueryError on query failure", async () => {
// Test: Query with invalid parameters
// Expected: QueryError with _tag and details
});
it("should throw AuthError on auth failure", async () => {
// Test: Unauthorized access
// Expected: AuthError with _tag
});
it("should throw ValidationError on validation failure", async () => {
// Test: Invalid input
// Expected: ValidationError with _tag and field details
});
it("should provide error recovery via Effect.ts", async () => {
// Test: Effect.catchTag for error handling
// Expected: Graceful recovery
});
});
```
**Expected Behavior:**
- All errors have `_tag` field
- Error messages descriptive
- Error types exported
- Effect.ts error handling works
**Coverage Target:** 95%
### 5.2 Edge Case Tests
**Test Suite:** Edge cases and failure modes
```typescript
describe("DataProvider Edge Cases", () => {
it("should handle network failures gracefully", async () => {
// Test: Simulate network failure
// Expected: NetworkError thrown
});
it("should handle timeout errors", async () => {
// Test: Operation exceeds timeout
// Expected: TimeoutError thrown
});
it("should handle concurrent updates", async () => {
// Test: Two updates to same thing
// Expected: Last write wins or conflict error
});
it("should handle large payloads", async () => {
// Test: Create thing with 1MB properties
// Expected: Success or PayloadTooLargeError
});
it("should handle invalid types", async () => {
// Test: Create thing with invalid type
// Expected: ValidationError
});
it("should handle circular connections", async () => {
// Test: A → B → A
// Expected: Allowed (circular references valid)
});
});
```
**Expected Behavior:**
- Graceful degradation
- Clear error messages
- No silent failures
- Proper cleanup
**Coverage Target:** 85%
## Category 6: Real-time Subscription Tests
### 6.1 React Hooks Tests
**Test Suite:** useQuery and useMutation hooks
```typescript
describe("DataProvider React Hooks", () => {
it("should work with useQuery hook", async () => {
// Test: const things = useQuery(provider.things.list, { type: "blog_post" })
// Expected: Returns loading, data, error states
});
it("should work with useMutation hook", async () => {
// Test: const create = useMutation(provider.things.create)
// Expected: Returns loading, success, error states
});
it("should handle loading state correctly", async () => {
// Test: useQuery returns undefined while loading
// Expected: UI shows loading indicator
});
it("should handle error state correctly", async () => {
// Test: useQuery returns error when query fails
// Expected: UI shows error message
});
it("should refetch on parameter change", async () => {
// Test: Change query parameters
// Expected: New query triggered
});
});
```
**Expected Behavior:**
- Hook API matches Convex hooks
- Loading states accurate
- Error states accurate
- Refetch works correctly
**Coverage Target:** 90%
## Test Infrastructure Requirements
### Required Test Utilities
1. **Mock DataProvider** (in-memory)
- For unit tests
- Fast execution
- Predictable behavior
2. **Test Convex Deployment**
- For integration tests
- Real backend
- Isolated test data
3. **Performance Benchmarking**
- Measure operation times
- Compare with baseline
- Track over time
4. **Test Data Generators**
- Create test organizations
- Create test users
- Create test things/connections/events
5. **Auth Test Helpers**
- Sign up test users
- Generate auth tokens
- Clean up test data
### Test Environment Setup
```bash
# Backend test deployment
CONVEX_URL=https://test-deployment.convex.cloud
CONVEX_DEPLOYMENT=test:shocking-falcon-870
# Test database (separate from prod)
TEST_ORG_ID=test-org-123
# Performance monitoring
PERFORMANCE_BASELINE_FILE=./tests/performance/baseline.json
```
## Coverage Targets by Category
| Category | Unit Coverage | Integration Coverage | Total Tests |
| ------------------ | ------------- | -------------------- | ----------- |
| Interface Contract | 95% | N/A | 30+ |
| Organizations | 95% | 85% | 10+ |
| People | 95% | 85% | 12+ |
| Things | 90% | 80% | 20+ |
| Connections | 90% | 80% | 18+ |
| Events | 90% | 80% | 15+ |
| Knowledge | 85% | 75% | 12+ |
| ConvexProvider | 95% | 90% | 15+ |
| Integration Flows | N/A | 80% | 8+ |
| Performance | 100% | 80% | 15+ |
| Error Handling | 95% | 85% | 12+ |
| Real-time | 90% | 85% | 10+ |
| **TOTAL** | **90%+** | **80%+** | **177+** |
## Test Execution Plan
### Phase 1: Unit Tests (Day 1-2)
1. Interface contract tests (type-only)
2. Mock provider tests
3. Error handling tests
4. ConvexProvider implementation tests
**Goal:** 90%+ unit coverage
### Phase 2: Integration Tests (Day 3-4)
1. Full flow tests with real backend
2. Multi-tenant isolation tests
3. Auth integration tests (50+ existing)
4. Real-time subscription tests
**Goal:** 80%+ integration coverage
### Phase 3: Performance Tests (Day 5)
1. Operation overhead tests
2. Large dataset tests
3. Concurrent request tests
4. Establish baseline
**Goal:** <10ms overhead validated
### Phase 4: Edge Cases (Day 6-7)
1. Error scenarios
2. Network failures
3. Concurrent updates
4. Large payloads
**Goal:** All edge cases covered
## Acceptance Criteria
### Must Pass Before Approval
- [ ] All 177+ tests pass
- [ ] 90%+ unit test coverage achieved
- [ ] 80%+ integration test coverage achieved
- [ ] All 50+ existing auth tests pass (zero regression)
- [ ] Performance overhead <10ms per operation
- [ ] All 6 dimensions fully tested (organizations, people, things, connections, events, knowledge)
- [ ] All 66 thing types validated
- [ ] All 25 connection types validated
- [ ] All 67 event types validated
- [ ] Multi-tenant isolation verified
- [ ] Real-time subscriptions working
- [ ] Error handling comprehensive
- [ ] TypeScript compiles with zero errors
- [ ] Documentation complete
### Performance Benchmarks
| Operation | Baseline (Convex) | Target (Provider) | Max Acceptable |
| ------------- | ----------------- | ----------------- | -------------- |
| Get | 5ms | 10ms | 15ms |
| List | 10ms | 15ms | 20ms |
| Create | 15ms | 20ms | 25ms |
| Update | 10ms | 15ms | 20ms |
| Delete | 8ms | 13ms | 18ms |
| Vector Search | 40ms | 50ms | 90ms |
**If ANY operation exceeds max acceptable, feature is REJECTED.**
## Quality Gates
### Gate 1: Unit Tests (End of Day 2)
- [ ] All interface tests pass
- [ ] All mock provider tests pass
- [ ] 90%+ unit coverage
- [ ] Zero TypeScript errors
### Gate 2: Integration Tests (End of Day 4)
- [ ] All integration flows pass
- [ ] All 50+ auth tests pass
- [ ] 80%+ integration coverage
- [ ] Multi-tenant isolation verified
### Gate 3: Performance Tests (End of Day 5)
- [ ] All operations within acceptable range
- [ ] Baseline established
- [ ] Performance report generated
### Gate 4: Final Validation (End of Day 7)
- [ ] All 177+ tests pass
- [ ] All acceptance criteria met
- [ ] Documentation complete
- [ ] Ready for code review
## Test Failure Protocol
### If Tests Fail During Implementation
1. **STOP** - Do not proceed with implementation
2. **ANALYZE** - Identify root cause of failure
3. **EMIT EVENT** - Log `test_failed` event with details
4. **TRIGGER PROBLEM SOLVER** - Problem solver agent monitors test failures
5. **FIX** - Backend specialist fixes issue
6. **RETEST** - Run failed tests again
7. **VALIDATE** - Ensure fix doesn't break other tests
### Common Failure Modes
1. **Type Errors** - Interface contract violated
2. **Auth Regression** - Existing auth tests fail
3. **Performance Degradation** - Overhead exceeds 10ms
4. **Multi-tenant Leak** - Data isolation broken
5. **Connection Type Mismatch** - Wrong relationship types used
## Success Metrics
### Technical Quality
- **Test Coverage:** 90%+ unit, 80%+ integration
- **Performance:** <10ms overhead per operation
- **Type Safety:** 100% typed (no `any`)
- **Error Handling:** All errors have `_tag`
- **Regression:** Zero functionality loss
### Ontology Alignment
- **6 Dimensions:** All fully tested
- **66 Thing Types:** All validated
- **25 Connection Types:** All validated
- **67 Event Types:** All validated
- **Multi-tenant:** Perfect isolation
### Developer Experience
- **Hook API:** Matches Convex ergonomics
- **Error Messages:** Clear and actionable
- **Type Cycle:** Full autocomplete
- **Documentation:** Complete examples
- **Migration Path:** Straightforward
## Related Documents
- **Plan:** `/Users/toc/Server/ONE/one/things/plans/2-backend-agnostic-frontend.md`
- **Feature Spec:** `/Users/toc/Server/ONE/one/things/features/2-1-dataprovider-interface.md` (to be created)
- **Implementation:** `/Users/toc/Server/ONE/frontend/src/providers/`
- **Existing Tests:** `/Users/toc/Server/ONE/frontend/tests/auth/` (50+ auth tests)
- **Mock Provider:** `/Users/toc/Server/ONE/frontend/src/providers/__tests__/DataProvider.test.ts` (existing)
## Notes for Backend Specialist
**Context Budget:** This test spec is designed to fit within 2,000 token context when implementing.
**Key Points:**
1. Read this spec BEFORE writing any code
2. Implement tests BEFORE implementation (TDD)
3. Use existing test patterns from `/frontend/tests/auth/`
4. Use existing mock provider pattern from `/__tests__/DataProvider.test.ts`
5. Run tests continuously during implementation
6. Target: 90%+ unit, 80%+ integration coverage
7. Zero regression on auth tests (50+)
**Critical Success Factor:**
The DataProvider interface is the foundation for the entire backend-agnostic architecture. These tests MUST pass before proceeding to Features 2-2 through 2-7. Quality cannot be compromised.
**Test Specification Status:** ✅ Complete and Ready for Implementation
**Created:** 2025-10-13
**Validated By:** Quality Agent (Intelligence Agent)
**Approval Required From:** Engineering Director Agent
**Next Step:** Backend Specialist begins implementation with tests first (TDD)