Thin MongoDB ODM built for Standard Schema
mongodb
zod
deno
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});