diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 905651a..02f19eb 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -538,15 +538,9 @@ func TestCoalesceGapUsesValidOverride(t *testing.T) { input := writeTempFile(t, dir, "input.json") output := filepath.Join(dir, "merged.json") - cfg, err := NewMergeConfig(MergeOptions{ - InputFiles: []string{input}, - OutputFile: output, - InputReader: DefaultInputReader, - OutputModules: DefaultOutputModules, - PreprocessingModules: DefaultPreprocessingModules, - PostprocessingModules: DefaultPostprocessingModules, - CoalesceGap: "1.5", - }) + opts := validMergeOptions(input, output) + opts.CoalesceGap = "1.5" + cfg, err := NewMergeConfig(opts) if err != nil { t.Fatalf("config failed: %v", err) } @@ -560,15 +554,9 @@ func TestCoalesceGapAllowsZero(t *testing.T) { input := writeTempFile(t, dir, "input.json") output := filepath.Join(dir, "merged.json") - cfg, err := NewMergeConfig(MergeOptions{ - InputFiles: []string{input}, - OutputFile: output, - InputReader: DefaultInputReader, - OutputModules: DefaultOutputModules, - PreprocessingModules: DefaultPreprocessingModules, - PostprocessingModules: DefaultPostprocessingModules, - CoalesceGap: "0", - }) + opts := validMergeOptions(input, output) + opts.CoalesceGap = "0" + cfg, err := NewMergeConfig(opts) if err != nil { t.Fatalf("config failed: %v", err) } @@ -593,15 +581,9 @@ func TestCoalesceGapRejectsInvalidOverride(t *testing.T) { input := writeTempFile(t, dir, "input.json") output := filepath.Join(dir, "merged.json") - _, err := NewMergeConfig(MergeOptions{ - InputFiles: []string{input}, - OutputFile: output, - InputReader: DefaultInputReader, - OutputModules: DefaultOutputModules, - PreprocessingModules: DefaultPreprocessingModules, - PostprocessingModules: DefaultPostprocessingModules, - CoalesceGap: test.value, - }) + opts := validMergeOptions(input, output) + opts.CoalesceGap = test.value + _, err := NewMergeConfig(opts) if err == nil { t.Fatal("expected error") } @@ -639,20 +621,16 @@ func TestNewTrimConfigRequiresExactlyOneSelectorFlag(t *testing.T) { input := writeTempFile(t, dir, "input.json") output := filepath.Join(dir, "trimmed.json") - _, err := NewTrimConfig(TrimOptions{ - InputFile: input, - OutputFile: output, - }) + opts := validTrimOptions(input, output) + opts.Keep = "" + _, err := NewTrimConfig(opts) if err == nil || !strings.Contains(err.Error(), "exactly one of --keep or --remove is required") { t.Fatalf("expected missing selector error, got %v", err) } - _, err = NewTrimConfig(TrimOptions{ - InputFile: input, - OutputFile: output, - Keep: "1", - Remove: "2", - }) + opts = validTrimOptions(input, output) + opts.Remove = "2" + _, err = NewTrimConfig(opts) if err == nil || !strings.Contains(err.Error(), "mutually exclusive") { t.Fatalf("expected mutually exclusive selector error, got %v", err) } @@ -664,14 +642,13 @@ func TestNewTrimConfigAcceptsOutputSchemaOverride(t *testing.T) { output := filepath.Join(dir, "trimmed.json") reportPath := filepath.Join(dir, "report.json") - cfg, err := NewTrimConfig(TrimOptions{ - InputFile: input, - OutputFile: output, - ReportFile: reportPath, - Remove: "3-5", - OutputSchema: OutputSchemaMinimal, - AllowEmpty: true, - }) + opts := validTrimOptions(input, output) + opts.Keep = "" + opts.Remove = "3-5" + opts.ReportFile = reportPath + opts.OutputSchema = OutputSchemaMinimal + opts.AllowEmpty = true + cfg, err := NewTrimConfig(opts) if err != nil { t.Fatalf("config failed: %v", err) } @@ -697,12 +674,9 @@ func TestNewTrimConfigTreatsWhitespaceReportFileAsOmitted(t *testing.T) { input := writeTempFile(t, dir, "input.json") output := filepath.Join(dir, "trimmed.json") - cfg, err := NewTrimConfig(TrimOptions{ - InputFile: input, - OutputFile: output, - Keep: "1", - ReportFile: " \t ", - }) + opts := validTrimOptions(input, output) + opts.ReportFile = " \t " + cfg, err := NewTrimConfig(opts) if err != nil { t.Fatalf("config failed: %v", err) } @@ -716,12 +690,9 @@ func TestNewTrimConfigRejectsInvalidOutputSchemaOverride(t *testing.T) { input := writeTempFile(t, dir, "input.json") output := filepath.Join(dir, "trimmed.json") - _, err := NewTrimConfig(TrimOptions{ - InputFile: input, - OutputFile: output, - Keep: "1", - OutputSchema: "compact", - }) + opts := validTrimOptions(input, output) + opts.OutputSchema = "compact" + _, err := NewTrimConfig(opts) if err == nil { t.Fatal("expected output schema validation error") } @@ -750,10 +721,8 @@ func TestNewNormalizeConfigRequiresOutputFile(t *testing.T) { dir := t.TempDir() input := writeTempFile(t, dir, "input.json") - _, err := NewNormalizeConfig(NormalizeOptions{ - InputFile: input, - OutputModules: DefaultOutputModules, - }) + opts := validNormalizeOptions(input, "") + _, err := NewNormalizeConfig(opts) if err == nil { t.Fatal("expected output-file required error") } @@ -768,11 +737,8 @@ func TestNewNormalizeConfigResolvesOutputSchemaDefaultAndEnv(t *testing.T) { output := filepath.Join(dir, "normalized.json") t.Setenv(OutputSchemaEnv, "") - cfg, err := NewNormalizeConfig(NormalizeOptions{ - InputFile: input, - OutputFile: output, - OutputModules: DefaultOutputModules, - }) + opts := validNormalizeOptions(input, output) + cfg, err := NewNormalizeConfig(opts) if err != nil { t.Fatalf("config failed: %v", err) } @@ -781,11 +747,7 @@ func TestNewNormalizeConfigResolvesOutputSchemaDefaultAndEnv(t *testing.T) { } t.Setenv(OutputSchemaEnv, OutputSchemaMinimal) - cfg, err = NewNormalizeConfig(NormalizeOptions{ - InputFile: input, - OutputFile: output, - OutputModules: DefaultOutputModules, - }) + cfg, err = NewNormalizeConfig(opts) if err != nil { t.Fatalf("config failed: %v", err) } @@ -799,12 +761,9 @@ func TestNewNormalizeConfigRejectsInvalidOutputSchema(t *testing.T) { input := writeTempFile(t, dir, "input.json") output := filepath.Join(dir, "normalized.json") - _, err := NewNormalizeConfig(NormalizeOptions{ - InputFile: input, - OutputFile: output, - OutputSchema: "compact", - OutputModules: DefaultOutputModules, - }) + opts := validNormalizeOptions(input, output) + opts.OutputSchema = "compact" + _, err := NewNormalizeConfig(opts) if err == nil { t.Fatal("expected output schema error") } @@ -818,11 +777,9 @@ func TestNewNormalizeConfigRejectsUnknownOutputModule(t *testing.T) { input := writeTempFile(t, dir, "input.json") output := filepath.Join(dir, "normalized.json") - _, err := NewNormalizeConfig(NormalizeOptions{ - InputFile: input, - OutputFile: output, - OutputModules: "json,yaml", - }) + opts := validNormalizeOptions(input, output) + opts.OutputModules = "json,yaml" + _, err := NewNormalizeConfig(opts) if err == nil { t.Fatal("expected output module error") } @@ -836,12 +793,9 @@ func TestNewNormalizeConfigTreatsWhitespaceReportFileAsOmitted(t *testing.T) { input := writeTempFile(t, dir, "input.json") output := filepath.Join(dir, "normalized.json") - cfg, err := NewNormalizeConfig(NormalizeOptions{ - InputFile: input, - OutputFile: output, - ReportFile: "\n\t ", - OutputModules: DefaultOutputModules, - }) + opts := validNormalizeOptions(input, output) + opts.ReportFile = "\n\t " + cfg, err := NewNormalizeConfig(opts) if err != nil { t.Fatalf("config failed: %v", err) } @@ -870,14 +824,7 @@ func assertPositiveFloatEnvValidation(t *testing.T, envName string) { input := writeTempFile(t, dir, "input.json") output := filepath.Join(dir, "merged.json") - _, err := NewMergeConfig(MergeOptions{ - InputFiles: []string{input}, - OutputFile: output, - InputReader: DefaultInputReader, - OutputModules: DefaultOutputModules, - PreprocessingModules: DefaultPreprocessingModules, - PostprocessingModules: DefaultPostprocessingModules, - }) + _, err := NewMergeConfig(validMergeOptions(input, output)) if err == nil { t.Fatal("expected error") } @@ -888,6 +835,33 @@ func assertPositiveFloatEnvValidation(t *testing.T, envName string) { } } +func validMergeOptions(inputFile string, outputFile string) MergeOptions { + return MergeOptions{ + InputFiles: []string{inputFile}, + OutputFile: outputFile, + InputReader: DefaultInputReader, + OutputModules: DefaultOutputModules, + PreprocessingModules: DefaultPreprocessingModules, + PostprocessingModules: DefaultPostprocessingModules, + } +} + +func validTrimOptions(inputFile string, outputFile string) TrimOptions { + return TrimOptions{ + InputFile: inputFile, + OutputFile: outputFile, + Keep: "1", + } +} + +func validNormalizeOptions(inputFile string, outputFile string) NormalizeOptions { + return NormalizeOptions{ + InputFile: inputFile, + OutputFile: outputFile, + OutputModules: DefaultOutputModules, + } +} + func writeTempFile(t *testing.T, dir string, name string) string { t.Helper()