@@ -1216,6 +1216,103 @@ func TestExpectOne(t *testing.T) {
1216
1216
})
1217
1217
}
1218
1218
1219
+ func TestGroupRemovalTrigger (t * testing.T ) {
1220
+ t .Parallel ()
1221
+
1222
+ db ,_ := dbtestutil .NewDB (t )
1223
+
1224
+ orgA := dbgen .Organization (t ,db , database.Organization {})
1225
+ _ ,err := db .InsertAllUsersGroup (context .Background (),orgA .ID )
1226
+ require .NoError (t ,err )
1227
+
1228
+ orgB := dbgen .Organization (t ,db , database.Organization {})
1229
+ _ ,err = db .InsertAllUsersGroup (context .Background (),orgB .ID )
1230
+ require .NoError (t ,err )
1231
+
1232
+ orgs := []database.Organization {orgA ,orgB }
1233
+
1234
+ user := dbgen .User (t ,db , database.User {})
1235
+ extra := dbgen .User (t ,db , database.User {})
1236
+ users := []database.User {user ,extra }
1237
+
1238
+ groupA1 := dbgen .Group (t ,db , database.Group {
1239
+ OrganizationID :orgA .ID ,
1240
+ })
1241
+ groupA2 := dbgen .Group (t ,db , database.Group {
1242
+ OrganizationID :orgA .ID ,
1243
+ })
1244
+
1245
+ groupB1 := dbgen .Group (t ,db , database.Group {
1246
+ OrganizationID :orgB .ID ,
1247
+ })
1248
+ groupB2 := dbgen .Group (t ,db , database.Group {
1249
+ OrganizationID :orgB .ID ,
1250
+ })
1251
+
1252
+ groups := []database.Group {groupA1 ,groupA2 ,groupB1 ,groupB2 }
1253
+
1254
+ // Add users to all organizations
1255
+ for _ ,u := range users {
1256
+ for _ ,o := range orgs {
1257
+ dbgen .OrganizationMember (t ,db , database.OrganizationMember {
1258
+ OrganizationID :o .ID ,
1259
+ UserID :u .ID ,
1260
+ })
1261
+ }
1262
+ }
1263
+
1264
+ // Add users to all groups
1265
+ for _ ,u := range users {
1266
+ for _ ,g := range groups {
1267
+ dbgen .GroupMember (t ,db , database.GroupMemberTable {
1268
+ GroupID :g .ID ,
1269
+ UserID :u .ID ,
1270
+ })
1271
+ }
1272
+ }
1273
+
1274
+ // Verify user is in all groups
1275
+ ctx := testutil .Context (t ,testutil .WaitLong )
1276
+ onlyGroupIDs := func (row database.GetGroupsRow ) uuid.UUID {
1277
+ return row .Group .ID
1278
+ }
1279
+ userGroups ,err := db .GetGroups (ctx , database.GetGroupsParams {
1280
+ HasMemberID :user .ID ,
1281
+ })
1282
+ require .NoError (t ,err )
1283
+ require .ElementsMatch (t , []uuid.UUID {
1284
+ orgA .ID ,orgB .ID ,// Everyone groups
1285
+ groupA1 .ID ,groupA2 .ID ,groupB1 .ID ,groupB2 .ID ,// Org groups
1286
+ },db2sdk .List (userGroups ,onlyGroupIDs ))
1287
+
1288
+ // Remove the user from org A
1289
+ err = db .DeleteOrganizationMember (ctx , database.DeleteOrganizationMemberParams {
1290
+ OrganizationID :orgA .ID ,
1291
+ UserID :user .ID ,
1292
+ })
1293
+ require .NoError (t ,err )
1294
+
1295
+ // Verify user is no longer in org A groups
1296
+ userGroups ,err = db .GetGroups (ctx , database.GetGroupsParams {
1297
+ HasMemberID :user .ID ,
1298
+ })
1299
+ require .NoError (t ,err )
1300
+ require .ElementsMatch (t , []uuid.UUID {
1301
+ orgB .ID ,// Everyone group
1302
+ groupB1 .ID ,groupB2 .ID ,// Org groups
1303
+ },db2sdk .List (userGroups ,onlyGroupIDs ))
1304
+
1305
+ // Verify extra user is unchanged
1306
+ extraUserGroups ,err := db .GetGroups (ctx , database.GetGroupsParams {
1307
+ HasMemberID :extra .ID ,
1308
+ })
1309
+ require .NoError (t ,err )
1310
+ require .ElementsMatch (t , []uuid.UUID {
1311
+ orgA .ID ,orgB .ID ,// Everyone groups
1312
+ groupA1 .ID ,groupA2 .ID ,groupB1 .ID ,groupB2 .ID ,// Org groups
1313
+ },db2sdk .List (extraUserGroups ,onlyGroupIDs ))
1314
+ }
1315
+
1219
1316
func requireUsersMatch (t testing.TB ,expected []database.User ,found []database.GetUsersRow ,msg string ) {
1220
1317
t .Helper ()
1221
1318
require .ElementsMatch (t ,expected ,database .ConvertUserRows (found ),msg )