Files
zarinpal-analytics-backend/internal/eventcatalog/impactful_catalog_test.go

120 lines
3.5 KiB
Go

package eventcatalog
import (
"encoding/json"
"os"
"strings"
"testing"
"time"
)
func TestImpactfulBusinessCatalogIsValidAndIndustryPersonalized(t *testing.T) {
data, err := os.ReadFile("../../catalogs/impactful-business-events-1405-v2.json")
if err != nil {
t.Fatal(err)
}
var input Import
if err := json.Unmarshal(data, &input); err != nil {
t.Fatal(err)
}
if err := ValidateImport(input, 1405); err != nil {
t.Fatal(err)
}
hasEducation, hasRetail := false, false
months := make(map[time.Month]bool)
for _, event := range input.Events {
if event.OfficialHoliday && event.RelevanceBPS < 7000 {
t.Fatalf("official holiday %s lacks evidenced business impact", event.ID)
}
for _, category := range event.MerchantCategories {
hasEducation = hasEducation || category == "مراکز آموزشی مجازی"
hasRetail = hasRetail || category == "کیف و کفش فروشی"
}
start, err := time.Parse(time.DateOnly, event.StartDate)
if err != nil {
t.Fatal(err)
}
months[start.Month()] = true
}
if !hasEducation || !hasRetail {
t.Fatal("catalog must include both education- and retail-specific windows")
}
if len(input.Events) < 12 || len(months) < 9 {
t.Fatalf("catalog must provide year-round candidate coverage; got %d events across %d months", len(input.Events), len(months))
}
}
func TestImpactfulBusinessCatalogLinksExactHistoricalOccurrences(t *testing.T) {
data, err := os.ReadFile("../../catalogs/impactful-business-events-1405-v2.json")
if err != nil {
t.Fatal(err)
}
var input Import
if err := json.Unmarshal(data, &input); err != nil {
t.Fatal(err)
}
required := []struct {
occasionKey string
variant string
}{
{"education-enrollment", "CAMPAIGN_WINDOW"},
{"black-friday", "PRIMARY"},
{"cyber-monday", "PRIMARY"},
{"yalda", "CAMPAIGN_WINDOW"},
{"nowruz", "CAMPAIGN_WINDOW"},
{"nowruz", "OPERATIONAL_WINDOW"},
}
for _, identity := range required {
years := make(map[int]bool)
for _, event := range input.Events {
if event.OccasionKey == identity.occasionKey && event.Variant == identity.variant {
years[event.JalaliYear] = true
}
}
for year := 1402; year <= 1405; year++ {
if !years[year] {
t.Errorf("%s/%s lacks occurrence for %d", identity.occasionKey, identity.variant, year)
}
}
}
}
func TestImpactfulBusinessCatalogDoesNotMislabelGregorian2027AsJalali1406(t *testing.T) {
data, err := os.ReadFile("../../catalogs/impactful-business-events-1405-v2.json")
if err != nil {
t.Fatal(err)
}
var input Import
if err := json.Unmarshal(data, &input); err != nil {
t.Fatal(err)
}
for _, event := range input.Events {
if (event.OccasionKey == "ramadan" || event.OccasionKey == "eid-al-fitr") && event.JalaliYear == 1406 {
t.Errorf("%s is before Nowruz 1406 and must not be labeled as Jalali 1406", event.ID)
}
}
}
func TestImpactfulBusinessCatalogAttributesCustomWindowsToInternalPolicy(t *testing.T) {
data, err := os.ReadFile("../../catalogs/impactful-business-events-1405-v2.json")
if err != nil {
t.Fatal(err)
}
var input Import
if err := json.Unmarshal(data, &input); err != nil {
t.Fatal(err)
}
customWindows := map[string]bool{
"education-enrollment": true,
"yalda": true,
"nowruz": true,
"ramadan": true,
}
for _, event := range input.Events {
if event.Variant == "CAMPAIGN_WINDOW" && customWindows[event.OccasionKey] && !strings.HasPrefix(event.SourceURI, "urn:zarinpal:event-window-policy:") {
t.Errorf("%s custom window must cite the internal derivation policy, got %q", event.ID, event.SourceURI)
}
}
}