package main import ( "context" "strings" "testing" "github.com/descrybe/descrybe-v2/apps/api/internal/billing" ) func TestDecideAssignMissingPlanSkipsA1(t *testing.T) { t.Parallel() mutate, reason := decideAssignMissingPlan(true, billing.A1LegacyCompanyID, "Anything") if mutate || reason != "a1_cohort" { t.Fatalf("A1 legacy id must never assign (even with -confirm): mutate=%v reason=%q", mutate, reason) } mutate, reason = decideAssignMissingPlan(true, "other-legacy-id", "A1 Slovenija") if !mutate || reason != "" { t.Fatalf("display name alone must not skip assign: mutate=%v reason=%q", mutate, reason) } mutate, reason = decideAssignMissingPlan(false, billing.A1LegacyCompanyID, "A1") if mutate || reason != "" { t.Fatalf("list-only: mutate=%v reason=%q", mutate, reason) } } func TestResolveFallbackPlanIDEmpty(t *testing.T) { t.Parallel() id, err := resolveFallbackPlanID(context.Background(), nil, " ") if err != nil { t.Fatal(err) } if id != 0 { t.Fatalf("got %d, want 0", id) } } func TestNormalizeAssignPlanName(t *testing.T) { t.Parallel() got, err := normalizeAssignPlanName(" Free ", true) if err != nil { t.Fatal(err) } if got != "Free" { t.Fatalf("got %q", got) } _, err = normalizeAssignPlanName(" ", true) if err == nil || !strings.Contains(err.Error(), "-plan-name") { t.Fatalf("expected plan-name error, got %v", err) } got, err = normalizeAssignPlanName(" ", false) if err != nil { t.Fatal(err) } if got != "" { t.Fatalf("list-only allows empty plan name, got %q", got) } } func TestGuardLiveAssign(t *testing.T) { t.Parallel() if err := guardLiveAssign(false, false, false); err != nil { t.Fatalf("list-only: %v", err) } if err := guardLiveAssign(true, true, false); err != nil { t.Fatalf("dry-run: %v", err) } if err := guardLiveAssign(true, false, true); err != nil { t.Fatalf("confirm: %v", err) } err := guardLiveAssign(true, false, false) if err == nil || !strings.Contains(err.Error(), "no blind live writes") { t.Fatalf("expected blind-assign refusal, got %v", err) } }