MCPcopy Index your code
hub / github.com/coder/coder / TestOrgMembersSoftDeleteTrigger

Function TestOrgMembersSoftDeleteTrigger

coderd/database/querier_test.go:8323–8489  ·  view source on GitHub ↗

TestOrgMembersSoftDeleteTrigger verifies that a user's organization memberships (and transitively their group memberships) are deleted when the user is soft-deleted.

(t *testing.T)

Source from the content-addressed store, hash-verified

8321// memberships (and transitively their group memberships) are deleted
8322// when the user is soft-deleted.
8323func 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

Callers

nothing calls this directly

Calls 14

NewDBFunction · 0.92
ContextFunction · 0.92
OrganizationFunction · 0.92
UserFunction · 0.92
OrganizationMemberFunction · 0.92
GroupFunction · 0.92
GroupMemberFunction · 0.92
RunMethod · 0.65
UpdateUserDeletedByIDMethod · 0.65
OrganizationMembersMethod · 0.65

Tested by

no test coverage detected