fix: enforce ranked match promotion size

This commit is contained in:
Josh Creek
2026-09-01 10:22:26 +01:00
parent 7807b9706b
commit e0ba6c6ead
2 changed files with 19 additions and 0 deletions
+10
View File
@@ -78,6 +78,9 @@ func CreateMatchFromAcceptedProposal(ctx context.Context, db *sql.DB, plan Accep
if proposalState != string(domain.Accepted) {
return fmt.Errorf("proposal is not accepted")
}
if !validAcceptedPlaylistCount(domain.Playlist(playlist), len(plan.Players)) {
return fmt.Errorf("accepted proposal playlist does not match player count")
}
participants, err := acceptedProposalParticipants(ctx, tx, plan)
if err != nil {
return err
@@ -110,6 +113,13 @@ func CreateMatchFromAcceptedProposal(ctx context.Context, db *sql.DB, plan Accep
})
}
func validAcceptedPlaylistCount(playlist domain.Playlist, count int) bool {
if playlist == domain.Ranked {
return count == 6
}
return playlist == domain.Casual && count >= 2 && count <= 6
}
func validAcceptedMatchPlan(plan AcceptedMatchPlan) bool {
if plan.MatchID == "" || plan.ProposalID == "" || (plan.Region != "EU" && plan.Region != "NA") || plan.Protocol < 1 || len(plan.Players) < 2 || len(plan.Players) > 6 {
return false
+9
View File
@@ -50,6 +50,15 @@ func TestAcceptedMatchPlanRejectsInvalidPlansBeforeDatabaseUse(t *testing.T) {
}
}
func TestAcceptedMatchPromotionHonoursPlaylistSizeInvariant(t *testing.T) {
if validAcceptedPlaylistCount(domain.Ranked, 5) || !validAcceptedPlaylistCount(domain.Ranked, 6) {
t.Fatal("ranked accepted-match count invariant is wrong")
}
if validAcceptedPlaylistCount(domain.Casual, 1) || !validAcceptedPlaylistCount(domain.Casual, 2) || validAcceptedPlaylistCount("other", 6) {
t.Fatal("casual accepted-match count invariant is wrong")
}
}
func TestMatchPlayersFromTeamsUsesDeterministicTeamSlots(t *testing.T) {
teams := domain.Teams{
Team0: []domain.Candidate{{PlayerID: "bravo"}, {PlayerID: "alpha"}},