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)) } }