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 }