Files
sim/packages/testing/src/mocks/database.mock.ts
Waleed b7f6bab282 feat(tests): added testing package, overhauled tests (#2586)
* feat(tests): added testing package, overhauled tests

* fix build
2025-12-25 16:06:47 -08:00

114 lines
3.3 KiB
TypeScript

import { vi } from 'vitest'
/**
* Creates mock SQL template literal function.
* Mimics drizzle-orm's sql tagged template.
*/
export function createMockSql() {
return (strings: TemplateStringsArray, ...values: any[]) => ({
strings,
values,
toSQL: () => ({ sql: strings.join('?'), params: values }),
})
}
/**
* Creates mock SQL operators (eq, and, or, etc.).
*/
export function createMockSqlOperators() {
return {
eq: vi.fn((a, b) => ({ type: 'eq', left: a, right: b })),
ne: vi.fn((a, b) => ({ type: 'ne', left: a, right: b })),
gt: vi.fn((a, b) => ({ type: 'gt', left: a, right: b })),
gte: vi.fn((a, b) => ({ type: 'gte', left: a, right: b })),
lt: vi.fn((a, b) => ({ type: 'lt', left: a, right: b })),
lte: vi.fn((a, b) => ({ type: 'lte', left: a, right: b })),
and: vi.fn((...conditions) => ({ type: 'and', conditions })),
or: vi.fn((...conditions) => ({ type: 'or', conditions })),
not: vi.fn((condition) => ({ type: 'not', condition })),
isNull: vi.fn((column) => ({ type: 'isNull', column })),
isNotNull: vi.fn((column) => ({ type: 'isNotNull', column })),
inArray: vi.fn((column, values) => ({ type: 'inArray', column, values })),
notInArray: vi.fn((column, values) => ({ type: 'notInArray', column, values })),
like: vi.fn((column, pattern) => ({ type: 'like', column, pattern })),
ilike: vi.fn((column, pattern) => ({ type: 'ilike', column, pattern })),
desc: vi.fn((column) => ({ type: 'desc', column })),
asc: vi.fn((column) => ({ type: 'asc', column })),
}
}
/**
* Creates a mock database connection.
*/
export function createMockDb() {
return {
select: vi.fn(() => ({
from: vi.fn(() => ({
where: vi.fn(() => ({
limit: vi.fn(() => Promise.resolve([])),
orderBy: vi.fn(() => Promise.resolve([])),
})),
leftJoin: vi.fn(() => ({
where: vi.fn(() => Promise.resolve([])),
})),
innerJoin: vi.fn(() => ({
where: vi.fn(() => Promise.resolve([])),
})),
})),
})),
insert: vi.fn(() => ({
values: vi.fn(() => ({
returning: vi.fn(() => Promise.resolve([])),
onConflictDoUpdate: vi.fn(() => ({
returning: vi.fn(() => Promise.resolve([])),
})),
onConflictDoNothing: vi.fn(() => ({
returning: vi.fn(() => Promise.resolve([])),
})),
})),
})),
update: vi.fn(() => ({
set: vi.fn(() => ({
where: vi.fn(() => ({
returning: vi.fn(() => Promise.resolve([])),
})),
})),
})),
delete: vi.fn(() => ({
where: vi.fn(() => ({
returning: vi.fn(() => Promise.resolve([])),
})),
})),
transaction: vi.fn(async (callback) => callback(createMockDb())),
query: vi.fn(() => Promise.resolve([])),
}
}
/**
* Mock module for @sim/db.
* Use with vi.mock() to replace the real database.
*
* @example
* ```ts
* vi.mock('@sim/db', () => databaseMock)
* ```
*/
export const databaseMock = {
db: createMockDb(),
sql: createMockSql(),
...createMockSqlOperators(),
}
/**
* Creates a mock for drizzle-orm module.
*
* @example
* ```ts
* vi.mock('drizzle-orm', () => drizzleOrmMock)
* ```
*/
export const drizzleOrmMock = {
sql: createMockSql(),
...createMockSqlOperators(),
}