package debug

import (
	"bytes"
	"net/http"
	"net/http/httptest"
	"strings"
	"testing"
)

var (
	// mux is the HTTP request multiplexer used with the test server.
	mux *http.ServeMux

	// server is a test HTTP server used to provide mock API responses.
	server *httptest.Server
)

// setup sets up a test HTTP server along with a cos.Client that is
// configured to talk to that test server. Tests should register handlers on
// mux which provide mock responses for the API method being tested.
func setup() {
	// test server
	mux = http.NewServeMux()
	server = httptest.NewServer(mux)
}

// teardown closes the test HTTP server.
func teardown() {
	server.Close()
}

func TestDebugRequestTransport(t *testing.T) {
	setup()
	defer teardown()

	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		w.Header().Add("X-Test-Response", "2333")
		w.WriteHeader(http.StatusBadGateway)
		w.Write([]byte("test response body"))
	})

	w := bytes.NewBufferString("")
	client := http.Client{}

	client.Transport = &DebugRequestTransport{
		RequestHeader:  true,
		RequestBody:    true,
		ResponseHeader: true,
		ResponseBody:   true,
		Writer:         w,
	}

	body := bytes.NewReader([]byte("test_request body"))
	req, _ := http.NewRequest("GET", server.URL, body)
	req.Header.Add("X-Test-Debug", "123")
	client.Do(req)

	b := make([]byte, 800)
	w.Read(b)
	info := string(b)
	if !strings.Contains(info, "GET / HTTP/1.1\r\n") ||
		!strings.Contains(info, "X-Test-Debug: 123\r\n") {
		t.Errorf("DebugRequestTransport debug info %#v don't contains request header", info)
	}
	if !strings.Contains(info, "\r\n\r\ntest_request body") {
		t.Errorf("DebugRequestTransport debug info  %#v don't contains request body", info)
	}

	if !strings.Contains(info, "HTTP/1.1 502 Bad Gateway\r\n") ||
		!strings.Contains(info, "X-Test-Response: 2333\r\n") {
		t.Errorf("DebugRequestTransport debug info  %#v don't contains response header", info)
	}

	if !strings.Contains(info, "\r\n\r\ntest response body") {
		t.Errorf("DebugRequestTransport debug info  %#v don't contains response body", info)
	}
}