github.com/gofiber/fiber/v2@v2.47.0/middleware/compress/compress_test.go (about)

     1  package compress
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"io"
     7  	"net/http/httptest"
     8  	"os"
     9  	"testing"
    10  
    11  	"github.com/gofiber/fiber/v2"
    12  	"github.com/gofiber/fiber/v2/utils"
    13  )
    14  
    15  var filedata []byte
    16  
    17  func init() {
    18  	dat, err := os.ReadFile("../../.github/README.md")
    19  	if err != nil {
    20  		panic(err)
    21  	}
    22  	filedata = dat
    23  }
    24  
    25  // go test -run Test_Compress_Gzip
    26  func Test_Compress_Gzip(t *testing.T) {
    27  	t.Parallel()
    28  	app := fiber.New()
    29  
    30  	app.Use(New())
    31  
    32  	app.Get("/", func(c *fiber.Ctx) error {
    33  		c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)
    34  		return c.Send(filedata)
    35  	})
    36  
    37  	req := httptest.NewRequest(fiber.MethodGet, "/", nil)
    38  	req.Header.Set("Accept-Encoding", "gzip")
    39  
    40  	resp, err := app.Test(req)
    41  	utils.AssertEqual(t, nil, err, "app.Test(req)")
    42  	utils.AssertEqual(t, 200, resp.StatusCode, "Status code")
    43  	utils.AssertEqual(t, "gzip", resp.Header.Get(fiber.HeaderContentEncoding))
    44  
    45  	// Validate that the file size has shrunk
    46  	body, err := io.ReadAll(resp.Body)
    47  	utils.AssertEqual(t, nil, err)
    48  	utils.AssertEqual(t, true, len(body) < len(filedata))
    49  }
    50  
    51  // go test -run Test_Compress_Different_Level
    52  func Test_Compress_Different_Level(t *testing.T) {
    53  	t.Parallel()
    54  	levels := []Level{LevelBestSpeed, LevelBestCompression}
    55  	for _, level := range levels {
    56  		t.Run(fmt.Sprintf("level %d", level), func(t *testing.T) {
    57  			t.Parallel()
    58  			app := fiber.New()
    59  
    60  			app.Use(New(Config{Level: level}))
    61  
    62  			app.Get("/", func(c *fiber.Ctx) error {
    63  				c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)
    64  				return c.Send(filedata)
    65  			})
    66  
    67  			req := httptest.NewRequest(fiber.MethodGet, "/", nil)
    68  			req.Header.Set("Accept-Encoding", "gzip")
    69  
    70  			resp, err := app.Test(req)
    71  			utils.AssertEqual(t, nil, err, "app.Test(req)")
    72  			utils.AssertEqual(t, 200, resp.StatusCode, "Status code")
    73  			utils.AssertEqual(t, "gzip", resp.Header.Get(fiber.HeaderContentEncoding))
    74  
    75  			// Validate that the file size has shrunk
    76  			body, err := io.ReadAll(resp.Body)
    77  			utils.AssertEqual(t, nil, err)
    78  			utils.AssertEqual(t, true, len(body) < len(filedata))
    79  		})
    80  	}
    81  }
    82  
    83  func Test_Compress_Deflate(t *testing.T) {
    84  	t.Parallel()
    85  	app := fiber.New()
    86  
    87  	app.Use(New())
    88  
    89  	app.Get("/", func(c *fiber.Ctx) error {
    90  		return c.Send(filedata)
    91  	})
    92  
    93  	req := httptest.NewRequest(fiber.MethodGet, "/", nil)
    94  	req.Header.Set("Accept-Encoding", "deflate")
    95  
    96  	resp, err := app.Test(req)
    97  	utils.AssertEqual(t, nil, err, "app.Test(req)")
    98  	utils.AssertEqual(t, 200, resp.StatusCode, "Status code")
    99  	utils.AssertEqual(t, "deflate", resp.Header.Get(fiber.HeaderContentEncoding))
   100  
   101  	// Validate that the file size has shrunk
   102  	body, err := io.ReadAll(resp.Body)
   103  	utils.AssertEqual(t, nil, err)
   104  	utils.AssertEqual(t, true, len(body) < len(filedata))
   105  }
   106  
   107  func Test_Compress_Brotli(t *testing.T) {
   108  	t.Parallel()
   109  	app := fiber.New()
   110  
   111  	app.Use(New())
   112  
   113  	app.Get("/", func(c *fiber.Ctx) error {
   114  		return c.Send(filedata)
   115  	})
   116  
   117  	req := httptest.NewRequest(fiber.MethodGet, "/", nil)
   118  	req.Header.Set("Accept-Encoding", "br")
   119  
   120  	resp, err := app.Test(req, 10000)
   121  	utils.AssertEqual(t, nil, err, "app.Test(req)")
   122  	utils.AssertEqual(t, 200, resp.StatusCode, "Status code")
   123  	utils.AssertEqual(t, "br", resp.Header.Get(fiber.HeaderContentEncoding))
   124  
   125  	// Validate that the file size has shrunk
   126  	body, err := io.ReadAll(resp.Body)
   127  	utils.AssertEqual(t, nil, err)
   128  	utils.AssertEqual(t, true, len(body) < len(filedata))
   129  }
   130  
   131  func Test_Compress_Disabled(t *testing.T) {
   132  	t.Parallel()
   133  	app := fiber.New()
   134  
   135  	app.Use(New(Config{Level: LevelDisabled}))
   136  
   137  	app.Get("/", func(c *fiber.Ctx) error {
   138  		return c.Send(filedata)
   139  	})
   140  
   141  	req := httptest.NewRequest(fiber.MethodGet, "/", nil)
   142  	req.Header.Set("Accept-Encoding", "br")
   143  
   144  	resp, err := app.Test(req)
   145  	utils.AssertEqual(t, nil, err, "app.Test(req)")
   146  	utils.AssertEqual(t, 200, resp.StatusCode, "Status code")
   147  	utils.AssertEqual(t, "", resp.Header.Get(fiber.HeaderContentEncoding))
   148  
   149  	// Validate the file size is not shrunk
   150  	body, err := io.ReadAll(resp.Body)
   151  	utils.AssertEqual(t, nil, err)
   152  	utils.AssertEqual(t, true, len(body) == len(filedata))
   153  }
   154  
   155  func Test_Compress_Next_Error(t *testing.T) {
   156  	t.Parallel()
   157  	app := fiber.New()
   158  
   159  	app.Use(New())
   160  
   161  	app.Get("/", func(c *fiber.Ctx) error {
   162  		return errors.New("next error")
   163  	})
   164  
   165  	req := httptest.NewRequest(fiber.MethodGet, "/", nil)
   166  	req.Header.Set("Accept-Encoding", "gzip")
   167  
   168  	resp, err := app.Test(req)
   169  	utils.AssertEqual(t, nil, err, "app.Test(req)")
   170  	utils.AssertEqual(t, 500, resp.StatusCode, "Status code")
   171  	utils.AssertEqual(t, "", resp.Header.Get(fiber.HeaderContentEncoding))
   172  
   173  	body, err := io.ReadAll(resp.Body)
   174  	utils.AssertEqual(t, nil, err)
   175  	utils.AssertEqual(t, "next error", string(body))
   176  }
   177  
   178  // go test -run Test_Compress_Next
   179  func Test_Compress_Next(t *testing.T) {
   180  	t.Parallel()
   181  	app := fiber.New()
   182  	app.Use(New(Config{
   183  		Next: func(_ *fiber.Ctx) bool {
   184  			return true
   185  		},
   186  	}))
   187  
   188  	resp, err := app.Test(httptest.NewRequest(fiber.MethodGet, "/", nil))
   189  	utils.AssertEqual(t, nil, err)
   190  	utils.AssertEqual(t, fiber.StatusNotFound, resp.StatusCode)
   191  }