package apiserver

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

	"github.com/gin-gonic/gin"
	"github.com/stretchr/testify/require"
)

type middlewareTestHandler struct{}

func (middlewareTestHandler) Name() string {
	return "middleware-test"
}

func (middlewareTestHandler) Register(routers map[RoutePath]gin.IRouter) error {
	routers["/api"].GET("/ping", func(c *gin.Context) {
		c.String(http.StatusOK, "pong")
	})
	return nil
}

func TestAPIServerAppliesPreInitMiddlewareToRouteGroups(t *testing.T) {
	gin.SetMode(gin.TestMode)

	server, err := NewAPIServer(APIServerParam{
		RoutePaths: []RoutePath{"/api"},
		PreInitRoute: func(root gin.IRouter) error {
			root.Use(func(c *gin.Context) {
				c.Header("X-Middleware", "applied")
				c.Next()
			})
			return nil
		},
		Handlers: []Handler{middlewareTestHandler{}},
	})
	require.NoError(t, err)

	rec := httptest.NewRecorder()
	req := httptest.NewRequest(http.MethodGet, "/api/ping", nil)
	server.ServeHTTP(rec, req)

	require.Equal(t, http.StatusOK, rec.Code)
	require.Equal(t, "applied", rec.Header().Get("X-Middleware"))
}
