Classify source relatedness as data-quality advisories
This commit is contained in:
@@ -8,6 +8,7 @@ import (
|
||||
"strings"
|
||||
|
||||
"gitea.maximumdirect.net/eric/notarius/internal/framework/contracts"
|
||||
frameworkdiagnostics "gitea.maximumdirect.net/eric/notarius/internal/framework/diagnostics"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -17,6 +18,25 @@ const (
|
||||
MaxMessageBytes = 4096
|
||||
)
|
||||
|
||||
// DataQualityResult converts accepted source-quality findings into bounded,
|
||||
// locally grouped advisories. These findings do not indicate process
|
||||
// degradation.
|
||||
func DataQualityResult(findings []contracts.Warning) (contracts.ValidationResult, error) {
|
||||
collector := frameworkdiagnostics.NewCollector()
|
||||
for _, finding := range findings {
|
||||
if err := collector.Add(contracts.ProducerDiagnostic{
|
||||
Disposition: contracts.DiagnosticDispositionAdvisory,
|
||||
Category: contracts.DiagnosticCategoryDataQuality,
|
||||
ReasonCode: finding.ReasonCode,
|
||||
OccurrenceCount: 1,
|
||||
Samples: []contracts.DiagnosticSample{{Scope: finding.Scope, Message: finding.Message}},
|
||||
}); err != nil {
|
||||
return contracts.ValidationResult{}, fmt.Errorf("collect data-quality diagnostic: %w", err)
|
||||
}
|
||||
}
|
||||
return contracts.ValidationResult{Approved: true, Diagnostics: collector.Diagnostics()}, nil
|
||||
}
|
||||
|
||||
func Truncate(value string) string {
|
||||
runes := []rune(value)
|
||||
if len(runes) <= MaxDisplayedRunes {
|
||||
|
||||
@@ -51,3 +51,21 @@ func TestLimitWarningsBoundsOutputAndReportsOmissions(t *testing.T) {
|
||||
t.Fatal("LimitWarnings() mutated its input")
|
||||
}
|
||||
}
|
||||
|
||||
func TestDataQualityResultGroupsFindingsWithoutWarnings(t *testing.T) {
|
||||
result, err := DataQualityResult([]contracts.Warning{
|
||||
{Scope: "records[0]", ReasonCode: "not_near_source", Message: "first"},
|
||||
{Scope: "records[0]", ReasonCode: "not_near_source", Message: "first"},
|
||||
{Scope: "records[1]", ReasonCode: "not_near_source", Message: "second"},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !result.Approved || len(result.Warnings) != 0 || len(result.Diagnostics) != 1 {
|
||||
t.Fatalf("result = %#v", result)
|
||||
}
|
||||
diagnostic := result.Diagnostics[0]
|
||||
if diagnostic.Disposition != contracts.DiagnosticDispositionAdvisory || diagnostic.Category != contracts.DiagnosticCategoryDataQuality || diagnostic.OccurrenceCount != 3 || diagnostic.OmittedSampleCount != 1 || len(diagnostic.Samples) != 2 {
|
||||
t.Fatalf("diagnostic = %#v", diagnostic)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user