110 lines
2.9 KiB
Go
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))
|
|
}
|
|
}
|