mirror of
https://github.com/jcreek/CosmicClash.git
synced 2026-09-11 00:14:00 +00:00
test(multiplayer): verify two-player proposal round trip
This commit is contained in:
@@ -3,6 +3,7 @@ package store
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
@@ -13,6 +14,10 @@ const ProposalInsertSQL = `INSERT INTO proposals
|
||||
(proposal_id, playlist, state, expires_at, revision, match_region, match_protocol)
|
||||
VALUES ($1, $2, 'OPEN', $3, 0, NULLIF($4, ''), NULLIF($5, 0))`
|
||||
|
||||
const ProposalOutboxInsertSQL = `INSERT INTO outbox
|
||||
(event_id, aggregate_type, aggregate_id, revision, event_type, payload)
|
||||
VALUES ($1, 'proposal', $2, 0, 'proposal_changed', $3)`
|
||||
|
||||
// CreateProposal atomically claims the queue tickets and creates the proposal.
|
||||
// Every statement runs inside the same SERIALIZABLE retry callback; callers
|
||||
// must never publish a proposal from a cache-only candidate list.
|
||||
@@ -27,6 +32,7 @@ func CreateProposal(ctx context.Context, db *sql.DB, proposal domain.Proposal, t
|
||||
if _, err := tx.ExecContext(ctx, ProposalInsertSQL, proposal.ProposalID, proposal.Playlist, proposal.ExpiresAt, proposal.Region, proposal.Protocol); err != nil {
|
||||
return err
|
||||
}
|
||||
players := make([]string, 0, len(proposal.Participants))
|
||||
for _, participant := range proposal.Participants {
|
||||
ticketID := ticketIDs[participant.PlayerID]
|
||||
if participant.PlayerID == "" || ticketID == "" {
|
||||
@@ -46,6 +52,17 @@ func CreateProposal(ctx context.Context, db *sql.DB, proposal domain.Proposal, t
|
||||
if changed != 1 {
|
||||
return fmt.Errorf("queue ticket claim lost")
|
||||
}
|
||||
players = append(players, participant.PlayerID)
|
||||
}
|
||||
payload, err := json.Marshal(map[string]any{
|
||||
"event": "proposal_changed", "revision": uint64(0), "resource_id": proposal.ProposalID,
|
||||
"occurred_at": now, "state": string(proposal.State), "player_ids": players,
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err := tx.ExecContext(ctx, ProposalOutboxInsertSQL, proposal.ProposalID, proposal.ProposalID, payload); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user