@@ -13,8 +13,12 @@ Use Vitest. Test files: `feature.ts` → `feature.test.ts`
1313These modules are mocked globally — do NOT re-mock them in test files unless you need to override behavior:
1414
1515- ` @sim/db ` → ` databaseMock `
16+ - ` @sim/db/schema ` → ` schemaMock `
1617- ` drizzle-orm ` → ` drizzleOrmMock `
1718- ` @sim/logger ` → ` loggerMock `
19+ - ` @/lib/auth ` → ` authMock `
20+ - ` @/lib/auth/hybrid ` → ` hybridAuthMock ` (with default session-delegating behavior)
21+ - ` @/lib/core/utils/request ` → ` requestUtilsMock `
1822- ` @/stores/console/store ` , ` @/stores/terminal ` , ` @/stores/execution/store `
1923- ` @/blocks/registry `
2024- ` @trigger.dev/sdk `
@@ -192,24 +196,38 @@ hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({
192196
193197### Database chain mocking
194198
199+ Use the centralized ` dbChainMock ` + ` dbChainMockFns ` helpers — no ` vi.hoisted() ` or chain-wiring boilerplate needed.
200+
195201``` typescript
196- const { mockSelect, mockFrom, mockWhere } = vi .hoisted (() => ({
197- mockSelect: vi .fn (),
198- mockFrom: vi .fn (),
199- mockWhere: vi .fn (),
200- }))
202+ import { dbChainMock , dbChainMockFns , resetDbChainMock } from ' @sim/testing'
201203
202- vi .mock (' @sim/db' , () => ({
203- db: { select: mockSelect },
204- }))
204+ vi .mock (' @sim/db' , () => dbChainMock )
205+ // Spread for custom exports: vi.mock('@sim/db', () => ({ ...dbChainMock, myTable: {...} }))
205206
206207beforeEach (() => {
207- mockSelect .mockReturnValue ({ from: mockFrom })
208- mockFrom .mockReturnValue ({ where: mockWhere })
209- mockWhere .mockResolvedValue ([{ id: ' 1' , name: ' test' }])
208+ vi .clearAllMocks ()
209+ resetDbChainMock () // only needed if tests use permanent (non-`Once`) overrides
210+ })
211+
212+ it (' reads a row' , async () => {
213+ dbChainMockFns .limit .mockResolvedValueOnce ([{ id: ' 1' , name: ' test' }])
214+ // exercise code that hits db.select().from().where().limit()
215+ expect (dbChainMockFns .where ).toHaveBeenCalled ()
210216})
211217```
212218
219+ ** Default chains supported:**
220+ - ` select()/selectDistinct()/selectDistinctOn() → from() → where()/innerJoin()/leftJoin() → where() → limit()/orderBy()/returning()/groupBy() `
221+ - ` insert() → values() → returning()/onConflictDoUpdate()/onConflictDoNothing() `
222+ - ` update() → set() → where() → limit()/orderBy()/returning() `
223+ - ` delete() → where() → limit()/orderBy()/returning() `
224+ - ` db.execute() ` resolves ` [] `
225+ - ` db.transaction(cb) ` calls cb with ` dbChainMock.db `
226+
227+ All terminals default to ` Promise.resolve([]) ` . Override per-test with ` dbChainMockFns.<terminal>.mockResolvedValueOnce(...) ` .
228+
229+ Use ` resetDbChainMock() ` in ` beforeEach ` only when tests replace wiring with ` .mockReturnValue ` / ` .mockResolvedValue ` (permanent). Tests using only ` ...Once ` variants don't need it.
230+
213231## @sim/testing Package
214232
215233Always prefer over local test data.
0 commit comments