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();
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
32 const newUser: UserInsert = {
33 name: "Test User",
34 email: "test@example.com",
35 age: 25,
36 };
37
38 const insertResult = await UserModel.insertOne(newUser);
39
40 assertExists(insertResult.insertedId);
41 console.log("User inserted with ID:", insertResult.insertedId);
42 },
43 sanitizeResources: false,
44 sanitizeOps: false,
45});
46
47Deno.test({
48 name: "CRUD: Find - should find the inserted user",
49 async fn() {
50
51 // First insert a user for this test
52 const newUser: UserInsert = {
53 name: "Find Test User",
54 email: "findtest@example.com",
55 age: 30,
56 };
57 const insertResult = await UserModel.insertOne(newUser);
58 assertExists(insertResult.insertedId);
59
60 const foundUser = await UserModel.findOne({
61 _id: new ObjectId(insertResult.insertedId),
62 });
63
64 assertExists(foundUser);
65 assertEquals(foundUser.email, "findtest@example.com");
66 assertEquals(foundUser.name, "Find Test User");
67 assertEquals(foundUser.age, 30);
68 },
69 sanitizeResources: false,
70 sanitizeOps: false,
71});
72
73Deno.test({
74 name: "CRUD: Update - should update user data",
75 async fn() {
76
77 // Insert a user for this test
78 const newUser: UserInsert = {
79 name: "Update Test User",
80 email: "updatetest@example.com",
81 age: 25,
82 };
83 const insertResult = await UserModel.insertOne(newUser);
84 assertExists(insertResult.insertedId);
85
86 // Update the user
87 const updateResult = await UserModel.update(
88 { _id: new ObjectId(insertResult.insertedId) },
89 { age: 26 },
90 );
91
92 assertEquals(updateResult.modifiedCount, 1);
93
94 // Verify the update
95 const updatedUser = await UserModel.findOne({
96 _id: new ObjectId(insertResult.insertedId),
97 });
98
99 assertExists(updatedUser);
100 assertEquals(updatedUser.age, 26);
101 },
102 sanitizeResources: false,
103 sanitizeOps: false,
104});
105
106Deno.test({
107 name: "CRUD: Delete - should delete user successfully",
108 async fn() {
109
110 // Insert a user for this test
111 const newUser: UserInsert = {
112 name: "Delete Test User",
113 email: "deletetest@example.com",
114 age: 35,
115 };
116 const insertResult = await UserModel.insertOne(newUser);
117 assertExists(insertResult.insertedId);
118
119 // Delete the user
120 const deleteResult = await UserModel.delete({
121 _id: new ObjectId(insertResult.insertedId),
122 });
123
124 assertEquals(deleteResult.deletedCount, 1);
125
126 // Verify deletion
127 const deletedUser = await UserModel.findOne({
128 _id: new ObjectId(insertResult.insertedId),
129 });
130
131 assertEquals(deletedUser, null);
132 },
133 sanitizeResources: false,
134 sanitizeOps: false,
135});
136
137Deno.test({
138 name: "CRUD: Find Multiple - should find multiple users",
139 async fn() {
140
141 // Insert multiple users
142 const users: UserInsert[] = [
143 { name: "User 1", email: "user1@example.com", age: 20 },
144 { name: "User 2", email: "user2@example.com", age: 25 },
145 { name: "User 3", email: "user3@example.com", age: 30 },
146 ];
147
148 for (const user of users) {
149 await UserModel.insertOne(user);
150 }
151
152 // Find all users with age >= 25
153 const foundUsers = await UserModel.find({ age: { $gte: 25 } });
154
155 assert(foundUsers.length >= 2);
156 },
157 sanitizeResources: false,
158 sanitizeOps: false,
159});
160
161