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
dfrn
dfrn4mo ago
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
dfrn
dfrn4mo ago
No description
dfrn
dfrn4mo ago
No description
Voltab
VoltabOP4mo ago
thanks @dfrn ! really helpfull

Did you find this page helpful?