Complete configuration diagnostics workstream
This commit is contained in:
@@ -192,20 +192,22 @@ func TestNotariusReferenceValidationRejectsInvalidBindings(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
references map[string]string
|
||||
wantErr string
|
||||
wantField string
|
||||
wantReason string
|
||||
}{
|
||||
{name: "empty selector", references: map[string]string{" ": "narratio.input.party"}, wantErr: "selector is required"},
|
||||
{name: "equals in selector", references: map[string]string{"party=x": "narratio.input.party"}, wantErr: "must not contain"},
|
||||
{name: "invalid stage", references: map[string]string{"lane.prepare.party": "narratio.input.party"}, wantErr: "middle component"},
|
||||
{name: "empty source", references: map[string]string{"party": " "}, wantErr: "source is required"},
|
||||
{name: "unsupported source", references: map[string]string{"party": "narratio.input.unknown"}, wantErr: "not a supported prepared input source"},
|
||||
{name: "empty selector", references: map[string]string{" ": "narratio.input.party"}, wantField: "pipeline.notarius.references", wantReason: "selector is required"},
|
||||
{name: "equals in selector", references: map[string]string{"party=x": "narratio.input.party"}, wantField: "pipeline.notarius.references", wantReason: "must not contain"},
|
||||
{name: "invalid stage", references: map[string]string{"lane.prepare.party": "narratio.input.party"}, wantField: "pipeline.notarius.references", wantReason: "middle component"},
|
||||
{name: "empty source", references: map[string]string{"party": " "}, wantField: "pipeline.notarius.references.party", wantReason: "source is required"},
|
||||
{name: "unsupported source", references: map[string]string{"party": "narratio.input.unknown"}, wantField: "pipeline.notarius.references.party", wantReason: "not a supported prepared input source"},
|
||||
{
|
||||
name: "normalized collision",
|
||||
references: map[string]string{
|
||||
"chunk.party": "narratio.input.party",
|
||||
" chunk . party ": "narratio.input.players",
|
||||
},
|
||||
wantErr: "normalize to",
|
||||
wantField: "pipeline.notarius.references",
|
||||
wantReason: "normalize to",
|
||||
},
|
||||
}
|
||||
|
||||
@@ -214,8 +216,8 @@ func TestNotariusReferenceValidationRejectsInvalidBindings(t *testing.T) {
|
||||
cfg := validNotariusConfig()
|
||||
cfg.References = tt.references
|
||||
err := validateNotarius(cfg, nil)
|
||||
if err == nil || !strings.Contains(err.Error(), tt.wantErr) {
|
||||
t.Fatalf("validateNotarius() error = %v, want containing %q", err, tt.wantErr)
|
||||
if err == nil || !strings.Contains(err.Error(), tt.wantField) || !strings.Contains(err.Error(), tt.wantReason) {
|
||||
t.Fatalf("validateNotarius() error = %v, want field %q and reason %q", err, tt.wantField, tt.wantReason)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -398,21 +400,21 @@ func TestNotariusEnabledValidation(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
section string
|
||||
wantErr string
|
||||
wantErr []string
|
||||
}{
|
||||
{name: "valid", section: valid},
|
||||
{name: "blank binary", section: strings.Replace(valid, " enabled: true\n", " enabled: true\n binary: \" \"\n", 1), wantErr: "pipeline.notarius.binary is required"},
|
||||
{name: "missing config path", section: strings.Replace(valid, " config_path: ./notarius.yml\n", "", 1), wantErr: "pipeline.notarius.config_path is required"},
|
||||
{name: "missing pipeline id", section: strings.Replace(valid, " pipeline_id: dnd-session\n", "", 1), wantErr: "pipeline.notarius.pipeline_id is required"},
|
||||
{name: "missing outputs", section: strings.Split(valid, " outputs:\n")[0], wantErr: "pipeline.notarius.outputs must contain at least one output"},
|
||||
{name: "zero timeout", section: strings.Replace(valid, " timeout: 45m", " timeout: 0s", 1), wantErr: "pipeline.notarius.timeout must be positive"},
|
||||
{name: "negative timeout", section: strings.Replace(valid, " timeout: 45m", " timeout: -1s", 1), wantErr: "pipeline.notarius.timeout must be positive"},
|
||||
{name: "invalid timeout", section: strings.Replace(valid, " timeout: 45m", " timeout: later", 1), wantErr: "pipeline.notarius.timeout must be a valid duration"},
|
||||
{name: "invalid output key", section: strings.Replace(valid, " npc_registry:", " npc-registry:", 1), wantErr: "outputs keys must match"},
|
||||
{name: "missing lane", section: strings.Replace(valid, " lane_id: npc-registry\n", "", 1), wantErr: "lane_id is required"},
|
||||
{name: "missing media type", section: strings.Replace(valid, " media_type: application/json\n", "", 1), wantErr: "media_type is required"},
|
||||
{name: "missing schema id", section: strings.Replace(valid, " schema_id: notarius.dnd.npc_registry\n", "", 1), wantErr: "schema_id is required"},
|
||||
{name: "missing schema version", section: strings.Replace(valid, " schema_version: v1\n", "", 1), wantErr: "schema_version is required"},
|
||||
{name: "blank binary", section: strings.Replace(valid, " enabled: true\n", " enabled: true\n binary: \" \"\n", 1), wantErr: []string{"pipeline.notarius.binary", "required"}},
|
||||
{name: "missing config path", section: strings.Replace(valid, " config_path: ./notarius.yml\n", "", 1), wantErr: []string{"pipeline.notarius.config_path", "required"}},
|
||||
{name: "missing pipeline id", section: strings.Replace(valid, " pipeline_id: dnd-session\n", "", 1), wantErr: []string{"pipeline.notarius.pipeline_id", "required"}},
|
||||
{name: "missing outputs", section: strings.Split(valid, " outputs:\n")[0], wantErr: []string{"pipeline.notarius.outputs", "at least one"}},
|
||||
{name: "zero timeout", section: strings.Replace(valid, " timeout: 45m", " timeout: 0s", 1), wantErr: []string{"pipeline.notarius.timeout", "positive"}},
|
||||
{name: "negative timeout", section: strings.Replace(valid, " timeout: 45m", " timeout: -1s", 1), wantErr: []string{"pipeline.notarius.timeout", "positive"}},
|
||||
{name: "invalid timeout", section: strings.Replace(valid, " timeout: 45m", " timeout: later", 1), wantErr: []string{"pipeline.notarius.timeout", "valid duration"}},
|
||||
{name: "invalid output key", section: strings.Replace(valid, " npc_registry:", " npc-registry:", 1), wantErr: []string{"pipeline.notarius.outputs keys", "must match"}},
|
||||
{name: "missing lane", section: strings.Replace(valid, " lane_id: npc-registry\n", "", 1), wantErr: []string{"pipeline.notarius.outputs.npc_registry.lane_id", "required"}},
|
||||
{name: "missing media type", section: strings.Replace(valid, " media_type: application/json\n", "", 1), wantErr: []string{"pipeline.notarius.outputs.npc_registry.media_type", "required"}},
|
||||
{name: "missing schema id", section: strings.Replace(valid, " schema_id: notarius.dnd.npc_registry\n", "", 1), wantErr: []string{"pipeline.notarius.outputs.npc_registry.schema_id", "required"}},
|
||||
{name: "missing schema version", section: strings.Replace(valid, " schema_version: v1\n", "", 1), wantErr: []string{"pipeline.notarius.outputs.npc_registry.schema_version", "required"}},
|
||||
{
|
||||
name: "normalized key collision",
|
||||
section: strings.Replace(valid, " module_key: dnd/npc-registry\n", ` module_key: dnd/npc-registry
|
||||
@@ -422,7 +424,7 @@ func TestNotariusEnabledValidation(t *testing.T) {
|
||||
schema_id: two
|
||||
schema_version: v1
|
||||
`, 1),
|
||||
wantErr: "normalize to duplicate source",
|
||||
wantErr: []string{"pipeline.notarius.outputs keys", "duplicate source"},
|
||||
},
|
||||
{
|
||||
name: "duplicate normalized lane",
|
||||
@@ -433,7 +435,7 @@ func TestNotariusEnabledValidation(t *testing.T) {
|
||||
schema_id: two
|
||||
schema_version: v1
|
||||
`, 1),
|
||||
wantErr: "duplicates pipeline.notarius.outputs.npc_registry.lane_id",
|
||||
wantErr: []string{"pipeline.notarius.outputs.spells.lane_id", "duplicates"},
|
||||
},
|
||||
}
|
||||
|
||||
@@ -445,7 +447,7 @@ func TestNotariusEnabledValidation(t *testing.T) {
|
||||
t.Fatalf("Load() error = %v", err)
|
||||
}
|
||||
err = Validate(cfg)
|
||||
if tt.wantErr == "" {
|
||||
if len(tt.wantErr) == 0 {
|
||||
if err != nil {
|
||||
t.Fatalf("Validate() error = %v", err)
|
||||
}
|
||||
@@ -455,8 +457,13 @@ func TestNotariusEnabledValidation(t *testing.T) {
|
||||
}
|
||||
return
|
||||
}
|
||||
if err == nil || !strings.Contains(err.Error(), tt.wantErr) {
|
||||
t.Fatalf("Validate() error = %v, want containing %q", err, tt.wantErr)
|
||||
if err == nil {
|
||||
t.Fatalf("Validate() error = nil, want containing %q", tt.wantErr)
|
||||
}
|
||||
for _, fragment := range tt.wantErr {
|
||||
if !strings.Contains(err.Error(), fragment) {
|
||||
t.Fatalf("Validate() error = %v, want containing %q", err, fragment)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -471,7 +478,7 @@ func TestExtractionReferencesRequireDeclaredOutput(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
body string
|
||||
wantErr string
|
||||
wantErr []string
|
||||
}{
|
||||
{
|
||||
name: "scriptorium declared extraction",
|
||||
@@ -492,7 +499,7 @@ func TestExtractionReferencesRequireDeclaredOutput(t *testing.T) {
|
||||
npcs:
|
||||
source: narratio.extraction.unknown
|
||||
`,
|
||||
wantErr: `references unknown extraction output "unknown"`,
|
||||
wantErr: []string{"pipeline.scriptorium.artifacts.recap.inputs.npcs.source", "unknown extraction output"},
|
||||
},
|
||||
{
|
||||
name: "publish declared extraction",
|
||||
@@ -509,7 +516,7 @@ func TestExtractionReferencesRequireDeclaredOutput(t *testing.T) {
|
||||
- source: narratio.extraction.unknown
|
||||
dest: artifacts/unknown.json
|
||||
`,
|
||||
wantErr: `extraction output "unknown" is not defined`,
|
||||
wantErr: []string{"pipeline.publish.outputs[0].source", "not defined"},
|
||||
},
|
||||
{
|
||||
name: "publish lock declared extraction",
|
||||
@@ -528,14 +535,19 @@ func TestExtractionReferencesRequireDeclaredOutput(t *testing.T) {
|
||||
t.Fatalf("Load() error = %v", err)
|
||||
}
|
||||
err = Validate(cfg)
|
||||
if tt.wantErr == "" {
|
||||
if len(tt.wantErr) == 0 {
|
||||
if err != nil {
|
||||
t.Fatalf("Validate() error = %v", err)
|
||||
}
|
||||
return
|
||||
}
|
||||
if err == nil || !strings.Contains(err.Error(), tt.wantErr) {
|
||||
t.Fatalf("Validate() error = %v, want containing %q", err, tt.wantErr)
|
||||
if err == nil {
|
||||
t.Fatalf("Validate() error = nil, want containing %q", tt.wantErr)
|
||||
}
|
||||
for _, fragment := range tt.wantErr {
|
||||
if !strings.Contains(err.Error(), fragment) {
|
||||
t.Fatalf("Validate() error = %v, want containing %q", err, fragment)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user