docs: reorder & testing

This commit is contained in:
Ilia Denisov
2026-05-07 00:58:53 +03:00
committed by GitHub
parent f446c6a2ac
commit 604fe40bcf
148 changed files with 9150 additions and 2757 deletions
+153 -241
View File
@@ -5,9 +5,17 @@ import (
"strings"
"testing"
commonfbs "galaxy/schema/fbs/common"
notificationfbs "galaxy/schema/fbs/notification"
flatbuffers "github.com/google/flatbuffers/go"
"github.com/google/uuid"
)
var (
testNotificationGameID = uuid.MustParse("11111111-1111-1111-1111-111111111111")
testNotificationApplicationID = uuid.MustParse("22222222-2222-2222-2222-222222222222")
testNotificationInviterID = uuid.MustParse("33333333-3333-3333-3333-333333333333")
)
func TestNotificationPayloadRoundTrips(t *testing.T) {
@@ -20,94 +28,123 @@ func TestNotificationPayloadRoundTrips(t *testing.T) {
decode func([]byte) (any, error)
}{
{
name: "game turn ready",
source: &GameTurnReadyEvent{GameID: "game-1", TurnNumber: 54},
encode: func(value any) ([]byte, error) { return GameTurnReadyEventToPayload(value.(*GameTurnReadyEvent)) },
decode: func(data []byte) (any, error) { return PayloadToGameTurnReadyEvent(data) },
name: "lobby invite received",
source: &LobbyInviteReceivedEvent{GameID: testNotificationGameID, InviterUserID: testNotificationInviterID},
encode: func(v any) ([]byte, error) {
return LobbyInviteReceivedEventToPayload(v.(*LobbyInviteReceivedEvent))
},
decode: func(data []byte) (any, error) { return PayloadToLobbyInviteReceivedEvent(data) },
},
{
name: "game finished",
source: &GameFinishedEvent{GameID: "game-2", FinalTurnNumber: 99},
encode: func(value any) ([]byte, error) { return GameFinishedEventToPayload(value.(*GameFinishedEvent)) },
decode: func(data []byte) (any, error) { return PayloadToGameFinishedEvent(data) },
name: "lobby invite revoked",
source: &LobbyInviteRevokedEvent{GameID: testNotificationGameID},
encode: func(v any) ([]byte, error) {
return LobbyInviteRevokedEventToPayload(v.(*LobbyInviteRevokedEvent))
},
decode: func(data []byte) (any, error) { return PayloadToLobbyInviteRevokedEvent(data) },
},
{
name: "lobby application submitted",
source: &LobbyApplicationSubmittedEvent{GameID: "game-3", ApplicantUserID: "user-7"},
encode: func(value any) ([]byte, error) {
return LobbyApplicationSubmittedEventToPayload(value.(*LobbyApplicationSubmittedEvent))
source: &LobbyApplicationSubmittedEvent{GameID: testNotificationGameID, ApplicationID: testNotificationApplicationID},
encode: func(v any) ([]byte, error) {
return LobbyApplicationSubmittedEventToPayload(v.(*LobbyApplicationSubmittedEvent))
},
decode: func(data []byte) (any, error) { return PayloadToLobbyApplicationSubmittedEvent(data) },
},
{
name: "lobby membership approved",
source: &LobbyMembershipApprovedEvent{GameID: "game-4"},
encode: func(value any) ([]byte, error) {
return LobbyMembershipApprovedEventToPayload(value.(*LobbyMembershipApprovedEvent))
name: "lobby application approved",
source: &LobbyApplicationApprovedEvent{GameID: testNotificationGameID},
encode: func(v any) ([]byte, error) {
return LobbyApplicationApprovedEventToPayload(v.(*LobbyApplicationApprovedEvent))
},
decode: func(data []byte) (any, error) { return PayloadToLobbyMembershipApprovedEvent(data) },
decode: func(data []byte) (any, error) { return PayloadToLobbyApplicationApprovedEvent(data) },
},
{
name: "lobby membership rejected",
source: &LobbyMembershipRejectedEvent{GameID: "game-5"},
encode: func(value any) ([]byte, error) {
return LobbyMembershipRejectedEventToPayload(value.(*LobbyMembershipRejectedEvent))
name: "lobby application rejected",
source: &LobbyApplicationRejectedEvent{GameID: testNotificationGameID},
encode: func(v any) ([]byte, error) {
return LobbyApplicationRejectedEventToPayload(v.(*LobbyApplicationRejectedEvent))
},
decode: func(data []byte) (any, error) { return PayloadToLobbyMembershipRejectedEvent(data) },
decode: func(data []byte) (any, error) { return PayloadToLobbyApplicationRejectedEvent(data) },
},
{
name: "lobby invite created",
source: &LobbyInviteCreatedEvent{GameID: "game-6", InviterUserID: "user-8"},
encode: func(value any) ([]byte, error) {
return LobbyInviteCreatedEventToPayload(value.(*LobbyInviteCreatedEvent))
name: "lobby membership removed",
source: &LobbyMembershipRemovedEvent{Reason: "deleted"},
encode: func(v any) ([]byte, error) {
return LobbyMembershipRemovedEventToPayload(v.(*LobbyMembershipRemovedEvent))
},
decode: func(data []byte) (any, error) { return PayloadToLobbyInviteCreatedEvent(data) },
decode: func(data []byte) (any, error) { return PayloadToLobbyMembershipRemovedEvent(data) },
},
{
name: "lobby invite redeemed",
source: &LobbyInviteRedeemedEvent{GameID: "game-7", InviteeUserID: "user-9"},
encode: func(value any) ([]byte, error) {
return LobbyInviteRedeemedEventToPayload(value.(*LobbyInviteRedeemedEvent))
name: "lobby membership blocked",
source: &LobbyMembershipBlockedEvent{GameID: testNotificationGameID, Reason: "permanent_blocked"},
encode: func(v any) ([]byte, error) {
return LobbyMembershipBlockedEventToPayload(v.(*LobbyMembershipBlockedEvent))
},
decode: func(data []byte) (any, error) { return PayloadToLobbyInviteRedeemedEvent(data) },
},
{
name: "lobby race name registration eligible",
source: &LobbyRaceNameRegistrationEligibleEvent{
GameID: "game-8",
RaceName: "Skylancer",
EligibleUntilMs: 1775208100000,
},
encode: func(value any) ([]byte, error) {
return LobbyRaceNameRegistrationEligibleEventToPayload(value.(*LobbyRaceNameRegistrationEligibleEvent))
},
decode: func(data []byte) (any, error) { return PayloadToLobbyRaceNameRegistrationEligibleEvent(data) },
decode: func(data []byte) (any, error) { return PayloadToLobbyMembershipBlockedEvent(data) },
},
{
name: "lobby race name registered",
source: &LobbyRaceNameRegisteredEvent{RaceName: "Skylancer"},
encode: func(value any) ([]byte, error) {
return LobbyRaceNameRegisteredEventToPayload(value.(*LobbyRaceNameRegisteredEvent))
encode: func(v any) ([]byte, error) {
return LobbyRaceNameRegisteredEventToPayload(v.(*LobbyRaceNameRegisteredEvent))
},
decode: func(data []byte) (any, error) { return PayloadToLobbyRaceNameRegisteredEvent(data) },
},
{
name: "lobby race name pending",
source: &LobbyRaceNamePendingEvent{RaceName: "Skylancer", ExpiresAt: "2026-05-06T12:00:00Z"},
encode: func(v any) ([]byte, error) {
return LobbyRaceNamePendingEventToPayload(v.(*LobbyRaceNamePendingEvent))
},
decode: func(data []byte) (any, error) { return PayloadToLobbyRaceNamePendingEvent(data) },
},
{
name: "lobby race name expired",
source: &LobbyRaceNameExpiredEvent{RaceName: "Skylancer"},
encode: func(v any) ([]byte, error) {
return LobbyRaceNameExpiredEventToPayload(v.(*LobbyRaceNameExpiredEvent))
},
decode: func(data []byte) (any, error) { return PayloadToLobbyRaceNameExpiredEvent(data) },
},
{
name: "runtime image pull failed",
source: &RuntimeImagePullFailedEvent{GameID: testNotificationGameID, ImageRef: "gcr.io/example:1.0.0"},
encode: func(v any) ([]byte, error) {
return RuntimeImagePullFailedEventToPayload(v.(*RuntimeImagePullFailedEvent))
},
decode: func(data []byte) (any, error) { return PayloadToRuntimeImagePullFailedEvent(data) },
},
{
name: "runtime container start failed",
source: &RuntimeContainerStartFailedEvent{GameID: testNotificationGameID},
encode: func(v any) ([]byte, error) {
return RuntimeContainerStartFailedEventToPayload(v.(*RuntimeContainerStartFailedEvent))
},
decode: func(data []byte) (any, error) { return PayloadToRuntimeContainerStartFailedEvent(data) },
},
{
name: "runtime start config invalid",
source: &RuntimeStartConfigInvalidEvent{GameID: testNotificationGameID, Reason: "missing engine version"},
encode: func(v any) ([]byte, error) {
return RuntimeStartConfigInvalidEventToPayload(v.(*RuntimeStartConfigInvalidEvent))
},
decode: func(data []byte) (any, error) { return PayloadToRuntimeStartConfigInvalidEvent(data) },
},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
payload, err := tt.encode(tt.source)
if err != nil {
t.Fatalf("encode payload: %v", err)
}
decoded, err := tt.decode(payload)
if err != nil {
t.Fatalf("decode payload: %v", err)
}
if !reflect.DeepEqual(tt.source, decoded) {
t.Fatalf("round-trip mismatch\nsource: %#v\ndecoded:%#v", tt.source, decoded)
}
@@ -122,76 +159,25 @@ func TestNotificationPayloadEncodersRejectNilInputs(t *testing.T) {
name string
call func() error
}{
{
name: "game turn ready",
call: func() error {
_, err := GameTurnReadyEventToPayload(nil)
return err
},
},
{
name: "game finished",
call: func() error {
_, err := GameFinishedEventToPayload(nil)
return err
},
},
{
name: "lobby application submitted",
call: func() error {
_, err := LobbyApplicationSubmittedEventToPayload(nil)
return err
},
},
{
name: "lobby membership approved",
call: func() error {
_, err := LobbyMembershipApprovedEventToPayload(nil)
return err
},
},
{
name: "lobby membership rejected",
call: func() error {
_, err := LobbyMembershipRejectedEventToPayload(nil)
return err
},
},
{
name: "lobby invite created",
call: func() error {
_, err := LobbyInviteCreatedEventToPayload(nil)
return err
},
},
{
name: "lobby invite redeemed",
call: func() error {
_, err := LobbyInviteRedeemedEventToPayload(nil)
return err
},
},
{
name: "lobby race name registration eligible",
call: func() error {
_, err := LobbyRaceNameRegistrationEligibleEventToPayload(nil)
return err
},
},
{
name: "lobby race name registered",
call: func() error {
_, err := LobbyRaceNameRegisteredEventToPayload(nil)
return err
},
},
{"lobby invite received", func() error { _, err := LobbyInviteReceivedEventToPayload(nil); return err }},
{"lobby invite revoked", func() error { _, err := LobbyInviteRevokedEventToPayload(nil); return err }},
{"lobby application submitted", func() error { _, err := LobbyApplicationSubmittedEventToPayload(nil); return err }},
{"lobby application approved", func() error { _, err := LobbyApplicationApprovedEventToPayload(nil); return err }},
{"lobby application rejected", func() error { _, err := LobbyApplicationRejectedEventToPayload(nil); return err }},
{"lobby membership removed", func() error { _, err := LobbyMembershipRemovedEventToPayload(nil); return err }},
{"lobby membership blocked", func() error { _, err := LobbyMembershipBlockedEventToPayload(nil); return err }},
{"lobby race name registered", func() error { _, err := LobbyRaceNameRegisteredEventToPayload(nil); return err }},
{"lobby race name pending", func() error { _, err := LobbyRaceNamePendingEventToPayload(nil); return err }},
{"lobby race name expired", func() error { _, err := LobbyRaceNameExpiredEventToPayload(nil); return err }},
{"runtime image pull failed", func() error { _, err := RuntimeImagePullFailedEventToPayload(nil); return err }},
{"runtime container start failed", func() error { _, err := RuntimeContainerStartFailedEventToPayload(nil); return err }},
{"runtime start config invalid", func() error { _, err := RuntimeStartConfigInvalidEventToPayload(nil); return err }},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
if err := tt.call(); err == nil {
t.Fatal("expected error")
}
@@ -206,62 +192,25 @@ func TestNotificationPayloadDecodersRejectEmptyPayloads(t *testing.T) {
name string
call func() error
}{
{
name: "game turn ready",
call: func() error {
_, err := PayloadToGameTurnReadyEvent(nil)
return err
},
},
{
name: "game finished",
call: func() error {
_, err := PayloadToGameFinishedEvent(nil)
return err
},
},
{
name: "lobby application submitted",
call: func() error {
_, err := PayloadToLobbyApplicationSubmittedEvent(nil)
return err
},
},
{
name: "lobby membership approved",
call: func() error {
_, err := PayloadToLobbyMembershipApprovedEvent(nil)
return err
},
},
{
name: "lobby membership rejected",
call: func() error {
_, err := PayloadToLobbyMembershipRejectedEvent(nil)
return err
},
},
{
name: "lobby invite created",
call: func() error {
_, err := PayloadToLobbyInviteCreatedEvent(nil)
return err
},
},
{
name: "lobby invite redeemed",
call: func() error {
_, err := PayloadToLobbyInviteRedeemedEvent(nil)
return err
},
},
{"lobby invite received", func() error { _, err := PayloadToLobbyInviteReceivedEvent(nil); return err }},
{"lobby invite revoked", func() error { _, err := PayloadToLobbyInviteRevokedEvent(nil); return err }},
{"lobby application submitted", func() error { _, err := PayloadToLobbyApplicationSubmittedEvent(nil); return err }},
{"lobby application approved", func() error { _, err := PayloadToLobbyApplicationApprovedEvent(nil); return err }},
{"lobby application rejected", func() error { _, err := PayloadToLobbyApplicationRejectedEvent(nil); return err }},
{"lobby membership removed", func() error { _, err := PayloadToLobbyMembershipRemovedEvent(nil); return err }},
{"lobby membership blocked", func() error { _, err := PayloadToLobbyMembershipBlockedEvent(nil); return err }},
{"lobby race name registered", func() error { _, err := PayloadToLobbyRaceNameRegisteredEvent(nil); return err }},
{"lobby race name pending", func() error { _, err := PayloadToLobbyRaceNamePendingEvent(nil); return err }},
{"lobby race name expired", func() error { _, err := PayloadToLobbyRaceNameExpiredEvent(nil); return err }},
{"runtime image pull failed", func() error { _, err := PayloadToRuntimeImagePullFailedEvent(nil); return err }},
{"runtime container start failed", func() error { _, err := PayloadToRuntimeContainerStartFailedEvent(nil); return err }},
{"runtime start config invalid", func() error { _, err := PayloadToRuntimeStartConfigInvalidEvent(nil); return err }},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
if err := tt.call(); err == nil {
t.Fatal("expected error")
}
@@ -269,7 +218,7 @@ func TestNotificationPayloadDecodersRejectEmptyPayloads(t *testing.T) {
}
}
func TestNotificationPayloadEncodersRejectMissingRequiredStrings(t *testing.T) {
func TestNotificationPayloadEncodersRejectMissingUUIDs(t *testing.T) {
t.Parallel()
tests := []struct {
@@ -278,36 +227,29 @@ func TestNotificationPayloadEncodersRejectMissingRequiredStrings(t *testing.T) {
want string
}{
{
name: "game turn ready",
call: func() error {
_, err := GameTurnReadyEventToPayload(&GameTurnReadyEvent{})
return err
},
name: "lobby invite received game_id",
call: func() error { _, err := LobbyInviteReceivedEventToPayload(&LobbyInviteReceivedEvent{InviterUserID: testNotificationInviterID}); return err },
want: "game_id is empty",
},
{
name: "lobby application submitted",
call: func() error {
_, err := LobbyApplicationSubmittedEventToPayload(&LobbyApplicationSubmittedEvent{GameID: "game-1"})
return err
},
want: "applicant_user_id is empty",
},
{
name: "lobby invite created",
call: func() error {
_, err := LobbyInviteCreatedEventToPayload(&LobbyInviteCreatedEvent{GameID: "game-1"})
return err
},
name: "lobby invite received inviter",
call: func() error { _, err := LobbyInviteReceivedEventToPayload(&LobbyInviteReceivedEvent{GameID: testNotificationGameID}); return err },
want: "inviter_user_id is empty",
},
{
name: "lobby invite redeemed",
call: func() error {
_, err := LobbyInviteRedeemedEventToPayload(&LobbyInviteRedeemedEvent{GameID: "game-1"})
return err
},
want: "invitee_user_id is empty",
name: "lobby application submitted game_id",
call: func() error { _, err := LobbyApplicationSubmittedEventToPayload(&LobbyApplicationSubmittedEvent{ApplicationID: testNotificationApplicationID}); return err },
want: "game_id is empty",
},
{
name: "lobby application submitted application_id",
call: func() error { _, err := LobbyApplicationSubmittedEventToPayload(&LobbyApplicationSubmittedEvent{GameID: testNotificationGameID}); return err },
want: "application_id is empty",
},
{
name: "runtime image pull failed game_id",
call: func() error { _, err := RuntimeImagePullFailedEventToPayload(&RuntimeImagePullFailedEvent{ImageRef: "x"}); return err },
want: "game_id is empty",
},
}
@@ -315,7 +257,6 @@ func TestNotificationPayloadEncodersRejectMissingRequiredStrings(t *testing.T) {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
err := tt.call()
if err == nil {
t.Fatal("expected error")
@@ -327,7 +268,7 @@ func TestNotificationPayloadEncodersRejectMissingRequiredStrings(t *testing.T) {
}
}
func TestNotificationPayloadDecodersRejectMissingRequiredStrings(t *testing.T) {
func TestNotificationPayloadDecodersRejectMissingUUIDs(t *testing.T) {
t.Parallel()
tests := []struct {
@@ -337,70 +278,42 @@ func TestNotificationPayloadDecodersRejectMissingRequiredStrings(t *testing.T) {
want string
}{
{
name: "game turn ready",
name: "lobby invite received game_id",
payload: func() []byte {
builder := flatbuffers.NewBuilder(32)
notificationfbs.GameTurnReadyEventStart(builder)
offset := notificationfbs.GameTurnReadyEventEnd(builder)
notificationfbs.FinishGameTurnReadyEventBuffer(builder, offset)
notificationfbs.LobbyInviteReceivedEventStart(builder)
offset := notificationfbs.LobbyInviteReceivedEventEnd(builder)
notificationfbs.FinishLobbyInviteReceivedEventBuffer(builder, offset)
return builder.FinishedBytes()
},
decode: func(data []byte) error {
_, err := PayloadToGameTurnReadyEvent(data)
return err
},
want: "game_id is missing",
decode: func(data []byte) error { _, err := PayloadToLobbyInviteReceivedEvent(data); return err },
want: "game_id is missing",
},
{
name: "lobby application submitted",
name: "lobby invite received inviter",
payload: func() []byte {
builder := flatbuffers.NewBuilder(32)
notificationfbs.LobbyInviteReceivedEventStart(builder)
notificationfbs.LobbyInviteReceivedEventAddGameId(builder, commonfbs.CreateUUID(builder, 1, 2))
offset := notificationfbs.LobbyInviteReceivedEventEnd(builder)
notificationfbs.FinishLobbyInviteReceivedEventBuffer(builder, offset)
return builder.FinishedBytes()
},
decode: func(data []byte) error { _, err := PayloadToLobbyInviteReceivedEvent(data); return err },
want: "inviter_user_id is missing",
},
{
name: "lobby application submitted application_id",
payload: func() []byte {
builder := flatbuffers.NewBuilder(32)
gameID := builder.CreateString("game-1")
notificationfbs.LobbyApplicationSubmittedEventStart(builder)
notificationfbs.LobbyApplicationSubmittedEventAddGameId(builder, gameID)
notificationfbs.LobbyApplicationSubmittedEventAddGameId(builder, commonfbs.CreateUUID(builder, 1, 2))
offset := notificationfbs.LobbyApplicationSubmittedEventEnd(builder)
notificationfbs.FinishLobbyApplicationSubmittedEventBuffer(builder, offset)
return builder.FinishedBytes()
},
decode: func(data []byte) error {
_, err := PayloadToLobbyApplicationSubmittedEvent(data)
return err
},
want: "applicant_user_id is missing",
},
{
name: "lobby invite created",
payload: func() []byte {
builder := flatbuffers.NewBuilder(32)
gameID := builder.CreateString("game-1")
notificationfbs.LobbyInviteCreatedEventStart(builder)
notificationfbs.LobbyInviteCreatedEventAddGameId(builder, gameID)
offset := notificationfbs.LobbyInviteCreatedEventEnd(builder)
notificationfbs.FinishLobbyInviteCreatedEventBuffer(builder, offset)
return builder.FinishedBytes()
},
decode: func(data []byte) error {
_, err := PayloadToLobbyInviteCreatedEvent(data)
return err
},
want: "inviter_user_id is missing",
},
{
name: "lobby invite redeemed",
payload: func() []byte {
builder := flatbuffers.NewBuilder(32)
gameID := builder.CreateString("game-1")
notificationfbs.LobbyInviteRedeemedEventStart(builder)
notificationfbs.LobbyInviteRedeemedEventAddGameId(builder, gameID)
offset := notificationfbs.LobbyInviteRedeemedEventEnd(builder)
notificationfbs.FinishLobbyInviteRedeemedEventBuffer(builder, offset)
return builder.FinishedBytes()
},
decode: func(data []byte) error {
_, err := PayloadToLobbyInviteRedeemedEvent(data)
return err
},
want: "invitee_user_id is missing",
decode: func(data []byte) error { _, err := PayloadToLobbyApplicationSubmittedEvent(data); return err },
want: "application_id is missing",
},
}
@@ -408,7 +321,6 @@ func TestNotificationPayloadDecodersRejectMissingRequiredStrings(t *testing.T) {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
err := tt.decode(tt.payload())
if err == nil {
t.Fatal("expected error")