github.com/adacta-ru/mattermost-server/v6@v6.0.0/web/response_writer_wrapper_test.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package web 5 6 import ( 7 "bufio" 8 "net" 9 "net/http" 10 "net/http/httptest" 11 "testing" 12 13 "github.com/stretchr/testify/assert" 14 ) 15 16 type TestHandler struct { 17 TestFunc func(w http.ResponseWriter, r *http.Request) 18 } 19 20 func (h *TestHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { 21 h.TestFunc(w, r) 22 } 23 24 type responseRecorderHijack struct { 25 httptest.ResponseRecorder 26 } 27 28 func (r *responseRecorderHijack) Hijack() (net.Conn, *bufio.ReadWriter, error) { 29 r.WriteHeader(http.StatusOK) 30 return nil, nil, nil 31 } 32 33 func newResponseWithHijack(original *httptest.ResponseRecorder) *responseRecorderHijack { 34 return &responseRecorderHijack{*original} 35 } 36 37 func TestStatusCodeIsAccessible(t *testing.T) { 38 resp := newWrappedWriter(httptest.NewRecorder()) 39 req := httptest.NewRequest("GET", "/api/v4/test", nil) 40 handler := TestHandler{func(w http.ResponseWriter, r *http.Request) { 41 w.WriteHeader(http.StatusBadRequest) 42 }} 43 handler.ServeHTTP(resp, req) 44 assert.Equal(t, http.StatusBadRequest, resp.StatusCode()) 45 } 46 47 func TestStatusCodeShouldBe200IfNotHeaderWritten(t *testing.T) { 48 resp := newWrappedWriter(httptest.NewRecorder()) 49 req := httptest.NewRequest("GET", "/api/v4/test", nil) 50 handler := TestHandler{func(w http.ResponseWriter, r *http.Request) { 51 w.Write([]byte{}) 52 }} 53 handler.ServeHTTP(resp, req) 54 assert.Equal(t, http.StatusOK, resp.StatusCode()) 55 } 56 57 func TestForUnsupportedHijack(t *testing.T) { 58 resp := newWrappedWriter(httptest.NewRecorder()) 59 req := httptest.NewRequest("GET", "/api/v4/test", nil) 60 handler := TestHandler{func(w http.ResponseWriter, r *http.Request) { 61 _, _, err := w.(*responseWriterWrapper).Hijack() 62 assert.NotNil(t, err) 63 assert.Equal(t, "Hijacker interface not supported by the wrapped ResponseWriter", err.Error()) 64 }} 65 handler.ServeHTTP(resp, req) 66 } 67 68 func TestForSupportedHijack(t *testing.T) { 69 resp := newWrappedWriter(newResponseWithHijack(httptest.NewRecorder())) 70 req := httptest.NewRequest("GET", "/api/v4/test", nil) 71 handler := TestHandler{func(w http.ResponseWriter, r *http.Request) { 72 _, _, err := w.(*responseWriterWrapper).Hijack() 73 assert.Nil(t, err) 74 }} 75 handler.ServeHTTP(resp, req) 76 } 77 78 func TestForSupportedFlush(t *testing.T) { 79 resp := newWrappedWriter(httptest.NewRecorder()) 80 req := httptest.NewRequest("GET", "/api/v4/test", nil) 81 handler := TestHandler{func(w http.ResponseWriter, r *http.Request) { 82 w.Write([]byte{}) 83 w.(*responseWriterWrapper).Flush() 84 }} 85 handler.ServeHTTP(resp, req) 86 assert.Equal(t, http.StatusOK, resp.StatusCode()) 87 }