hyapp-server/pkg/roommq/messages_test.go
2026-07-12 00:47:20 +08:00

112 lines
3.3 KiB
Go

package roommq
import (
"strings"
"testing"
"google.golang.org/protobuf/proto"
roomeventsv1 "hyapp.local/api/proto/events/room/v1"
)
func TestRoomOutboxMessageRoundTrip(t *testing.T) {
body, err := proto.Marshal(&roomeventsv1.RoomRocketIgnited{RocketId: "rocket-1", Level: 2, LaunchAtMs: 12345})
if err != nil {
t.Fatalf("marshal body: %v", err)
}
envelope := &roomeventsv1.EventEnvelope{
AppCode: "default",
EventId: "evt-1",
EventType: "RoomRocketIgnited",
RoomId: "room-1",
RoomVersion: 9,
OccurredAtMs: 12300,
Body: body,
}
encoded, err := EncodeRoomOutboxMessage(envelope)
if err != nil {
t.Fatalf("encode: %v", err)
}
decoded, message, err := DecodeRoomOutboxMessage(encoded)
if err != nil {
t.Fatalf("decode: %v", err)
}
if message.MessageType != MessageTypeRoomOutboxEvent || decoded.GetEventId() != envelope.GetEventId() {
t.Fatalf("unexpected decoded message: %#v %#v", message, decoded)
}
}
func TestRoomEventTypeTagUsesExactTrimmedEventType(t *testing.T) {
tag, err := EventTypeTag(" RoomGiftSent ")
if err != nil {
t.Fatalf("EventTypeTag failed: %v", err)
}
if tag != EventTypeRoomGiftSent {
t.Fatalf("event tag = %q, want %q", tag, EventTypeRoomGiftSent)
}
for _, invalid := range []string{"", TagRoomOutboxEvent, "Room GiftSent", "RoomGiftSent || *", "Room.GiftSent"} {
if _, err := EventTypeTag(invalid); err == nil {
t.Fatalf("EventTypeTag(%q) unexpectedly succeeded", invalid)
}
}
}
func TestRoomLegacyCompatibleTagExpressionIsDeterministicAndDeduplicated(t *testing.T) {
first, err := LegacyCompatibleTagExpression(
EventTypeRoomUserJoined,
EventTypeRoomGiftSent,
EventTypeRoomUserJoined,
)
if err != nil {
t.Fatalf("LegacyCompatibleTagExpression failed: %v", err)
}
second, err := LegacyCompatibleTagExpression(EventTypeRoomGiftSent, EventTypeRoomUserJoined)
if err != nil {
t.Fatalf("LegacyCompatibleTagExpression failed: %v", err)
}
if first != second {
t.Fatalf("expressions differ by input order: first=%q second=%q", first, second)
}
want := TagRoomOutboxEvent + " || " + EventTypeRoomGiftSent + " || " + EventTypeRoomUserJoined
if first != want {
t.Fatalf("expression = %q, want %q", first, want)
}
if strings.Count(first, EventTypeRoomUserJoined) != 1 {
t.Fatalf("typed tag was not deduplicated: %q", first)
}
}
func TestRoomLegacyCompatibleTagExpressionRejectsUnsafeOrMissingTypedTags(t *testing.T) {
for _, eventTypes := range [][]string{
nil,
{TagRoomOutboxEvent},
{"RoomGiftSent || *"},
} {
if _, err := LegacyCompatibleTagExpression(eventTypes...); err == nil {
t.Fatalf("LegacyCompatibleTagExpression(%v) unexpectedly succeeded", eventTypes)
}
}
}
func TestRoomRocketLaunchDueRoundTrip(t *testing.T) {
encoded, err := EncodeRoomRocketLaunchDueMessage(RoomRocketLaunchDueMessage{
AppCode: "default",
RoomID: "room-1",
RocketID: "rocket-1",
Level: 1,
LaunchAtMS: 12345,
ResetAtMS: 99999,
CommandID: "cmd_room_rocket_launch_rocket-1",
})
if err != nil {
t.Fatalf("encode: %v", err)
}
decoded, err := DecodeRoomRocketLaunchDueMessage(encoded)
if err != nil {
t.Fatalf("decode: %v", err)
}
if decoded.MessageType != MessageTypeRoomRocketLaunchDue || decoded.RocketID != "rocket-1" || decoded.LaunchAtMS != 12345 {
t.Fatalf("unexpected decoded message: %#v", decoded)
}
}