69 lines
2.3 KiB
Go

package roomnotice
import (
"context"
"regexp"
"testing"
"github.com/DATA-DOG/go-sqlmock"
"google.golang.org/protobuf/proto"
roomeventsv1 "hyapp.local/api/proto/events/room/v1"
)
func TestLoadRoomOutboxEnvelopeRejectsEmptyAppInsteadOfDefaultingToLalu(t *testing.T) {
db, mock, err := sqlmock.New()
if err != nil {
t.Fatalf("create sqlmock: %v", err)
}
defer db.Close()
repository := &MySQLRepository{db: db, roomOutboxTable: "`hyapp_room`.`room_outbox`"}
if _, err := repository.LoadRoomOutboxEnvelope(context.Background(), "", "evt-1"); err == nil {
t.Fatal("empty app_code must be rejected before owner table access")
}
if err := mock.ExpectationsWereMet(); err != nil {
t.Fatalf("empty key unexpectedly queried room owner table: %v", err)
}
}
func TestLoadRoomOutboxEnvelopeUsesExactImmutableOwnerEnvelope(t *testing.T) {
db, mock, err := sqlmock.New()
if err != nil {
t.Fatalf("create sqlmock: %v", err)
}
defer db.Close()
body, err := proto.Marshal(&roomeventsv1.RoomUserKicked{ActorUserId: 7, TargetUserId: 42})
if err != nil {
t.Fatalf("marshal room kick body: %v", err)
}
envelopeBytes, err := proto.Marshal(&roomeventsv1.EventEnvelope{
AppCode: "huwaa",
EventId: "room:kick:evt-1",
EventType: eventRoomUserKicked,
RoomId: "room-1",
RoomVersion: 9,
OccurredAtMs: 1700000000000,
Body: body,
})
if err != nil {
t.Fatalf("marshal room envelope: %v", err)
}
repository := &MySQLRepository{db: db, roomOutboxTable: "`hyapp_room`.`room_outbox`"}
mock.ExpectQuery(regexp.QuoteMeta(`
SELECT room_id, envelope
FROM `+"`hyapp_room`.`room_outbox`"+`
WHERE app_code = ? AND event_id = ? AND event_type = ?`)).
WithArgs("huwaa", "room:kick:evt-1", eventRoomUserKicked).
WillReturnRows(sqlmock.NewRows([]string{"room_id", "envelope"}).AddRow("room-1", envelopeBytes))
envelope, err := repository.LoadRoomOutboxEnvelope(context.Background(), " HUWAA ", "room:kick:evt-1")
if err != nil {
t.Fatalf("load exact room owner envelope: %v", err)
}
if envelope.GetAppCode() != "huwaa" || envelope.GetEventId() != "room:kick:evt-1" || envelope.GetRoomId() != "room-1" {
t.Fatalf("room owner snapshot mismatch: %+v", envelope)
}
if err := mock.ExpectationsWereMet(); err != nil {
t.Fatalf("room replay query mismatch: %v", err)
}
}