TestOrgMembersSoftDeleteTrigger verifies that a user's organization memberships (and transitively their group memberships) are deleted when the user is soft-deleted.
(t *testing.T)
| 8321 | // memberships (and transitively their group memberships) are deleted |
| 8322 | // when the user is soft-deleted. |
| 8323 | func TestOrgMembersSoftDeleteTrigger(t *testing.T) { |
| 8324 | t.Parallel() |
| 8325 | |
| 8326 | // SingleOrg verifies the basic case: one org, one group, and a |
| 8327 | // control user whose membership must survive. |
| 8328 | t.Run("SingleOrg", func(t *testing.T) { |
| 8329 | t.Parallel() |
| 8330 | |
| 8331 | db, _ := dbtestutil.NewDB(t) |
| 8332 | ctx := testutil.Context(t, testutil.WaitMedium) |
| 8333 | |
| 8334 | org := dbgen.Organization(t, db, database.Organization{}) |
| 8335 | |
| 8336 | // userA will be soft-deleted. |
| 8337 | userA := dbgen.User(t, db, database.User{}) |
| 8338 | dbgen.OrganizationMember(t, db, database.OrganizationMember{ |
| 8339 | OrganizationID: org.ID, |
| 8340 | UserID: userA.ID, |
| 8341 | }) |
| 8342 | |
| 8343 | // Add userA to a group in the org (should be cleaned up transitively). |
| 8344 | group := dbgen.Group(t, db, database.Group{OrganizationID: org.ID}) |
| 8345 | dbgen.GroupMember(t, db, database.GroupMemberTable{ |
| 8346 | UserID: userA.ID, |
| 8347 | GroupID: group.ID, |
| 8348 | }) |
| 8349 | |
| 8350 | // userB is a control; their membership must not be touched. |
| 8351 | userB := dbgen.User(t, db, database.User{}) |
| 8352 | dbgen.OrganizationMember(t, db, database.OrganizationMember{ |
| 8353 | OrganizationID: org.ID, |
| 8354 | UserID: userB.ID, |
| 8355 | }) |
| 8356 | dbgen.GroupMember(t, db, database.GroupMemberTable{ |
| 8357 | UserID: userB.ID, |
| 8358 | GroupID: group.ID, |
| 8359 | }) |
| 8360 | |
| 8361 | // Soft-delete userA. |
| 8362 | require.NoError(t, db.UpdateUserDeletedByID(ctx, userA.ID)) |
| 8363 | |
| 8364 | // userA should no longer appear in the organization. |
| 8365 | orgMembers, err := db.OrganizationMembers(ctx, database.OrganizationMembersParams{ |
| 8366 | OrganizationID: org.ID, |
| 8367 | }) |
| 8368 | require.NoError(t, err) |
| 8369 | var memberIDs []uuid.UUID |
| 8370 | for _, m := range orgMembers { |
| 8371 | memberIDs = append(memberIDs, m.OrganizationMember.UserID) |
| 8372 | } |
| 8373 | require.NotContains(t, memberIDs, userA.ID) |
| 8374 | require.Contains(t, memberIDs, userB.ID) |
| 8375 | |
| 8376 | // The raw org membership rows should also be gone (not just hidden). |
| 8377 | rawOrgs, err := db.GetOrganizationIDsByMemberIDs(ctx, []uuid.UUID{userA.ID}) |
| 8378 | require.NoError(t, err) |
| 8379 | require.Empty(t, rawOrgs, "zombie org membership rows should not exist after soft-delete") |
| 8380 |
nothing calls this directly
no test coverage detected