jazz-tools 0.18.14 → 0.18.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +45 -33
- package/CHANGELOG.md +23 -0
- package/dist/better-auth/database-adapter/index.d.ts +50 -0
- package/dist/better-auth/database-adapter/index.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/index.js +920 -0
- package/dist/better-auth/database-adapter/index.js.map +1 -0
- package/dist/better-auth/database-adapter/repository/account.d.ts +24 -0
- package/dist/better-auth/database-adapter/repository/account.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/repository/generic.d.ts +45 -0
- package/dist/better-auth/database-adapter/repository/generic.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/repository/index.d.ts +6 -0
- package/dist/better-auth/database-adapter/repository/index.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/repository/session.d.ts +29 -0
- package/dist/better-auth/database-adapter/repository/session.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/repository/user.d.ts +30 -0
- package/dist/better-auth/database-adapter/repository/user.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/repository/verification.d.ts +18 -0
- package/dist/better-auth/database-adapter/repository/verification.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/schema.d.ts +27 -0
- package/dist/better-auth/database-adapter/schema.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/tests/index.test.d.ts +2 -0
- package/dist/better-auth/database-adapter/tests/index.test.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/tests/repository/account.test.d.ts +2 -0
- package/dist/better-auth/database-adapter/tests/repository/account.test.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/tests/repository/generic.test.d.ts +2 -0
- package/dist/better-auth/database-adapter/tests/repository/generic.test.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/tests/repository/session.test.d.ts +2 -0
- package/dist/better-auth/database-adapter/tests/repository/session.test.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/tests/repository/user.test.d.ts +2 -0
- package/dist/better-auth/database-adapter/tests/repository/user.test.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/tests/repository/verification.test.d.ts +2 -0
- package/dist/better-auth/database-adapter/tests/repository/verification.test.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/tests/sync-utils.d.ts +16 -0
- package/dist/better-auth/database-adapter/tests/sync-utils.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/tests/utils.test.d.ts +2 -0
- package/dist/better-auth/database-adapter/tests/utils.test.d.ts.map +1 -0
- package/dist/better-auth/database-adapter/utils.d.ts +16 -0
- package/dist/better-auth/database-adapter/utils.d.ts.map +1 -0
- package/dist/worker/edge-wasm.d.ts +2 -0
- package/dist/worker/edge-wasm.d.ts.map +1 -0
- package/dist/worker/edge-wasm.js +5 -0
- package/dist/worker/edge-wasm.js.map +1 -0
- package/jazz-tools-0.18.6.tgz +0 -0
- package/package.json +15 -5
- package/src/better-auth/database-adapter/index.ts +228 -0
- package/src/better-auth/database-adapter/repository/account.ts +131 -0
- package/src/better-auth/database-adapter/repository/generic.ts +297 -0
- package/src/better-auth/database-adapter/repository/index.ts +5 -0
- package/src/better-auth/database-adapter/repository/session.ts +190 -0
- package/src/better-auth/database-adapter/repository/user.ts +158 -0
- package/src/better-auth/database-adapter/repository/verification.ts +37 -0
- package/src/better-auth/database-adapter/schema.ts +222 -0
- package/src/better-auth/database-adapter/tests/index.test.ts +690 -0
- package/src/better-auth/database-adapter/tests/repository/account.test.ts +149 -0
- package/src/better-auth/database-adapter/tests/repository/generic.test.ts +183 -0
- package/src/better-auth/database-adapter/tests/repository/session.test.ts +419 -0
- package/src/better-auth/database-adapter/tests/repository/user.test.ts +673 -0
- package/src/better-auth/database-adapter/tests/repository/verification.test.ts +101 -0
- package/src/better-auth/database-adapter/tests/sync-utils.ts +127 -0
- package/src/better-auth/database-adapter/tests/utils.test.ts +787 -0
- package/src/better-auth/database-adapter/utils.ts +178 -0
- package/src/worker/edge-wasm.ts +5 -0
- package/tsup.config.ts +8 -0
@@ -0,0 +1,673 @@
|
|
1
|
+
import { beforeEach, describe, expect, it } from "vitest";
|
2
|
+
import { Account, co } from "jazz-tools";
|
3
|
+
import { startWorker } from "jazz-tools/worker";
|
4
|
+
import { UserRepository } from "../../repository/user";
|
5
|
+
import { createJazzSchema, Database } from "../../schema";
|
6
|
+
import { createWorkerAccount, startSyncServer } from "../sync-utils.js";
|
7
|
+
|
8
|
+
describe("UserRepository", () => {
|
9
|
+
let syncServer: any;
|
10
|
+
|
11
|
+
let databaseSchema: Database;
|
12
|
+
let databaseRoot: co.loaded<Database, { group: true }>;
|
13
|
+
let worker: Account;
|
14
|
+
|
15
|
+
beforeEach(async () => {
|
16
|
+
syncServer = await startSyncServer();
|
17
|
+
|
18
|
+
const workerAccount = await createWorkerAccount({
|
19
|
+
name: "test",
|
20
|
+
peer: `ws://localhost:${syncServer.port}`,
|
21
|
+
});
|
22
|
+
|
23
|
+
const JazzSchema = createJazzSchema({
|
24
|
+
user: {
|
25
|
+
modelName: "user",
|
26
|
+
fields: {
|
27
|
+
email: {
|
28
|
+
type: "string",
|
29
|
+
required: true,
|
30
|
+
},
|
31
|
+
name: {
|
32
|
+
type: "string",
|
33
|
+
required: false,
|
34
|
+
},
|
35
|
+
},
|
36
|
+
},
|
37
|
+
session: {
|
38
|
+
modelName: "session",
|
39
|
+
fields: {
|
40
|
+
userId: {
|
41
|
+
type: "string",
|
42
|
+
required: true,
|
43
|
+
},
|
44
|
+
token: {
|
45
|
+
type: "string",
|
46
|
+
required: true,
|
47
|
+
},
|
48
|
+
},
|
49
|
+
},
|
50
|
+
});
|
51
|
+
|
52
|
+
const result = await startWorker({
|
53
|
+
AccountSchema: JazzSchema.WorkerAccount,
|
54
|
+
syncServer: `ws://localhost:${syncServer.port}`,
|
55
|
+
accountID: workerAccount.accountID,
|
56
|
+
accountSecret: workerAccount.agentSecret,
|
57
|
+
});
|
58
|
+
|
59
|
+
databaseSchema = JazzSchema.DatabaseRoot;
|
60
|
+
databaseRoot = await JazzSchema.loadDatabase(result.worker);
|
61
|
+
worker = result.worker;
|
62
|
+
});
|
63
|
+
|
64
|
+
it("should create a user repository", async () => {
|
65
|
+
const userRepository = new UserRepository(
|
66
|
+
databaseSchema,
|
67
|
+
databaseRoot,
|
68
|
+
worker,
|
69
|
+
);
|
70
|
+
expect(userRepository).toBeDefined();
|
71
|
+
});
|
72
|
+
|
73
|
+
describe("create", () => {
|
74
|
+
it("should create a user with email index and sessions list", async () => {
|
75
|
+
const userRepository = new UserRepository(
|
76
|
+
databaseSchema,
|
77
|
+
databaseRoot,
|
78
|
+
worker,
|
79
|
+
);
|
80
|
+
|
81
|
+
const user = await userRepository.create("user", {
|
82
|
+
email: "test@example.com",
|
83
|
+
name: "Test User",
|
84
|
+
});
|
85
|
+
|
86
|
+
expect(user.$jazz.id).toBeDefined();
|
87
|
+
expect(user.email).toBe("test@example.com");
|
88
|
+
expect(user.name).toBe("Test User");
|
89
|
+
expect(user.sessions).toBeDefined();
|
90
|
+
expect(Array.isArray(user.sessions)).toBe(true);
|
91
|
+
expect(user.sessions.length).toBe(0);
|
92
|
+
});
|
93
|
+
|
94
|
+
it("should throw error when creating user with existing email", async () => {
|
95
|
+
const userRepository = new UserRepository(
|
96
|
+
databaseSchema,
|
97
|
+
databaseRoot,
|
98
|
+
worker,
|
99
|
+
);
|
100
|
+
|
101
|
+
await userRepository.create("user", {
|
102
|
+
email: "test@example.com",
|
103
|
+
name: "Test User",
|
104
|
+
});
|
105
|
+
|
106
|
+
await expect(
|
107
|
+
userRepository.create("user", {
|
108
|
+
email: "test@example.com",
|
109
|
+
name: "Another User",
|
110
|
+
}),
|
111
|
+
).rejects.toThrow("Email already exists");
|
112
|
+
});
|
113
|
+
|
114
|
+
it("should handle missing session schema gracefully", async () => {
|
115
|
+
const userRepository = new UserRepository(
|
116
|
+
databaseSchema,
|
117
|
+
databaseRoot,
|
118
|
+
worker,
|
119
|
+
);
|
120
|
+
|
121
|
+
// This test verifies that the repository handles the case where
|
122
|
+
// the session schema exists (as required by createJazzSchema)
|
123
|
+
// but the session list schema lookup might fail
|
124
|
+
const user = await userRepository.create("user", {
|
125
|
+
email: "test@example.com",
|
126
|
+
name: "Test User",
|
127
|
+
});
|
128
|
+
|
129
|
+
expect(user.$jazz.id).toBeDefined();
|
130
|
+
expect(user.email).toBe("test@example.com");
|
131
|
+
expect(user.sessions).toBeDefined();
|
132
|
+
});
|
133
|
+
|
134
|
+
it("should create multiple users with different emails", async () => {
|
135
|
+
const userRepository = new UserRepository(
|
136
|
+
databaseSchema,
|
137
|
+
databaseRoot,
|
138
|
+
worker,
|
139
|
+
);
|
140
|
+
|
141
|
+
const user1 = await userRepository.create("user", {
|
142
|
+
email: "user1@example.com",
|
143
|
+
name: "User One",
|
144
|
+
});
|
145
|
+
|
146
|
+
const user2 = await userRepository.create("user", {
|
147
|
+
email: "user2@example.com",
|
148
|
+
name: "User Two",
|
149
|
+
});
|
150
|
+
|
151
|
+
expect(user1.$jazz.id).not.toBe(user2.$jazz.id);
|
152
|
+
expect(user1.email).toBe("user1@example.com");
|
153
|
+
expect(user2.email).toBe("user2@example.com");
|
154
|
+
});
|
155
|
+
});
|
156
|
+
|
157
|
+
describe("findMany", () => {
|
158
|
+
it("should find user by email using email index", async () => {
|
159
|
+
const userRepository = new UserRepository(
|
160
|
+
databaseSchema,
|
161
|
+
databaseRoot,
|
162
|
+
worker,
|
163
|
+
);
|
164
|
+
|
165
|
+
const createdUser = await userRepository.create("user", {
|
166
|
+
email: "test@example.com",
|
167
|
+
name: "Test User",
|
168
|
+
});
|
169
|
+
|
170
|
+
const users = await userRepository.findMany("user", [
|
171
|
+
{
|
172
|
+
field: "email",
|
173
|
+
operator: "eq",
|
174
|
+
value: "test@example.com",
|
175
|
+
connector: "AND",
|
176
|
+
},
|
177
|
+
]);
|
178
|
+
|
179
|
+
expect(users.length).toBe(1);
|
180
|
+
expect(users[0]?.$jazz.id).toBe(createdUser.$jazz.id);
|
181
|
+
expect(users[0]?.email).toBe("test@example.com");
|
182
|
+
});
|
183
|
+
|
184
|
+
it("should return empty array when finding non-existent email", async () => {
|
185
|
+
const userRepository = new UserRepository(
|
186
|
+
databaseSchema,
|
187
|
+
databaseRoot,
|
188
|
+
worker,
|
189
|
+
);
|
190
|
+
|
191
|
+
const users = await userRepository.findMany("user", [
|
192
|
+
{
|
193
|
+
field: "email",
|
194
|
+
operator: "eq",
|
195
|
+
value: "nonexistent@example.com",
|
196
|
+
connector: "AND",
|
197
|
+
},
|
198
|
+
]);
|
199
|
+
|
200
|
+
expect(users.length).toBe(0);
|
201
|
+
});
|
202
|
+
|
203
|
+
it("should find users with other where conditions using generic logic", async () => {
|
204
|
+
const userRepository = new UserRepository(
|
205
|
+
databaseSchema,
|
206
|
+
databaseRoot,
|
207
|
+
worker,
|
208
|
+
);
|
209
|
+
|
210
|
+
const user1 = await userRepository.create("user", {
|
211
|
+
email: "user1@example.com",
|
212
|
+
name: "User One",
|
213
|
+
});
|
214
|
+
|
215
|
+
const user2 = await userRepository.create("user", {
|
216
|
+
email: "user2@example.com",
|
217
|
+
name: "User Two",
|
218
|
+
});
|
219
|
+
|
220
|
+
// Find all users
|
221
|
+
const allUsers = await userRepository.findMany("user", []);
|
222
|
+
expect(allUsers.length).toBe(2);
|
223
|
+
|
224
|
+
// Find by name
|
225
|
+
const usersByName = await userRepository.findMany("user", [
|
226
|
+
{
|
227
|
+
field: "name",
|
228
|
+
operator: "eq",
|
229
|
+
value: "User One",
|
230
|
+
connector: "AND",
|
231
|
+
},
|
232
|
+
]);
|
233
|
+
expect(usersByName.length).toBe(1);
|
234
|
+
expect(usersByName[0]?.$jazz.id).toBe(user1.$jazz.id);
|
235
|
+
});
|
236
|
+
|
237
|
+
it("should find users by id using generic logic", async () => {
|
238
|
+
const userRepository = new UserRepository(
|
239
|
+
databaseSchema,
|
240
|
+
databaseRoot,
|
241
|
+
worker,
|
242
|
+
);
|
243
|
+
|
244
|
+
const createdUser = await userRepository.create("user", {
|
245
|
+
email: "test@example.com",
|
246
|
+
name: "Test User",
|
247
|
+
});
|
248
|
+
|
249
|
+
const users = await userRepository.findMany("user", [
|
250
|
+
{
|
251
|
+
field: "id",
|
252
|
+
operator: "eq",
|
253
|
+
value: createdUser.$jazz.id,
|
254
|
+
connector: "AND",
|
255
|
+
},
|
256
|
+
]);
|
257
|
+
|
258
|
+
expect(users.length).toBe(1);
|
259
|
+
expect(users[0]?.$jazz.id).toBe(createdUser.$jazz.id);
|
260
|
+
});
|
261
|
+
});
|
262
|
+
|
263
|
+
describe("update", () => {
|
264
|
+
it("should update user without email change", async () => {
|
265
|
+
const userRepository = new UserRepository(
|
266
|
+
databaseSchema,
|
267
|
+
databaseRoot,
|
268
|
+
worker,
|
269
|
+
);
|
270
|
+
|
271
|
+
const user = await userRepository.create("user", {
|
272
|
+
email: "test@example.com",
|
273
|
+
name: "Test User",
|
274
|
+
});
|
275
|
+
|
276
|
+
await userRepository.update(
|
277
|
+
"user",
|
278
|
+
[
|
279
|
+
{
|
280
|
+
field: "id",
|
281
|
+
operator: "eq",
|
282
|
+
value: user.$jazz.id,
|
283
|
+
connector: "AND",
|
284
|
+
},
|
285
|
+
],
|
286
|
+
{ name: "Updated User" },
|
287
|
+
);
|
288
|
+
|
289
|
+
const updatedUsers = await userRepository.findMany("user", [
|
290
|
+
{ field: "id", operator: "eq", value: user.$jazz.id, connector: "AND" },
|
291
|
+
]);
|
292
|
+
|
293
|
+
expect(updatedUsers.length).toBe(1);
|
294
|
+
expect(updatedUsers[0]?.name).toBe("Updated User");
|
295
|
+
expect(updatedUsers[0]?.email).toBe("test@example.com");
|
296
|
+
});
|
297
|
+
|
298
|
+
it("should update user email and maintain email index", async () => {
|
299
|
+
const userRepository = new UserRepository(
|
300
|
+
databaseSchema,
|
301
|
+
databaseRoot,
|
302
|
+
worker,
|
303
|
+
);
|
304
|
+
|
305
|
+
const user = await userRepository.create("user", {
|
306
|
+
email: "old@example.com",
|
307
|
+
name: "Test User",
|
308
|
+
});
|
309
|
+
|
310
|
+
// Update email
|
311
|
+
const updatedUsers = await userRepository.update(
|
312
|
+
"user",
|
313
|
+
[
|
314
|
+
{
|
315
|
+
field: "id",
|
316
|
+
operator: "eq",
|
317
|
+
value: user.$jazz.id,
|
318
|
+
connector: "AND",
|
319
|
+
},
|
320
|
+
],
|
321
|
+
{ email: "new@example.com" },
|
322
|
+
);
|
323
|
+
|
324
|
+
expect(updatedUsers.length).toBe(1);
|
325
|
+
expect(updatedUsers[0]?.email).toBe("new@example.com");
|
326
|
+
|
327
|
+
// Verify old email is no longer findable
|
328
|
+
const oldEmailUsers = await userRepository.findMany("user", [
|
329
|
+
{
|
330
|
+
field: "email",
|
331
|
+
operator: "eq",
|
332
|
+
value: "old@example.com",
|
333
|
+
connector: "AND",
|
334
|
+
},
|
335
|
+
]);
|
336
|
+
expect(oldEmailUsers.length).toBe(0);
|
337
|
+
|
338
|
+
// Verify new email is findable
|
339
|
+
const newEmailUsers = await userRepository.findMany("user", [
|
340
|
+
{
|
341
|
+
field: "email",
|
342
|
+
operator: "eq",
|
343
|
+
value: "new@example.com",
|
344
|
+
connector: "AND",
|
345
|
+
},
|
346
|
+
]);
|
347
|
+
expect(newEmailUsers.length).toBe(1);
|
348
|
+
expect(newEmailUsers[0]?.$jazz.id).toBe(user.$jazz.id);
|
349
|
+
});
|
350
|
+
|
351
|
+
it("should update user email to null and remove from email index", async () => {
|
352
|
+
const userRepository = new UserRepository(
|
353
|
+
databaseSchema,
|
354
|
+
databaseRoot,
|
355
|
+
worker,
|
356
|
+
);
|
357
|
+
|
358
|
+
const user = await userRepository.create("user", {
|
359
|
+
email: "test@example.com",
|
360
|
+
name: "Test User",
|
361
|
+
});
|
362
|
+
|
363
|
+
// Update email to null
|
364
|
+
const updatedUsers = await userRepository.update(
|
365
|
+
"user",
|
366
|
+
[
|
367
|
+
{
|
368
|
+
field: "id",
|
369
|
+
operator: "eq",
|
370
|
+
value: user.$jazz.id,
|
371
|
+
connector: "AND",
|
372
|
+
},
|
373
|
+
],
|
374
|
+
{ email: null },
|
375
|
+
);
|
376
|
+
|
377
|
+
expect(updatedUsers.length).toBe(1);
|
378
|
+
expect(updatedUsers[0]?.email).toBe(null);
|
379
|
+
|
380
|
+
// Verify email is no longer findable
|
381
|
+
const emailUsers = await userRepository.findMany("user", [
|
382
|
+
{
|
383
|
+
field: "email",
|
384
|
+
operator: "eq",
|
385
|
+
value: "test@example.com",
|
386
|
+
connector: "AND",
|
387
|
+
},
|
388
|
+
]);
|
389
|
+
expect(emailUsers.length).toBe(0);
|
390
|
+
});
|
391
|
+
|
392
|
+
it("should handle update with no matching users", async () => {
|
393
|
+
const userRepository = new UserRepository(
|
394
|
+
databaseSchema,
|
395
|
+
databaseRoot,
|
396
|
+
worker,
|
397
|
+
);
|
398
|
+
|
399
|
+
const updatedUsers = await userRepository.update(
|
400
|
+
"user",
|
401
|
+
[
|
402
|
+
{
|
403
|
+
field: "id",
|
404
|
+
operator: "eq",
|
405
|
+
value: "non-existent-id",
|
406
|
+
connector: "AND",
|
407
|
+
},
|
408
|
+
],
|
409
|
+
{ name: "Updated" },
|
410
|
+
);
|
411
|
+
|
412
|
+
expect(updatedUsers.length).toBe(0);
|
413
|
+
});
|
414
|
+
|
415
|
+
it("should not update email index when email is undefined in update", async () => {
|
416
|
+
const userRepository = new UserRepository(
|
417
|
+
databaseSchema,
|
418
|
+
databaseRoot,
|
419
|
+
worker,
|
420
|
+
);
|
421
|
+
|
422
|
+
const user = await userRepository.create("user", {
|
423
|
+
email: "test@example.com",
|
424
|
+
name: "Test User",
|
425
|
+
});
|
426
|
+
|
427
|
+
// Update only name, not email
|
428
|
+
await userRepository.update(
|
429
|
+
"user",
|
430
|
+
[
|
431
|
+
{
|
432
|
+
field: "id",
|
433
|
+
operator: "eq",
|
434
|
+
value: user.$jazz.id,
|
435
|
+
connector: "AND",
|
436
|
+
},
|
437
|
+
],
|
438
|
+
{ name: "Updated User" },
|
439
|
+
);
|
440
|
+
|
441
|
+
// Verify email is still findable
|
442
|
+
const emailUsers = await userRepository.findMany("user", [
|
443
|
+
{
|
444
|
+
field: "email",
|
445
|
+
operator: "eq",
|
446
|
+
value: "test@example.com",
|
447
|
+
connector: "AND",
|
448
|
+
},
|
449
|
+
]);
|
450
|
+
expect(emailUsers.length).toBe(1);
|
451
|
+
expect(emailUsers[0]?.name).toBe("Updated User");
|
452
|
+
});
|
453
|
+
});
|
454
|
+
|
455
|
+
describe("deleteValue", () => {
|
456
|
+
it("should delete user and remove from email index", async () => {
|
457
|
+
const userRepository = new UserRepository(
|
458
|
+
databaseSchema,
|
459
|
+
databaseRoot,
|
460
|
+
worker,
|
461
|
+
);
|
462
|
+
|
463
|
+
const user = await userRepository.create("user", {
|
464
|
+
email: "test@example.com",
|
465
|
+
name: "Test User",
|
466
|
+
});
|
467
|
+
|
468
|
+
const deletedCount = await userRepository.deleteValue("user", [
|
469
|
+
{ field: "id", operator: "eq", value: user.$jazz.id, connector: "AND" },
|
470
|
+
]);
|
471
|
+
|
472
|
+
expect(deletedCount).toBe(1);
|
473
|
+
|
474
|
+
// Verify user is no longer findable
|
475
|
+
const users = await userRepository.findMany("user", []);
|
476
|
+
expect(users.length).toBe(0);
|
477
|
+
|
478
|
+
// Verify email is no longer findable
|
479
|
+
const emailUsers = await userRepository.findMany("user", [
|
480
|
+
{
|
481
|
+
field: "email",
|
482
|
+
operator: "eq",
|
483
|
+
value: "test@example.com",
|
484
|
+
connector: "AND",
|
485
|
+
},
|
486
|
+
]);
|
487
|
+
expect(emailUsers.length).toBe(0);
|
488
|
+
});
|
489
|
+
|
490
|
+
it("should delete multiple users and clean up email indexes", async () => {
|
491
|
+
const userRepository = new UserRepository(
|
492
|
+
databaseSchema,
|
493
|
+
databaseRoot,
|
494
|
+
worker,
|
495
|
+
);
|
496
|
+
|
497
|
+
const user1 = await userRepository.create("user", {
|
498
|
+
email: "user1@example.com",
|
499
|
+
name: "User One",
|
500
|
+
});
|
501
|
+
|
502
|
+
const user2 = await userRepository.create("user", {
|
503
|
+
email: "user2@example.com",
|
504
|
+
name: "User Two",
|
505
|
+
});
|
506
|
+
|
507
|
+
// Delete all users
|
508
|
+
const deletedCount = await userRepository.deleteValue("user", []);
|
509
|
+
expect(deletedCount).toBe(2);
|
510
|
+
|
511
|
+
// Verify no users are findable
|
512
|
+
const users = await userRepository.findMany("user", []);
|
513
|
+
expect(users.length).toBe(0);
|
514
|
+
|
515
|
+
// Verify emails are no longer findable
|
516
|
+
const email1Users = await userRepository.findMany("user", [
|
517
|
+
{
|
518
|
+
field: "email",
|
519
|
+
operator: "eq",
|
520
|
+
value: "user1@example.com",
|
521
|
+
connector: "AND",
|
522
|
+
},
|
523
|
+
]);
|
524
|
+
expect(email1Users.length).toBe(0);
|
525
|
+
|
526
|
+
const email2Users = await userRepository.findMany("user", [
|
527
|
+
{
|
528
|
+
field: "email",
|
529
|
+
operator: "eq",
|
530
|
+
value: "user2@example.com",
|
531
|
+
connector: "AND",
|
532
|
+
},
|
533
|
+
]);
|
534
|
+
expect(email2Users.length).toBe(0);
|
535
|
+
});
|
536
|
+
|
537
|
+
it("should handle deletion with no matching users", async () => {
|
538
|
+
const userRepository = new UserRepository(
|
539
|
+
databaseSchema,
|
540
|
+
databaseRoot,
|
541
|
+
worker,
|
542
|
+
);
|
543
|
+
|
544
|
+
const deletedCount = await userRepository.deleteValue("user", [
|
545
|
+
{
|
546
|
+
field: "id",
|
547
|
+
operator: "eq",
|
548
|
+
value: "non-existent-id",
|
549
|
+
connector: "AND",
|
550
|
+
},
|
551
|
+
]);
|
552
|
+
|
553
|
+
expect(deletedCount).toBe(0);
|
554
|
+
});
|
555
|
+
|
556
|
+
it("should clean up email index for user without email", async () => {
|
557
|
+
const userRepository = new UserRepository(
|
558
|
+
databaseSchema,
|
559
|
+
databaseRoot,
|
560
|
+
worker,
|
561
|
+
);
|
562
|
+
|
563
|
+
const user = await userRepository.create("user", {
|
564
|
+
email: "test@example.com",
|
565
|
+
name: "Test User",
|
566
|
+
});
|
567
|
+
|
568
|
+
// First set email to null
|
569
|
+
await userRepository.update(
|
570
|
+
"user",
|
571
|
+
[
|
572
|
+
{
|
573
|
+
field: "id",
|
574
|
+
operator: "eq",
|
575
|
+
value: user.$jazz.id,
|
576
|
+
connector: "AND",
|
577
|
+
},
|
578
|
+
],
|
579
|
+
{ email: null },
|
580
|
+
);
|
581
|
+
|
582
|
+
// Then delete the user
|
583
|
+
const deletedCount = await userRepository.deleteValue("user", [
|
584
|
+
{ field: "id", operator: "eq", value: user.$jazz.id, connector: "AND" },
|
585
|
+
]);
|
586
|
+
|
587
|
+
expect(deletedCount).toBe(1);
|
588
|
+
|
589
|
+
// Verify no users remain
|
590
|
+
const users = await userRepository.findMany("user", []);
|
591
|
+
expect(users.length).toBe(0);
|
592
|
+
});
|
593
|
+
});
|
594
|
+
|
595
|
+
describe("email index management", () => {
|
596
|
+
it("should handle custom email field name from better auth schema", async () => {
|
597
|
+
const customSchema = createJazzSchema({
|
598
|
+
user: {
|
599
|
+
modelName: "user",
|
600
|
+
fields: {
|
601
|
+
emailAddress: {
|
602
|
+
type: "string",
|
603
|
+
required: true,
|
604
|
+
},
|
605
|
+
},
|
606
|
+
},
|
607
|
+
session: {
|
608
|
+
modelName: "session",
|
609
|
+
fields: {
|
610
|
+
userId: {
|
611
|
+
type: "string",
|
612
|
+
required: true,
|
613
|
+
},
|
614
|
+
token: {
|
615
|
+
type: "string",
|
616
|
+
required: true,
|
617
|
+
},
|
618
|
+
},
|
619
|
+
},
|
620
|
+
});
|
621
|
+
|
622
|
+
const userRepository = new UserRepository(
|
623
|
+
customSchema.DatabaseRoot,
|
624
|
+
databaseRoot,
|
625
|
+
worker,
|
626
|
+
{
|
627
|
+
user: {
|
628
|
+
modelName: "user",
|
629
|
+
fields: {
|
630
|
+
email: {
|
631
|
+
type: "string",
|
632
|
+
fieldName: "emailAddress",
|
633
|
+
},
|
634
|
+
},
|
635
|
+
},
|
636
|
+
},
|
637
|
+
);
|
638
|
+
|
639
|
+
const user = await userRepository.create("user", {
|
640
|
+
emailAddress: "test@example.com",
|
641
|
+
});
|
642
|
+
|
643
|
+
expect(user.emailAddress).toBe("test@example.com");
|
644
|
+
|
645
|
+
// Should be findable by the custom field name
|
646
|
+
const users = await userRepository.findMany("user", [
|
647
|
+
{
|
648
|
+
field: "email",
|
649
|
+
operator: "eq",
|
650
|
+
value: "test@example.com",
|
651
|
+
connector: "AND",
|
652
|
+
},
|
653
|
+
]);
|
654
|
+
|
655
|
+
expect(users.length).toBe(1);
|
656
|
+
expect(users[0]?.$jazz.id).toBe(user.$jazz.id);
|
657
|
+
});
|
658
|
+
|
659
|
+
it("should default to 'email' field when no better auth schema is provided", async () => {
|
660
|
+
const userRepository = new UserRepository(
|
661
|
+
databaseSchema,
|
662
|
+
databaseRoot,
|
663
|
+
worker,
|
664
|
+
);
|
665
|
+
|
666
|
+
const user = await userRepository.create("user", {
|
667
|
+
email: "test@example.com",
|
668
|
+
});
|
669
|
+
|
670
|
+
expect(user.email).toBe("test@example.com");
|
671
|
+
});
|
672
|
+
});
|
673
|
+
});
|