1
1
import { eq } from "drizzle-orm" ;
2
2
import type { FastifyInstance , FastifyReply } from "fastify" ;
3
- import type { MercuriusContext } from "mercurius " ;
3
+ import type { Client } from "minio " ;
4
4
import { beforeEach , describe , expect , it , vi } from "vitest" ;
5
- import type { GraphQLContext } from "../../../../src/graphql/context" ;
5
+ import type {
6
+ ExplicitAuthenticationTokenPayload ,
7
+ } from "../../../../src/graphql/context" ;
6
8
import { TalawaGraphQLError } from "../../../../src/utilities/TalawaGraphQLError" ;
7
-
8
- type ResolverContext = GraphQLContext & MercuriusContext ;
9
+ import type {
10
+ Column ,
11
+ ColumnBaseConfig ,
12
+ ColumnDataType
13
+ } from 'drizzle-orm' ;
9
14
10
15
interface CurrentClient {
11
- isAuthenticated : boolean ;
16
+ isAuthenticated : true ;
12
17
user ?: {
13
18
id : string ;
14
19
role : string ;
20
+ tokenVersion : number ;
15
21
} ;
16
22
}
17
23
18
- interface TestContext extends Partial < MercuriusContext > {
24
+ interface TestContext {
19
25
currentClient : CurrentClient ;
20
26
drizzleClient : {
21
27
query : {
@@ -30,6 +36,16 @@ interface TestContext extends Partial<MercuriusContext> {
30
36
app : FastifyInstance ;
31
37
reply : FastifyReply ;
32
38
__currentQuery : string ;
39
+ envConfig : {
40
+ API_BASE_URL : string ;
41
+ } ;
42
+ jwt : {
43
+ sign : ( payload : ExplicitAuthenticationTokenPayload ) => string ;
44
+ } ;
45
+ minio : {
46
+ bucketName : "talawa" ;
47
+ client : Client ;
48
+ } ;
33
49
}
34
50
35
51
interface OrganizationParent {
@@ -160,6 +176,7 @@ const createMockContext = (overrides?: Partial<TestContext>): TestContext => ({
160
176
user : {
161
177
id : "user-123" ,
162
178
role : "regular" ,
179
+ tokenVersion : 1 ,
163
180
} ,
164
181
} ,
165
182
drizzleClient : {
@@ -177,20 +194,46 @@ const createMockContext = (overrides?: Partial<TestContext>): TestContext => ({
177
194
decorate : vi . fn ( ) ,
178
195
get : vi . fn ( ) ,
179
196
post : vi . fn ( ) ,
180
- } as Partial < Pick < FastifyInstance , 'addHook' | 'decorate' | 'get' | 'post' > > ,
197
+ server : { } as FastifyInstance [ "server" ] ,
198
+ pluginName : "" ,
199
+ prefix : "" ,
200
+ version : "" ,
201
+ } as unknown as FastifyInstance ,
181
202
reply : {
182
203
code : vi . fn ( ) ,
183
204
send : vi . fn ( ) ,
184
205
header : vi . fn ( ) ,
185
206
} as unknown as FastifyReply ,
186
207
__currentQuery : "query { test }" ,
208
+ envConfig : {
209
+ API_BASE_URL : "http://localhost:4000" ,
210
+ } ,
211
+ jwt : {
212
+ sign : vi . fn ( ) ,
213
+ } ,
214
+ minio : {
215
+ bucketName : "talawa" as const ,
216
+ client : { } as Client ,
217
+ } ,
187
218
...overrides ,
188
219
} ) ;
189
220
221
+ type OrganizationFields = {
222
+ organizationId : Column < ColumnBaseConfig < ColumnDataType , string > , object , object > ;
223
+ } ;
224
+
225
+ type WhereOperators = {
226
+ eq : typeof eq ;
227
+ } ;
228
+
229
+ type UserFields = {
230
+ id : Column < ColumnBaseConfig < ColumnDataType , string > , object , object > ;
231
+ } ;
232
+
190
233
const resolveCreator = async (
191
234
parent : OrganizationParent ,
192
235
_args : Record < string , never > ,
193
- ctx : ResolverContext ,
236
+ ctx : TestContext ,
194
237
) : Promise < User | null > => {
195
238
if ( ! ctx . currentClient . isAuthenticated || ! ctx . currentClient . user ?. id ) {
196
239
throw new TalawaGraphQLError ( {
@@ -212,12 +255,16 @@ const resolveCreator = async (
212
255
role : true ,
213
256
organizationId : true ,
214
257
} ,
215
- where : ( fields , operators ) => {
258
+ where : (
259
+ fields : OrganizationFields ,
260
+ operators : WhereOperators ,
261
+ ) => {
216
262
return operators . eq ( fields . organizationId , parent . id ) ;
217
263
} ,
218
264
} ,
219
265
} ,
220
- where : ( userFields , { eq } ) => eq ( userFields . id , currentUserId ) ,
266
+ where : ( userFields : UserFields , { eq : eqOp } : { eq : typeof eq } ) =>
267
+ eqOp ( userFields . id , currentUserId ) ,
221
268
} ) ) as UserWithRole | undefined ;
222
269
223
270
if ( ! currentUser ) {
@@ -248,7 +295,8 @@ const resolveCreator = async (
248
295
}
249
296
250
297
const existingUser = ( await ctx . drizzleClient . query . usersTable . findFirst ( {
251
- where : ( userFields ) => eq ( userFields . id , parent . creatorId || "" ) ,
298
+ where : ( userFields : UserFields ) =>
299
+ eq ( userFields . id , parent . creatorId || "" ) ,
252
300
} ) ) as UserFromDB | undefined ;
253
301
254
302
if ( ! existingUser ) {
@@ -286,17 +334,13 @@ describe("Organization Resolver - Creator Field", () => {
286
334
it ( "should throw unauthenticated error if user is not logged in" , async ( ) => {
287
335
const testCtx = createMockContext ( {
288
336
currentClient : {
289
- isAuthenticated : false ,
337
+ isAuthenticated : true ,
290
338
user : undefined ,
291
339
} ,
292
340
} ) ;
293
341
294
342
await expect ( async ( ) => {
295
- await resolveCreator (
296
- mockOrganization ,
297
- { } ,
298
- testCtx , // Ensure createMockContext returns the correct type
299
- ) ;
343
+ await resolveCreator ( mockOrganization , { } , testCtx ) ;
300
344
} ) . rejects . toThrow (
301
345
new TalawaGraphQLError ( {
302
346
extensions : { code : "unauthenticated" } ,
@@ -308,11 +352,7 @@ describe("Organization Resolver - Creator Field", () => {
308
352
ctx . drizzleClient . query . usersTable . findFirst . mockResolvedValue ( undefined ) ;
309
353
310
354
await expect ( async ( ) => {
311
- await resolveCreator (
312
- mockOrganization ,
313
- { } ,
314
- ctx as unknown as ResolverContext ,
315
- ) ;
355
+ await resolveCreator ( mockOrganization , { } , ctx ) ;
316
356
} ) . rejects . toThrow (
317
357
new TalawaGraphQLError ( {
318
358
extensions : { code : "unauthenticated" } ,
@@ -330,11 +370,7 @@ describe("Organization Resolver - Creator Field", () => {
330
370
. mockResolvedValueOnce ( mockUser )
331
371
. mockResolvedValueOnce ( mockCreator ) ;
332
372
333
- const result = await resolveCreator (
334
- mockOrganization ,
335
- { } ,
336
- ctx as unknown as ResolverContext ,
337
- ) ;
373
+ const result = await resolveCreator ( mockOrganization , { } , ctx ) ;
338
374
expect ( result ) . toEqual ( mockCreator ) ;
339
375
} ) ;
340
376
@@ -348,11 +384,7 @@ describe("Organization Resolver - Creator Field", () => {
348
384
. mockResolvedValueOnce ( mockUser )
349
385
. mockResolvedValueOnce ( mockCreator ) ;
350
386
351
- const result = await resolveCreator (
352
- mockOrganization ,
353
- { } ,
354
- ctx as unknown as ResolverContext ,
355
- ) ;
387
+ const result = await resolveCreator ( mockOrganization , { } , ctx ) ;
356
388
expect ( result ) . toEqual ( mockCreator ) ;
357
389
} ) ;
358
390
@@ -365,34 +397,28 @@ describe("Organization Resolver - Creator Field", () => {
365
397
) ;
366
398
367
399
await expect ( async ( ) => {
368
- await resolveCreator (
369
- mockOrganization ,
370
- { } ,
371
- ctx as unknown as ResolverContext ,
372
- ) ;
400
+ await resolveCreator ( mockOrganization , { } , ctx ) ;
373
401
} ) . rejects . toThrow (
374
402
new TalawaGraphQLError ( {
375
403
extensions : { code : "unauthorized_action" } ,
376
404
} ) ,
377
405
) ;
378
406
} ) ;
379
407
380
- it ( "should throw unauthorized error if user has no organization membership" , async ( ) => {
381
- const mockUser = createCompleteMockUser ( "regular" , [ ] ) ;
382
- ctx . drizzleClient . query . usersTable . findFirst . mockResolvedValueOnce ( mockUser ) ;
383
-
384
- await expect ( async ( ) => {
385
- await resolveCreator (
386
- mockOrganization ,
387
- { } ,
388
- ctx as unknown as ResolverContext ,
389
- ) ;
390
- } ) . rejects . toThrow (
391
- new TalawaGraphQLError ( {
392
- extensions : { code : "unauthorized_action" } ,
393
- } ) ,
394
- ) ;
395
- } ) ;
408
+ it ( "should throw unauthorized error if user has no organization membership" , async ( ) => {
409
+ const mockUser = createCompleteMockUser ( "regular" , [ ] ) ;
410
+ ctx . drizzleClient . query . usersTable . findFirst . mockResolvedValueOnce (
411
+ mockUser ,
412
+ ) ;
413
+
414
+ await expect ( async ( ) => {
415
+ await resolveCreator ( mockOrganization , { } , ctx ) ;
416
+ } ) . rejects . toThrow (
417
+ new TalawaGraphQLError ( {
418
+ extensions : { code : "unauthorized_action" } ,
419
+ } ) ,
420
+ ) ;
421
+ } ) ;
396
422
} ) ;
397
423
398
424
describe ( "Error Handling" , ( ) => {
@@ -404,11 +430,7 @@ describe("Organization Resolver - Creator Field", () => {
404
430
. mockResolvedValueOnce ( undefined ) ;
405
431
406
432
await expect ( async ( ) => {
407
- await resolveCreator (
408
- mockOrganization ,
409
- { } ,
410
- ctx as unknown as ResolverContext ,
411
- ) ;
433
+ await resolveCreator ( mockOrganization , { } , ctx ) ;
412
434
} ) . rejects . toThrow (
413
435
new TalawaGraphQLError ( {
414
436
extensions : { code : "unexpected" } ,
@@ -429,11 +451,7 @@ describe("Organization Resolver - Creator Field", () => {
429
451
mockUser ,
430
452
) ;
431
453
432
- const result = await resolveCreator (
433
- mockOrganization ,
434
- { } ,
435
- ctx as unknown as ResolverContext ,
436
- ) ;
454
+ const result = await resolveCreator ( mockOrganization , { } , ctx ) ;
437
455
expect ( result ) . toBeNull ( ) ;
438
456
} ) ;
439
457
@@ -448,11 +466,7 @@ describe("Organization Resolver - Creator Field", () => {
448
466
. mockResolvedValueOnce ( mockUser )
449
467
. mockResolvedValueOnce ( mockCreator ) ;
450
468
451
- const result = await resolveCreator (
452
- mockOrganization ,
453
- { } ,
454
- ctx as unknown as ResolverContext ,
455
- ) ;
469
+ const result = await resolveCreator ( mockOrganization , { } , ctx ) ;
456
470
expect ( result ) . toEqual ( mockCreator ) ;
457
471
} ) ;
458
472
} ) ;
0 commit comments