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