package config import ( "strings" "testing" ) func TestRenderLoadAndValidate(t *testing.T) { tests := []struct { name string renderYAML string wantLoadErr string wantValidateErr string assert func(t *testing.T, cfg *Config) }{ { name: "render defaults when omitted", renderYAML: "", assert: func(t *testing.T, cfg *Config) { t.Helper() if cfg.Pipeline.Render == nil { t.Fatal("render config should be present via defaults") } if cfg.Pipeline.Render.Enabled == nil || !*cfg.Pipeline.Render.Enabled { t.Fatalf("render.enabled = %#v, want true", cfg.Pipeline.Render.Enabled) } if cfg.Pipeline.Render.Format != "markdown" { t.Fatalf("render.format = %q, want markdown", cfg.Pipeline.Render.Format) } if cfg.Pipeline.Render.IncludeTimestamps == nil || !*cfg.Pipeline.Render.IncludeTimestamps { t.Fatalf("render.include_timestamps = %#v, want true", cfg.Pipeline.Render.IncludeTimestamps) } if cfg.Pipeline.Render.IncludeSegmentIDs { t.Fatalf("render.include_segment_ids = true, want false") } if cfg.Pipeline.Render.IncludeMetadata { t.Fatalf("render.include_metadata = true, want false") } }, }, { name: "valid explicit render config", renderYAML: `render: enabled: false format: markdown title: Session Render include_timestamps: false include_segment_ids: true include_metadata: true `, assert: func(t *testing.T, cfg *Config) { t.Helper() if cfg.Pipeline.Render == nil { t.Fatal("render config should be present") } if cfg.Pipeline.Render.Enabled == nil || *cfg.Pipeline.Render.Enabled { t.Fatalf("render.enabled = %#v, want false", cfg.Pipeline.Render.Enabled) } if cfg.Pipeline.Render.IncludeTimestamps == nil || *cfg.Pipeline.Render.IncludeTimestamps { t.Fatalf("render.include_timestamps = %#v, want false", cfg.Pipeline.Render.IncludeTimestamps) } if !cfg.Pipeline.Render.IncludeSegmentIDs { t.Fatalf("render.include_segment_ids = false, want true") } if !cfg.Pipeline.Render.IncludeMetadata { t.Fatalf("render.include_metadata = false, want true") } }, }, { name: "invalid render format fails", renderYAML: `render: format: html `, wantValidateErr: "pipeline.render.format must be markdown", }, { name: "unknown render field fails strict decoding", renderYAML: `render: format: markdown unknown: true `, wantLoadErr: "strict decode failed", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { pipelineYAML := testPipelineBaseYAML if tt.renderYAML != "" { pipelineYAML += "\n" + tt.renderYAML } pipelinePath, sessionPath := writeConfigFiles(t, pipelineYAML, testSessionBaseYAML) cfg, err := Load(pipelinePath, sessionPath) if tt.wantLoadErr != "" { if err == nil { t.Fatalf("expected load error containing %q, got nil", tt.wantLoadErr) } if !strings.Contains(err.Error(), tt.wantLoadErr) { t.Fatalf("load error = %q, want to contain %q", err.Error(), tt.wantLoadErr) } return } if err != nil { t.Fatalf("Load() error = %v", err) } if tt.assert != nil { tt.assert(t, cfg) } err = Validate(cfg) if tt.wantValidateErr != "" { if err == nil { t.Fatalf("expected validation error containing %q, got nil", tt.wantValidateErr) } if !strings.Contains(err.Error(), tt.wantValidateErr) { t.Fatalf("validation error = %q, want to contain %q", err.Error(), tt.wantValidateErr) } return } if err != nil { t.Fatalf("Validate() error = %v", err) } }) } }