mirror of
https://github.com/mattermost/mattermost.git
synced 2026-09-21 05:54:10 +08:00
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 <matty-code@mattermost.com> * Remove unused orphanedRecordsWithChildIDs helper Fixes golangci-lint unused check failure in check-style CI. Co-authored-by: mattermost-code <matty-code@mattermost.com> * 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 <matty-code@mattermost.com> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: mattermost-code <matty-code@mattermost.com>
This commit is contained in:
co-authored by
mattermost-code
Cursor Agent
parent
9a1e9a010e
commit
4fe11a7d5d
@@ -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)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user