Thin MongoDB ODM built for Standard Schema
mongodb zod deno
at main 4.4 kB view raw
1import { assert, assertEquals, assertExists, assertFalse } from "@std/assert"; 2import type { IndexDescription } from "mongodb"; 3import { 4 cleanupCollection, 5 createUserModel, 6 setupTestDb, 7 teardownTestDb, 8} from "./utils.ts"; 9import type { Model } from "../mod.ts"; 10 11let UserModel: Model<typeof import("./utils.ts").userSchema>; 12 13Deno.test.beforeAll(async () => { 14 await setupTestDb(); 15 UserModel = createUserModel("users_index"); 16}); 17 18Deno.test.beforeEach(async () => { 19 await cleanupCollection(UserModel); 20 // Drop all indexes except _id 21 try { 22 await UserModel.dropIndexes(); 23 } catch { 24 // Ignore if no indexes exist 25 } 26}); 27 28Deno.test.afterAll(async () => { 29 await teardownTestDb(); 30}); 31 32Deno.test({ 33 name: "Index: Create - should create a simple index", 34 async fn() { 35 const indexName = await UserModel.createIndex({ email: 1 }); 36 assertExists(indexName); 37 assertEquals(typeof indexName, "string"); 38 39 const indexExists = await UserModel.indexExists(indexName); 40 assert(indexExists); 41 }, 42 sanitizeResources: false, 43 sanitizeOps: false, 44}); 45 46Deno.test({ 47 name: "Index: Create Unique - should create a unique index", 48 async fn() { 49 const indexName = await UserModel.createIndex( 50 { email: 1 }, 51 { unique: true, name: "email_unique_test" }, 52 ); 53 assertExists(indexName); 54 assertEquals(indexName, "email_unique_test"); 55 56 const index = await UserModel.getIndex(indexName); 57 assertExists(index); 58 assert(index.unique); 59 }, 60 sanitizeResources: false, 61 sanitizeOps: false, 62}); 63 64Deno.test({ 65 name: "Index: Create Compound - should create a compound index", 66 async fn() { 67 const indexName = await UserModel.createIndex({ name: 1, age: -1 }); 68 assertExists(indexName); 69 70 const index = await UserModel.getIndex(indexName); 71 assertExists(index); 72 assertEquals(Object.keys(index.key || {}).length, 2); 73 }, 74 sanitizeResources: false, 75 sanitizeOps: false, 76}); 77 78Deno.test({ 79 name: "Index: List - should list all indexes", 80 async fn() { 81 // Create a few indexes 82 await UserModel.createIndex({ email: 1 }); 83 await UserModel.createIndex({ name: 1, age: -1 }); 84 85 const indexes = await UserModel.listIndexes(); 86 // Should have at least _id index + the 2 we created 87 assert(indexes.length >= 3); 88 89 const indexNames = indexes.map((idx) => idx.name); 90 assert(indexNames.includes("_id_")); 91 }, 92 sanitizeResources: false, 93 sanitizeOps: false, 94}); 95 96Deno.test({ 97 name: "Index: Drop - should drop an index", 98 async fn() { 99 const indexName = await UserModel.createIndex({ email: 1 }); 100 assertExists(indexName); 101 102 let indexExists = await UserModel.indexExists(indexName); 103 assert(indexExists); 104 105 await UserModel.dropIndex(indexName); 106 107 indexExists = await UserModel.indexExists(indexName); 108 assertFalse(indexExists); 109 }, 110 sanitizeResources: false, 111 sanitizeOps: false, 112}); 113 114Deno.test({ 115 name: "Index: Create Multiple - should create multiple indexes", 116 async fn() { 117 const indexNames = await UserModel.createIndexes([ 118 { key: { email: 1 }, name: "email_multiple_test" }, 119 { key: { name: 1, age: -1 }, name: "name_age_multiple_test" }, 120 ]); 121 122 assertEquals(indexNames.length, 2); 123 assertEquals(indexNames.includes("email_multiple_test"), true); 124 assertEquals(indexNames.includes("name_age_multiple_test"), true); 125 }, 126 sanitizeResources: false, 127 sanitizeOps: false, 128}); 129 130Deno.test({ 131 name: "Index: Sync - should create missing indexes", 132 async fn() { 133 const indexesToSync: IndexDescription[] = [ 134 { key: { email: 1 }, name: "email_idx" }, 135 { key: { name: 1 }, name: "name_idx" }, 136 ]; 137 138 const created = await UserModel.syncIndexes(indexesToSync); 139 assertEquals(created.length, 2); 140 141 // Running again should not create duplicates 142 const createdAgain = await UserModel.syncIndexes(indexesToSync); 143 assertEquals(createdAgain.length, 0); 144 }, 145 sanitizeResources: false, 146 sanitizeOps: false, 147}); 148 149Deno.test({ 150 name: "Index: Get - should get index by name", 151 async fn() { 152 await UserModel.createIndex( 153 { email: 1 }, 154 { unique: true, name: "email_unique_idx" }, 155 ); 156 157 const index = await UserModel.getIndex("email_unique_idx"); 158 assertExists(index); 159 assertEquals(index.name, "email_unique_idx"); 160 assert(index.unique); 161 }, 162 sanitizeResources: false, 163 sanitizeOps: false, 164});