@@ -6,6 +6,9 @@ import { Registration, RegistrationStore } from '../../../../src/util/Registrati
66
77describe ( 'NamespacedAuthorizer' , ( ) : void => {
88 const claims : ClaimSet = { claim : 'set' } ;
9+ const perm1 = [ { resource_id : 'res1' , resource_scopes : [ 'scope1' ] } ] ;
10+ const perm2 = [ { resource_id : 'res2' , resource_scopes : [ 'scope2' ] } ] ;
11+ const fallbackPerm = [ { resource_id : 'fallback' , resource_scopes : [ 'scopef' ] } ] ;
912
1013 let authorizers : Record < string , Mocked < Authorizer > > ;
1114 let fallback : Mocked < Authorizer > ;
@@ -14,11 +17,11 @@ describe('NamespacedAuthorizer', (): void => {
1417
1518 beforeEach ( async ( ) : Promise < void > => {
1619 authorizers = {
17- ns1 : { permissions : vi . fn ( ) . mockResolvedValue ( ' perm1' ) , } ,
18- ns2 : { permissions : vi . fn ( ) . mockResolvedValue ( ' perm2' ) , } ,
20+ ns1 : { permissions : vi . fn ( ) . mockResolvedValue ( perm1 ) , } ,
21+ ns2 : { permissions : vi . fn ( ) . mockResolvedValue ( perm2 ) , } ,
1922 } ;
2023
21- fallback = { permissions : vi . fn ( ) . mockResolvedValue ( 'perm' ) , } ;
24+ fallback = { permissions : vi . fn ( ) . mockResolvedValue ( fallbackPerm ) , } ;
2225
2326 const descriptions : Record < string , Registration > = {
2427 res1 : { description : { name : 'http://example.com/foo/ns1/res' , resource_scopes : [ ] } , owner : 'owner1' } ,
@@ -33,19 +36,17 @@ describe('NamespacedAuthorizer', (): void => {
3336 } ) ;
3437
3538 describe ( '.permissions' , ( ) : void => {
36- it ( 'returns an empty list if there is no query or multiple identifiers .' , async ( ) : Promise < void > => {
39+ it ( 'returns an empty list if there is no query.' , async ( ) : Promise < void > => {
3740 await expect ( authorizer . permissions ( claims ) ) . resolves . toEqual ( [ ] ) ;
3841 await expect ( authorizer . permissions ( claims , [ ] ) ) . resolves . toEqual ( [ ] ) ;
39- const query = [ { resource_id : 'res1' } , { resource_id : 'res2' } ] ;
40- await expect ( authorizer . permissions ( claims , query ) ) . resolves . toEqual ( [ ] ) ;
4142 expect ( authorizers . ns1 . permissions ) . toHaveBeenCalledTimes ( 0 ) ;
4243 expect ( authorizers . ns2 . permissions ) . toHaveBeenCalledTimes ( 0 ) ;
4344 expect ( fallback . permissions ) . toHaveBeenCalledTimes ( 0 ) ;
4445 } ) ;
4546
4647 it ( 'calls the matching authorizer.' , async ( ) : Promise < void > => {
4748 const query = [ { resource_id : 'res2' , resource_scopes : [ 'scope1' ] } ] ;
48- await expect ( authorizer . permissions ( claims , query ) ) . resolves . toEqual ( ' perm2' ) ;
49+ await expect ( authorizer . permissions ( claims , query ) ) . resolves . toEqual ( perm2 ) ;
4950 expect ( authorizers . ns1 . permissions ) . toHaveBeenCalledTimes ( 0 ) ;
5051 expect ( authorizers . ns2 . permissions ) . toHaveBeenCalledTimes ( 1 ) ;
5152 expect ( authorizers . ns2 . permissions ) . toHaveBeenLastCalledWith ( claims , query ) ;
@@ -55,21 +56,41 @@ describe('NamespacedAuthorizer', (): void => {
5556 it ( 'calls the fallback authorizer if there is no match.' , async ( ) : Promise < void > => {
5657 const query1 = [ { resource_id : 'res3' } ] ;
5758 const query2 = [ { resource_id : 'unknown' } ] ;
58- await expect ( authorizer . permissions ( claims , query1 ) ) . resolves . toEqual ( 'perm' ) ;
59- await expect ( authorizer . permissions ( claims , query2 ) ) . resolves . toEqual ( 'perm' ) ;
59+ await expect ( authorizer . permissions ( claims , query1 ) ) . resolves . toEqual ( fallbackPerm ) ;
60+ await expect ( authorizer . permissions ( claims , query2 ) ) . resolves . toEqual ( fallbackPerm ) ;
6061 expect ( authorizers . ns1 . permissions ) . toHaveBeenCalledTimes ( 0 ) ;
6162 expect ( authorizers . ns2 . permissions ) . toHaveBeenCalledTimes ( 0 ) ;
6263 expect ( fallback . permissions ) . toHaveBeenCalledTimes ( 2 ) ;
6364 expect ( fallback . permissions ) . toHaveBeenCalledWith ( claims , query1 ) ;
6465 expect ( fallback . permissions ) . toHaveBeenCalledWith ( claims , query2 ) ;
6566 } ) ;
67+
68+ it ( 'merges permissions of mixed namespaces.' , async ( ) : Promise < void > => {
69+ const query = [
70+ { resource_id : 'res1' , resource_scopes : [ 'scope1' ] } ,
71+ { resource_id : 'res2' , resource_scopes : [ 'scope2' ] } ,
72+ { resource_id : 'res3' , resource_scopes : [ 'scope3' ] } ,
73+ ] ;
74+
75+ await expect ( authorizer . permissions ( claims , query ) ) . resolves . toEqual ( [ ...perm1 , ...perm2 , ...fallbackPerm ] ) ;
76+
77+ expect ( authorizers . ns1 . permissions ) . toHaveBeenCalledTimes ( 1 ) ;
78+ expect ( authorizers . ns1 . permissions ) . toHaveBeenCalledWith ( claims , [ query [ 0 ] ] ) ;
79+ expect ( authorizers . ns2 . permissions ) . toHaveBeenCalledTimes ( 1 ) ;
80+ expect ( authorizers . ns2 . permissions ) . toHaveBeenCalledWith ( claims , [ query [ 1 ] ] ) ;
81+ expect ( fallback . permissions ) . toHaveBeenCalledTimes ( 1 ) ;
82+ expect ( fallback . permissions ) . toHaveBeenCalledWith ( claims , [ query [ 2 ] ] ) ;
83+ } ) ;
6684 } ) ;
6785
6886 it ( 'can be configured to use a different path segment.' , async ( ) : Promise < void > => {
69- authorizers . res = { permissions : vi . fn ( ) . mockResolvedValue ( 'perm-res' ) , } ;
87+ authorizers . res = {
88+ permissions : vi . fn ( ) . mockResolvedValue ( [ { resource_id : 'res1' , resource_scopes : [ 'perm-res' ] } ] ) ,
89+ } ;
7090 const authorizer = new NamespacedAuthorizer ( authorizers , fallback , registrationStore , 3 ) ;
7191 const query = [ { resource_id : 'res1' } ] ;
72- await expect ( authorizer . permissions ( claims , query ) ) . resolves . toEqual ( 'perm-res' ) ;
92+ await expect ( authorizer . permissions ( claims , query ) )
93+ . resolves . toEqual ( [ { resource_id : 'res1' , resource_scopes : [ 'perm-res' ] } ] ) ;
7394 expect ( authorizers . res . permissions ) . toHaveBeenCalledTimes ( 1 ) ;
7495 expect ( authorizers . res . permissions ) . toHaveBeenLastCalledWith ( claims , query ) ;
7596 } ) ;
0 commit comments