96 lines
3.1 KiB
Go

package service_test
import (
"context"
"encoding/json"
"testing"
"time"
roomv1 "hyapp.local/api/proto/room/v1"
walletv1 "hyapp.local/api/proto/wallet/v1"
"hyapp/pkg/appcode"
roomservice "hyapp/services/room-service/internal/room/service"
"hyapp/services/room-service/internal/testutil/mysqltest"
)
func TestListRoomOnlineUsersReturnsOwnerAdminRoleAndGiftValue(t *testing.T) {
ctx := context.Background()
repository := mysqltest.NewRepository(t)
wallet := &treasureTestWallet{debits: []*walletv1.DebitGiftResponse{{
BillingReceiptId: "receipt-online-users",
CoinSpent: 321,
GiftPointAdded: 321,
HeatValue: 321,
GiftTypeCode: "normal",
}}}
now := &fixedRoomTreasureClock{now: time.Date(2026, 5, 27, 12, 0, 0, 0, time.UTC)}
svc := newTreasureTestService(t, repository, wallet, now)
roomID := "room-online-users"
ownerID := int64(1001)
adminID := int64(1002)
normalID := int64(1003)
createTreasureRoom(t, ctx, svc, roomID, ownerID, 9001)
joinTreasureRoom(t, ctx, svc, roomID, adminID)
joinTreasureRoom(t, ctx, svc, roomID, normalID)
if _, err := svc.SetRoomAdmin(ctx, &roomv1.SetRoomAdminRequest{
Meta: roomservice.NewRequestMeta(roomID, ownerID),
TargetUserId: adminID,
Enabled: true,
}); err != nil {
t.Fatalf("set admin failed: %v", err)
}
if _, err := svc.SetRoomAdmin(ctx, &roomv1.SetRoomAdminRequest{
Meta: roomservice.NewRequestMeta(roomID, ownerID),
TargetUserId: ownerID,
Enabled: true,
}); err == nil {
t.Fatalf("setting owner as admin must fail")
}
if _, err := svc.SendGift(ctx, &roomv1.SendGiftRequest{
Meta: treasureMeta(roomID, adminID, "online-users-gift"),
TargetType: "user",
TargetUserId: ownerID,
GiftId: "gift-online-users",
GiftCount: 1,
}); err != nil {
t.Fatalf("send gift failed: %v", err)
}
resp, err := svc.ListRoomOnlineUsers(ctx, &roomv1.ListRoomOnlineUsersRequest{
Meta: &roomv1.RequestMeta{AppCode: appcode.Default, RoomId: roomID},
RoomId: roomID,
ViewerUserId: ownerID,
Page: 1,
PageSize: 10,
Sort: "gift_value",
})
if err != nil {
t.Fatalf("list online users failed: %v", err)
}
if len(resp.GetItems()) != 3 {
t.Fatalf("expected three online users, got %+v", resp.GetItems())
}
byID := make(map[int64]*roomv1.RoomOnlineUser, len(resp.GetItems()))
for _, item := range resp.GetItems() {
byID[item.GetUserId()] = item
}
if owner := byID[ownerID]; owner == nil || !owner.GetIsOwner() || owner.GetRoomRole() != "normal" {
t.Fatalf("owner must be is_owner=true and room_role=normal: %+v", owner)
}
if admin := byID[adminID]; admin == nil || admin.GetIsOwner() || admin.GetRoomRole() != "admin" || admin.GetGiftValue() != 321 {
t.Fatalf("admin gift value or role mismatch: %+v", admin)
}
if normal := byID[normalID]; normal == nil || normal.GetIsOwner() || normal.GetRoomRole() != "normal" || normal.GetGiftValue() != 0 {
t.Fatalf("normal user mismatch: %+v", normal)
}
payload, err := json.Marshal(resp.GetItems())
if err != nil {
t.Fatalf("marshal online users failed: %v", err)
}
t.Logf("online users response items: %s", payload)
}