Implement artifact-level render command with Markdown output and update docs
This commit is contained in:
@@ -804,6 +804,97 @@ func TestNewNormalizeConfigTreatsWhitespaceReportFileAsOmitted(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewRenderConfigRequiresInputOutputAndFormat(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
input := writeTempFile(t, dir, "input.json")
|
||||
output := filepath.Join(dir, "rendered.md")
|
||||
|
||||
_, err := NewRenderConfig(RenderOptions{
|
||||
OutputFile: output,
|
||||
Format: RenderFormatMarkdown,
|
||||
})
|
||||
if err == nil || !strings.Contains(err.Error(), "--input-file is required") {
|
||||
t.Fatalf("expected input-file required error, got %v", err)
|
||||
}
|
||||
|
||||
_, err = NewRenderConfig(RenderOptions{
|
||||
InputFile: input,
|
||||
Format: RenderFormatMarkdown,
|
||||
})
|
||||
if err == nil || !strings.Contains(err.Error(), "--output-file is required") {
|
||||
t.Fatalf("expected output-file required error, got %v", err)
|
||||
}
|
||||
|
||||
_, err = NewRenderConfig(RenderOptions{
|
||||
InputFile: input,
|
||||
OutputFile: output,
|
||||
})
|
||||
if err == nil || !strings.Contains(err.Error(), "--format is required") {
|
||||
t.Fatalf("expected format required error, got %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewRenderConfigRejectsUnknownFormat(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
input := writeTempFile(t, dir, "input.json")
|
||||
output := filepath.Join(dir, "rendered.md")
|
||||
|
||||
opts := validRenderOptions(input, output)
|
||||
opts.Format = "txt"
|
||||
_, err := NewRenderConfig(opts)
|
||||
if err == nil {
|
||||
t.Fatal("expected format validation error")
|
||||
}
|
||||
if !strings.Contains(err.Error(), "--format must be") {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewRenderConfigAppliesDefaultsAndFlags(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
input := writeTempFile(t, dir, "input.json")
|
||||
output := filepath.Join(dir, "rendered.md")
|
||||
|
||||
cfg, err := NewRenderConfig(validRenderOptions(input, output))
|
||||
if err != nil {
|
||||
t.Fatalf("config failed: %v", err)
|
||||
}
|
||||
if cfg.Title != DefaultRenderTitle {
|
||||
t.Fatalf("title = %q, want %q", cfg.Title, DefaultRenderTitle)
|
||||
}
|
||||
if !cfg.IncludeTimestamps {
|
||||
t.Fatal("include timestamps should default true")
|
||||
}
|
||||
if cfg.IncludeSegmentIDs {
|
||||
t.Fatal("include segment IDs should default false")
|
||||
}
|
||||
if cfg.IncludeMetadata {
|
||||
t.Fatal("include metadata should default false")
|
||||
}
|
||||
|
||||
opts := validRenderOptions(input, output)
|
||||
opts.Title = "Meeting Notes"
|
||||
opts.IncludeTimestamps = false
|
||||
opts.IncludeSegmentIDs = true
|
||||
opts.IncludeMetadata = true
|
||||
cfg, err = NewRenderConfig(opts)
|
||||
if err != nil {
|
||||
t.Fatalf("config failed: %v", err)
|
||||
}
|
||||
if cfg.Title != "Meeting Notes" {
|
||||
t.Fatalf("title = %q, want Meeting Notes", cfg.Title)
|
||||
}
|
||||
if cfg.IncludeTimestamps {
|
||||
t.Fatal("include timestamps should be false")
|
||||
}
|
||||
if !cfg.IncludeSegmentIDs {
|
||||
t.Fatal("include segment IDs should be true")
|
||||
}
|
||||
if !cfg.IncludeMetadata {
|
||||
t.Fatal("include metadata should be true")
|
||||
}
|
||||
}
|
||||
|
||||
func assertPositiveFloatEnvValidation(t *testing.T, envName string) {
|
||||
t.Helper()
|
||||
|
||||
@@ -862,6 +953,18 @@ func validNormalizeOptions(inputFile string, outputFile string) NormalizeOptions
|
||||
}
|
||||
}
|
||||
|
||||
func validRenderOptions(inputFile string, outputFile string) RenderOptions {
|
||||
return RenderOptions{
|
||||
InputFile: inputFile,
|
||||
OutputFile: outputFile,
|
||||
Format: RenderFormatMarkdown,
|
||||
Title: DefaultRenderTitle,
|
||||
IncludeTimestamps: true,
|
||||
IncludeSegmentIDs: false,
|
||||
IncludeMetadata: false,
|
||||
}
|
||||
}
|
||||
|
||||
func writeTempFile(t *testing.T, dir string, name string) string {
|
||||
t.Helper()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user