2026-06-17 23:13:08 +08:00

136 lines
4.7 KiB
Go

package service_test
import (
"context"
"testing"
"time"
roomv1 "hyapp.local/api/proto/room/v1"
"hyapp/pkg/appcode"
"hyapp/services/room-service/internal/integration"
roomservice "hyapp/services/room-service/internal/room/service"
"hyapp/services/room-service/internal/router"
"hyapp/services/room-service/internal/testutil/mysqltest"
)
func TestAdminCreateRobotRoomProjectsOwnerRegionAndCountry(t *testing.T) {
ctx := appcode.WithContext(context.Background(), appcode.Default)
repository := mysqltest.NewRepository(t)
svc := roomservice.New(roomservice.Config{
NodeID: "node-admin-robot-room-owner-region-country-test",
LeaseTTL: 10 * time.Second,
RankLimit: 20,
SnapshotEveryN: 1,
}, router.NewMemoryDirectory(), repository, followTestWallet{}, integration.NewNoopRoomEventPublisher(), integration.NewNoopOutboxPublisher())
resp, err := svc.AdminCreateRobotRoom(ctx, &roomv1.AdminCreateRobotRoomRequest{
Meta: roomservice.NewRequestMeta("", 9001),
OwnerRobotUserId: 325379237278126080,
CandidateRobotUserIds: []int64{325379237278126080},
MinRobotCount: 1,
MaxRobotCount: 1,
RoomName: "Robot Owner",
RoomAvatar: testRoomCoverURL,
VisibleRegionId: 686,
OwnerCountryCode: "ae",
GiftRule: &roomv1.AdminRobotRoomGiftRule{
GiftIds: []string{"84"},
LuckyGiftIds: []string{"28"},
NormalGiftIntervalMs: 10000,
LuckyComboMin: 100,
LuckyComboMax: 10000,
LuckyPauseMinMs: 5000,
LuckyPauseMaxMs: 20000,
},
AdminId: 9001,
})
if err != nil {
t.Fatalf("AdminCreateRobotRoom failed: %v", err)
}
roomID := resp.GetRoom().GetRoomId()
if roomID == "" {
t.Fatalf("created robot room id is empty")
}
entries, err := repository.ListRoomListEntries(ctx, roomservice.RoomListQuery{VisibleRegionID: 686, CountryCode: "AE", Tab: "new", Limit: 10})
if err != nil {
t.Fatalf("list robot room entries failed: %v", err)
}
if len(entries) != 1 || entries[0].RoomID != roomID || entries[0].VisibleRegionID != 686 || entries[0].OwnerCountryCode != "AE" {
t.Fatalf("robot room owner region/country projection mismatch: %+v", entries)
}
}
func TestAdminCreateRobotRoomUsesCandidatePoolAndActiveCount(t *testing.T) {
ctx := appcode.WithContext(context.Background(), appcode.Default)
repository := mysqltest.NewRepository(t)
svc := roomservice.New(roomservice.Config{
NodeID: "node-admin-robot-room-pool-test",
LeaseTTL: 10 * time.Second,
RankLimit: 20,
SnapshotEveryN: 1,
}, router.NewMemoryDirectory(), repository, followTestWallet{}, integration.NewNoopRoomEventPublisher(), integration.NewNoopOutboxPublisher())
resp, err := svc.AdminCreateRobotRoom(ctx, &roomv1.AdminCreateRobotRoomRequest{
Meta: roomservice.NewRequestMeta("", 9001),
OwnerRobotUserId: 1001,
CandidateRobotUserIds: []int64{1001, 1002, 1003, 1004},
MinRobotCount: 2,
MaxRobotCount: 2,
RoomName: "Robot Pool",
RoomAvatar: testRoomCoverURL,
VisibleRegionId: 686,
OwnerCountryCode: "ae",
GiftRule: &roomv1.AdminRobotRoomGiftRule{
GiftIds: []string{"84"},
LuckyGiftIds: []string{"28"},
NormalGiftIntervalMs: 10000,
LuckyComboMin: 1,
LuckyComboMax: 1,
LuckyPauseMinMs: 5000,
LuckyPauseMaxMs: 20000,
RobotStayMinMs: 180000,
RobotStayMaxMs: 600000,
RobotReplaceMinMs: 0,
RobotReplaceMaxMs: 60000,
MaxGiftSenders: 2,
},
AdminId: 9001,
})
if err != nil {
t.Fatalf("AdminCreateRobotRoom failed: %v", err)
}
roomID := resp.GetRoom().GetRoomId()
if got := len(resp.GetRoom().GetRobotUserIds()); got != 4 {
t.Fatalf("robot room should persist full candidate pool for replacement, got %d", got)
}
if resp.GetRoom().GetGiftRule().GetMaxGiftSenders() != 2 {
t.Fatalf("max gift senders should round-trip through room config")
}
snapshot, err := svc.GetRoomSnapshot(ctx, &roomv1.GetRoomSnapshotRequest{
Meta: &roomv1.RequestMeta{AppCode: appcode.Default, RoomId: roomID},
RoomId: roomID,
ViewerUserId: 1001,
})
if err != nil {
t.Fatalf("snapshot failed: %v", err)
}
if got := len(snapshot.GetRoom().GetOnlineUsers()); got != 2 {
t.Fatalf("robot room should only bootstrap active robot count online, got %d", got)
}
if got := occupiedSeatUserCount(snapshot.GetRoom()); got != 2 {
t.Fatalf("robot room should only put active robots on virtual mic, got %d", got)
}
}
func occupiedSeatUserCount(snapshot *roomv1.RoomSnapshot) int {
count := 0
for _, seat := range snapshot.GetMicSeats() {
if seat.GetUserId() > 0 {
count++
}
}
return count
}