fix(multiplayer): promote accepted matches atomically

This commit is contained in:
Josh Creek
2026-09-03 00:13:18 +01:00
parent eaf7ea8748
commit 1976c6eac6
4 changed files with 112 additions and 36 deletions
+25
View File
@@ -584,6 +584,17 @@ func TestPostgreSQLProposalClaimAndResponseAreAtomic(t *testing.T) {
if err != nil {
t.Fatal(err)
}
proposal.Region = "EU"
proposal.Protocol = 1
for index := range proposal.Participants {
if proposal.Participants[index].PlayerID == "proposal-player-a" {
proposal.Participants[index].Team = 0
proposal.Participants[index].Slot = 0
} else {
proposal.Participants[index].Team = 1
proposal.Participants[index].Slot = 3
}
}
if err := CreateProposal(ctx, db, proposal, map[string]string{"proposal-player-a": "proposal-ticket-0", "proposal-player-b": "proposal-ticket-1"}, now); err != nil {
t.Fatalf("create proposal: %v", err)
}
@@ -616,6 +627,20 @@ func TestPostgreSQLProposalClaimAndResponseAreAtomic(t *testing.T) {
if accepted.State != domain.Accepted || accepted.Revision != 2 {
t.Fatalf("proposal did not close after unanimous acceptance: %+v", accepted)
}
var matchState string
if err := db.QueryRow(`SELECT state FROM matches WHERE match_id = 'match-proposal-integration'`).Scan(&matchState); err != nil {
t.Fatalf("atomic accepted match: %v", err)
}
var acceptedTickets, matchPlayers int
if err := db.QueryRow(`SELECT count(*) FROM queue_tickets WHERE ticket_id LIKE 'proposal-ticket-%' AND state = 'ACCEPTED'`).Scan(&acceptedTickets); err != nil {
t.Fatal(err)
}
if err := db.QueryRow(`SELECT count(*) FROM match_participants WHERE match_id = 'match-proposal-integration'`).Scan(&matchPlayers); err != nil {
t.Fatal(err)
}
if matchState != "ALLOCATING" || acceptedTickets != 2 || matchPlayers != 2 {
t.Fatalf("acceptance did not atomically materialize match: state=%s tickets=%d players=%d", matchState, acceptedTickets, matchPlayers)
}
}
// TestPostgreSQLProposalDeclineCancelsOffenderAndRequeuesInnocent protects the