1
0
mirror of https://github.com/gofiber/fiber.git synced 2025-02-24 08:23:43 +00:00

Merge pull request #538 from Fenny/master

Add test cases
This commit is contained in:
fenny 2020-07-04 08:47:00 +02:00 committed by GitHub
commit 0ebec5b688
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 140 additions and 26 deletions

2
app.go
View File

@ -29,7 +29,7 @@ import (
)
// Version of current package
const Version = "1.12.3"
const Version = "1.12.4"
// Map is a shortcut for map[string]interface{}, useful for JSON returns
type Map map[string]interface{}

33
ctx.go
View File

@ -312,8 +312,12 @@ func (ctx *Ctx) Cookie(cookie *Cookie) {
// Cookies is used for getting a cookie value by key
// Returned value is only valid within the handler. Do not store any references.
// Make copies or use the Immutable setting instead.
func (ctx *Ctx) Cookies(key string) (value string) {
return getString(ctx.Fasthttp.Request.Header.Cookie(key))
func (ctx *Ctx) Cookies(key string, defaultValue ...string) (value string) {
value = getString(ctx.Fasthttp.Request.Header.Cookie(key))
if len(defaultValue) > 0 && len(value) == 0 {
return defaultValue[0]
}
return
}
// Download transfers the file from path as an attachment.
@ -461,8 +465,12 @@ func (ctx *Ctx) Fresh() bool {
// Field names are case-insensitive
// Returned value is only valid within the handler. Do not store any references.
// Make copies or use the Immutable setting instead.
func (ctx *Ctx) Get(key string) (value string) {
return getString(ctx.Fasthttp.Request.Header.Peek(key))
func (ctx *Ctx) Get(key string, defaultValue ...string) (value string) {
value = getString(ctx.Fasthttp.Request.Header.Peek(key))
if len(defaultValue) > 0 && len(value) == 0 {
return defaultValue[0]
}
return
}
// Hostname contains the hostname derived from the Host HTTP header.
@ -629,7 +637,7 @@ func (ctx *Ctx) OriginalURL() string {
// Params is used to get the route parameters.
// Defaults to empty string "", if the param doesn't exist.
func (ctx *Ctx) Params(key string) string {
func (ctx *Ctx) Params(key string, defaultValue ...string) (value string) {
for i := range ctx.route.routeParams {
if len(key) != len(ctx.route.routeParams[i]) {
continue
@ -637,12 +645,15 @@ func (ctx *Ctx) Params(key string) string {
if ctx.route.routeParams[i] == key {
// in case values are not here
if len(ctx.values) <= i {
return ""
break
}
return ctx.values[i]
}
}
return ""
if len(defaultValue) > 0 && len(value) == 0 {
return defaultValue[0]
}
return
}
// Path returns the path part of the request URL.
@ -687,8 +698,12 @@ func (ctx *Ctx) Protocol() string {
// Query returns the query string parameter in the url.
// Returned value is only valid within the handler. Do not store any references.
// Make copies or use the Immutable setting instead.
func (ctx *Ctx) Query(key string) (value string) {
return getString(ctx.Fasthttp.QueryArgs().Peek(key))
func (ctx *Ctx) Query(key string, defaultValue ...string) (value string) {
value = getString(ctx.Fasthttp.QueryArgs().Peek(key))
if len(defaultValue) > 0 && len(value) == 0 {
return defaultValue[0]
}
return
}
// Range returns a struct containing the type and a slice of ranges.

View File

@ -4,8 +4,8 @@ import (
"fmt"
"log"
"github.com/gofiber/fiber"
"github.com/valyala/fasthttp"
fiber "github.com/gofiber/fiber"
fasthttp "github.com/valyala/fasthttp"
)
// CompressConfig defines the config for Compress middleware.
@ -67,16 +67,16 @@ func CompressWithConfig(config CompressConfig) fiber.Handler {
func compress(config CompressConfig) fiber.Handler {
// Init middleware settings
var compress fasthttp.RequestHandler
var compressHandler fasthttp.RequestHandler
switch config.Level {
case -1: // Disabled
compress = fasthttp.CompressHandlerBrotliLevel(func(c *fasthttp.RequestCtx) {}, fasthttp.CompressBrotliNoCompression, fasthttp.CompressNoCompression)
compressHandler = fasthttp.CompressHandlerBrotliLevel(func(c *fasthttp.RequestCtx) {}, fasthttp.CompressBrotliNoCompression, fasthttp.CompressNoCompression)
case 1: // Best speed
compress = fasthttp.CompressHandlerBrotliLevel(func(c *fasthttp.RequestCtx) {}, fasthttp.CompressBrotliBestSpeed, fasthttp.CompressBestSpeed)
compressHandler = fasthttp.CompressHandlerBrotliLevel(func(c *fasthttp.RequestCtx) {}, fasthttp.CompressBrotliBestSpeed, fasthttp.CompressBestSpeed)
case 2: // Best compression
compress = fasthttp.CompressHandlerBrotliLevel(func(c *fasthttp.RequestCtx) {}, fasthttp.CompressBrotliBestCompression, fasthttp.CompressBestCompression)
compressHandler = fasthttp.CompressHandlerBrotliLevel(func(c *fasthttp.RequestCtx) {}, fasthttp.CompressBrotliBestCompression, fasthttp.CompressBestCompression)
default: // Default
compress = fasthttp.CompressHandlerBrotliLevel(func(c *fasthttp.RequestCtx) {}, fasthttp.CompressBrotliDefaultCompression, fasthttp.CompressDefaultCompression)
compressHandler = fasthttp.CompressHandlerBrotliLevel(func(c *fasthttp.RequestCtx) {}, fasthttp.CompressBrotliDefaultCompression, fasthttp.CompressDefaultCompression)
}
// Return handler
return func(c *fiber.Ctx) {
@ -88,6 +88,6 @@ func compress(config CompressConfig) fiber.Handler {
// Middleware logic...
c.Next()
// Compress response
compress(c.Fasthttp)
compressHandler(c.Fasthttp)
}
}

View File

@ -31,6 +31,50 @@ func Test_Middleware_Compress(t *testing.T) {
os.Remove("../ctx.go.fiber.gz")
}
// go test -run Test_Middleware_Compress_Config
func Test_Middleware_Compress_Config(t *testing.T) {
app := fiber.New()
app.Use(Compress(CompressConfig{
Level: CompressLevelDefault,
}))
app.Get("/", func(c *fiber.Ctx) {
c.SendFile("../ctx.go", true)
})
req := httptest.NewRequest("GET", "/", nil)
req.Header.Set(fiber.HeaderAcceptEncoding, "gzip")
resp, err := app.Test(req)
utils.AssertEqual(t, nil, err, "app.Test(req)")
utils.AssertEqual(t, 200, resp.StatusCode, "Status code")
utils.AssertEqual(t, "gzip", resp.Header.Get(fiber.HeaderContentEncoding))
utils.AssertEqual(t, fiber.MIMETextPlainCharsetUTF8, resp.Header.Get(fiber.HeaderContentType))
os.Remove("../ctx.go.fiber.gz")
}
// go test -run Test_Middleware_Compress_Level
func Test_Middleware_Compress_Level(t *testing.T) {
app := fiber.New()
app.Use(Compress(2))
app.Get("/", func(c *fiber.Ctx) {
c.SendFile("../ctx.go", true)
})
req := httptest.NewRequest("GET", "/", nil)
req.Header.Set(fiber.HeaderAcceptEncoding, "br")
resp, err := app.Test(req, 3000)
utils.AssertEqual(t, nil, err, "app.Test(req)")
utils.AssertEqual(t, 200, resp.StatusCode, "Status code")
utils.AssertEqual(t, "br", resp.Header.Get(fiber.HeaderContentEncoding))
utils.AssertEqual(t, fiber.MIMETextPlainCharsetUTF8, resp.Header.Get(fiber.HeaderContentType))
os.Remove("../ctx.go.fiber.gz")
}
// go test -v -run=^$ -bench=Benchmark_Middleware_Compress -benchmem -count=4
func Benchmark_Middleware_Compress(b *testing.B) {
app := fiber.New()

View File

@ -10,7 +10,7 @@ import (
"sort"
"strings"
"github.com/gofiber/fiber"
fiber "github.com/gofiber/fiber"
)
// Middleware types

View File

@ -11,9 +11,9 @@ import (
"sync"
"time"
"github.com/gofiber/fiber"
"github.com/gofiber/utils"
"github.com/valyala/bytebufferpool"
fiber "github.com/gofiber/fiber"
utils "github.com/gofiber/utils"
bytebufferpool "github.com/valyala/bytebufferpool"
)
// Middleware types

View File

@ -4,8 +4,8 @@ import (
"fmt"
"log"
"github.com/gofiber/fiber"
"github.com/gofiber/utils"
fiber "github.com/gofiber/fiber"
utils "github.com/gofiber/utils"
)
// Middleware types
@ -95,10 +95,10 @@ func requestID(config RequestIDConfig) fiber.Handler {
rid := ctx.Get(config.Header)
// Create new UUID if empty
if len(rid) <= 0 {
rid = utils.UUID()
rid = config.Generator()
}
// Set new id to response header
ctx.Set(fiber.HeaderXRequestID, rid)
ctx.Set(config.Header, rid)
// Continue stack
ctx.Next()
}

View File

@ -34,6 +34,61 @@ func Test_Middleware_RequestID(t *testing.T) {
utils.AssertEqual(t, reqid, resp.Header.Get(fiber.HeaderXRequestID))
}
// go test -run Test_Middleware_RequestID_Header
func Test_Middleware_RequestID_Header(t *testing.T) {
app := fiber.New()
app.Use(RequestID("X-Test-header"))
app.Get("/", func(ctx *fiber.Ctx) {
ctx.Send("Hello?")
})
resp, err := app.Test(httptest.NewRequest("GET", "/", nil))
utils.AssertEqual(t, nil, err, "app.Test(req)")
utils.AssertEqual(t, 200, resp.StatusCode, "Status code")
reqid := resp.Header.Get("X-Test-header")
utils.AssertEqual(t, 36, len(reqid))
req := httptest.NewRequest("GET", "/", nil)
req.Header.Add("X-Test-header", reqid)
resp, err = app.Test(req)
utils.AssertEqual(t, nil, err, "app.Test(req)")
utils.AssertEqual(t, 200, resp.StatusCode, "Status code")
utils.AssertEqual(t, reqid, resp.Header.Get("X-Test-header"))
}
// go test -run Test_Middleware_RequestID_Config
func Test_Middleware_RequestID_Config(t *testing.T) {
app := fiber.New()
app.Use(RequestID(RequestIDConfig{
Header: "X-Test-Header",
Generator: func() string {
return "johndoe"
},
}))
app.Get("/", func(ctx *fiber.Ctx) {
ctx.Send("Hello?")
})
resp, err := app.Test(httptest.NewRequest("GET", "/", nil))
utils.AssertEqual(t, nil, err, "app.Test(req)")
utils.AssertEqual(t, 200, resp.StatusCode, "Status code")
reqid := resp.Header.Get("X-Test-Header")
utils.AssertEqual(t, "johndoe", reqid)
req := httptest.NewRequest("GET", "/", nil)
req.Header.Add(fiber.HeaderXRequestID, reqid)
resp, err = app.Test(req)
utils.AssertEqual(t, nil, err, "app.Test(req)")
utils.AssertEqual(t, 200, resp.StatusCode, "Status code")
utils.AssertEqual(t, reqid, resp.Header.Get("X-Test-Header"))
}
// go test -v -run=^$ -bench=Benchmark_Middleware_RequestID -benchmem -count=4
func Benchmark_Middleware_RequestID(b *testing.B) {