package middleware

import (
	"bufio"
	"bytes"
	"net"
	"net/http"
	"net/http/httptest"
	"testing"
	"time"

	"github.com/stretchr/testify/assert"
)

type testLoggerWriter struct {
	*httptest.ResponseRecorder
}

func (cw testLoggerWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
	return nil, nil, nil
}

func TestRequestLogger(t *testing.T) {
	testHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		_, ok := w.(http.Hijacker)
		if !ok {
			t.Errorf("http.Hijacker is unavailable on the writer. add the interface methods.")
		}
	})

	r := httptest.NewRequest("GET", "/", nil)
	w := testLoggerWriter{
		ResponseRecorder: httptest.NewRecorder(),
	}

	handler := DefaultLogger(testHandler)
	handler.ServeHTTP(w, r)
}

func TestRequestLoggerReadFrom(t *testing.T) {
	data := []byte("file data")
	testHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		http.ServeContent(w, r, "file", time.Time{}, bytes.NewReader(data))
	})

	r := httptest.NewRequest("GET", "/", nil)
	w := httptest.NewRecorder()

	handler := DefaultLogger(testHandler)
	handler.ServeHTTP(w, r)

	assert.Equal(t, data, w.Body.Bytes())
}
