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(), }