Thin MongoDB ODM built for Standard Schema
mongodb zod deno
at main 3.9 kB view raw
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});