package internal_api

import (
	"net/http"
	"net/http/httptest"
	"testing"

	"github.com/gin-gonic/gin"
	"github.com/stretchr/testify/require"
	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/trace"
)

func TestTraceMiddlewareExtractsIncomingTraceID(t *testing.T) {
	previousPropagator := otel.GetTextMapPropagator()
	t.Cleanup(func() {
		otel.SetTextMapPropagator(previousPropagator)
	})

	gin.SetMode(gin.TestMode)
	router := gin.New()
	registerTraceMiddleware(router)
	const traceID = "33333333333333333333333333333333"
	router.GET("/trace", func(c *gin.Context) {
		spanContext := trace.SpanContextFromContext(c.Request.Context())
		require.True(t, spanContext.HasTraceID())
		require.Equal(t, traceID, spanContext.TraceID().String())
		c.Status(http.StatusNoContent)
	})

	request := httptest.NewRequest(http.MethodGet, "/trace", nil)
	request.Header.Set("X-Trace-ID", traceID)
	response := httptest.NewRecorder()
	router.ServeHTTP(response, request)
	require.Equal(t, http.StatusNoContent, response.Code)
}
