From 793ebfe4a4cd5315aca312effd62a23ed7dc6b1e Mon Sep 17 00:00:00 2001 From: Kalle <38327916+Sendouc@users.noreply.github.com> Date: Sun, 19 Apr 2026 07:10:49 +0300 Subject: [PATCH] Fix avgSeedingSkillOrdinal condition in autoseed Basically this should never happen so this is not fixing any known bug --- .../tournament/tournament-utils.test.ts | 22 +++++++++++++++++-- app/features/tournament/tournament-utils.ts | 10 +++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/app/features/tournament/tournament-utils.test.ts b/app/features/tournament/tournament-utils.test.ts index c81afec69..90ea09166 100644 --- a/app/features/tournament/tournament-utils.test.ts +++ b/app/features/tournament/tournament-utils.test.ts @@ -23,7 +23,10 @@ const createTeam = ( id, seed: options.seed ?? null, members: { length: options.members ?? 4 }, - avgSeedingSkillOrdinal: options.avgSeedingSkillOrdinal ?? 100, + avgSeedingSkillOrdinal: + options.avgSeedingSkillOrdinal === undefined + ? 100 + : options.avgSeedingSkillOrdinal, createdAt: options.createdAt ?? id, startingBracketIdx: options.startingBracketIdx ?? null, }); @@ -146,7 +149,7 @@ describe("compareTeamsForOrdering", () => { it("places team with skill before team without skill", () => { const withSkill = createTeam(1, { avgSeedingSkillOrdinal: 100 }); - const withoutSkill = createTeam(2); + const withoutSkill = createTeam(2, { avgSeedingSkillOrdinal: null }); const result = compareTeamsForOrdering( withSkill, @@ -156,6 +159,21 @@ describe("compareTeamsForOrdering", () => { expect(result).toBeLessThan(0); }); + + it("places rated team before unrated team even when unrated was created earlier", () => { + const rated = createTeam(1, { + avgSeedingSkillOrdinal: 100, + createdAt: 200, + }); + const unrated = createTeam(2, { + avgSeedingSkillOrdinal: null, + createdAt: 100, + }); + + const sorted = sortTeamsBySeeding([unrated, rated], MIN_MEMBERS); + + expect(sorted.map((t) => t.id)).toEqual([1, 2]); + }); }); describe("createdAt tiebreaker", () => { diff --git a/app/features/tournament/tournament-utils.ts b/app/features/tournament/tournament-utils.ts index c9017b864..f6dc8ebb3 100644 --- a/app/features/tournament/tournament-utils.ts +++ b/app/features/tournament/tournament-utils.ts @@ -312,10 +312,16 @@ export function compareTeamsForOrdering( return 1; } + if (a.avgSeedingSkillOrdinal !== null && b.avgSeedingSkillOrdinal === null) { + return -1; + } + if (a.avgSeedingSkillOrdinal === null && b.avgSeedingSkillOrdinal !== null) { + return 1; + } if ( - a.avgSeedingSkillOrdinal !== b.avgSeedingSkillOrdinal && a.avgSeedingSkillOrdinal !== null && - b.avgSeedingSkillOrdinal !== null + b.avgSeedingSkillOrdinal !== null && + a.avgSeedingSkillOrdinal !== b.avgSeedingSkillOrdinal ) { return b.avgSeedingSkillOrdinal - a.avgSeedingSkillOrdinal; }