12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- // 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{}
-
- // RouteMockPoint registers a mock point as a middleware for testing, example:
- //
- // r.Use(web.RouteMockPoint("my-mock-point-1"))
- // r.Get("/foo", middleware2, web.RouteMockPoint("my-mock-point-2"), middleware2, handler)
- //
- // Then use web.RouteMock to mock the route execution.
- // It only takes effect in testing mode (setting.IsInTesting == true).
- func RouteMockPoint(pointName string) func(next http.Handler) http.Handler {
- 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
- }
- }
|