|
|
|
package response
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bufio"
|
|
|
|
"net"
|
|
|
|
"net/http"
|
|
|
|
"net/http/httptest"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestHeaderOnceResponseWriter_Flush(t *testing.T) {
|
|
|
|
req := httptest.NewRequest(http.MethodGet, "http://localhost", http.NoBody)
|
|
|
|
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
cw := NewHeaderOnceResponseWriter(w)
|
|
|
|
cw.Header().Set("X-Test", "test")
|
|
|
|
cw.WriteHeader(http.StatusServiceUnavailable)
|
|
|
|
cw.WriteHeader(http.StatusExpectationFailed)
|
|
|
|
_, err := cw.Write([]byte("content"))
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
|
|
|
flusher, ok := cw.(http.Flusher)
|
|
|
|
assert.True(t, ok)
|
|
|
|
flusher.Flush()
|
|
|
|
})
|
|
|
|
|
|
|
|
resp := httptest.NewRecorder()
|
|
|
|
handler.ServeHTTP(resp, req)
|
|
|
|
assert.Equal(t, http.StatusServiceUnavailable, resp.Code)
|
|
|
|
assert.Equal(t, "test", resp.Header().Get("X-Test"))
|
|
|
|
assert.Equal(t, "content", resp.Body.String())
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestHeaderOnceResponseWriter_Hijack(t *testing.T) {
|
|
|
|
resp := httptest.NewRecorder()
|
|
|
|
writer := &HeaderOnceResponseWriter{
|
|
|
|
w: resp,
|
|
|
|
}
|
|
|
|
assert.NotPanics(t, func() {
|
|
|
|
writer.Hijack()
|
|
|
|
})
|
|
|
|
|
|
|
|
writer = &HeaderOnceResponseWriter{
|
|
|
|
w: mockedHijackable{resp},
|
|
|
|
}
|
|
|
|
assert.NotPanics(t, func() {
|
|
|
|
writer.Hijack()
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
type mockedHijackable struct {
|
|
|
|
*httptest.ResponseRecorder
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m mockedHijackable) Hijack() (net.Conn, *bufio.ReadWriter, error) {
|
|
|
|
return nil, nil, nil
|
|
|
|
}
|