// ⚡️ Fiber is an Express inspired web framework written in Go with ☕️ // 🤖 Github Repository: https://github.com/gofiber/fiber // 📌 API Documentation: https://docs.gofiber.io package fiber import ( "errors" "io/ioutil" "net/http/httptest" "testing" "github.com/gofiber/fiber/v2/internal/template/html" "github.com/gofiber/fiber/v2/utils" ) // go test -run Test_App_Mount func Test_App_Mount(t *testing.T) { micro := New() micro.Get("/doe", func(c *Ctx) error { return c.SendStatus(StatusOK) }) app := New() app.Mount("/john", micro) resp, err := app.Test(httptest.NewRequest(MethodGet, "/john/doe", nil)) utils.AssertEqual(t, nil, err, "app.Test(req)") utils.AssertEqual(t, 200, resp.StatusCode, "Status code") utils.AssertEqual(t, uint32(2), app.handlersCount) } // go test -run Test_App_Mount_Nested func Test_App_Mount_Nested(t *testing.T) { app := New() one := New() two := New() three := New() two.Mount("/three", three) app.Mount("/one", one) one.Mount("/two", two) one.Get("/doe", func(c *Ctx) error { return c.SendStatus(StatusOK) }) two.Get("/nested", func(c *Ctx) error { return c.SendStatus(StatusOK) }) three.Get("/test", func(c *Ctx) error { return c.SendStatus(StatusOK) }) resp, err := app.Test(httptest.NewRequest(MethodGet, "/one/doe", nil)) 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)) 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)) utils.AssertEqual(t, nil, err, "app.Test(req)") utils.AssertEqual(t, 200, resp.StatusCode, "Status code") utils.AssertEqual(t, uint32(6), app.handlersCount) } // go test -run Test_App_MountPath func Test_App_MountPath(t *testing.T) { app := New() one := New() two := New() three := New() two.Mount("/three", three) one.Mount("/two", two) app.Mount("/one", one) utils.AssertEqual(t, "/one", one.MountPath()) utils.AssertEqual(t, "/one/two", two.MountPath()) utils.AssertEqual(t, "/one/two/three", three.MountPath()) utils.AssertEqual(t, "", app.MountPath()) } func Test_App_ErrorHandler_GroupMount(t *testing.T) { micro := New(Config{ ErrorHandler: func(c *Ctx, err error) error { utils.AssertEqual(t, "0: GET error", err.Error()) return c.Status(500).SendString("1: custom error") }, }) micro.Get("/doe", func(c *Ctx) error { return errors.New("0: GET error") }) app := New() v1 := app.Group("/v1") v1.Mount("/john", micro) resp, err := app.Test(httptest.NewRequest(MethodGet, "/v1/john/doe", nil)) testErrorResponse(t, err, resp, "1: custom error") } func Test_App_ErrorHandler_GroupMountRootLevel(t *testing.T) { micro := New(Config{ ErrorHandler: func(c *Ctx, err error) error { utils.AssertEqual(t, "0: GET error", err.Error()) return c.Status(500).SendString("1: custom error") }, }) micro.Get("/john/doe", func(c *Ctx) error { return errors.New("0: GET error") }) app := New() v1 := app.Group("/v1") v1.Mount("/", micro) resp, err := app.Test(httptest.NewRequest(MethodGet, "/v1/john/doe", nil)) testErrorResponse(t, err, resp, "1: custom error") } // go test -run Test_App_Group_Mount func Test_App_Group_Mount(t *testing.T) { micro := New() micro.Get("/doe", func(c *Ctx) error { return c.SendStatus(StatusOK) }) app := New() v1 := app.Group("/v1") v1.Mount("/john", micro) resp, err := app.Test(httptest.NewRequest(MethodGet, "/v1/john/doe", nil)) utils.AssertEqual(t, nil, err, "app.Test(req)") utils.AssertEqual(t, 200, resp.StatusCode, "Status code") utils.AssertEqual(t, uint32(2), app.handlersCount) } func Test_App_UseMountedErrorHandler(t *testing.T) { app := New() fiber := New(Config{ ErrorHandler: func(ctx *Ctx, err error) error { return ctx.Status(500).SendString("hi, i'm a custom error") }, }) fiber.Get("/", func(c *Ctx) error { return errors.New("something happened") }) app.Mount("/api", fiber) resp, err := app.Test(httptest.NewRequest(MethodGet, "/api", nil)) testErrorResponse(t, err, resp, "hi, i'm a custom error") } func Test_App_UseMountedErrorHandlerRootLevel(t *testing.T) { app := New() fiber := New(Config{ ErrorHandler: func(ctx *Ctx, err error) error { return ctx.Status(500).SendString("hi, i'm a custom error") }, }) fiber.Get("/api", func(c *Ctx) error { return errors.New("something happened") }) app.Mount("/", fiber) resp, err := app.Test(httptest.NewRequest(MethodGet, "/api", nil)) testErrorResponse(t, err, resp, "hi, i'm a custom error") } func Test_App_UseMountedErrorHandlerForBestPrefixMatch(t *testing.T) { app := New() tsf := func(ctx *Ctx, err error) error { return ctx.Status(200).SendString("hi, i'm a custom sub sub fiber error") } tripleSubFiber := New(Config{ ErrorHandler: tsf, }) tripleSubFiber.Get("/", func(c *Ctx) error { return errors.New("something happened") }) sf := func(ctx *Ctx, err error) error { return ctx.Status(200).SendString("hi, i'm a custom sub fiber error") } subfiber := New(Config{ ErrorHandler: sf, }) subfiber.Get("/", func(c *Ctx) error { return errors.New("something happened") }) subfiber.Mount("/third", tripleSubFiber) f := func(ctx *Ctx, err error) error { return ctx.Status(200).SendString("hi, i'm a custom error") } fiber := New(Config{ ErrorHandler: f, }) fiber.Get("/", func(c *Ctx) error { return errors.New("something happened") }) fiber.Mount("/sub", subfiber) app.Mount("/api", fiber) resp, err := app.Test(httptest.NewRequest(MethodGet, "/api/sub", nil)) utils.AssertEqual(t, nil, err, "/api/sub req") utils.AssertEqual(t, 200, resp.StatusCode, "Status code") b, err := ioutil.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)) utils.AssertEqual(t, nil, err, "/api/sub/third req") utils.AssertEqual(t, 200, resp.StatusCode, "Status code") b, err = ioutil.ReadAll(resp2.Body) utils.AssertEqual(t, nil, err, "iotuil.ReadAll()") utils.AssertEqual(t, "hi, i'm a custom sub sub fiber error", string(b), "Third fiber Response body") } // go test -run Test_Ctx_Render_Mount func Test_Ctx_Render_Mount(t *testing.T) { t.Parallel() sub := New(Config{ Views: html.New("./.github/testdata/template", ".gohtml"), }) sub.Get("/:name", func(ctx *Ctx) error { return ctx.Render("hello_world", Map{ "Name": ctx.Params("name"), }) }) app := New() app.Mount("/hello", sub) resp, err := app.Test(httptest.NewRequest(MethodGet, "/hello/a", nil)) utils.AssertEqual(t, StatusOK, resp.StatusCode, "Status code") utils.AssertEqual(t, nil, err, "app.Test(req)") body, err := ioutil.ReadAll(resp.Body) utils.AssertEqual(t, nil, err) utils.AssertEqual(t, "