package app import ( "path/filepath" "strings" "testing" "gitea.maximumdirect.net/eric/narratio/internal/config" ) func TestResolveCampaignConfigPathCampaignFileWins(t *testing.T) { explicit := filepath.Join(t.TempDir(), "custom-campaign.yml") got, err := resolveCampaignConfigPath(&config.PipelineConfig{}, "", explicit) if err != nil { t.Fatalf("resolveCampaignConfigPath() error = %v", err) } if got != explicit { t.Fatalf("path = %q, want explicit path %q", got, explicit) } } func TestResolveCampaignConfigPathUsesSelectedCampaignID(t *testing.T) { dir := t.TempDir() pipelineCfg := &config.PipelineConfig{} pipelineCfg.Campaigns.Root = dir got, err := resolveCampaignConfigPath(pipelineCfg, "icewind", "") if err != nil { t.Fatalf("resolveCampaignConfigPath() error = %v", err) } want := filepath.Join(dir, "icewind", "campaign.yml") if got != filepath.Clean(want) { t.Fatalf("path = %q, want %q", got, filepath.Clean(want)) } } func TestResolveCampaignConfigPathUsesDefaultCampaignID(t *testing.T) { dir := t.TempDir() pipelineCfg := &config.PipelineConfig{} pipelineCfg.Campaigns.Root = dir pipelineCfg.Campaigns.DefaultCampaignID = "dilfs" got, err := resolveCampaignConfigPath(pipelineCfg, "", "") if err != nil { t.Fatalf("resolveCampaignConfigPath() error = %v", err) } want := filepath.Join(dir, "dilfs", "campaign.yml") if got != filepath.Clean(want) { t.Fatalf("path = %q, want %q", got, filepath.Clean(want)) } } func TestResolveCampaignConfigPathRejectsCampaignIDAndFile(t *testing.T) { _, err := resolveCampaignConfigPath(&config.PipelineConfig{}, "dilfs", filepath.Join(t.TempDir(), "campaign.yml")) if err == nil { t.Fatal("expected error, got nil") } if !strings.Contains(err.Error(), "mutually exclusive") { t.Fatalf("error = %q, want mutual exclusion", err.Error()) } } func TestResolveCampaignConfigPathRequiresCampaignSelection(t *testing.T) { _, err := resolveCampaignConfigPath(&config.PipelineConfig{}, "", "") if err == nil { t.Fatal("expected error, got nil") } if !strings.Contains(err.Error(), "no campaign selected") { t.Fatalf("error = %q, want missing selection guidance", err.Error()) } } func TestResolveCampaignConfigPathRejectsPathLikeCampaignID(t *testing.T) { pipelineCfg := &config.PipelineConfig{} pipelineCfg.Campaigns.Root = t.TempDir() _, err := resolveCampaignConfigPath(pipelineCfg, "../icewind", "") if err == nil { t.Fatal("expected error, got nil") } if !strings.Contains(err.Error(), "single path segment") { t.Fatalf("error = %q, want path segment guidance", err.Error()) } }