test: add Vitest config and test utils
Made-with: Cursor
This commit is contained in:
5
tests/setup.ts
Normal file
5
tests/setup.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
import { beforeAll, vi } from 'vitest';
|
||||
|
||||
beforeAll(() => {
|
||||
vi.stubEnv('NODE_ENV', 'test');
|
||||
});
|
||||
12
tests/smoke.test.ts
Normal file
12
tests/smoke.test.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import { createMockDb } from './test-utils.js';
|
||||
|
||||
describe('test-utils', () => {
|
||||
it('createMockDb returns mock with select, insert, update, delete', () => {
|
||||
const db = createMockDb();
|
||||
expect(db.select).toBeDefined();
|
||||
expect(db.insert).toBeDefined();
|
||||
expect(db.update).toBeDefined();
|
||||
expect(db.delete).toBeDefined();
|
||||
});
|
||||
});
|
||||
61
tests/test-utils.ts
Normal file
61
tests/test-utils.ts
Normal file
@@ -0,0 +1,61 @@
|
||||
import { vi } from 'vitest';
|
||||
import type { FastifyInstance } from 'fastify';
|
||||
import type { NodePgDatabase } from 'drizzle-orm/node-postgres';
|
||||
import type * as schema from '../src/db/schema/index.js';
|
||||
|
||||
export type MockDb = {
|
||||
select: ReturnType<NodePgDatabase<typeof schema>['select']>;
|
||||
insert: ReturnType<NodePgDatabase<typeof schema>['insert']>;
|
||||
update: ReturnType<NodePgDatabase<typeof schema>['update']>;
|
||||
delete: ReturnType<NodePgDatabase<typeof schema>['delete']>;
|
||||
};
|
||||
|
||||
/**
|
||||
* Create a chainable mock for Drizzle DB operations.
|
||||
* Configure chain terminals (limit, returning) to resolve to desired values.
|
||||
* Example: mockDb.select.mockReturnValue({ from: vi.fn().mockReturnValue({ where: vi.fn().mockReturnValue({ limit: vi.fn().mockResolvedValue([user]) }) }) })
|
||||
*/
|
||||
export function createMockDb(): MockDb {
|
||||
const chain = {
|
||||
from: vi.fn().mockReturnThis(),
|
||||
where: vi.fn().mockReturnThis(),
|
||||
values: vi.fn().mockReturnThis(),
|
||||
set: vi.fn().mockReturnThis(),
|
||||
orderBy: vi.fn().mockReturnThis(),
|
||||
limit: vi.fn().mockReturnThis(),
|
||||
returning: vi.fn().mockReturnThis(),
|
||||
};
|
||||
|
||||
return {
|
||||
select: vi.fn().mockReturnValue(chain),
|
||||
insert: vi.fn().mockReturnValue(chain),
|
||||
update: vi.fn().mockReturnValue(chain),
|
||||
delete: vi.fn().mockReturnValue(chain),
|
||||
} as unknown as MockDb;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a minimal mock Fastify app with db for route/integration tests.
|
||||
* Use buildApp() from app.ts for full integration tests.
|
||||
*/
|
||||
export function createMockApp(): FastifyInstance & { db: MockDb } {
|
||||
return {
|
||||
db: createMockDb(),
|
||||
log: {
|
||||
child: () => ({
|
||||
debug: () => {},
|
||||
info: () => {},
|
||||
warn: () => {},
|
||||
error: () => {},
|
||||
trace: () => {},
|
||||
fatal: () => {},
|
||||
}),
|
||||
debug: () => {},
|
||||
info: () => {},
|
||||
warn: () => {},
|
||||
error: () => {},
|
||||
trace: () => {},
|
||||
fatal: () => {},
|
||||
},
|
||||
} as FastifyInstance & { db: MockDb };
|
||||
}
|
||||
28
vitest.config.ts
Normal file
28
vitest.config.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
import { defineConfig } from 'vitest/config';
|
||||
import { resolve } from 'path';
|
||||
|
||||
export default defineConfig({
|
||||
test: {
|
||||
globals: true,
|
||||
environment: 'node',
|
||||
include: ['tests/**/*.test.ts', 'tests/**/*.spec.ts'],
|
||||
coverage: {
|
||||
provider: 'v8',
|
||||
reporter: ['text', 'json', 'lcov'],
|
||||
include: ['src/services/**/*.ts'],
|
||||
exclude: [
|
||||
'src/services/**/*.d.ts',
|
||||
'**/*.test.ts',
|
||||
'**/*.spec.ts',
|
||||
'**/index.ts',
|
||||
],
|
||||
},
|
||||
setupFiles: ['tests/setup.ts'],
|
||||
testTimeout: 10000,
|
||||
},
|
||||
resolve: {
|
||||
alias: {
|
||||
'@': resolve(__dirname, 'src'),
|
||||
},
|
||||
},
|
||||
});
|
||||
Reference in New Issue
Block a user