fix(multiplayer): dispatch live abandonment lifecycle

This commit is contained in:
Josh Creek
2026-09-03 20:55:56 +01:00
parent bd93a2657e
commit 947fefc95c
5 changed files with 62 additions and 5 deletions
+23
View File
@@ -80,3 +80,26 @@ func TestDeliverStateOutboxEventValidatesRevisionAndTargets(t *testing.T) {
t.Fatal("revision-mismatched state event accepted")
}
}
func TestDeliverStateOutboxEventRoutesLiveAbandonmentLifecycle(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 := []byte(`{"event":"state_changed","revision":9,"resource_id":"match_1234567890","occurred_at":"1970-01-01T00:16:40Z","state":"LIVE","match_id":"match_1234567890","player_ids":["player-a","player-b"],"abandoned_player_ids":["player-a"]}`)
event := store.OutboxEvent{EventType: "state_changed", AggregateID: "match_1234567890", Revision: 9, Payload: payload}
if err := deliverStateOutboxEvent(context.Background(), event, service); err != nil {
t.Fatalf("live abandonment event rejected: %v", err)
}
for playerID, subscriber := range map[string]*eventSubscriber{"player-a": first, "player-b": second} {
select {
case packet := <-subscriber.queue:
if !json.Valid(packet) {
t.Fatalf("%s received malformed lifecycle packet %q", playerID, packet)
}
case <-time.After(time.Second):
t.Fatalf("%s did not receive live-abandonment lifecycle event", playerID)
}
}
}