From 20176dd51f0fc4d37a938a5d068dc8378259cd4e Mon Sep 17 00:00:00 2001 From: vikingowl Date: Sat, 18 Apr 2026 14:43:07 +0200 Subject: [PATCH] refactor(discovery): validator accepts *Bucket, skips bucket checks when nil --- backend/internal/domain/discovery/service.go | 2 +- backend/internal/domain/discovery/validate.go | 6 ++--- .../domain/discovery/validate_test.go | 27 +++++++++++++------ 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/backend/internal/domain/discovery/service.go b/backend/internal/domain/discovery/service.go index c8e9e06..fed0563 100644 --- a/backend/internal/domain/discovery/service.go +++ b/backend/internal/domain/discovery/service.go @@ -224,7 +224,7 @@ func (s *Service) processBucketResponse(ctx context.Context, b Bucket, resp Pass // Semantic validation — catches agent self-contradictions that the // schema alone cannot. Errors drop the market; warnings would be // appended to hinweis (none defined yet at Pass 0 scope). - issues := ValidateForInsert(dm, b) + issues := ValidateForInsert(dm, &b) if HasErrors(issues) { slog.InfoContext(ctx, "validation failed; skipping market", "markt", m.MarktName, "stadt", m.Stadt, "issues", formatIssues(issues)) diff --git a/backend/internal/domain/discovery/validate.go b/backend/internal/domain/discovery/validate.go index 3653758..6014c46 100644 --- a/backend/internal/domain/discovery/validate.go +++ b/backend/internal/domain/discovery/validate.go @@ -36,15 +36,15 @@ type Issue struct { // from, before it hits the queue. Current checks: // // - bundesland_mismatch: m.Bundesland does not equal b.Region (CH "Kanton X" -// prefix is normalized). +// prefix is normalized). Skipped when b is nil. // - status_hinweis_inconsistent: AgentStatus=="bestaetigt" AND hinweis // mentions "vorjahr" — the agent contradicted itself. // // Returns nil when clean. -func ValidateForInsert(m DiscoveredMarket, b Bucket) []Issue { +func ValidateForInsert(m DiscoveredMarket, b *Bucket) []Issue { var issues []Issue - if m.Bundesland != "" && !regionsEqual(m.Bundesland, b.Region) { + if b != nil && m.Bundesland != "" && !regionsEqual(m.Bundesland, b.Region) { issues = append(issues, Issue{ Severity: SeverityError, Code: "bundesland_mismatch", diff --git a/backend/internal/domain/discovery/validate_test.go b/backend/internal/domain/discovery/validate_test.go index 8a23cc4..c8f78c7 100644 --- a/backend/internal/domain/discovery/validate_test.go +++ b/backend/internal/domain/discovery/validate_test.go @@ -8,27 +8,27 @@ func TestValidateForInsert(t *testing.T) { tests := []struct { name string m DiscoveredMarket - b Bucket + b *Bucket wantCodes []string wantErrors bool }{ { name: "clean", m: DiscoveredMarket{Bundesland: "Bayern", AgentStatus: "bestaetigt"}, - b: baseBucket, + b: &baseBucket, wantCodes: nil, }, { name: "bundesland mismatch", m: DiscoveredMarket{Bundesland: "Baden-Württemberg", AgentStatus: "bestaetigt"}, - b: baseBucket, + b: &baseBucket, wantCodes: []string{"bundesland_mismatch"}, wantErrors: true, }, { name: "bundesland empty is not an error", m: DiscoveredMarket{Bundesland: "", AgentStatus: "bestaetigt"}, - b: baseBucket, + b: &baseBucket, wantCodes: nil, }, { @@ -38,7 +38,7 @@ func TestValidateForInsert(t *testing.T) { AgentStatus: "bestaetigt", Hinweis: "Termin aus Vorjahr, noch nicht bestaetigt", }, - b: baseBucket, + b: &baseBucket, wantCodes: []string{"status_hinweis_inconsistent"}, wantErrors: true, }, @@ -49,13 +49,13 @@ func TestValidateForInsert(t *testing.T) { AgentStatus: "vorjahr_unbestaetigt", Hinweis: "Aus dem Vorjahr uebernommen", }, - b: baseBucket, + b: &baseBucket, wantCodes: nil, }, { name: "kanton prefix is normalized when bucket is just the kanton name", m: DiscoveredMarket{Bundesland: "Kanton Zürich", AgentStatus: "bestaetigt"}, - b: Bucket{Region: "Zürich"}, + b: &Bucket{Region: "Zürich"}, wantCodes: nil, }, { @@ -65,10 +65,21 @@ func TestValidateForInsert(t *testing.T) { AgentStatus: "bestaetigt", Hinweis: "Termin aus dem Vorjahr uebernommen", }, - b: baseBucket, + b: &baseBucket, wantCodes: []string{"bundesland_mismatch", "status_hinweis_inconsistent"}, wantErrors: true, }, + { + name: "nil bucket skips bundesland_mismatch check", + m: DiscoveredMarket{ + MarktName: "Testmarkt", + Stadt: "Testdorf", + Bundesland: "Bayern", + AgentStatus: "bestaetigt", + }, + b: nil, + wantCodes: nil, + }, } for _, tc := range tests {