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
79 lines
3.2 KiB
Makefile
79 lines
3.2 KiB
Makefile
# OwnCord Server — developer convenience targets
|
|
#
|
|
# test Run the test suite the way CI does (race + timeout).
|
|
# test-deadlock Run the deadlock-detection pass CI also runs.
|
|
# cover Per-package coverage (what CI uploads) + a function summary.
|
|
# cover-all Cross-package coverage — the honest number. See below.
|
|
# sqlc-generate Regenerate type-safe Go from sqlc.yaml (db/dbgen).
|
|
# sqlc-verify Fail if the committed dbgen output is stale (used by CI).
|
|
# sqlc-install Install the pinned sqlc version into $GOBIN.
|
|
# protocol-generate Regenerate WS message-type constants (Go + TS) from docs/protocol-schema.json.
|
|
# protocol-verify Fail if the committed protocol constants are stale (used by CI).
|
|
# otel-up Start Jaeger + Prometheus for local tracing development.
|
|
# otel-down Stop and remove the OTel dev containers.
|
|
|
|
SQLC_VERSION := $(shell cat sqlc.version)
|
|
|
|
.PHONY: test test-deadlock cover cover-all sqlc-install sqlc-generate sqlc-verify \
|
|
protocol-generate protocol-verify otel-up otel-down
|
|
|
|
test:
|
|
go test -race -timeout 20m ./...
|
|
|
|
test-deadlock:
|
|
go test -tags deadlock -count=1 ./...
|
|
|
|
# Matches the CI invocation. Note that `go test ./... -coverprofile` instruments
|
|
# each package only for itself, so a package whose code is mostly exercised
|
|
# through another package's tests reports far lower than its real coverage
|
|
# (`service` reads ~37% here versus ~85% cross-package). Use cover-all for the
|
|
# number to reason about; this target exists to reproduce the CI artifact.
|
|
cover:
|
|
go test ./... -coverprofile=coverage.out -cover
|
|
@go tool cover -func=coverage.out | tail -1
|
|
|
|
# Cross-package coverage: every package is instrumented for every test binary,
|
|
# so code reached indirectly is counted. Prints the functions no test reaches at
|
|
# all — the list to work from when closing gaps.
|
|
cover-all:
|
|
go test -count=1 -coverpkg=./... -coverprofile=coverage-all.out ./...
|
|
@echo
|
|
@echo "── functions with no coverage ──────────────────────────────────────"
|
|
@go tool cover -func=coverage-all.out | awk '$$NF=="0.0%"' | sed 's|github.com/owncord/server/||'
|
|
@echo
|
|
@go tool cover -func=coverage-all.out | tail -1
|
|
|
|
sqlc-install:
|
|
go install github.com/sqlc-dev/sqlc/cmd/sqlc@$(SQLC_VERSION)
|
|
|
|
sqlc-generate:
|
|
sqlc generate
|
|
|
|
sqlc-verify:
|
|
sqlc generate
|
|
@git diff --exit-code db/dbgen || ( \
|
|
echo "ERROR: generated sqlc output is stale. Run 'make sqlc-generate' and commit the result." ; \
|
|
exit 1 ; \
|
|
)
|
|
|
|
protocol-generate:
|
|
go run ./scripts/genprotocol
|
|
|
|
protocol-verify:
|
|
go run ./scripts/genprotocol
|
|
@git diff --exit-code ws/message_types.go ../Client/tauri-client/src/lib/protocolTypes.ts || ( \
|
|
echo "ERROR: generated protocol constants are stale. Run 'make protocol-generate' and commit the result." ; \
|
|
exit 1 ; \
|
|
)
|
|
|
|
# Phase B Step 8 — local OTel development stack.
|
|
# Starts Jaeger (traces) and Prometheus (metrics) in Docker.
|
|
# Jaeger UI: http://localhost:16686
|
|
# Prometheus UI: http://localhost:9090
|
|
# Run the server with: go build -tags otel . && ./owncord-server
|
|
otel-up:
|
|
docker compose -f docker-compose.otel.yml up -d
|
|
|
|
otel-down:
|
|
docker compose -f docker-compose.otel.yml down
|