package storage import ( "context" "encoding/json" "net/http" "net/http/httptest" "testing" ) // TestHTTPUsageReporter_SendsCorrectContractToCore ist der Nachweis, dass // HTTPUsageReporter exakt den Vertrag von Core internal/resync.Handler. // UsageHandler bedient (Service-Credential-Header, JSON-Feldnamen) — echte // Vernetzung gegen einen laufenden Core-Prozess ist nicht Teil dieses // Tests (internal/resync.Handler ist in Core aktuell in keinem cmd/*/ // main.go verdrahtet, siehe FDN-03-Pruefprotokoll), daher hier gegen einen // httptest-Server geprueft, der denselben Vertrag nachbildet. func TestHTTPUsageReporter_SendsCorrectContractToCore(t *testing.T) { var gotClientID, gotClientSecret string var gotBody []usageDeltaDTO srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { gotClientID = r.Header.Get("X-Nexarch-Client-Id") gotClientSecret = r.Header.Get("X-Nexarch-Client-Secret") if err := json.NewDecoder(r.Body).Decode(&gotBody); err != nil { t.Errorf("anfrage-koerper dekodieren: %v", err) } w.Header().Set("Content-Type", "application/json") _ = json.NewEncoder(w).Encode(map[string]int{"applied": len(gotBody)}) })) defer srv.Close() reporter := NewHTTPUsageReporter(srv.URL, "dms-service-client", "dms-service-secret", nil) if err := reporter.Report(context.Background(), "acme", UsageMetric, 4096); err != nil { t.Fatalf("report: %v", err) } if gotClientID != "dms-service-client" || gotClientSecret != "dms-service-secret" { t.Fatalf("service-credential-header falsch: id=%q secret=%q", gotClientID, gotClientSecret) } if len(gotBody) != 1 { t.Fatalf("erwartet 1 delta im koerper, habe %d", len(gotBody)) } if gotBody[0].TenantSlug != "acme" || gotBody[0].Metric != UsageMetric || gotBody[0].Delta != 4096 { t.Fatalf("unerwarteter delta-inhalt: %+v", gotBody[0]) } } // TestHTTPUsageReporter_RejectsNonOKStatus prueft, dass ein von Core // abgelehnter Aufruf (z.B. ungueltiges Service-Credential) als Fehler // zurueckgegeben wird, statt stillschweigend zu verlieren. func TestHTTPUsageReporter_RejectsNonOKStatus(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { http.Error(w, "ungueltiges service-credential", http.StatusUnauthorized) })) defer srv.Close() reporter := NewHTTPUsageReporter(srv.URL, "x", "y", nil) if err := reporter.Report(context.Background(), "acme", UsageMetric, 1); err == nil { t.Fatal("erwartet fehler bei abgelehnter nutzungsmeldung, habe nil") } }