Files
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

109 lines
3.0 KiB
Go

package vipcardexperimentser
import (
"strings"
"testing"
"time"
"91porn-server/models/v/prdcthsomod"
"91porn-server/models/v/rchgordmod"
"91porn-server/models/v/vipcardexperimentmod"
"go.mongodb.org/mongo-driver/bson/primitive"
)
func TestValidatePublicationWindow(t *testing.T) {
now := time.Now()
future := now.Add(2 * time.Minute)
if err := validatePublicationWindow(
&vipcardexperimentmod.Experiment{StartAt: &future},
now,
); err == nil {
t.Fatal("expected future startAt to fail")
}
past := now.Add(-time.Minute)
if err := validatePublicationWindow(
&vipcardexperimentmod.Experiment{EndAt: &past},
now,
); err == nil {
t.Fatal("expected expired endAt to fail")
}
end := now.Add(time.Hour)
if err := validatePublicationWindow(
&vipcardexperimentmod.Experiment{EndAt: &end},
now,
); err != nil {
t.Fatalf("valid publication window failed: %v", err)
}
}
func TestMergeOrderStatisticsAddsGoldPurchases(t *testing.T) {
sharedProductID := primitive.NewObjectID()
goldOnlyProductID := primitive.NewObjectID()
result := mergeOrderStatistics(
[]rchgordmod.VIPExperimentOrderStat{{
Variant: vipcardexperimentmod.VariantA,
ProductID: sharedProductID,
CreatedOrders: 2,
PaidOrders: 1,
PaidAmount: 1000,
}},
[]prdcthsomod.VIPExperimentGoldOrderStat{
{
Variant: vipcardexperimentmod.VariantA,
ProductID: sharedProductID,
GoldPaidOrders: 3,
GoldPaidAmount: 600,
},
{
Variant: vipcardexperimentmod.VariantB,
ProductID: goldOnlyProductID,
GoldPaidOrders: 1,
GoldPaidAmount: 200,
},
},
)
if len(result) != 2 {
t.Fatalf("merged order count = %d, want 2", len(result))
}
if result[0].PaidOrders != 1 || result[0].PaidAmount != 1000 ||
result[0].GoldPaidOrders != 3 || result[0].GoldPaidAmount != 600 {
t.Fatalf("merged shared product stats = %#v", result[0])
}
if result[1].Variant != vipcardexperimentmod.VariantB ||
result[1].ProductID != goldOnlyProductID ||
result[1].GoldPaidOrders != 1 || result[1].GoldPaidAmount != 200 {
t.Fatalf("gold-only product stats = %#v", result[1])
}
}
func TestPublishRejectsInvalidUIConfigBeforeDatabaseAccess(t *testing.T) {
productID := primitive.NewObjectID()
experiment := &vipcardexperimentmod.Experiment{
ExperimentID: "invalid-ui-config",
TrafficA: 50,
TrafficB: 50,
VariantA: vipcardexperimentmod.VariantConfig{
DefaultProductID: productID,
ProductIDs: []primitive.ObjectID{productID},
UIConfig: &vipcardexperimentmod.UIConfig{
BadgeStyles: []vipcardexperimentmod.BadgeStyle{{
BadgeType: vipcardexperimentmod.BadgeMostPopular,
BackgroundColor: "#FFF",
TextColor: "#FFFFFF",
}},
},
},
VariantB: vipcardexperimentmod.VariantConfig{
DefaultProductID: productID,
ProductIDs: []primitive.ObjectID{productID},
},
}
err := Publish(experiment, "tester")
if err == nil || !strings.Contains(err.Error(), "variantA.uiConfig") {
t.Fatalf("Publish() error = %v, want variantA.uiConfig error", err)
}
}