@@ -425,6 +425,97 @@ describe('ReviewService.getReview authorization checks', () => {
425
425
} ) ;
426
426
} ) ;
427
427
428
+ describe ( 'ReviewService.getReviews reviewer visibility' , ( ) => {
429
+ let prismaMock : any ;
430
+ let prismaErrorServiceMock : any ;
431
+ let resourceApiServiceMock : any ;
432
+ let challengeApiServiceMock : any ;
433
+ let service : ReviewService ;
434
+
435
+ const baseAuthUser : JwtUser = {
436
+ userId : 'reviewer-1' ,
437
+ roles : [ ] ,
438
+ isMachine : false ,
439
+ } ;
440
+
441
+ const baseSubmission = { id : 'submission-1' } ;
442
+
443
+ const buildResource = ( roleName : string ) => ( {
444
+ id : 'resource-1' ,
445
+ challengeId : 'challenge-1' ,
446
+ memberId : baseAuthUser . userId ,
447
+ memberHandle : 'reviewerHandle' ,
448
+ roleId : 'role-reviewer' ,
449
+ phaseId : 'phase-review' ,
450
+ createdBy : 'tc' ,
451
+ created : new Date ( ) . toISOString ( ) ,
452
+ roleName,
453
+ } ) ;
454
+
455
+ beforeEach ( ( ) => {
456
+ jest . resetAllMocks ( ) ;
457
+
458
+ prismaMock = {
459
+ submission : {
460
+ findMany : jest . fn ( ) . mockResolvedValue ( [ baseSubmission ] ) ,
461
+ } ,
462
+ review : {
463
+ findMany : jest . fn ( ) . mockResolvedValue ( [ ] ) ,
464
+ count : jest . fn ( ) . mockResolvedValue ( 0 ) ,
465
+ } ,
466
+ } ;
467
+
468
+ prismaErrorServiceMock = {
469
+ handleError : jest . fn ( ) ,
470
+ } ;
471
+
472
+ resourceApiServiceMock = {
473
+ getMemberResourcesRoles : jest . fn ( ) ,
474
+ } ;
475
+
476
+ challengeApiServiceMock = {
477
+ getChallengeDetail : jest . fn ( ) ,
478
+ getChallenges : jest . fn ( ) ,
479
+ } ;
480
+
481
+ service = new ReviewService (
482
+ prismaMock ,
483
+ prismaErrorServiceMock ,
484
+ resourceApiServiceMock ,
485
+ challengeApiServiceMock ,
486
+ ) ;
487
+ } ) ;
488
+
489
+ it ( 'filters reviews by the reviewer resource id when the requester is a reviewer' , async ( ) => {
490
+ resourceApiServiceMock . getMemberResourcesRoles . mockResolvedValue ( [
491
+ buildResource ( 'Reviewer' ) ,
492
+ ] ) ;
493
+
494
+ await service . getReviews ( baseAuthUser , undefined , 'challenge-1' ) ;
495
+
496
+ expect ( resourceApiServiceMock . getMemberResourcesRoles ) . toHaveBeenCalledWith (
497
+ 'challenge-1' ,
498
+ baseAuthUser . userId ,
499
+ ) ;
500
+
501
+ expect ( prismaMock . review . findMany ) . toHaveBeenCalledTimes ( 1 ) ;
502
+ const callArgs = prismaMock . review . findMany . mock . calls [ 0 ] [ 0 ] ;
503
+ expect ( callArgs . where . resourceId ) . toEqual ( { in : [ 'resource-1' ] } ) ;
504
+ expect ( callArgs . where . submissionId ) . toEqual ( { in : [ baseSubmission . id ] } ) ;
505
+ } ) ;
506
+
507
+ it ( 'does not restrict resource visibility for copilots' , async ( ) => {
508
+ resourceApiServiceMock . getMemberResourcesRoles . mockResolvedValue ( [
509
+ buildResource ( 'Copilot' ) ,
510
+ ] ) ;
511
+
512
+ await service . getReviews ( baseAuthUser , undefined , 'challenge-1' ) ;
513
+
514
+ const callArgs = prismaMock . review . findMany . mock . calls [ 0 ] [ 0 ] ;
515
+ expect ( callArgs . where . resourceId ) . toBeUndefined ( ) ;
516
+ } ) ;
517
+ } ) ;
518
+
428
519
describe ( 'ReviewService.updateReviewItem validations' , ( ) => {
429
520
const prismaMock = {
430
521
reviewItem : {
0 commit comments