github.com/gofiber/fiber/v2@v2.47.0/middleware/monitor/monitor_test.go (about)

     1  package monitor
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"io"
     7  	"net/http/httptest"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/gofiber/fiber/v2"
    12  	"github.com/gofiber/fiber/v2/utils"
    13  
    14  	"github.com/valyala/fasthttp"
    15  )
    16  
    17  func Test_Monitor_405(t *testing.T) {
    18  	t.Parallel()
    19  
    20  	app := fiber.New()
    21  
    22  	app.Use("/", New())
    23  
    24  	resp, err := app.Test(httptest.NewRequest(fiber.MethodPost, "/", nil))
    25  	utils.AssertEqual(t, nil, err)
    26  	utils.AssertEqual(t, 405, resp.StatusCode)
    27  }
    28  
    29  func Test_Monitor_Html(t *testing.T) {
    30  	t.Parallel()
    31  
    32  	app := fiber.New()
    33  
    34  	// defaults
    35  	app.Get("/", New())
    36  	resp, err := app.Test(httptest.NewRequest(fiber.MethodGet, "/", nil))
    37  
    38  	utils.AssertEqual(t, nil, err)
    39  	utils.AssertEqual(t, 200, resp.StatusCode)
    40  	utils.AssertEqual(t, fiber.MIMETextHTMLCharsetUTF8,
    41  		resp.Header.Get(fiber.HeaderContentType))
    42  	buf, err := io.ReadAll(resp.Body)
    43  	utils.AssertEqual(t, nil, err)
    44  	utils.AssertEqual(t, true, bytes.Contains(buf, []byte("<title>"+defaultTitle+"</title>")))
    45  	timeoutLine := fmt.Sprintf("setTimeout(fetchJSON, %d)",
    46  		defaultRefresh.Milliseconds()-timeoutDiff)
    47  	utils.AssertEqual(t, true, bytes.Contains(buf, []byte(timeoutLine)))
    48  
    49  	// custom config
    50  	conf := Config{Title: "New " + defaultTitle, Refresh: defaultRefresh + time.Second}
    51  	app.Get("/custom", New(conf))
    52  	resp, err = app.Test(httptest.NewRequest(fiber.MethodGet, "/custom", nil))
    53  
    54  	utils.AssertEqual(t, nil, err)
    55  	utils.AssertEqual(t, 200, resp.StatusCode)
    56  	utils.AssertEqual(t, fiber.MIMETextHTMLCharsetUTF8,
    57  		resp.Header.Get(fiber.HeaderContentType))
    58  	buf, err = io.ReadAll(resp.Body)
    59  	utils.AssertEqual(t, nil, err)
    60  	utils.AssertEqual(t, true, bytes.Contains(buf, []byte("<title>"+conf.Title+"</title>")))
    61  	timeoutLine = fmt.Sprintf("setTimeout(fetchJSON, %d)",
    62  		conf.Refresh.Milliseconds()-timeoutDiff)
    63  	utils.AssertEqual(t, true, bytes.Contains(buf, []byte(timeoutLine)))
    64  }
    65  
    66  func Test_Monitor_Html_CustomCodes(t *testing.T) {
    67  	t.Parallel()
    68  
    69  	app := fiber.New()
    70  
    71  	// defaults
    72  	app.Get("/", New())
    73  	resp, err := app.Test(httptest.NewRequest(fiber.MethodGet, "/", nil))
    74  
    75  	utils.AssertEqual(t, nil, err)
    76  	utils.AssertEqual(t, 200, resp.StatusCode)
    77  	utils.AssertEqual(t, fiber.MIMETextHTMLCharsetUTF8,
    78  		resp.Header.Get(fiber.HeaderContentType))
    79  	buf, err := io.ReadAll(resp.Body)
    80  	utils.AssertEqual(t, nil, err)
    81  	utils.AssertEqual(t, true, bytes.Contains(buf, []byte("<title>"+defaultTitle+"</title>")))
    82  	timeoutLine := fmt.Sprintf("setTimeout(fetchJSON, %d)",
    83  		defaultRefresh.Milliseconds()-timeoutDiff)
    84  	utils.AssertEqual(t, true, bytes.Contains(buf, []byte(timeoutLine)))
    85  
    86  	// custom config
    87  	conf := Config{
    88  		Title:      "New " + defaultTitle,
    89  		Refresh:    defaultRefresh + time.Second,
    90  		ChartJsURL: "https://cdnjs.com/libraries/Chart.js",
    91  		FontURL:    "/public/my-font.css",
    92  		CustomHead: `<style>body{background:#fff}</style>`,
    93  	}
    94  	app.Get("/custom", New(conf))
    95  	resp, err = app.Test(httptest.NewRequest(fiber.MethodGet, "/custom", nil))
    96  
    97  	utils.AssertEqual(t, nil, err)
    98  	utils.AssertEqual(t, 200, resp.StatusCode)
    99  	utils.AssertEqual(t, fiber.MIMETextHTMLCharsetUTF8,
   100  		resp.Header.Get(fiber.HeaderContentType))
   101  	buf, err = io.ReadAll(resp.Body)
   102  	utils.AssertEqual(t, nil, err)
   103  	utils.AssertEqual(t, true, bytes.Contains(buf, []byte("<title>"+conf.Title+"</title>")))
   104  	utils.AssertEqual(t, true, bytes.Contains(buf, []byte("https://cdnjs.com/libraries/Chart.js")))
   105  	utils.AssertEqual(t, true, bytes.Contains(buf, []byte("/public/my-font.css")))
   106  	utils.AssertEqual(t, true, bytes.Contains(buf, []byte(conf.CustomHead)))
   107  
   108  	timeoutLine = fmt.Sprintf("setTimeout(fetchJSON, %d)",
   109  		conf.Refresh.Milliseconds()-timeoutDiff)
   110  	utils.AssertEqual(t, true, bytes.Contains(buf, []byte(timeoutLine)))
   111  }
   112  
   113  // go test -run Test_Monitor_JSON -race
   114  func Test_Monitor_JSON(t *testing.T) {
   115  	t.Parallel()
   116  
   117  	app := fiber.New()
   118  
   119  	app.Get("/", New())
   120  
   121  	req := httptest.NewRequest(fiber.MethodGet, "/", nil)
   122  	req.Header.Set(fiber.HeaderAccept, fiber.MIMEApplicationJSON)
   123  	resp, err := app.Test(req)
   124  	utils.AssertEqual(t, nil, err)
   125  	utils.AssertEqual(t, 200, resp.StatusCode)
   126  	utils.AssertEqual(t, fiber.MIMEApplicationJSON, resp.Header.Get(fiber.HeaderContentType))
   127  
   128  	b, err := io.ReadAll(resp.Body)
   129  	utils.AssertEqual(t, nil, err)
   130  	utils.AssertEqual(t, true, bytes.Contains(b, []byte("pid")))
   131  	utils.AssertEqual(t, true, bytes.Contains(b, []byte("os")))
   132  }
   133  
   134  // go test -v -run=^$ -bench=Benchmark_Monitor -benchmem -count=4
   135  func Benchmark_Monitor(b *testing.B) {
   136  	app := fiber.New()
   137  
   138  	app.Get("/", New())
   139  
   140  	h := app.Handler()
   141  
   142  	fctx := &fasthttp.RequestCtx{}
   143  	fctx.Request.Header.SetMethod(fiber.MethodGet)
   144  	fctx.Request.SetRequestURI("/")
   145  	fctx.Request.Header.Set(fiber.HeaderAccept, fiber.MIMEApplicationJSON)
   146  
   147  	b.ReportAllocs()
   148  	b.ResetTimer()
   149  
   150  	b.RunParallel(func(pb *testing.PB) {
   151  		for pb.Next() {
   152  			h(fctx)
   153  		}
   154  	})
   155  
   156  	utils.AssertEqual(b, 200, fctx.Response.Header.StatusCode())
   157  	utils.AssertEqual(b,
   158  		fiber.MIMEApplicationJSON,
   159  		string(fctx.Response.Header.Peek(fiber.HeaderContentType)))
   160  }
   161  
   162  // go test -run Test_Monitor_Next
   163  func Test_Monitor_Next(t *testing.T) {
   164  	t.Parallel()
   165  
   166  	app := fiber.New()
   167  
   168  	app.Use("/", New(Config{
   169  		Next: func(_ *fiber.Ctx) bool {
   170  			return true
   171  		},
   172  	}))
   173  
   174  	resp, err := app.Test(httptest.NewRequest(fiber.MethodPost, "/", nil))
   175  	utils.AssertEqual(t, nil, err)
   176  	utils.AssertEqual(t, 404, resp.StatusCode)
   177  }
   178  
   179  // go test -run Test_Monitor_APIOnly -race
   180  func Test_Monitor_APIOnly(t *testing.T) {
   181  	app := fiber.New()
   182  
   183  	app.Get("/", New(Config{
   184  		APIOnly: true,
   185  	}))
   186  
   187  	req := httptest.NewRequest(fiber.MethodGet, "/", nil)
   188  	req.Header.Set(fiber.HeaderAccept, fiber.MIMEApplicationJSON)
   189  	resp, err := app.Test(req)
   190  	utils.AssertEqual(t, nil, err)
   191  	utils.AssertEqual(t, 200, resp.StatusCode)
   192  	utils.AssertEqual(t, fiber.MIMEApplicationJSON, resp.Header.Get(fiber.HeaderContentType))
   193  
   194  	b, err := io.ReadAll(resp.Body)
   195  	utils.AssertEqual(t, nil, err)
   196  	utils.AssertEqual(t, true, bytes.Contains(b, []byte("pid")))
   197  	utils.AssertEqual(t, true, bytes.Contains(b, []byte("os")))
   198  }