Skip to content

Commit

Permalink
[Bug-fix]: Wrong handlers execution order in some mount cases #2460
Browse files Browse the repository at this point in the history
  • Loading branch information
ReneWerner87 committed May 17, 2023
1 parent 8d4a97c commit 87b5159
Showing 1 changed file with 29 additions and 26 deletions.
55 changes: 29 additions & 26 deletions mount_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ package fiber
import (
"errors"
"io"
"net/http"
"net/http/httptest"
"testing"

Expand All @@ -25,7 +26,7 @@ func Test_App_Mount(t *testing.T) {

app := New()
app.Mount("/john", micro)
resp, err := app.Test(httptest.NewRequest(MethodGet, "/john/doe", nil))
resp, err := app.Test(httptest.NewRequest(MethodGet, "/john/doe", http.NoBody))
utils.AssertEqual(t, nil, err, "app.Test(req)")
utils.AssertEqual(t, 200, resp.StatusCode, "Status code")
utils.AssertEqual(t, uint32(2), app.handlersCount)
Expand All @@ -45,7 +46,7 @@ func Test_App_Mount_RootPath_Nested(t *testing.T) {
dynamic.Mount("/api", apiserver)
app.Mount("/", dynamic)

resp, err := app.Test(httptest.NewRequest(MethodGet, "/api/v1/home", nil))
resp, err := app.Test(httptest.NewRequest(MethodGet, "/api/v1/home", http.NoBody))
utils.AssertEqual(t, nil, err, "app.Test(req)")
utils.AssertEqual(t, 200, resp.StatusCode, "Status code")
utils.AssertEqual(t, uint32(2), app.handlersCount)
Expand Down Expand Up @@ -75,15 +76,15 @@ func Test_App_Mount_Nested(t *testing.T) {
return c.SendStatus(StatusOK)
})

resp, err := app.Test(httptest.NewRequest(MethodGet, "/one/doe", nil))
resp, err := app.Test(httptest.NewRequest(MethodGet, "/one/doe", http.NoBody))
utils.AssertEqual(t, nil, err, "app.Test(req)")
utils.AssertEqual(t, 200, resp.StatusCode, "Status code")

resp, err = app.Test(httptest.NewRequest(MethodGet, "/one/two/nested", nil))
resp, err = app.Test(httptest.NewRequest(MethodGet, "/one/two/nested", http.NoBody))
utils.AssertEqual(t, nil, err, "app.Test(req)")
utils.AssertEqual(t, 200, resp.StatusCode, "Status code")

resp, err = app.Test(httptest.NewRequest(MethodGet, "/one/two/three/test", nil))
resp, err = app.Test(httptest.NewRequest(MethodGet, "/one/two/three/test", http.NoBody))
utils.AssertEqual(t, nil, err, "app.Test(req)")
utils.AssertEqual(t, 200, resp.StatusCode, "Status code")

Expand All @@ -99,11 +100,12 @@ func Test_App_Mount_Express_Behavior(t *testing.T) {
return c.SendString(body)
}
}
testEndpoint := func(app *App, route, expectedBody string) {
resp, err := app.Test(httptest.NewRequest(MethodGet, route, nil))
testEndpoint := func(app *App, route, expectedBody string, statusCode int) {
resp, err := app.Test(httptest.NewRequest(MethodGet, route, http.NoBody))
utils.AssertEqual(t, nil, err, "app.Test(req)")
body, err := io.ReadAll(resp.Body)
utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, statusCode, resp.StatusCode, "Status code")
utils.AssertEqual(t, expectedBody, string(body), "Unexpected response body")
}

Expand All @@ -130,11 +132,11 @@ func Test_App_Mount_Express_Behavior(t *testing.T) {
})
}
// expectation check
testEndpoint(app, "/world", "subapp world!")
testEndpoint(app, "/hello", "app hello!")
testEndpoint(app, "/bar", "subapp bar!")
testEndpoint(app, "/foo", "subapp foo!")
testEndpoint(app, "/unknown", ErrNotFound.Message)
testEndpoint(app, "/world", "subapp world!", StatusOK)
testEndpoint(app, "/hello", "app hello!", StatusOK)
testEndpoint(app, "/bar", "subapp bar!", StatusOK)
testEndpoint(app, "/foo", "subapp foo!", StatusOK)
testEndpoint(app, "/unknown", ErrNotFound.Message, StatusNotFound)

utils.AssertEqual(t, uint32(17), app.handlersCount)
utils.AssertEqual(t, uint32(16+9), app.routesCount)
Expand All @@ -144,10 +146,11 @@ func Test_App_Mount_Express_Behavior(t *testing.T) {
func Test_App_Mount_RoutePositions(t *testing.T) {
t.Parallel()
testEndpoint := func(app *App, route, expectedBody string) {
resp, err := app.Test(httptest.NewRequest(MethodGet, route, nil))
resp, err := app.Test(httptest.NewRequest(MethodGet, route, http.NoBody))
utils.AssertEqual(t, nil, err, "app.Test(req)")
body, err := io.ReadAll(resp.Body)
utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, StatusOK, resp.StatusCode, "Status code")
utils.AssertEqual(t, expectedBody, string(body), "Unexpected response body")
}

Expand Down Expand Up @@ -243,7 +246,7 @@ func Test_App_ErrorHandler_GroupMount(t *testing.T) {
v1 := app.Group("/v1")
v1.Mount("/john", micro)

resp, err := app.Test(httptest.NewRequest(MethodGet, "/v1/john/doe", nil))
resp, err := app.Test(httptest.NewRequest(MethodGet, "/v1/john/doe", http.NoBody))
testErrorResponse(t, err, resp, "1: custom error")
}

Expand All @@ -263,7 +266,7 @@ func Test_App_ErrorHandler_GroupMountRootLevel(t *testing.T) {
v1 := app.Group("/v1")
v1.Mount("/", micro)

resp, err := app.Test(httptest.NewRequest(MethodGet, "/v1/john/doe", nil))
resp, err := app.Test(httptest.NewRequest(MethodGet, "/v1/john/doe", http.NoBody))
testErrorResponse(t, err, resp, "1: custom error")
}

Expand All @@ -279,7 +282,7 @@ func Test_App_Group_Mount(t *testing.T) {
v1 := app.Group("/v1")
v1.Mount("/john", micro)

resp, err := app.Test(httptest.NewRequest(MethodGet, "/v1/john/doe", nil))
resp, err := app.Test(httptest.NewRequest(MethodGet, "/v1/john/doe", http.NoBody))
utils.AssertEqual(t, nil, err, "app.Test(req)")
utils.AssertEqual(t, 200, resp.StatusCode, "Status code")
utils.AssertEqual(t, uint32(2), app.handlersCount)
Expand All @@ -300,7 +303,7 @@ func Test_App_UseParentErrorHandler(t *testing.T) {

app.Mount("/api", fiber)

resp, err := app.Test(httptest.NewRequest(MethodGet, "/api", nil))
resp, err := app.Test(httptest.NewRequest(MethodGet, "/api", http.NoBody))
testErrorResponse(t, err, resp, "hi, i'm a custom error")
}

Expand All @@ -319,7 +322,7 @@ func Test_App_UseMountedErrorHandler(t *testing.T) {

app.Mount("/api", fiber)

resp, err := app.Test(httptest.NewRequest(MethodGet, "/api", nil))
resp, err := app.Test(httptest.NewRequest(MethodGet, "/api", http.NoBody))
testErrorResponse(t, err, resp, "hi, i'm a custom error")
}

Expand All @@ -338,7 +341,7 @@ func Test_App_UseMountedErrorHandlerRootLevel(t *testing.T) {

app.Mount("/", fiber)

resp, err := app.Test(httptest.NewRequest(MethodGet, "/api", nil))
resp, err := app.Test(httptest.NewRequest(MethodGet, "/api", http.NoBody))
testErrorResponse(t, err, resp, "hi, i'm a custom error")
}

Expand Down Expand Up @@ -380,15 +383,15 @@ func Test_App_UseMountedErrorHandlerForBestPrefixMatch(t *testing.T) {

app.Mount("/api", fiber)

resp, err := app.Test(httptest.NewRequest(MethodGet, "/api/sub", nil))
resp, err := app.Test(httptest.NewRequest(MethodGet, "/api/sub", http.NoBody))
utils.AssertEqual(t, nil, err, "/api/sub req")
utils.AssertEqual(t, 200, resp.StatusCode, "Status code")

b, err := io.ReadAll(resp.Body)
utils.AssertEqual(t, nil, err, "iotuil.ReadAll()")
utils.AssertEqual(t, "hi, i'm a custom sub fiber error", string(b), "Response body")

resp2, err := app.Test(httptest.NewRequest(MethodGet, "/api/sub/third", nil))
resp2, err := app.Test(httptest.NewRequest(MethodGet, "/api/sub/third", http.NoBody))
utils.AssertEqual(t, nil, err, "/api/sub/third req")
utils.AssertEqual(t, 200, resp.StatusCode, "Status code")

Expand All @@ -414,7 +417,7 @@ func Test_Ctx_Render_Mount(t *testing.T) {
app := New()
app.Mount("/hello", sub)

resp, err := app.Test(httptest.NewRequest(MethodGet, "/hello/a", nil))
resp, err := app.Test(httptest.NewRequest(MethodGet, "/hello/a", http.NoBody))
utils.AssertEqual(t, StatusOK, resp.StatusCode, "Status code")
utils.AssertEqual(t, nil, err, "app.Test(req)")

Expand Down Expand Up @@ -466,23 +469,23 @@ func Test_Ctx_Render_Mount_ParentOrSubHasViews(t *testing.T) {
sub.Mount("/bruh", sub2)
app.Mount("/hello", sub)

resp, err := app.Test(httptest.NewRequest(MethodGet, "/hello/world/a", nil))
resp, err := app.Test(httptest.NewRequest(MethodGet, "/hello/world/a", http.NoBody))
utils.AssertEqual(t, StatusOK, resp.StatusCode, "Status code")
utils.AssertEqual(t, nil, err, "app.Test(req)")

body, err := io.ReadAll(resp.Body)
utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, "<h1>Hello a!</h1>", string(body))

resp, err = app.Test(httptest.NewRequest(MethodGet, "/test", nil))
resp, err = app.Test(httptest.NewRequest(MethodGet, "/test", http.NoBody))
utils.AssertEqual(t, StatusOK, resp.StatusCode, "Status code")
utils.AssertEqual(t, nil, err, "app.Test(req)")

body, err = io.ReadAll(resp.Body)
utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, "<h1>Hello, World!</h1>", string(body))

resp, err = app.Test(httptest.NewRequest(MethodGet, "/hello/bruh/moment", nil))
resp, err = app.Test(httptest.NewRequest(MethodGet, "/hello/bruh/moment", http.NoBody))
utils.AssertEqual(t, StatusOK, resp.StatusCode, "Status code")
utils.AssertEqual(t, nil, err, "app.Test(req)")

Expand All @@ -508,7 +511,7 @@ func Test_Ctx_Render_MountGroup(t *testing.T) {
v1 := app.Group("/v1")
v1.Mount("/john", micro)

resp, err := app.Test(httptest.NewRequest(MethodGet, "/v1/john/doe", nil))
resp, err := app.Test(httptest.NewRequest(MethodGet, "/v1/john/doe", http.NoBody))
utils.AssertEqual(t, nil, err, "app.Test(req)")
utils.AssertEqual(t, 200, resp.StatusCode, "Status code")

Expand Down

0 comments on commit 87b5159

Please sign in to comment.