package ucca import "testing" func intentRes(reg, sourceClass string, sem float64, weight int) LegalSearchResult { return LegalSearchResult{ RegulationShort: reg, SourceClass: sourceClass, Score: sem, AuthorityWeight: weight, Jurisdiction: "EU", } } func TestQueryWantsGuidance(t *testing.T) { wants := []string{ "Was empfiehlt der EDPB zum DSB?", "Was sagt die ENISA zu Security Updates?", "laut DSK ...", "Orientierungshilfe zur DSFA", "Welche BSI-Empfehlung gilt?", "Auslegung der Aufsichtsbehörde", } plain := []string{ "Ab wann braucht man einen Datenschutzbeauftragten?", "Welche Anforderungen bestehen an Security Updates?", } for _, q := range wants { if !queryWantsGuidance(q) { t.Errorf("should detect interpretation intent: %q", q) } } for _, q := range plain { if queryWantsGuidance(q) { t.Errorf("should NOT detect intent (norm question): %q", q) } } } func TestRerank_NormQuestion_BindingStaysTop(t *testing.T) { // No intent signal → binding wins even though guidance is semantically higher. results := []LegalSearchResult{ intentRes("EDPB DPO", "supervisory_guidance", 0.64, 70), intentRes("DSGVO", "binding_law", 0.58, 100), } out := rerankByAuthority("Ab wann braucht man einen Datenschutzbeauftragten?", results) if out[0].SourceClass != "binding_law" { t.Errorf("norm question: binding must stay Top-1, got %s", out[0].SourceClass) } } func TestRerank_InterpretationQuestion_GuidanceMayWin(t *testing.T) { // Explicit intent + guidance semantically competitive → guidance wins. results := []LegalSearchResult{ intentRes("EDPB DPO", "supervisory_guidance", 0.64, 70), intentRes("DSGVO", "binding_law", 0.58, 100), } out := rerankByAuthority("Was empfiehlt der EDPB zum Datenschutzbeauftragten?", results) if out[0].SourceClass != "supervisory_guidance" { t.Errorf("interpretation question: guidance should win Top-1, got %s", out[0].SourceClass) } } func TestRerank_OffTopicGuidance_BlockedByGuard(t *testing.T) { // Intent present, but guidance semantic is far below the best binding hit → // the margin guard keeps binding on top (no off-topic guideline override). results := []LegalSearchResult{ intentRes("EDPB DPO", "supervisory_guidance", 0.40, 70), intentRes("DSGVO", "binding_law", 0.58, 100), } out := rerankByAuthority("Was empfiehlt der EDPB zum Datenschutzbeauftragten?", results) if out[0].SourceClass != "binding_law" { t.Errorf("off-topic guidance must not win even with intent, got %s", out[0].SourceClass) } }