mirror of
https://github.com/jcreek/CosmicClash.git
synced 2026-09-11 08:23:45 +00:00
feat(multiplayer): wire production proposal outbox delivery
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/cosmic-clash/cosmic-clash/server/store"
|
||||
)
|
||||
|
||||
func TestDeliverProposalOutboxEventPublishesEveryTarget(t *testing.T) {
|
||||
service := &Service{}
|
||||
first := service.getEventHub().subscribe("player-a")
|
||||
second := service.getEventHub().subscribe("player-b")
|
||||
defer service.getEventHub().unsubscribe(first)
|
||||
defer service.getEventHub().unsubscribe(second)
|
||||
|
||||
payload, err := json.Marshal(map[string]any{
|
||||
"event": "proposal_changed", "revision": uint64(0), "resource_id": "proposal-1",
|
||||
"occurred_at": time.Unix(1000, 0).UTC(), "state": "OPEN", "player_ids": []string{"player-a", "player-b"},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := deliverProposalOutboxEvent(context.Background(), store.OutboxEvent{EventID: "event-1", Payload: payload}, service); err != nil {
|
||||
t.Fatalf("deliver proposal event: %v", err)
|
||||
}
|
||||
for name, subscriber := range map[string]*eventSubscriber{"player-a": first, "player-b": second} {
|
||||
select {
|
||||
case <-subscriber.queue:
|
||||
case <-time.After(time.Second):
|
||||
t.Fatalf("%s did not receive targeted proposal event", name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestDeliverProposalOutboxEventRejectsMalformedOrUntargetedRows(t *testing.T) {
|
||||
service := &Service{}
|
||||
for name, event := range map[string]store.OutboxEvent{
|
||||
"malformed": {Payload: []byte("{")},
|
||||
"wrong event": {Payload: []byte(`{"event":"match_completed","resource_id":"match-1","player_ids":["player-a"]}`)},
|
||||
"missing target": {Payload: []byte(`{"event":"proposal_changed","resource_id":"proposal-1","player_ids":[]}`)},
|
||||
} {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
if err := deliverProposalOutboxEvent(context.Background(), event, service); err == nil {
|
||||
t.Fatal("malformed or untargeted event accepted")
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user