@@ -225,6 +225,86 @@ describe('Project Member endpoints (e2e)', () => {
225225 expect ( projectMemberServiceMock . deleteMember ) . toHaveBeenCalled ( ) ;
226226 } ) ;
227227
228+ it ( 'creates members for m2m token with project-member write scope' , async ( ) => {
229+ ( jwtServiceMock . validateToken as jest . Mock ) . mockResolvedValueOnce ( {
230+ scopes : [ Scope . PROJECT_MEMBERS_WRITE ] ,
231+ isMachine : true ,
232+ tokenPayload : {
233+ gty : 'client-credentials' ,
234+ scope : Scope . PROJECT_MEMBERS_WRITE ,
235+ } ,
236+ } ) ;
237+
238+ await request ( app . getHttpServer ( ) )
239+ . post ( '/v6/projects/1001/members' )
240+ . set ( 'Authorization' , 'Bearer m2m-member-write' )
241+ . send ( { userId : '101125' , role : 'observer' } )
242+ . expect ( 201 ) ;
243+
244+ expect ( projectMemberServiceMock . addMember ) . toHaveBeenCalledWith (
245+ '1001' ,
246+ expect . objectContaining ( { userId : '101125' , role : 'observer' } ) ,
247+ expect . objectContaining ( {
248+ scopes : [ Scope . PROJECT_MEMBERS_WRITE ] ,
249+ isMachine : true ,
250+ } ) ,
251+ undefined ,
252+ ) ;
253+ } ) ;
254+
255+ it ( 'updates members for m2m token with project-member write scope' , async ( ) => {
256+ ( jwtServiceMock . validateToken as jest . Mock ) . mockResolvedValueOnce ( {
257+ scopes : [ Scope . PROJECT_MEMBERS_WRITE ] ,
258+ isMachine : true ,
259+ tokenPayload : {
260+ gty : 'client-credentials' ,
261+ scope : Scope . PROJECT_MEMBERS_WRITE ,
262+ } ,
263+ } ) ;
264+
265+ await request ( app . getHttpServer ( ) )
266+ . patch ( '/v6/projects/1001/members/11' )
267+ . set ( 'Authorization' , 'Bearer m2m-member-write' )
268+ . send ( { role : 'observer' } )
269+ . expect ( 200 ) ;
270+
271+ expect ( projectMemberServiceMock . updateMember ) . toHaveBeenCalledWith (
272+ '1001' ,
273+ '11' ,
274+ expect . objectContaining ( { role : 'observer' } ) ,
275+ expect . objectContaining ( {
276+ scopes : [ Scope . PROJECT_MEMBERS_WRITE ] ,
277+ isMachine : true ,
278+ } ) ,
279+ undefined ,
280+ ) ;
281+ } ) ;
282+
283+ it ( 'deletes members for m2m token with project-member write scope' , async ( ) => {
284+ ( jwtServiceMock . validateToken as jest . Mock ) . mockResolvedValueOnce ( {
285+ scopes : [ Scope . PROJECT_MEMBERS_WRITE ] ,
286+ isMachine : true ,
287+ tokenPayload : {
288+ gty : 'client-credentials' ,
289+ scope : Scope . PROJECT_MEMBERS_WRITE ,
290+ } ,
291+ } ) ;
292+
293+ await request ( app . getHttpServer ( ) )
294+ . delete ( '/v6/projects/1001/members/11' )
295+ . set ( 'Authorization' , 'Bearer m2m-member-write' )
296+ . expect ( 204 ) ;
297+
298+ expect ( projectMemberServiceMock . deleteMember ) . toHaveBeenCalledWith (
299+ '1001' ,
300+ '11' ,
301+ expect . objectContaining ( {
302+ scopes : [ Scope . PROJECT_MEMBERS_WRITE ] ,
303+ isMachine : true ,
304+ } ) ,
305+ ) ;
306+ } ) ;
307+
228308 it ( 'lists members for m2m token with project-member read scope' , async ( ) => {
229309 ( jwtServiceMock . validateToken as jest . Mock ) . mockResolvedValueOnce ( {
230310 scopes : [ Scope . PROJECT_MEMBERS_READ ] ,
0 commit comments