fix(growth): validate reviewed event catalog
This commit is contained in:
60
internal/growth/catalog_test.go
Normal file
60
internal/growth/catalog_test.go
Normal file
@@ -0,0 +1,60 @@
|
||||
package growth
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestCatalog1405IsValidAndDefensivelyCopied(t *testing.T) {
|
||||
first := Catalog1405()
|
||||
if err := ValidateCatalog(first); err != nil {
|
||||
t.Fatalf("catalog should be valid: %v", err)
|
||||
}
|
||||
first[0].Tags[0] = "mutated"
|
||||
second := Catalog1405()
|
||||
if second[0].Tags[0] == "mutated" {
|
||||
t.Fatal("catalog tags escaped through a shared backing array")
|
||||
}
|
||||
}
|
||||
|
||||
func TestValidateCatalogRejectsDuplicateAndIncompleteEvents(t *testing.T) {
|
||||
event := catalogEvent("duplicate", "رویداد", "2026-01-01", "2026-01-01", "family", EventOfficial, []string{"tag"})
|
||||
if err := ValidateCatalog([]Event{event, event}); err == nil {
|
||||
t.Fatal("expected duplicate id error")
|
||||
}
|
||||
event.Source = ""
|
||||
if err := ValidateCatalog([]Event{event}); err == nil {
|
||||
t.Fatal("expected missing source error")
|
||||
}
|
||||
}
|
||||
|
||||
func TestAnalyzeEventEffectExcludesCatalogEventsFromBaseline(t *testing.T) {
|
||||
target := Event{ID: "target", StartDate: date("2026-05-02"), EndDate: date("2026-05-02")}
|
||||
excluded := Event{ID: "other", StartDate: target.StartDate.AddDate(0, 0, -7), EndDate: target.StartDate.AddDate(0, 0, -7)}
|
||||
history := make([]DailyPoint, 0, 9)
|
||||
for week := 1; week <= 8; week++ {
|
||||
count := int64(30)
|
||||
if week == 1 {
|
||||
count = 1_000
|
||||
}
|
||||
history = append(history, DailyPoint{Date: target.StartDate.AddDate(0, 0, -7*week), SessionCount: count, PaidSessionCount: count, PaidAmountRial: count * 100})
|
||||
}
|
||||
history = append(history, DailyPoint{Date: target.StartDate, SessionCount: 50, PaidSessionCount: 50, PaidAmountRial: 5_000})
|
||||
effect := AnalyzeEventEffect(history, target, []Event{excluded})
|
||||
if effect.ObservationCount != 7 || effect.BaselineSessionCount != 30 || !effect.MaterialWin {
|
||||
t.Fatalf("catalog event polluted baseline: %+v", effect)
|
||||
}
|
||||
}
|
||||
|
||||
func TestForecastSuppressesPoorBacktest(t *testing.T) {
|
||||
start := date("2026-07-01")
|
||||
history := make([]DailyPoint, 0, 90)
|
||||
for i := 90; i > 0; i-- {
|
||||
value := int64(100)
|
||||
if i%2 == 0 {
|
||||
value = 1_000
|
||||
}
|
||||
history = append(history, DailyPoint{Date: start.AddDate(0, 0, -i), SessionCount: value, PaidSessionCount: value, PaidAmountRial: value * 1_000})
|
||||
}
|
||||
forecast := BuildForecast(history, nil, start, 90)
|
||||
if forecast.Confidence != ConfidenceInsufficientData || len(forecast.Points) != 0 {
|
||||
t.Fatalf("poor model should be suppressed: %+v", forecast)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user