@@ -288,13 +288,14 @@ func TestCheckMetadata(t *testing.T) {
288
288
289
289
func TestCheckPermissionOverSchema (t * testing.T ) {
290
290
testCases := []struct {
291
- name string
292
- schema string
293
- relationships []* core.RelationTuple
294
- resource * core.ObjectAndRelation
295
- subject * core.ObjectAndRelation
296
- expectedPermissionship v1.ResourceCheckResult_Membership
297
- expectedCaveat * core.CaveatExpression
291
+ name string
292
+ schema string
293
+ relationships []* core.RelationTuple
294
+ resource * core.ObjectAndRelation
295
+ subject * core.ObjectAndRelation
296
+ expectedPermissionship v1.ResourceCheckResult_Membership
297
+ expectedCaveat * core.CaveatExpression
298
+ alternativeExpectedCaveat * core.CaveatExpression
298
299
}{
299
300
{
300
301
"basic union" ,
@@ -312,6 +313,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
312
313
ONR ("user" , "tom" , "..." ),
313
314
v1 .ResourceCheckResult_MEMBER ,
314
315
nil ,
316
+ nil ,
315
317
},
316
318
{
317
319
"basic intersection" ,
@@ -330,6 +332,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
330
332
ONR ("user" , "tom" , "..." ),
331
333
v1 .ResourceCheckResult_MEMBER ,
332
334
nil ,
335
+ nil ,
333
336
},
334
337
{
335
338
"basic exclusion" ,
@@ -347,6 +350,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
347
350
ONR ("user" , "tom" , "..." ),
348
351
v1 .ResourceCheckResult_MEMBER ,
349
352
nil ,
353
+ nil ,
350
354
},
351
355
{
352
356
"basic union, multiple branches" ,
@@ -365,6 +369,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
365
369
ONR ("user" , "tom" , "..." ),
366
370
v1 .ResourceCheckResult_MEMBER ,
367
371
nil ,
372
+ nil ,
368
373
},
369
374
{
370
375
"basic union no permission" ,
@@ -380,6 +385,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
380
385
ONR ("user" , "tom" , "..." ),
381
386
v1 .ResourceCheckResult_NOT_MEMBER ,
382
387
nil ,
388
+ nil ,
383
389
},
384
390
{
385
391
"basic intersection no permission" ,
@@ -397,6 +403,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
397
403
ONR ("user" , "tom" , "..." ),
398
404
v1 .ResourceCheckResult_NOT_MEMBER ,
399
405
nil ,
406
+ nil ,
400
407
},
401
408
{
402
409
"basic exclusion no permission" ,
@@ -415,6 +422,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
415
422
ONR ("user" , "tom" , "..." ),
416
423
v1 .ResourceCheckResult_NOT_MEMBER ,
417
424
nil ,
425
+ nil ,
418
426
},
419
427
{
420
428
"exclusion with multiple branches" ,
@@ -441,6 +449,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
441
449
ONR ("user" , "tom" , "..." ),
442
450
v1 .ResourceCheckResult_MEMBER ,
443
451
nil ,
452
+ nil ,
444
453
},
445
454
{
446
455
"intersection with multiple branches" ,
@@ -467,6 +476,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
467
476
ONR ("user" , "tom" , "..." ),
468
477
v1 .ResourceCheckResult_MEMBER ,
469
478
nil ,
479
+ nil ,
470
480
},
471
481
{
472
482
"exclusion with multiple branches no permission" ,
@@ -494,6 +504,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
494
504
ONR ("user" , "tom" , "..." ),
495
505
v1 .ResourceCheckResult_NOT_MEMBER ,
496
506
nil ,
507
+ nil ,
497
508
},
498
509
{
499
510
"intersection with multiple branches no permission" ,
@@ -519,6 +530,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
519
530
ONR ("user" , "tom" , "..." ),
520
531
v1 .ResourceCheckResult_NOT_MEMBER ,
521
532
nil ,
533
+ nil ,
522
534
},
523
535
{
524
536
"basic arrow" ,
@@ -541,6 +553,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
541
553
ONR ("user" , "tom" , "..." ),
542
554
v1 .ResourceCheckResult_MEMBER ,
543
555
nil ,
556
+ nil ,
544
557
},
545
558
{
546
559
"basic any arrow" ,
@@ -563,6 +576,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
563
576
ONR ("user" , "tom" , "..." ),
564
577
v1 .ResourceCheckResult_MEMBER ,
565
578
nil ,
579
+ nil ,
566
580
},
567
581
{
568
582
"basic all arrow negative" ,
@@ -585,6 +599,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
585
599
ONR ("user" , "tom" , "..." ),
586
600
v1 .ResourceCheckResult_NOT_MEMBER ,
587
601
nil ,
602
+ nil ,
588
603
},
589
604
{
590
605
"basic all arrow positive" ,
@@ -608,6 +623,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
608
623
ONR ("user" , "tom" , "..." ),
609
624
v1 .ResourceCheckResult_MEMBER ,
610
625
nil ,
626
+ nil ,
611
627
},
612
628
{
613
629
"basic all arrow positive with different types" ,
@@ -635,6 +651,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
635
651
ONR ("user" , "tom" , "..." ),
636
652
v1 .ResourceCheckResult_MEMBER ,
637
653
nil ,
654
+ nil ,
638
655
},
639
656
{
640
657
"basic all arrow negative over different types" ,
@@ -663,6 +680,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
663
680
ONR ("user" , "tom" , "..." ),
664
681
v1 .ResourceCheckResult_NOT_MEMBER ,
665
682
nil ,
683
+ nil ,
666
684
},
667
685
{
668
686
"basic all arrow positive over different types" ,
@@ -692,6 +710,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
692
710
ONR ("user" , "tom" , "..." ),
693
711
v1 .ResourceCheckResult_MEMBER ,
694
712
nil ,
713
+ nil ,
695
714
},
696
715
{
697
716
"all arrow for single org" ,
@@ -713,6 +732,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
713
732
ONR ("user" , "tom" , "..." ),
714
733
v1 .ResourceCheckResult_MEMBER ,
715
734
nil ,
735
+ nil ,
716
736
},
717
737
{
718
738
"all arrow for no orgs" ,
@@ -733,6 +753,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
733
753
ONR ("user" , "tom" , "..." ),
734
754
v1 .ResourceCheckResult_NOT_MEMBER ,
735
755
nil ,
756
+ nil ,
736
757
},
737
758
{
738
759
"view_by_all negative" ,
@@ -766,6 +787,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
766
787
ONR ("user" , "fred" , "..." ),
767
788
v1 .ResourceCheckResult_NOT_MEMBER ,
768
789
nil ,
790
+ nil ,
769
791
},
770
792
{
771
793
"view_by_any positive" ,
@@ -801,6 +823,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
801
823
ONR ("user" , "fred" , "..." ),
802
824
v1 .ResourceCheckResult_MEMBER ,
803
825
nil ,
826
+ nil ,
804
827
},
805
828
{
806
829
"view_by_any positive directly" ,
@@ -836,6 +859,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
836
859
ONR ("user" , "rachel" , "..." ),
837
860
v1 .ResourceCheckResult_MEMBER ,
838
861
nil ,
862
+ nil ,
839
863
},
840
864
{
841
865
"caveated intersection arrow" ,
@@ -862,6 +886,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
862
886
ONR ("user" , "tom" , "..." ),
863
887
v1 .ResourceCheckResult_CAVEATED_MEMBER ,
864
888
caveatAndCtx ("somecaveat" , nil ),
889
+ nil ,
865
890
},
866
891
{
867
892
"intersection arrow with caveated member" ,
@@ -888,6 +913,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
888
913
ONR ("user" , "tom" , "..." ),
889
914
v1 .ResourceCheckResult_CAVEATED_MEMBER ,
890
915
caveatAndCtx ("somecaveat" , nil ),
916
+ nil ,
891
917
},
892
918
{
893
919
"caveated intersection arrow with caveated member" ,
@@ -914,6 +940,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
914
940
ONR ("user" , "tom" , "..." ),
915
941
v1 .ResourceCheckResult_CAVEATED_MEMBER ,
916
942
caveatAndCtx ("somecaveat" , nil ),
943
+ nil ,
917
944
},
918
945
{
919
946
"caveated intersection arrow with caveated member, different context" ,
@@ -947,6 +974,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
947
974
caveatAndCtx ("anothercaveat" , map [string ]any {"someparam" : int64 (43 )}),
948
975
caveatAndCtx ("somecaveat" , map [string ]any {"someparam" : int64 (42 )}),
949
976
),
977
+ nil ,
950
978
},
951
979
{
952
980
"caveated intersection arrow with multiple caveated branches" ,
@@ -978,8 +1006,8 @@ func TestCheckPermissionOverSchema(t *testing.T) {
978
1006
caveatAndCtx ("somecaveat" , map [string ]any {"someparam" : int64 (41 )}),
979
1007
caveatAndCtx ("somecaveat" , map [string ]any {"someparam" : int64 (42 )}),
980
1008
),
1009
+ nil ,
981
1010
},
982
-
983
1011
{
984
1012
"caveated intersection arrow with multiple caveated members" ,
985
1013
`definition user {}
@@ -1010,6 +1038,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
1010
1038
caveatAndCtx ("somecaveat" , map [string ]any {"someparam" : int64 (41 )}),
1011
1039
caveatAndCtx ("somecaveat" , map [string ]any {"someparam" : int64 (42 )}),
1012
1040
),
1041
+ nil ,
1013
1042
},
1014
1043
{
1015
1044
"caveated intersection arrow with one caveated branch" ,
@@ -1038,6 +1067,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
1038
1067
ONR ("user" , "tom" , "..." ),
1039
1068
v1 .ResourceCheckResult_CAVEATED_MEMBER ,
1040
1069
caveatAndCtx ("somecaveat" , map [string ]any {"someparam" : int64 (42 )}),
1070
+ nil ,
1041
1071
},
1042
1072
{
1043
1073
"caveated intersection arrow with one caveated member" ,
@@ -1066,6 +1096,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
1066
1096
ONR ("user" , "tom" , "..." ),
1067
1097
v1 .ResourceCheckResult_CAVEATED_MEMBER ,
1068
1098
caveatAndCtx ("somecaveat" , map [string ]any {"someparam" : int64 (42 )}),
1099
+ nil ,
1069
1100
},
1070
1101
{
1071
1102
"caveated intersection arrow multiple paths to the same subject" ,
@@ -1093,6 +1124,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
1093
1124
ONR ("user" , "tom" , "..." ),
1094
1125
v1 .ResourceCheckResult_CAVEATED_MEMBER ,
1095
1126
caveatAndCtx ("somecaveat" , nil ),
1127
+ nil ,
1096
1128
},
1097
1129
{
1098
1130
"recursive all arrow positive result" ,
@@ -1129,6 +1161,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
1129
1161
ONR ("user" , "fred" , "..." ),
1130
1162
v1 .ResourceCheckResult_MEMBER ,
1131
1163
nil ,
1164
+ nil ,
1132
1165
},
1133
1166
{
1134
1167
"recursive all arrow negative result" ,
@@ -1165,6 +1198,7 @@ func TestCheckPermissionOverSchema(t *testing.T) {
1165
1198
ONR ("user" , "tom" , "..." ),
1166
1199
v1 .ResourceCheckResult_NOT_MEMBER ,
1167
1200
nil ,
1201
+ nil ,
1168
1202
},
1169
1203
{
1170
1204
"recursive all arrow negative result due to recursion missing a folder" ,
@@ -1202,6 +1236,79 @@ func TestCheckPermissionOverSchema(t *testing.T) {
1202
1236
ONR ("user" , "fred" , "..." ),
1203
1237
v1 .ResourceCheckResult_NOT_MEMBER ,
1204
1238
nil ,
1239
+ nil ,
1240
+ },
1241
+ {
1242
+ "caveated over multiple branches" ,
1243
+ `
1244
+ caveat somecaveat(somevalue int) {
1245
+ somevalue == 42
1246
+ }
1247
+
1248
+ definition user {}
1249
+
1250
+ definition role {
1251
+ relation member: user
1252
+ }
1253
+
1254
+ definition resource {
1255
+ relation viewer: role#member with somecaveat
1256
+ permission view = viewer
1257
+ }
1258
+ ` ,
1259
+ []* core.RelationTuple {
1260
+ tuple .MustParse (`role:firstrole#member@user:tom[somecaveat:{"somevalue":40}]` ),
1261
+ tuple .MustParse (`role:secondrole#member@user:tom[somecaveat:{"somevalue":42}]` ),
1262
+ tuple .MustParse (`resource:doc1#viewer@role:firstrole#member` ),
1263
+ tuple .MustParse (`resource:doc1#viewer@role:secondrole#member` ),
1264
+ },
1265
+ ONR ("resource" , "doc1" , "view" ),
1266
+ ONR ("user" , "tom" , "..." ),
1267
+ v1 .ResourceCheckResult_CAVEATED_MEMBER ,
1268
+ caveatOr (
1269
+ caveatAndCtx ("somecaveat" , map [string ]any {"somevalue" : int64 (40 )}),
1270
+ caveatAndCtx ("somecaveat" , map [string ]any {"somevalue" : int64 (42 )}),
1271
+ ),
1272
+ caveatOr (
1273
+ caveatAndCtx ("somecaveat" , map [string ]any {"somevalue" : int64 (42 )}),
1274
+ caveatAndCtx ("somecaveat" , map [string ]any {"somevalue" : int64 (40 )}),
1275
+ ),
1276
+ },
1277
+ {
1278
+ "caveated over multiple branches reversed" ,
1279
+ `
1280
+ caveat somecaveat(somevalue int) {
1281
+ somevalue == 42
1282
+ }
1283
+
1284
+ definition user {}
1285
+
1286
+ definition role {
1287
+ relation member: user
1288
+ }
1289
+
1290
+ definition resource {
1291
+ relation viewer: role#member with somecaveat
1292
+ permission view = viewer
1293
+ }
1294
+ ` ,
1295
+ []* core.RelationTuple {
1296
+ tuple .MustParse (`role:secondrole#member@user:tom[somecaveat:{"somevalue":42}]` ),
1297
+ tuple .MustParse (`role:firstrole#member@user:tom[somecaveat:{"somevalue":40}]` ),
1298
+ tuple .MustParse (`resource:doc1#viewer@role:secondrole#member` ),
1299
+ tuple .MustParse (`resource:doc1#viewer@role:firstrole#member` ),
1300
+ },
1301
+ ONR ("resource" , "doc1" , "view" ),
1302
+ ONR ("user" , "tom" , "..." ),
1303
+ v1 .ResourceCheckResult_CAVEATED_MEMBER ,
1304
+ caveatOr (
1305
+ caveatAndCtx ("somecaveat" , map [string ]any {"somevalue" : int64 (40 )}),
1306
+ caveatAndCtx ("somecaveat" , map [string ]any {"somevalue" : int64 (42 )}),
1307
+ ),
1308
+ caveatOr (
1309
+ caveatAndCtx ("somecaveat" , map [string ]any {"somevalue" : int64 (42 )}),
1310
+ caveatAndCtx ("somecaveat" , map [string ]any {"somevalue" : int64 (40 )}),
1311
+ ),
1205
1312
},
1206
1313
}
1207
1314
@@ -1239,10 +1346,18 @@ func TestCheckPermissionOverSchema(t *testing.T) {
1239
1346
1240
1347
require .Equal (tc .expectedPermissionship , membership )
1241
1348
1242
- if tc .expectedCaveat != nil {
1349
+ if tc .expectedCaveat != nil && tc . alternativeExpectedCaveat == nil {
1243
1350
require .NotEmpty (resp .ResultsByResourceId [tc .resource .ObjectId ].Expression )
1244
1351
testutil .RequireProtoEqual (t , tc .expectedCaveat , resp .ResultsByResourceId [tc .resource .ObjectId ].Expression , "mismatch in caveat" )
1245
1352
}
1353
+
1354
+ if tc .expectedCaveat != nil && tc .alternativeExpectedCaveat != nil {
1355
+ require .NotEmpty (resp .ResultsByResourceId [tc .resource .ObjectId ].Expression )
1356
+
1357
+ if testutil .AreProtoEqual (tc .expectedCaveat , resp .ResultsByResourceId [tc .resource .ObjectId ].Expression , "mismatch in caveat" ) != nil {
1358
+ testutil .RequireProtoEqual (t , tc .alternativeExpectedCaveat , resp .ResultsByResourceId [tc .resource .ObjectId ].Expression , "mismatch in caveat" )
1359
+ }
1360
+ }
1246
1361
})
1247
1362
}
1248
1363
}
0 commit comments