2023-07-09 15:25:53 +03:00
// Copyright 2023 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package web
import (
"net/http"
"code.gitea.io/gitea/modules/setting"
)
// MockAfterMiddlewares is a general mock point, it's between middlewares and the handler
const MockAfterMiddlewares = "MockAfterMiddlewares"
var routeMockPoints = map [ string ] func ( next http . Handler ) http . Handler { }
2024-06-19 01:32:45 +03:00
// RouterMockPoint registers a mock point as a middleware for testing, example:
2023-07-09 15:25:53 +03:00
//
2024-06-19 01:32:45 +03:00
// r.Use(web.RouterMockPoint("my-mock-point-1"))
// r.Get("/foo", middleware2, web.RouterMockPoint("my-mock-point-2"), middleware2, handler)
2023-07-09 15:25:53 +03:00
//
// Then use web.RouteMock to mock the route execution.
// It only takes effect in testing mode (setting.IsInTesting == true).
2024-06-19 01:32:45 +03:00
func RouterMockPoint ( pointName string ) func ( next http . Handler ) http . Handler {
2023-07-09 15:25:53 +03:00
if ! setting . IsInTesting {
return nil
}
routeMockPoints [ pointName ] = nil
return func ( next http . Handler ) http . Handler {
return http . HandlerFunc ( func ( w http . ResponseWriter , r * http . Request ) {
if h := routeMockPoints [ pointName ] ; h != nil {
h ( next ) . ServeHTTP ( w , r )
} else {
next . ServeHTTP ( w , r )
}
} )
}
}
// RouteMock uses the registered mock point to mock the route execution, example:
//
// defer web.RouteMockReset()
// web.RouteMock(web.MockAfterMiddlewares, func(ctx *context.Context) {
// ctx.WriteResponse(...)
// }
//
// Then the mock function will be executed as a middleware at the mock point.
// It only takes effect in testing mode (setting.IsInTesting == true).
func RouteMock ( pointName string , h any ) {
if _ , ok := routeMockPoints [ pointName ] ; ! ok {
panic ( "route mock point not found: " + pointName )
}
routeMockPoints [ pointName ] = toHandlerProvider ( h )
}
// RouteMockReset resets all mock points (no mock anymore)
func RouteMockReset ( ) {
for k := range routeMockPoints {
routeMockPoints [ k ] = nil // keep the keys because RouteMock will check the keys to make sure no misspelling
}
}