Files
CosmicClash/server/api/outbox_test.go
T
2026-09-01 15:43:32 +01:00

64 lines
2.3 KiB
Go

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")
}
})
}
}
func TestDeliverResultOutboxEventRejectsMalformedRows(t *testing.T) {
for _, event := range []store.OutboxEvent{
{EventType: "proposal_changed", AggregateID: "match-1", Revision: 1, Payload: []byte(`{}`)},
{EventType: "match_completed", AggregateID: "", Revision: 1, Payload: []byte(`{}`)},
{EventType: "match_completed", AggregateID: "match-1", Revision: 1, Payload: []byte(`not-json`)},
} {
if err := deliverResultOutboxEvent(nil, nil, event, &Service{}); err == nil {
t.Fatalf("invalid result event accepted: %+v", event)
}
}
}