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  }