how to do unit test using drizzle ?
how to unit test this ? :
import { eq } from 'drizzle-orm';
import { db } from '../db/connection';
import { usersTable } from '../db/schema';
import { User, CreateUserData } from '../types';
export class UserService {
async createUser(userData: CreateUserData): Promise<User> {
// Check if user already exists
const existingUser = await db
.select({
id: usersTable.id,
firstName: usersTable.firstName,
lastName: usersTable.lastName,
email: usersTable.email,
createdAt: usersTable.createdAt,
updatedAt: usersTable.updatedAt,
deletedAt: usersTable.deletedAt,
})
.from(usersTable)
.where(eq(usersTable.id, userData.uid));
if (existingUser.length > 0) {
// User already exists, return the existing user
const user = existingUser[0];
if (!user) {
throw new Error('Failed to retrieve existing user');
}
return user;
}
// Create new user
const newUser = await db
.insert(usersTable)
.values({
id: userData.uid,
firstName: userData.firstName,
lastName: userData.lastName,
email: userData.email,
})
.returning({
id: usersTable.id,
firstName: usersTable.firstName,
lastName: usersTable.lastName,
email: usersTable.email,
createdAt: usersTable.createdAt,
updatedAt: usersTable.updatedAt,
deletedAt: usersTable.deletedAt,
});
const createdUser = newUser[0];
if (!createdUser) {
throw new Error('Failed to create new user');
}
return createdUser;
}
}
import { eq } from 'drizzle-orm';
import { db } from '../db/connection';
import { usersTable } from '../db/schema';
import { User, CreateUserData } from '../types';
export class UserService {
async createUser(userData: CreateUserData): Promise<User> {
// Check if user already exists
const existingUser = await db
.select({
id: usersTable.id,
firstName: usersTable.firstName,
lastName: usersTable.lastName,
email: usersTable.email,
createdAt: usersTable.createdAt,
updatedAt: usersTable.updatedAt,
deletedAt: usersTable.deletedAt,
})
.from(usersTable)
.where(eq(usersTable.id, userData.uid));
if (existingUser.length > 0) {
// User already exists, return the existing user
const user = existingUser[0];
if (!user) {
throw new Error('Failed to retrieve existing user');
}
return user;
}
// Create new user
const newUser = await db
.insert(usersTable)
.values({
id: userData.uid,
firstName: userData.firstName,
lastName: userData.lastName,
email: userData.email,
})
.returning({
id: usersTable.id,
firstName: usersTable.firstName,
lastName: usersTable.lastName,
email: usersTable.email,
createdAt: usersTable.createdAt,
updatedAt: usersTable.updatedAt,
deletedAt: usersTable.deletedAt,
});
const createdUser = newUser[0];
if (!createdUser) {
throw new Error('Failed to create new user');
}
return createdUser;
}
}
4 Replies
I think this counts more as an integration test. but I usually pass the drizzle instace into functions where I need to use it.
That allows me to replace it with PGLite when running the tests. And it also allows me the flexibility that if I ever need to use a function inside on a specific transaction context I can


thanks @dfrn ! really helpfull