109 lines
3.0 KiB
Go
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)
|
|
}
|
|
}
|