All checks were successful
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-ai-compliance (push) Successful in 37s
CI / test-python-backend-compliance (push) Successful in 32s
CI / test-python-document-crawler (push) Successful in 22s
CI / test-python-dsms-gateway (push) Successful in 18s
- LegalRAGClient: QDRANT_HOST+PORT → QDRANT_URL + QDRANT_API_KEY - docker-compose: env vars updated for hosted Qdrant - AllowedCollections: added bp_compliance_gdpr, bp_dsfa_templates, bp_dsfa_risks - Migration scripts (bash + python) for data transfer Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
146 lines
4.0 KiB
Go
146 lines
4.0 KiB
Go
package ucca
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestSearchCollection_UsesCorrectCollection(t *testing.T) {
|
|
// Track which collection was requested
|
|
var requestedURL string
|
|
|
|
// Mock Ollama (embedding)
|
|
ollamaMock := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
json.NewEncoder(w).Encode(ollamaEmbeddingResponse{
|
|
Embedding: make([]float64, 1024),
|
|
})
|
|
}))
|
|
defer ollamaMock.Close()
|
|
|
|
// Mock Qdrant
|
|
qdrantMock := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
requestedURL = r.URL.Path
|
|
json.NewEncoder(w).Encode(qdrantSearchResponse{
|
|
Result: []qdrantSearchHit{},
|
|
})
|
|
}))
|
|
defer qdrantMock.Close()
|
|
|
|
// Parse qdrant mock host/port
|
|
client := &LegalRAGClient{
|
|
qdrantURL: qdrantMock.URL,
|
|
ollamaURL: ollamaMock.URL,
|
|
embeddingModel: "bge-m3",
|
|
collection: "bp_compliance_ce",
|
|
httpClient: http.DefaultClient,
|
|
}
|
|
|
|
// Test with explicit collection
|
|
_, err := client.SearchCollection(context.Background(), "bp_compliance_recht", "test query", nil, 3)
|
|
if err != nil {
|
|
t.Fatalf("SearchCollection failed: %v", err)
|
|
}
|
|
|
|
if !strings.Contains(requestedURL, "/collections/bp_compliance_recht/") {
|
|
t.Errorf("Expected collection bp_compliance_recht in URL, got: %s", requestedURL)
|
|
}
|
|
}
|
|
|
|
func TestSearchCollection_FallbackDefault(t *testing.T) {
|
|
var requestedURL string
|
|
|
|
ollamaMock := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
json.NewEncoder(w).Encode(ollamaEmbeddingResponse{
|
|
Embedding: make([]float64, 1024),
|
|
})
|
|
}))
|
|
defer ollamaMock.Close()
|
|
|
|
qdrantMock := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
requestedURL = r.URL.Path
|
|
json.NewEncoder(w).Encode(qdrantSearchResponse{
|
|
Result: []qdrantSearchHit{},
|
|
})
|
|
}))
|
|
defer qdrantMock.Close()
|
|
|
|
client := &LegalRAGClient{
|
|
qdrantURL: qdrantMock.URL,
|
|
ollamaURL: ollamaMock.URL,
|
|
embeddingModel: "bge-m3",
|
|
collection: "bp_compliance_ce",
|
|
httpClient: http.DefaultClient,
|
|
}
|
|
|
|
// Test with empty collection (should fall back to default)
|
|
_, err := client.SearchCollection(context.Background(), "", "test query", nil, 3)
|
|
if err != nil {
|
|
t.Fatalf("SearchCollection failed: %v", err)
|
|
}
|
|
|
|
if !strings.Contains(requestedURL, "/collections/bp_compliance_ce/") {
|
|
t.Errorf("Expected default collection bp_compliance_ce in URL, got: %s", requestedURL)
|
|
}
|
|
}
|
|
|
|
func TestSearch_StillWorks(t *testing.T) {
|
|
var requestedURL string
|
|
|
|
ollamaMock := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
json.NewEncoder(w).Encode(ollamaEmbeddingResponse{
|
|
Embedding: make([]float64, 1024),
|
|
})
|
|
}))
|
|
defer ollamaMock.Close()
|
|
|
|
qdrantMock := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
requestedURL = r.URL.Path
|
|
json.NewEncoder(w).Encode(qdrantSearchResponse{
|
|
Result: []qdrantSearchHit{
|
|
{
|
|
ID: "1",
|
|
Score: 0.95,
|
|
Payload: map[string]interface{}{
|
|
"chunk_text": "Test content",
|
|
"regulation_id": "eu_2016_679",
|
|
"regulation_name_de": "DSGVO",
|
|
"regulation_short": "DSGVO",
|
|
"category": "regulation",
|
|
"source": "https://example.com",
|
|
},
|
|
},
|
|
},
|
|
})
|
|
}))
|
|
defer qdrantMock.Close()
|
|
|
|
client := &LegalRAGClient{
|
|
qdrantURL: qdrantMock.URL,
|
|
ollamaURL: ollamaMock.URL,
|
|
embeddingModel: "bge-m3",
|
|
collection: "bp_compliance_ce",
|
|
httpClient: http.DefaultClient,
|
|
}
|
|
|
|
results, err := client.Search(context.Background(), "DSGVO Art. 35", nil, 5)
|
|
if err != nil {
|
|
t.Fatalf("Search failed: %v", err)
|
|
}
|
|
|
|
if len(results) != 1 {
|
|
t.Fatalf("Expected 1 result, got %d", len(results))
|
|
}
|
|
|
|
if results[0].RegulationCode != "eu_2016_679" {
|
|
t.Errorf("Expected regulation_code eu_2016_679, got %s", results[0].RegulationCode)
|
|
}
|
|
|
|
if !strings.Contains(requestedURL, "/collections/bp_compliance_ce/") {
|
|
t.Errorf("Expected default collection in URL, got: %s", requestedURL)
|
|
}
|
|
}
|