99 lines
3.0 KiB
Go
99 lines
3.0 KiB
Go
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)
|
|
}
|
|
}
|