package simplehttp

import (
	"encoding/json"
	"encoding/xml"
	"testing"
)

func TestParsingGetFromJson(t *testing.T) {
	tmp := testStruct{
		Value1: "1",
		Value2: "2",
		Value3: "3",
	}

	data, err := json.Marshal(tmp)
	if err != nil {
		t.Fail()
	}

	server.SetNextResponse(data)

	request := NewHTTPRequest(dummyurl)
	var retVal testStruct
	err = request.GetResponseFromJSON(&retVal)

	if err != nil {
		t.Fail()
	}

	if tmp.Value1 != retVal.Value1 {
		t.Fail()
	}

	if tmp.Value2 != retVal.Value2 {
		t.Fail()
	}

	if tmp.Value3 != retVal.Value3 {
		t.Fail()
	}
}

func TestFailingParsingGetFromJson(t *testing.T) {
	request := NewHTTPRequest(invalidurl)
	var retVal testStruct
	err := request.GetResponseFromJSON(&retVal)

	if err == nil {
		t.Fail()
	}
}

func TestParsingPostFromJson(t *testing.T) {
	tmp := testStruct{
		Value1: "1",
		Value2: "2",
		Value3: "3",
	}

	data, err := json.Marshal(tmp)
	if err != nil {
		t.Fail()
	}

	server.SetNextResponse(data)

	request := NewHTTPRequest(dummyurl)
	var retVal testStruct
	err = request.PostResponseFromJSON(nil, &retVal)

	if err != nil {
		t.Fail()
	}

	if tmp.Value1 != retVal.Value1 {
		t.Fail()
	}

	if tmp.Value2 != retVal.Value2 {
		t.Fail()
	}

	if tmp.Value3 != retVal.Value3 {
		t.Fail()
	}
}

func TestFailingParsingPostFromJson(t *testing.T) {
	request := NewHTTPRequest(invalidurl)
	var retVal testStruct
	err := request.PostResponseFromJSON(nil, &retVal)

	if err == nil {
		t.Fail()
	}
}

func TestParsingGetFromXml(t *testing.T) {
	tmp := testStruct{
		Value1: "1",
		Value2: "2",
		Value3: "3",
	}

	data, err := xml.Marshal(tmp)
	if err != nil {
		t.Fail()
	}

	server.SetNextResponse(data)

	request := NewHTTPRequest(dummyurl)
	var retVal testStruct
	response, err := request.MakeGetRequest()
	response.ParseFromXML(&retVal)

	if err != nil {
		t.Fail()
	}

	if tmp.Value1 != retVal.Value1 {
		t.Fail()
	}

	if tmp.Value2 != retVal.Value2 {
		t.Fail()
	}

	if tmp.Value3 != retVal.Value3 {
		t.Fail()
	}
}