mirror of
https://github.com/J3vb/OwnCord.git
synced 2026-09-03 03:50:00 +03:00
Audits what actually has tests, then closes the gaps it found. Full write-up with before/after numbers in docs/audit-test-coverage-2026-07-25.md. Measurement first: `go test ./... -coverprofile` (what CI runs) instruments each package only for itself, so code exercised through another package's tests reads as uncovered — `service` reported 36.7% against a real 85%. All analysis here uses -coverpkg=./..., and both views now have Makefile targets. Features that had zero coverage at every layer: - user blocking (db + service + the /api/v1/blocks routes) - auth lockout persistence — the DB round-trip that survives a restart - plugin install/enable/disable/uninstall and the plugin KV namespace - event replay bounds (GetMaxEventSeq, PruneEventsOlderThan) - LiveKit participant_joined webhook (replayed-token guard), the room-service client, and proxyWebSocket/copyWS - ws_proxy.rs and livekit_proxy.rs — pure helpers extracted, matching the existing tofu.rs pattern, so cert-pin and header-injection checks are testable Gaps that were hidden rather than absent: - Server/admin reported 0.3% coverage with 307 tests passing. TestSpawnDetached_* re-execs the test binary; the child inherited GOCOVERDIR and the parent's stdout, clobbering the profile and printing "[no tests to run]". Now 71.4%, and CI's uploaded artifact is correct. - vitest.config.ts excluded 2.2k LOC unexplained, including two files that already had tests. Trimmed to three entries, each justified inline. - api.HandleLiveKitHealthForTest re-implemented the handler it claimed to expose, so eight call sites tested a copy. Added a hook to the real one. Two bugs found and pinned rather than silently patched: logctx.WithGroup nests req_id under the group, and drag-reorder.ts takes one listener ref per channel but releases one per sidebar, so the count never reaches zero. Coverage: client 92.93% -> 94.87% statements (3371 -> 3572 tests) even after un-excluding hidden files; Rust 47 -> 74 tests; Go zero-coverage functions ~70 -> 21, with plugin 61->77%, admin 67->86%, db 76->84%, service 85->91%. Verified: go vet, all four build-tag variants, go test -race, -tags deadlock, vitest --coverage, cargo test --lib, cargo clippy --all-targets, playwright. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AEETs3Vh6sAHHb1jMBL75g
83 lines
2.9 KiB
Go
83 lines
2.9 KiB
Go
package logctx
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"log/slog"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/go-chi/chi/v5/middleware"
|
|
)
|
|
|
|
// TestHandlerAddsReqID verifies the enriching handler stamps req_id when the
|
|
// context carries a chi request ID, and omits it otherwise. (trace_id is only
|
|
// populated under -tags otel and is covered by manual verification.)
|
|
func TestHandlerAddsReqID(t *testing.T) {
|
|
var buf bytes.Buffer
|
|
log := slog.New(New(slog.NewTextHandler(&buf, nil)))
|
|
|
|
ctx := context.WithValue(context.Background(), middleware.RequestIDKey, "req-abc-123")
|
|
log.InfoContext(ctx, "hello")
|
|
if !strings.Contains(buf.String(), "req_id=req-abc-123") {
|
|
t.Errorf("expected req_id in output, got: %s", buf.String())
|
|
}
|
|
|
|
buf.Reset()
|
|
log.InfoContext(context.Background(), "plain")
|
|
if strings.Contains(buf.String(), "req_id") {
|
|
t.Errorf("did not expect req_id without a request ID: %s", buf.String())
|
|
}
|
|
|
|
// Enrichment must survive logger.With (WithAttrs re-wrap).
|
|
buf.Reset()
|
|
log.With("k", "v").InfoContext(ctx, "withattrs")
|
|
if !strings.Contains(buf.String(), "req_id=req-abc-123") {
|
|
t.Errorf("expected req_id to survive With(): %s", buf.String())
|
|
}
|
|
}
|
|
|
|
// TestHandlerSurvivesWithGroup covers the WithGroup re-wrap and pins the known
|
|
// nesting caveat the WithGroup doc comment flags.
|
|
//
|
|
// Enrichment survives the re-wrap, but because Handle calls r.AddAttrs *after*
|
|
// the inner handler has opened the group, req_id lands as "http.req_id" rather
|
|
// than at the record's top level. That is only harmless while no logger-level
|
|
// groups are opened in production code — which is true today, and is exactly
|
|
// the condition the source comment says to revisit. If someone introduces
|
|
// slog groups, this test is what tells them log searches for a bare `req_id`
|
|
// will stop matching.
|
|
func TestHandlerSurvivesWithGroup(t *testing.T) {
|
|
var buf bytes.Buffer
|
|
log := slog.New(New(slog.NewTextHandler(&buf, nil)))
|
|
ctx := context.WithValue(context.Background(), middleware.RequestIDKey, "req-group-1")
|
|
|
|
log.WithGroup("http").InfoContext(ctx, "grouped", "status", 200)
|
|
|
|
out := buf.String()
|
|
if !strings.Contains(out, "req-group-1") {
|
|
t.Errorf("req_id was dropped by WithGroup(): %s", out)
|
|
}
|
|
if !strings.Contains(out, "http.req_id=req-group-1") {
|
|
t.Errorf("current behaviour is to nest req_id under the group; got: %s", out)
|
|
}
|
|
if !strings.Contains(out, "http.status=200") {
|
|
t.Errorf("expected the group to still apply to record attrs: %s", out)
|
|
}
|
|
}
|
|
|
|
// TestHandlerEnabledDelegates confirms the wrapper does not widen or narrow the
|
|
// inner handler's level.
|
|
func TestHandlerEnabledDelegates(t *testing.T) {
|
|
var buf bytes.Buffer
|
|
inner := slog.NewTextHandler(&buf, &slog.HandlerOptions{Level: slog.LevelWarn})
|
|
h := New(inner)
|
|
|
|
if h.Enabled(context.Background(), slog.LevelInfo) {
|
|
t.Error("Enabled(Info) = true for a Warn-level inner handler")
|
|
}
|
|
if !h.Enabled(context.Background(), slog.LevelError) {
|
|
t.Error("Enabled(Error) = false for a Warn-level inner handler")
|
|
}
|
|
}
|