From 4fe11a7d5d14616f3c31363762617ddfd99895df Mon Sep 17 00:00:00 2001 From: "cursor[bot]" <206951365+cursor[bot]@users.noreply.github.com> Date: Thu, 25 Jun 2026 07:34:36 -0400 Subject: [PATCH] Fix flaky TestCheckTeamsTeamMembersIntegrity (#36797) * Fix flaky TestCheckTeamsTeamMembersIntegrity Integrity checks scan the full database for orphaned TeamMembers rows, so parallel sqlstore tests and leftover rows from sibling tests can inflate global record counts and flip index-based assertions. Reset tables at test start and scope the one-record assertion to the team parent ID created in that subtest. Tests-only change. Verified package compiles locally; full test loop requires PostgreSQL (CI). Co-authored-by: mattermost-code * Remove unused orphanedRecordsWithChildIDs helper Fixes golangci-lint unused check failure in check-style CI. Co-authored-by: mattermost-code * Address PR feedback: 1 item resolved, 1 declined * Use real users in TestCheckTeamsTeamMembersIntegrity fixtures createTeamMember with model.NewId() also creates Users-side orphans that can pollute TestCheckUsersTeamMembersIntegrity when tests share a store. Co-authored-by: mattermost-code --------- Co-authored-by: Cursor Agent Co-authored-by: mattermost-code --- .../channels/store/sqlstore/integrity_test.go | 39 ++++++++++++++++--- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/server/channels/store/sqlstore/integrity_test.go b/server/channels/store/sqlstore/integrity_test.go index 7c1078aebfa..cea3a426a72 100644 --- a/server/channels/store/sqlstore/integrity_test.go +++ b/server/channels/store/sqlstore/integrity_test.go @@ -792,6 +792,25 @@ func TestCheckSessionsAuditsIntegrity(t *testing.T) { }) } +func orphanedRecordsWithParentIDs(records []model.OrphanedRecord, parentIDs ...string) []model.OrphanedRecord { + parentIDSet := make(map[string]struct{}, len(parentIDs)) + for _, parentID := range parentIDs { + parentIDSet[parentID] = struct{}{} + } + + filtered := make([]model.OrphanedRecord, 0, len(parentIDs)) + for _, record := range records { + if record.ParentId == nil { + continue + } + if _, ok := parentIDSet[*record.ParentId]; ok { + filtered = append(filtered, record) + } + } + + return filtered +} + func orphanedRecordsWithChildIDs(records []model.OrphanedRecord, childIDs ...string) []model.OrphanedRecord { childIDSet := make(map[string]struct{}, len(childIDs)) for _, childID := range childIDs { @@ -983,24 +1002,34 @@ func TestCheckTeamsTeamMembersIntegrity(t *testing.T) { dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { + team := createTeam(ss) + user := createUser(rctx, ss) + createTeamMember(rctx, ss, team.Id, user.Id) + result := checkTeamsTeamMembersIntegrity(store) require.NoError(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) - require.Empty(t, data.Records) + require.Empty(t, orphanedRecordsWithParentIDs(data.Records, team.Id)) + ss.Team().RemoveAllMembersByTeam(team.Id) + dbmap.Exec(`DELETE FROM Teams WHERE Id=?`, team.Id) + dbmap.Exec(`DELETE FROM Users WHERE Id=?`, user.Id) }) t.Run("should generate a report with one record", func(t *testing.T) { team := createTeam(ss) - member := createTeamMember(rctx, ss, team.Id, model.NewId()) + user := createUser(rctx, ss) + createTeamMember(rctx, ss, team.Id, user.Id) dbmap.Exec(`DELETE FROM Teams WHERE Id=?`, team.Id) result := checkTeamsTeamMembersIntegrity(store) require.NoError(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) - require.Len(t, data.Records, 1) + records := orphanedRecordsWithParentIDs(data.Records, team.Id) + require.Len(t, records, 1) require.Equal(t, model.OrphanedRecord{ ParentId: &team.Id, - }, data.Records[0]) - ss.Team().RemoveAllMembersByTeam(member.TeamId) + }, records[0]) + ss.Team().RemoveAllMembersByTeam(team.Id) + dbmap.Exec(`DELETE FROM Users WHERE Id=?`, user.Id) }) }) }