Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
18ea77a
feat(web): add mock-db and dependencies tests
brandonkachen Dec 16, 2025
b90c078
refactor(testing): centralize mock-db utilities in common package
brandonkachen Dec 17, 2025
507fd3d
docs(testing): add knowledge file for mock-db utilities
brandonkachen Dec 17, 2025
7c1894c
fix(testing): add Bun/Jest compatibility layer for mock-db
brandonkachen Dec 17, 2025
4717d6d
fix(testing): add bun:test stub for Jest module resolution
brandonkachen Dec 17, 2025
3d8acc3
fix(testing): exclude Bun-only tests from Jest test runner
brandonkachen Dec 17, 2025
4bb1046
fix(e2e): wrap test.use() in describe block for proper Playwright sco…
brandonkachen Dec 17, 2025
c611780
refactor(testing): move TestableDb interface to mock-db.ts
brandonkachen Dec 17, 2025
c567749
chore(e2e): rename .spec.ts to .test.ts for consistency
brandonkachen Dec 17, 2025
521958d
refactor(testing): rename TestableDb to DbOperations
brandonkachen Dec 17, 2025
7111953
docs(testing): update knowledge.md with DbOperations name
brandonkachen Dec 17, 2025
ba0d08b
refactor(testing): move DbOperations interface to canonical contracts…
brandonkachen Dec 17, 2025
eaa1756
fix(web): rename Playwright e2e tests to .e2e.ts extension
brandonkachen Dec 17, 2025
6965e13
fix(web): remove bunfig.toml that may interfere with CI
brandonkachen Dec 17, 2025
3b790af
Merge remote-tracking branch 'origin/main' into brandon/mock-db
brandonkachen Dec 17, 2025
92d99ee
fix(web): exclude lib/__tests__ from Jest runner
brandonkachen Dec 17, 2025
c05b299
fix(web): only exclude ban-conditions.test.ts from Jest, not entire l…
brandonkachen Dec 17, 2025
e494d19
Merge remote-tracking branch 'origin/main' into brandon/mock-db
brandonkachen Dec 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 106 additions & 0 deletions common/src/testing/knowledge.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
# Mock Database Utilities

Mock database objects for testing. No real database needed.

## DbOperations

`DbOperations` is a minimal interface defined in `@codebuff/common/types/contracts/database`. Both the real `CodebuffPgDatabase` and test mocks satisfy it, enabling dependency injection without `as any` casts.

**Production code** should import from the contracts location:
```ts
import type { DbOperations } from '@codebuff/common/types/contracts/database'
```

**Test code** can import from either location (mock-db re-exports the interface for convenience):
```ts
import { createMockDb, type DbOperations } from '@codebuff/common/testing/mock-db'
```

## Utilities

### `createMockDb(config?)`

API route tests with insert/update/select:

```ts
import { createMockDb } from '@codebuff/common/testing/mock-db'

const mockDb = createMockDb({
insert: { onValues: async (values) => { /* check values */ } },
update: { onWhere: async () => {} },
select: { results: [{ id: 'user-123' }] },
})

await postAgentRuns({ db: mockDb, ... })
```

### `createMockDbWithErrors(config)`

Test error paths:

```ts
import { createMockDbWithErrors } from '@codebuff/common/testing/mock-db'

const mockDb = createMockDbWithErrors({
insertError: new Error('Connection failed'),
selectResults: [{ user_id: 'user-123' }],
})
```

### `createSelectOnlyMockDb(results)`

Read-only queries (version-utils, etc.):

```ts
import { createSelectOnlyMockDb } from '@codebuff/common/testing/mock-db'

const mockDb = createSelectOnlyMockDb([{ major: 1, minor: 2, patch: 3 }])

const result = await getLatestAgentVersion({
agentId: 'test-agent',
publisherId: 'test-publisher',
db: mockDb,
})
```

### `createMockDbSelect(config)`

Batch queries (agent dependencies route):

```ts
import { createMockDbSelect, mockDbSchema } from '@codebuff/common/testing/mock-db'

const mockDbSelect = mock(() => ({}))
mock.module('@codebuff/internal/db', () => ({ default: { select: mockDbSelect } }))

mockDbSelect.mockImplementation(createMockDbSelect({
publishers: [{ id: 'test-publisher' }],
rootAgent: { id: 'agent', version: '1.0.0', publisher_id: 'test-publisher', data: {} },
childAgents: [],
}))
```

### `createMockLogger()`

```ts
import { createMockLogger } from '@codebuff/common/testing/mock-db'

const mockLogger = createMockLogger()
// error, warn, info, debug are all mocks
```

## How to use

1. Import from `@codebuff/common/testing/mock-db`
2. Create in `beforeEach()` for fresh state
3. Pass to functions that take `DbOperations`

## Query patterns

| Pattern | Use |
|---------|---------|
| `db.insert(table).values(data)` | `createMockDb` |
| `db.update(table).set(data).where(cond)` | `createMockDb` |
| `db.select().from().where().limit()` | `createMockDb` |
| `db.select().from().where().orderBy().limit()` | `createSelectOnlyMockDb` |
| Batch queries with counting | `createMockDbSelect` |
Loading