mirror of
https://github.com/jcreek/CosmicClash.git
synced 2026-09-10 16:04:04 +00:00
fix: enforce ranked match promotion size
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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"}},
|
||||
|
||||
Reference in New Issue
Block a user