yumi-golang/internal/service/luckygift/reward_event_test.go
2026-04-22 19:57:28 +08:00

110 lines
2.9 KiB
Go

package luckygift
import (
"chatapp3-golang/internal/config"
"context"
"encoding/json"
"testing"
"github.com/alicebob/miniredis/v2"
"github.com/redis/go-redis/v9"
)
func TestPublishRewardEventWritesWinningResultsToStream(t *testing.T) {
mr, err := miniredis.Run()
if err != nil {
t.Fatalf("miniredis run failed: %v", err)
}
defer mr.Close()
client := redis.NewClient(&redis.Options{Addr: mr.Addr()})
defer client.Close()
service := &LuckyGiftService{
cfg: config.Config{
LuckyGift: config.LuckyGiftConfig{
RewardStreamKey: "lucky-gift:reward",
},
},
repo: luckyGiftPorts{Redis: client},
}
req := LuckyGiftDrawRequest{
BusinessID: "biz-1001",
SysOrigin: "LIKEI",
RoomID: 2001,
SendUserID: 3001,
GiftID: 4001,
GiftPrice: 500,
GiftNum: 2,
}
results := []LuckyGiftDrawResult{
{ID: "order-a", AcceptUserID: 9001, RewardNum: 88},
{ID: "order-b", AcceptUserID: 9002, RewardNum: 0},
}
if err := service.publishRewardEvent(context.Background(), req, results, 88); err != nil {
t.Fatalf("publishRewardEvent returned error: %v", err)
}
streams, err := client.XRange(context.Background(), "lucky-gift:reward", "-", "+").Result()
if err != nil {
t.Fatalf("xrange returned error: %v", err)
}
if len(streams) != 1 {
t.Fatalf("expected 1 stream record, got %d", len(streams))
}
payloadRaw, ok := streams[0].Values["payload"].(string)
if !ok || payloadRaw == "" {
t.Fatalf("expected payload field, got %#v", streams[0].Values["payload"])
}
var event LuckyGiftRewardDispatchEvent
if err := json.Unmarshal([]byte(payloadRaw), &event); err != nil {
t.Fatalf("unmarshal payload failed: %v", err)
}
if event.EventID != "LUCKY_GIFT_REWARD:biz-1001" {
t.Fatalf("unexpected event id: %s", event.EventID)
}
if len(event.Results) != 1 {
t.Fatalf("expected only winning results to be published, got %d", len(event.Results))
}
if event.Results[0].OrderSeed != "order-a" || event.Results[0].AcceptUserID != 9001 || event.Results[0].RewardNum != 88 {
t.Fatalf("unexpected winning result payload: %+v", event.Results[0])
}
}
func TestPublishRewardEventSkipsZeroRewardTotal(t *testing.T) {
mr, err := miniredis.Run()
if err != nil {
t.Fatalf("miniredis run failed: %v", err)
}
defer mr.Close()
client := redis.NewClient(&redis.Options{Addr: mr.Addr()})
defer client.Close()
service := &LuckyGiftService{
cfg: config.Config{
LuckyGift: config.LuckyGiftConfig{
RewardStreamKey: "lucky-gift:reward",
},
},
repo: luckyGiftPorts{Redis: client},
}
if err := service.publishRewardEvent(context.Background(), LuckyGiftDrawRequest{BusinessID: "biz-1002"}, nil, 0); err != nil {
t.Fatalf("publishRewardEvent returned error: %v", err)
}
streams, err := client.XRange(context.Background(), "lucky-gift:reward", "-", "+").Result()
if err != nil {
t.Fatalf("xrange returned error: %v", err)
}
if len(streams) != 0 {
t.Fatalf("expected no stream records for zero reward total, got %d", len(streams))
}
}