package mockhttpclient

import (
	"bytes"
	"io/ioutil"
	"net/http"
	"reflect"
	"strings"
	"testing"

	"go.skia.org/infra/go/testutils"
)

func TestEmptyMock(t *testing.T) {
	testutils.SmallTest(t)
	urlMock := NewURLMock()
	c := urlMock.Client()

	if _, err := c.Get("http://www.example.com"); err == nil {
		t.Errorf("Should have gotten error for unmocked GET")
	}
}

func getResponseBody(t *testing.T, resp *http.Response) []byte {
	if resp == nil || resp.Body == nil {
		t.Errorf("Response was nil:  %#v", resp)
		return nil
	}
	defer func() {
		err := resp.Body.Close()
		if err != nil {
			// Something horribly horribly bad has happened if our mock body closes and returns an error
			t.Fatalf("Mock response should not have errored on close. %s", err)
		}
	}()
	b, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		t.Errorf("Problem reading response body: %s", err)
		return nil
	}
	return b
}

func TestGetMockOnce(t *testing.T) {
	testutils.SmallTest(t)
	urlMock := NewURLMock()

	expectedResponse := []byte("Hello world")
	urlMock.MockOnce("http://www.example.com", MockGetDialogue(expectedResponse))

	if urlMock.Empty() {
		t.Errorf("URLMock should not be empty, but is: %#v", urlMock)
	}

	c := urlMock.Client()
	if resp, err := c.Get("http://www.exampledomain.com"); err == nil {
		t.Errorf("Should have gotten error for unmocked URL, but was %#v", resp)
	}

	if resp, err := c.Get("http://www.example.com"); err != nil {
		t.Errorf("Should not have gotten error for mocked GET: %s", err)
	} else {
		body := getResponseBody(t, resp)
		if !reflect.DeepEqual(expectedResponse, body) {
			t.Errorf("Expected: %#v\n, but was: %#v", expectedResponse, expectedResponse)
		}
	}

	if resp, err := c.Get("http://www.example.com"); err == nil {
		t.Errorf("Should have gotten error for second, unmocked, GET, but was %#v", resp)
	}

	if !urlMock.Empty() {
		t.Errorf("URLMock should now be empty, but is not: %#v", urlMock)
	}
}

func TestGetMockAlways(t *testing.T) {
	testutils.SmallTest(t)
	expectedResponse := []byte("Hello world")
	c := New(map[string]MockDialogue{
		"http://www.example.com": MockGetDialogue(expectedResponse),
	})
	for i := 0; i < 100; i++ {
		if resp, err := c.Get("http://www.example.com"); err != nil {
			t.Errorf("Should not have gotten error for mocked GET: %s", err)
		} else {
			body := getResponseBody(t, resp)
			if !reflect.DeepEqual(expectedResponse, body) {
				t.Errorf("Expected: %#v\n, but was: %#v", expectedResponse, expectedResponse)
			}
		}
	}
}

func TestPostNotGet(t *testing.T) {
	testutils.SmallTest(t)
	urlMock := NewURLMock()

	expectedResponse := []byte("Hello world")
	urlMock.MockOnce("http://www.example.com", MockGetDialogue(expectedResponse))

	c := urlMock.Client()
	r := bytes.NewReader([]byte("fizzbuzz"))

	if resp, err := c.Post("http://www.example.com", "text/plain", r); err == nil {
		t.Errorf("Should have gotten error that we POSTed when a GET was mocked, but was %#v", resp)
	}
}

func TestPostWrongBody(t *testing.T) {
	testutils.SmallTest(t)
	urlMock := NewURLMock()

	expectedResponseBody := []byte("Hello world")
	urlMock.MockOnce("http://www.example.com", MockPostDialogue("text/plain", []byte("password"), expectedResponseBody))

	c := urlMock.Client()
	r := bytes.NewReader([]byte("fizzbuzz"))

	if resp, err := c.Post("http://www.example.com", "text/plain", r); err == nil {
		t.Errorf("Should have gotten error that the request body differed from expected, but was %#v", resp)
	}
}

func TestPostDontCareBody(t *testing.T) {
	testutils.SmallTest(t)
	urlMock := NewURLMock()

	expectedResponseBody := []byte("Hello world")
	urlMock.MockOnce("http://www.example.com", MockPostDialogue("text/plain", DONT_CARE_REQUEST, expectedResponseBody))

	c := urlMock.Client()
	r := bytes.NewReader([]byte("fizzbuzz"))

	if _, err := c.Post("http://www.example.com", "text/plain", r); err != nil {
		t.Errorf("Should not have gotten error that the request body differed from expected: %s", err)
	}
}

func TestPostWrongType(t *testing.T) {
	testutils.SmallTest(t)
	urlMock := NewURLMock()

	firstRequestBody := []byte("alpha")
	secondRequestBody := []byte("beta")
	expectedResponseBody := []byte("Hello world")
	urlMock.MockOnce("http://www.example.com", MockPostDialogue("text/plain", firstRequestBody, expectedResponseBody))
	urlMock.MockOnce("http://www.example.com", MockPostDialogue("text/plain", secondRequestBody, expectedResponseBody))

	c := urlMock.Client()

	if _, err := c.Post("http://www.example.com", "text/plain", bytes.NewReader(firstRequestBody)); err != nil {
		t.Errorf("Should not have gotten error for first mocked POST: %s", err)
	}

	if resp, err := c.Post("http://www.example.com", "application/json", bytes.NewReader(secondRequestBody)); err == nil {
		t.Errorf("Should have gotten error for second POST of wrong type, but was %#v", resp)
	} else if !strings.Contains(err.Error(), `expected "text/plain", but was "application/json"`) {
		t.Errorf("The wrong error was shown: %s", err)
	}
}
