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 }