@@ -1243,3 +1243,121 @@ func TestService_SetMemberRole(t *testing.T) {
12431243 })
12441244 }
12451245}
1246+
1247+ func TestService_RemoveMember (t * testing.T ) {
1248+ ctx := context .Background ()
1249+ projectID := uuid .New ().String ()
1250+ userID := uuid .New ().String ()
1251+
1252+ tests := []struct {
1253+ name string
1254+ projectID string
1255+ principalID string
1256+ principalType string
1257+ setup func (* mocks.Repository , * mocks.PolicyService )
1258+ wantErr error
1259+ }{
1260+ {
1261+ name : "should return error if project does not exist" ,
1262+ projectID : projectID ,
1263+ principalID : userID ,
1264+ principalType : schema .UserPrincipal ,
1265+ setup : func (repo * mocks.Repository , policySvc * mocks.PolicyService ) {
1266+ repo .EXPECT ().GetByID (ctx , projectID ).Return (project.Project {}, project .ErrNotExist )
1267+ },
1268+ wantErr : project .ErrNotExist ,
1269+ },
1270+ {
1271+ name : "should return error for invalid principal type" ,
1272+ projectID : projectID ,
1273+ principalID : userID ,
1274+ principalType : "app/invalid" ,
1275+ setup : func (repo * mocks.Repository , policySvc * mocks.PolicyService ) {
1276+ repo .EXPECT ().GetByID (ctx , projectID ).Return (project.Project {ID : projectID }, nil )
1277+ },
1278+ wantErr : project .ErrInvalidPrincipalType ,
1279+ },
1280+ {
1281+ name : "should return error if principal has no project policies" ,
1282+ projectID : projectID ,
1283+ principalID : userID ,
1284+ principalType : schema .UserPrincipal ,
1285+ setup : func (repo * mocks.Repository , policySvc * mocks.PolicyService ) {
1286+ repo .EXPECT ().GetByID (ctx , projectID ).Return (project.Project {ID : projectID }, nil )
1287+ policySvc .EXPECT ().List (ctx , policy.Filter {
1288+ ProjectID : projectID , PrincipalID : userID , PrincipalType : schema .UserPrincipal ,
1289+ }).Return ([]policy.Policy {}, nil )
1290+ },
1291+ wantErr : project .ErrNotMember ,
1292+ },
1293+ {
1294+ name : "should delete all project policies for the principal" ,
1295+ projectID : projectID ,
1296+ principalID : userID ,
1297+ principalType : schema .UserPrincipal ,
1298+ setup : func (repo * mocks.Repository , policySvc * mocks.PolicyService ) {
1299+ repo .EXPECT ().GetByID (ctx , projectID ).Return (project.Project {ID : projectID }, nil )
1300+ policySvc .EXPECT ().List (ctx , policy.Filter {
1301+ ProjectID : projectID , PrincipalID : userID , PrincipalType : schema .UserPrincipal ,
1302+ }).Return ([]policy.Policy {{ID : "p1" }, {ID : "p2" }}, nil )
1303+ policySvc .EXPECT ().Delete (ctx , "p1" ).Return (nil )
1304+ policySvc .EXPECT ().Delete (ctx , "p2" ).Return (nil )
1305+ },
1306+ wantErr : nil ,
1307+ },
1308+ {
1309+ name : "should work for service user principal" ,
1310+ projectID : projectID ,
1311+ principalID : userID ,
1312+ principalType : schema .ServiceUserPrincipal ,
1313+ setup : func (repo * mocks.Repository , policySvc * mocks.PolicyService ) {
1314+ repo .EXPECT ().GetByID (ctx , projectID ).Return (project.Project {ID : projectID }, nil )
1315+ policySvc .EXPECT ().List (ctx , policy.Filter {
1316+ ProjectID : projectID , PrincipalID : userID , PrincipalType : schema .ServiceUserPrincipal ,
1317+ }).Return ([]policy.Policy {{ID : "p1" }}, nil )
1318+ policySvc .EXPECT ().Delete (ctx , "p1" ).Return (nil )
1319+ },
1320+ wantErr : nil ,
1321+ },
1322+ {
1323+ name : "should work for group principal" ,
1324+ projectID : projectID ,
1325+ principalID : userID ,
1326+ principalType : schema .GroupPrincipal ,
1327+ setup : func (repo * mocks.Repository , policySvc * mocks.PolicyService ) {
1328+ repo .EXPECT ().GetByID (ctx , projectID ).Return (project.Project {ID : projectID }, nil )
1329+ policySvc .EXPECT ().List (ctx , policy.Filter {
1330+ ProjectID : projectID , PrincipalID : userID , PrincipalType : schema .GroupPrincipal ,
1331+ }).Return ([]policy.Policy {{ID : "p1" }}, nil )
1332+ policySvc .EXPECT ().Delete (ctx , "p1" ).Return (nil )
1333+ },
1334+ wantErr : nil ,
1335+ },
1336+ }
1337+
1338+ for _ , tt := range tests {
1339+ t .Run (tt .name , func (t * testing.T ) {
1340+ repo := mocks .NewRepository (t )
1341+ policySvc := mocks .NewPolicyService (t )
1342+ relationSvc := mocks .NewRelationService (t )
1343+ userSvc := mocks .NewUserService (t )
1344+ suserSvc := mocks .NewServiceuserService (t )
1345+ groupSvc := mocks .NewGroupService (t )
1346+ roleSvc := mocks .NewRoleService (t )
1347+ authnSvc := mocks .NewAuthnService (t )
1348+
1349+ if tt .setup != nil {
1350+ tt .setup (repo , policySvc )
1351+ }
1352+
1353+ svc := project .NewService (repo , relationSvc , userSvc , policySvc , authnSvc , suserSvc , groupSvc , roleSvc )
1354+ err := svc .RemoveMember (ctx , tt .projectID , tt .principalID , tt .principalType )
1355+
1356+ if tt .wantErr != nil {
1357+ assert .ErrorIs (t , err , tt .wantErr )
1358+ } else {
1359+ assert .NoError (t , err )
1360+ }
1361+ })
1362+ }
1363+ }
0 commit comments