gomcp/internal/infrastructure/tracing/tracing_test.go

106 lines
2.8 KiB
Go

package tracing
import (
"context"
"net/http"
"net/http/httptest"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// --- InitTracer Tests ---
func TestInitTracer_NoopWhenEndpointEmpty(t *testing.T) {
tp, err := InitTracer(context.Background(), "")
require.NoError(t, err)
assert.Nil(t, tp, "empty endpoint should return nil TracerProvider (noop)")
}
func TestShutdown_NilProvider_NoPanic(t *testing.T) {
// Should not panic when called with nil.
assert.NotPanics(t, func() {
Shutdown(context.Background(), nil)
})
}
func TestTracer_ReturnsNonNil(t *testing.T) {
tr := Tracer("test-tracer")
assert.NotNil(t, tr)
}
// --- HTTPMiddleware Tests ---
func TestHTTPMiddleware_SetsStatusCode(t *testing.T) {
handler := HTTPMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusCreated)
w.Write([]byte("created"))
}))
req := httptest.NewRequest(http.MethodPost, "/api/soc/event", nil)
rr := httptest.NewRecorder()
handler.ServeHTTP(rr, req)
assert.Equal(t, http.StatusCreated, rr.Code)
assert.Equal(t, "created", rr.Body.String())
}
func TestHTTPMiddleware_Default200(t *testing.T) {
handler := HTTPMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("ok"))
}))
req := httptest.NewRequest(http.MethodGet, "/healthz", nil)
rr := httptest.NewRecorder()
handler.ServeHTTP(rr, req)
assert.Equal(t, http.StatusOK, rr.Code)
}
func TestHTTPMiddleware_ErrorStatus(t *testing.T) {
handler := HTTPMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusInternalServerError)
}))
req := httptest.NewRequest(http.MethodGet, "/error", nil)
rr := httptest.NewRecorder()
handler.ServeHTTP(rr, req)
assert.Equal(t, http.StatusInternalServerError, rr.Code)
}
// --- statusWriter Tests ---
func TestStatusWriter_DefaultStatus(t *testing.T) {
rr := httptest.NewRecorder()
sw := &statusWriter{ResponseWriter: rr, status: http.StatusOK}
assert.Equal(t, http.StatusOK, sw.status)
assert.False(t, sw.wroteHeader)
}
func TestStatusWriter_WriteHeaderOnce(t *testing.T) {
rr := httptest.NewRecorder()
sw := &statusWriter{ResponseWriter: rr, status: http.StatusOK}
sw.WriteHeader(http.StatusNotFound)
assert.Equal(t, http.StatusNotFound, sw.status)
assert.True(t, sw.wroteHeader)
// Second call should NOT change status.
sw.WriteHeader(http.StatusCreated)
assert.Equal(t, http.StatusNotFound, sw.status, "status should not change on second WriteHeader")
}
func TestStatusWriter_WriteImplicitHeader(t *testing.T) {
rr := httptest.NewRecorder()
sw := &statusWriter{ResponseWriter: rr, status: http.StatusOK}
n, err := sw.Write([]byte("hello"))
assert.NoError(t, err)
assert.Equal(t, 5, n)
assert.True(t, sw.wroteHeader, "Write should set wroteHeader")
}