mirror of
https://github.com/syntrex-lab/gomcp.git
synced 2026-04-26 21:06:21 +02:00
106 lines
2.8 KiB
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")
|
|
}
|