package app import ( "os" "path/filepath" "strings" "testing" ) func TestResolveCampaignConfigPathExplicitWins(t *testing.T) { explicit := filepath.Join(t.TempDir(), "custom-campaign.yml") got, err := resolveCampaignConfigPathWithCandidates(explicit, []string{filepath.Join(t.TempDir(), "campaign.yml")}) if err != nil { t.Fatalf("resolveCampaignConfigPathWithCandidates() error = %v", err) } if got != explicit { t.Fatalf("path = %q, want explicit path %q", got, explicit) } } func TestResolveCampaignConfigPathUsesFirstExistingDefault(t *testing.T) { dir := t.TempDir() missing := filepath.Join(dir, "missing.yml") found := filepath.Join(dir, "campaign.yml") if err := os.WriteFile(found, []byte("campaign: sample-campaign\n"), 0o644); err != nil { t.Fatalf("write campaign.yml: %v", err) } got, err := resolveCampaignConfigPathWithCandidates("", []string{missing, found}) if err != nil { t.Fatalf("resolveCampaignConfigPathWithCandidates() error = %v", err) } if got != filepath.Clean(found) { t.Fatalf("path = %q, want %q", got, filepath.Clean(found)) } } func TestResolveCampaignConfigPathErrorIncludesSearchedPaths(t *testing.T) { _, err := resolveCampaignConfigPathWithCandidates("", []string{"/usr/local/etc/narratio/campaign.yml", "/etc/narratio/campaign.yml"}) if err == nil { t.Fatal("expected error, got nil") } if !strings.Contains(err.Error(), "searched") { t.Fatalf("error = %q, want searched paths", err.Error()) } if !strings.Contains(err.Error(), "pass --campaign") { t.Fatalf("error = %q, want explicit-campaign guidance", err.Error()) } }