package livechat import ( "context" "fmt" "testing" "github.com/glebarez/sqlite" "gorm.io/gorm" biz "kra/internal/biz/livechat" ) type testProvider struct{ db *gorm.DB } func (p testProvider) DB() *gorm.DB { return p.db } func openChatTestDB(t *testing.T) *gorm.DB { t.Helper() db, err := gorm.Open(sqlite.Open("file:"+t.Name()+"?mode=memory&cache=shared"), &gorm.Config{}) if err != nil { t.Fatal(err) } for _, statement := range []string{ `CREATE TABLE live_rooms (id integer primary key, enabled numeric, deleted_at datetime)`, `CREATE TABLE sys_users (id integer primary key, username text, nick_name text, header_img text, enable integer, deleted_at datetime)`, `INSERT INTO live_rooms(id,enabled) VALUES (7,1)`, `INSERT INTO sys_users(id,username,nick_name,header_img,enable) VALUES (3,'viewer','Viewer','avatar.png',1)`, } { if err = db.Exec(statement).Error; err != nil { t.Fatal(err) } } return db } func TestChatHistoryIsProcessLocalNotPersisted(t *testing.T) { db := openChatTestDB(t) first := NewRepo(testProvider{db: db}) if _, err := first.CreateChat(context.Background(), 7, 3, "current session"); err != nil { t.Fatal(err) } second := NewRepo(testProvider{db: db}) items, err := second.ListRecent(context.Background(), 7, 100) if err != nil { t.Fatal(err) } if len(items) != 0 { t.Fatalf("chat leaked across runtime sessions: %+v", items) } } func TestChatKeepsLatestHundredMessages(t *testing.T) { db := openChatTestDB(t) repo := NewRepo(testProvider{db: db}) for index := 1; index <= 105; index++ { if _, err := repo.CreateChat(context.Background(), 7, 3, fmt.Sprintf("message-%03d", index)); err != nil { t.Fatal(err) } } items, err := repo.ListRecent(context.Background(), 7, 100) if err != nil { t.Fatal(err) } if len(items) != 100 || items[0].Content != "message-006" || items[99].Content != "message-105" { t.Fatalf("history length=%d first=%q last=%q", len(items), items[0].Content, items[len(items)-1].Content) } } func TestGiftMessageUsesSnapshotAndUserAvatar(t *testing.T) { db := openChatTestDB(t) repo := NewRepo(testProvider{db: db}) item, err := repo.CreateGift(context.Background(), &biz.GiftSnapshot{RoomID: 7, UserID: 3, Username: "viewer", Nickname: "Viewer", GiftID: 8, GiftName: "Star", GiftIcon: "star.png", Quantity: 10, DiamondTotal: 50}) if err != nil { t.Fatal(err) } if item.Type != biz.TypeGift || item.Avatar != "avatar.png" || item.GiftName != "Star" || item.Quantity != 10 || item.DiamondTotal != 50 { t.Fatalf("gift message = %+v", item) } } func TestClearDropsRoomMessagesWhenBroadcastEnds(t *testing.T) { db := openChatTestDB(t) repo := NewRepo(testProvider{db: db}) if _, err := repo.CreateChat(context.Background(), 7, 3, "before close"); err != nil { t.Fatal(err) } if err := repo.Clear(context.Background(), 7); err != nil { t.Fatal(err) } items, err := repo.ListRecent(context.Background(), 7, 100) if err != nil { t.Fatal(err) } if len(items) != 0 { t.Fatalf("messages remained after room close: %+v", items) } }