@@ -103,47 +103,47 @@ describe('API V2 authz tests', () => {
103103 'getAplTeams' ,
104104 'getAplTeam' ,
105105 'editAplTeam' ,
106- 'deleteTeam ' ,
106+ 'deleteAplTeam ' ,
107107 // Services
108108 'createAplService' ,
109109 'getAplService' ,
110110 'editAplService' ,
111- 'deleteService ' ,
111+ 'deleteAplService ' ,
112112 'getAllAplServices' ,
113113 'getTeamAplServices' ,
114114 // Workloads
115115 'createAplWorkload' ,
116116 'getAplWorkload' ,
117117 'editAplWorkload' ,
118- 'deleteWorkload ' ,
118+ 'deleteAplWorkload ' ,
119119 'getAllAplWorkloads' ,
120120 'getTeamAplWorkloads' ,
121121 // Sealed Secrets
122122 'createAplSealedSecret' ,
123123 'getAplSealedSecret' ,
124124 'editAplSealedSecret' ,
125- 'deleteSealedSecret ' ,
125+ 'deleteAplSealedSecret ' ,
126126 'getAllAplSealedSecrets' ,
127127 'getAplSealedSecrets' ,
128128 // Code Repos
129129 'createAplCodeRepo' ,
130130 'getAplCodeRepo' ,
131131 'editAplCodeRepo' ,
132- 'deleteCodeRepo ' ,
132+ 'deleteAplCodeRepo ' ,
133133 'getAllAplCodeRepos' ,
134134 'getTeamAplCodeRepos' ,
135135 // Builds
136136 'createAplBuild' ,
137137 'getAplBuild' ,
138138 'editAplBuild' ,
139- 'deleteBuild ' ,
139+ 'deleteAplBuild ' ,
140140 'getAllAplBuilds' ,
141141 'getTeamAplBuilds' ,
142142 // Network Policies
143143 'createAplNetpol' ,
144144 'getAplNetpol' ,
145145 'editAplNetpol' ,
146- 'deleteNetpol ' ,
146+ 'deleteAplNetpol ' ,
147147 'getAllAplNetpols' ,
148148 'getTeamAplNetpols' ,
149149 // Policies
@@ -155,7 +155,7 @@ describe('API V2 authz tests', () => {
155155 'connectCloudtty' ,
156156 'deleteCloudtty' ,
157157 // Other
158- 'createTeam ' ,
158+ 'createAplTeam ' ,
159159 // Git migration
160160 'migrateGitSettings' ,
161161 // API status
@@ -180,6 +180,50 @@ describe('API V2 authz tests', () => {
180180 } )
181181 }
182182 } )
183+
184+ const team1 = {
185+ kind : 'AplTeamSettingSet' ,
186+ metadata : {
187+ name : 'team1' ,
188+ labels : {
189+ 'apl.io/teamId' : 'team1' ,
190+ } ,
191+ } ,
192+ spec : {
193+ selfService : {
194+ teamMembers : {
195+ createServices : true ,
196+ editSecurityPolicies : true ,
197+ } ,
198+ } ,
199+ } ,
200+ }
201+
202+ const team2 = {
203+ kind : 'AplTeamSettingSet' ,
204+ metadata : {
205+ name : 'team2' ,
206+ labels : {
207+ 'apl.io/teamId' : 'team2' ,
208+ } ,
209+ } ,
210+ spec : {
211+ selfService : {
212+ teamMembers : {
213+ createServices : false ,
214+ editSecurityPolicies : false ,
215+ } ,
216+ } ,
217+ } ,
218+ }
219+
220+ jest . spyOn ( otomiStack , 'getAplTeams' ) . mockReturnValue ( [ team1 , team2 ] as any )
221+
222+ jest . spyOn ( otomiStack , 'getAplTeam' ) . mockImplementation ( ( teamId : string ) => {
223+ if ( teamId === 'team1' ) return team1 as any
224+ if ( teamId === 'team2' ) return team2 as any
225+ throw new Error ( `Team ${ teamId } not found` )
226+ } )
183227 } )
184228
185229 describe ( 'V2 Team Endpoints' , ( ) => {
@@ -678,6 +722,54 @@ describe('API V2 authz tests', () => {
678722 } )
679723 } )
680724
725+ describe ( 'Code repository utility endpoints' , ( ) => {
726+ const data = {
727+ repositoryUrl : 'github.com/buildpacks/samples' ,
728+ }
729+
730+ test ( 'team member can test own code repository url' , async ( ) => {
731+ jest . spyOn ( otomiStack , 'getTestRepoConnect' ) . mockResolvedValue ( { status : 'success' } )
732+
733+ await agent
734+ . get ( '/v2/teams/team1/coderepos/testRepoConnect' )
735+ . query ( {
736+ url : data . repositoryUrl ,
737+ } )
738+ . set ( 'Authorization' , `Bearer ${ teamMemberToken } ` )
739+ . expect ( 200 )
740+ } )
741+
742+ test ( 'team member cannot test other team code repository url' , async ( ) => {
743+ jest . spyOn ( otomiStack , 'getTestRepoConnect' ) . mockResolvedValue ( { status : 'success' } )
744+
745+ await agent
746+ . get ( '/v2/teams/team2/coderepos/testRepoConnect' )
747+ . query ( {
748+ url : data . repositoryUrl ,
749+ } )
750+ . set ( 'Authorization' , `Bearer ${ teamMemberToken } ` )
751+ . expect ( 403 )
752+ } )
753+
754+ test ( 'team member can get own internal repository urls' , async ( ) => {
755+ jest . spyOn ( otomiStack , 'getInternalRepoUrls' ) . mockResolvedValue ( [ ] )
756+
757+ await agent
758+ . get ( '/v2/teams/team1/internalRepoUrls' )
759+ . set ( 'Authorization' , `Bearer ${ teamMemberToken } ` )
760+ . expect ( 200 )
761+ } )
762+
763+ test ( 'team member cannot get other internal repository urls' , async ( ) => {
764+ jest . spyOn ( otomiStack , 'getInternalRepoUrls' ) . mockResolvedValue ( [ ] )
765+
766+ await agent
767+ . get ( '/v2/teams/team2/internalRepoUrls' )
768+ . set ( 'Authorization' , `Bearer ${ teamMemberToken } ` )
769+ . expect ( 403 )
770+ } )
771+ } )
772+
681773 describe ( 'Cross-Team Access Denial' , ( ) => {
682774 test ( 'team member cannot create code repo in other team' , async ( ) => {
683775 await agent
@@ -999,11 +1091,19 @@ describe('API V2 authz tests', () => {
9991091 . expect ( 200 )
10001092 } )
10011093
1002- test ( 'team member cannot update policy' , async ( ) => {
1094+ test ( 'team member can update policy' , async ( ) => {
10031095 await agent
10041096 . put ( '/v2/teams/team1/policies/disallow-selinux' )
10051097 . send ( policyData )
10061098 . set ( 'Authorization' , `Bearer ${ teamMemberToken } ` )
1099+ . expect ( 200 )
1100+ } )
1101+
1102+ test ( 'team member cannot update policy' , async ( ) => {
1103+ await agent
1104+ . put ( '/v2/teams/team2/policies/disallow-selinux' )
1105+ . send ( policyData )
1106+ . set ( 'Authorization' , `Bearer ${ teamMemberToken } ` )
10071107 . expect ( 403 )
10081108 } )
10091109
@@ -1177,15 +1277,25 @@ describe('API V2 authz tests', () => {
11771277 } )
11781278
11791279 test ( 'team member cannot create its own services when disabled' , async ( ) => {
1180- jest . spyOn ( otomiStack , 'createService' ) . mockResolvedValue ( { } as any )
1280+ jest . spyOn ( otomiStack , 'createAplService' ) . mockResolvedValue ( { } as any )
1281+
11811282 await agent
1182- . post ( '/v1 /teams/team2/services' )
1283+ . post ( '/v2 /teams/team2/services' )
11831284 . send ( {
1184- name : 'newservice' ,
1185- serviceType : 'ksvcPredeployed' ,
1186- ingress : { type : 'cluster' } ,
1187- networkPolicy : {
1188- ingressPrivate : { mode : 'DenyAll' } ,
1285+ kind : 'AplTeamService' ,
1286+ metadata : {
1287+ name : 'newservice' ,
1288+ } ,
1289+ spec : {
1290+ serviceType : 'ksvcPredeployed' ,
1291+ ingress : {
1292+ type : 'cluster' ,
1293+ } ,
1294+ networkPolicy : {
1295+ ingressPrivate : {
1296+ mode : 'DenyAll' ,
1297+ } ,
1298+ } ,
11891299 } ,
11901300 } )
11911301 . set ( 'Content-Type' , 'application/json' )
0 commit comments