Thin MongoDB ODM built for Standard Schema
mongodb
zod
deno
1import { assert, assertEquals, assertExists } from "@std/assert";
2import { ObjectId } from "mongodb";
3import {
4 cleanupCollection,
5 createUserModel,
6 setupTestDb,
7 teardownTestDb,
8 type UserInsert,
9 type userSchema,
10} from "./utils.ts";
11import type { Model } from "../mod.ts";
12
13let UserModel: Model<typeof userSchema>;
14
15Deno.test.beforeAll(async () => {
16 await setupTestDb();
17 UserModel = createUserModel("users_crud");
18});
19
20Deno.test.beforeEach(async () => {
21 await cleanupCollection(UserModel);
22});
23
24Deno.test.afterAll(async () => {
25 await teardownTestDb();
26});
27
28Deno.test({
29 name: "CRUD: Insert - should insert a new user successfully",
30 async fn() {
31 const newUser: UserInsert = {
32 name: "Test User",
33 email: "test@example.com",
34 age: 25,
35 };
36
37 const insertResult = await UserModel.insertOne(newUser);
38
39 assertExists(insertResult.insertedId);
40 console.log("User inserted with ID:", insertResult.insertedId);
41 },
42 sanitizeResources: false,
43 sanitizeOps: false,
44});
45
46Deno.test({
47 name: "CRUD: Find - should find the inserted user",
48 async fn() {
49 // First insert a user for this test
50 const newUser: UserInsert = {
51 name: "Find Test User",
52 email: "findtest@example.com",
53 age: 30,
54 };
55 const insertResult = await UserModel.insertOne(newUser);
56 assertExists(insertResult.insertedId);
57
58 const foundUser = await UserModel.findOne({
59 _id: new ObjectId(insertResult.insertedId),
60 });
61
62 assertExists(foundUser);
63 assertEquals(foundUser.email, "findtest@example.com");
64 assertEquals(foundUser.name, "Find Test User");
65 assertEquals(foundUser.age, 30);
66 },
67 sanitizeResources: false,
68 sanitizeOps: false,
69});
70
71Deno.test({
72 name: "CRUD: Update - should update user data",
73 async fn() {
74 // Insert a user for this test
75 const newUser: UserInsert = {
76 name: "Update Test User",
77 email: "updatetest@example.com",
78 age: 25,
79 };
80 const insertResult = await UserModel.insertOne(newUser);
81 assertExists(insertResult.insertedId);
82
83 // Update the user
84 const updateResult = await UserModel.update(
85 { _id: new ObjectId(insertResult.insertedId) },
86 { age: 26 },
87 );
88
89 assertEquals(updateResult.modifiedCount, 1);
90
91 // Verify the update
92 const updatedUser = await UserModel.findOne({
93 _id: new ObjectId(insertResult.insertedId),
94 });
95
96 assertExists(updatedUser);
97 assertEquals(updatedUser.age, 26);
98 },
99 sanitizeResources: false,
100 sanitizeOps: false,
101});
102
103Deno.test({
104 name: "CRUD: Delete - should delete user successfully",
105 async fn() {
106 // Insert a user for this test
107 const newUser: UserInsert = {
108 name: "Delete Test User",
109 email: "deletetest@example.com",
110 age: 35,
111 };
112 const insertResult = await UserModel.insertOne(newUser);
113 assertExists(insertResult.insertedId);
114
115 // Delete the user
116 const deleteResult = await UserModel.delete({
117 _id: new ObjectId(insertResult.insertedId),
118 });
119
120 assertEquals(deleteResult.deletedCount, 1);
121
122 // Verify deletion
123 const deletedUser = await UserModel.findOne({
124 _id: new ObjectId(insertResult.insertedId),
125 });
126
127 assertEquals(deletedUser, null);
128 },
129 sanitizeResources: false,
130 sanitizeOps: false,
131});
132
133Deno.test({
134 name: "CRUD: Find Multiple - should find multiple users",
135 async fn() {
136 // Insert multiple users
137 const users: UserInsert[] = [
138 { name: "User 1", email: "user1@example.com", age: 20 },
139 { name: "User 2", email: "user2@example.com", age: 25 },
140 { name: "User 3", email: "user3@example.com", age: 30 },
141 ];
142
143 for (const user of users) {
144 await UserModel.insertOne(user);
145 }
146
147 // Find all users with age >= 25
148 const foundUsers = await UserModel.find({ age: { $gte: 25 } });
149
150 assert(foundUsers.length >= 2);
151 },
152 sanitizeResources: false,
153 sanitizeOps: false,
154});