package httpclient

import (
	"errors"
	"net/http"
	"testing"

	"github.com/fiskerinc/cloud-services/pkg/httpclient/mock"
)

const (
	jsonBody          = `{"name":"test data"}`
	TestErrorTemplate = "%s test. Expected '%v'. Got '%v'"
	testURL           = "https://fiskerinc.com"
)

var (
	httpHeader = http.Header{"content-type": []string{"application/json"}}
	errServer  = errors.New("Error from web server")
)

func TestGetRequest(t *testing.T) {
	c := mock.Client{
		DoFunc: func(*http.Request) (*http.Response, error) {
			return &http.Response{StatusCode: 200}, nil
		},
	}

	Client = &c

	_, err := Get(testURL, httpHeader)
	if err != nil {
		t.Fatalf(TestErrorTemplate, "TestGetRequest", errors.New("Error from web server"), err)
	}
}

func TestGetRequestError(t *testing.T) {
	c := mock.Client{
		DoFunc: func(*http.Request) (*http.Response, error) {
			return nil, errServer
		},
	}

	Client = &c

	_, err := Get(testURL, httpHeader)
	if err == nil {
		t.Fatalf(TestErrorTemplate, "TestGetRequestError", errServer, err)
	}
}

func TestPostRequest(t *testing.T) {
	c := mock.Client{
		DoFunc: func(*http.Request) (*http.Response, error) {
			return &http.Response{StatusCode: 200}, nil
		},
	}

	Client = &c

	_, err := Post(testURL, jsonBody, httpHeader)
	if err != nil {
		t.Fatalf(TestErrorTemplate, "TestPostRequest", nil, err)
	}
}

func TestPostRequestError(t *testing.T) {
	c := mock.Client{
		DoFunc: func(*http.Request) (*http.Response, error) {
			return nil, errServer
		},
	}

	Client = &c

	_, err := Post(testURL, jsonBody, httpHeader)
	if err == nil {
		t.Fatalf(TestErrorTemplate, "TestPostRequestError", errServer, err)
	}
}

func TestDoRequest(t *testing.T) {
	Client = &mock.Client{
		DoFunc: func(*http.Request) (*http.Response, error) {
			return &http.Response{StatusCode: 200}, nil
		},
	}
	request, _ := http.NewRequest(http.MethodPost, "http://test.com", nil)
	response, err := Do(request)
	if err != nil {
		t.Errorf(TestErrorTemplate, "Response error", "nil", err)
	}
	if response.StatusCode != 200 {
		t.Errorf(TestErrorTemplate, "Response status", 200, response.StatusCode)
	}
}
