go.sdls.io/sin@v0.0.9/pkg/sin/response_writer_test.go (about)

     1  // Copyright 2014 Manu Martinez-Almeida.  All rights reserved.
     2  // Use of this source code is governed by a MIT style
     3  // license that can be found in the LICENSE file.
     4  
     5  package sin
     6  
     7  import (
     8  	"net/http"
     9  	"net/http/httptest"
    10  	"testing"
    11  
    12  	"github.com/stretchr/testify/assert"
    13  )
    14  
    15  // TODO
    16  // func (w *responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
    17  // func (w *responseWriter) CloseNotify() <-chan bool {
    18  // func (w *responseWriter) Flush() {
    19  
    20  var (
    21  	_ ResponseWriter      = &responseWriter{}
    22  	_ http.ResponseWriter = &responseWriter{}
    23  	_ http.ResponseWriter = ResponseWriter(&responseWriter{})
    24  	_ http.Hijacker       = ResponseWriter(&responseWriter{})
    25  	_ http.Flusher        = ResponseWriter(&responseWriter{})
    26  )
    27  
    28  func TestResponseWriterReset(t *testing.T) {
    29  	testWriter := httptest.NewRecorder()
    30  	writer := &responseWriter{}
    31  	var w ResponseWriter = writer
    32  
    33  	writer.reset(testWriter)
    34  	assert.Equal(t, -1, writer.size)
    35  	assert.Equal(t, http.StatusOK, writer.status)
    36  	assert.Equal(t, testWriter, writer.ResponseWriter)
    37  	assert.Equal(t, -1, w.Size())
    38  	assert.Equal(t, http.StatusOK, w.Status())
    39  	assert.False(t, w.Written())
    40  }
    41  
    42  func TestResponseWriterWriteHeader(t *testing.T) {
    43  	testWriter := httptest.NewRecorder()
    44  	writer := &responseWriter{}
    45  	writer.reset(testWriter)
    46  	w := ResponseWriter(writer)
    47  
    48  	w.WriteHeader(http.StatusMultipleChoices)
    49  	assert.False(t, w.Written())
    50  	assert.Equal(t, http.StatusMultipleChoices, w.Status())
    51  	assert.NotEqual(t, http.StatusMultipleChoices, testWriter.Code)
    52  
    53  	w.WriteHeader(-1)
    54  	assert.Equal(t, http.StatusMultipleChoices, w.Status())
    55  }
    56  
    57  func TestResponseWriterWriteHeadersNow(t *testing.T) {
    58  	testWriter := httptest.NewRecorder()
    59  	writer := &responseWriter{}
    60  	writer.reset(testWriter)
    61  	w := ResponseWriter(writer)
    62  
    63  	w.WriteHeader(http.StatusMultipleChoices)
    64  	w.WriteHeaderNow()
    65  
    66  	assert.True(t, w.Written())
    67  	assert.Equal(t, 0, w.Size())
    68  	assert.Equal(t, http.StatusMultipleChoices, testWriter.Code)
    69  
    70  	writer.size = 10
    71  	w.WriteHeaderNow()
    72  	assert.Equal(t, 10, w.Size())
    73  }
    74  
    75  func TestResponseWriterWrite(t *testing.T) {
    76  	testWriter := httptest.NewRecorder()
    77  	writer := &responseWriter{}
    78  	writer.reset(testWriter)
    79  	w := ResponseWriter(writer)
    80  
    81  	n, err := w.Write([]byte("hola"))
    82  	assert.Equal(t, 4, n)
    83  	assert.Equal(t, 4, w.Size())
    84  	assert.Equal(t, http.StatusOK, w.Status())
    85  	assert.Equal(t, http.StatusOK, testWriter.Code)
    86  	assert.Equal(t, "hola", testWriter.Body.String())
    87  	assert.NoError(t, err)
    88  
    89  	n, err = w.Write([]byte(" adios"))
    90  	assert.Equal(t, 6, n)
    91  	assert.Equal(t, 10, w.Size())
    92  	assert.Equal(t, "hola adios", testWriter.Body.String())
    93  	assert.NoError(t, err)
    94  }
    95  
    96  func TestResponseWriterHijack(t *testing.T) {
    97  	testWriter := httptest.NewRecorder()
    98  	writer := &responseWriter{}
    99  	writer.reset(testWriter)
   100  	w := ResponseWriter(writer)
   101  
   102  	assert.Panics(t, func() {
   103  		_, _, err := w.Hijack()
   104  		assert.NoError(t, err)
   105  	})
   106  	assert.True(t, w.Written())
   107  
   108  	w.Flush()
   109  }
   110  
   111  func TestResponseWriterFlush(t *testing.T) {
   112  	testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   113  		writer := &responseWriter{}
   114  		writer.reset(w)
   115  
   116  		writer.WriteHeader(http.StatusInternalServerError)
   117  		writer.Flush()
   118  	}))
   119  	defer testServer.Close()
   120  
   121  	// should return 500
   122  	resp, err := http.Get(testServer.URL)
   123  	assert.NoError(t, err)
   124  	assert.Equal(t, http.StatusInternalServerError, resp.StatusCode)
   125  }