package mock

import (
	"encoding/json"
	"net/url"
	"testing"
)

func TestMatchURLVals(t *testing.T) {
	testVal, testVal2, testVal3, emptyVal := url.Values{}, url.Values{}, url.Values{}, url.Values{}
	testVal.Add("test", "test")
	testVal2.Add("test2", "test2")
	testVal3.Add("test", "diferentValString")

	nonceVal1, nonceVal2 := url.Values{}, url.Values{}
	nonceVal1.Add("nonce", "012349723587")
	nonceVal2.Add("nonce", "9327373874")

	var expected = false
	received := MatchURLVals(testVal, emptyVal)
	if received != expected {
		t.Errorf("MatchURLVals error expected %v received %v",
			expected,
			received)
	}

	received = MatchURLVals(emptyVal, testVal)
	if received != expected {
		t.Errorf("MatchURLVals error expected %v received %v",
			expected,
			received)
	}

	received = MatchURLVals(testVal, testVal2)
	if received != expected {
		t.Errorf("MatchURLVals error expected %v received %v",
			expected,
			received)
	}

	received = MatchURLVals(testVal2, testVal)
	if received != expected {
		t.Errorf("MatchURLVals error expected %v received %v",
			expected,
			received)
	}

	received = MatchURLVals(testVal, testVal3)
	if received != expected {
		t.Errorf("MatchURLVals error expected %v received %v",
			expected,
			received)
	}

	received = MatchURLVals(nonceVal1, testVal2)
	if received != expected {
		t.Errorf("MatchURLVals error expected %v received %v",
			expected,
			received)
	}

	expected = true
	received = MatchURLVals(emptyVal, emptyVal)
	if received != expected {
		t.Errorf("MatchURLVals error expected %v received %v",
			expected,
			received)
	}

	received = MatchURLVals(testVal, testVal)
	if received != expected {
		t.Errorf("MatchURLVals error expected %v received %v",
			expected,
			received)
	}

	received = MatchURLVals(nonceVal1, nonceVal2)
	if received != expected {
		t.Errorf("MatchURLVals error expected %v received %v",
			expected,
			received)
	}
}

func TestDeriveURLValsFromJSON(t *testing.T) {
	test1 := struct {
		Things []string `json:"things"`
		Data   struct {
			Numbers    []int   `json:"numbers"`
			Number     float64 `json:"number"`
			SomeString string  `json:"somestring"`
		} `json:"data"`
	}{
		Things: []string{"hello", "world"},
		Data: struct {
			Numbers    []int   `json:"numbers"`
			Number     float64 `json:"number"`
			SomeString string  `json:"somestring"`
		}{
			Numbers:    []int{1, 3, 3, 7},
			Number:     3.14,
			SomeString: "hello, peoples",
		},
	}

	payload, err := json.Marshal(test1)
	if err != nil {
		t.Error("marshal error", err)
	}

	_, err = DeriveURLValsFromJSONMap(payload)
	if err != nil {
		t.Error("DeriveURLValsFromJSON error", err)
	}

	test2 := map[string]string{
		"val":  "1",
		"val2": "2",
		"val3": "3",
		"val4": "4",
		"val5": "5",
		"val6": "6",
		"val7": "7",
	}

	payload, err = json.Marshal(test2)
	if err != nil {
		t.Error("marshal error", err)
	}

	vals, err := DeriveURLValsFromJSONMap(payload)
	if err != nil {
		t.Error("DeriveURLValsFromJSON error", err)
	}

	if vals["val"][0] != "1" {
		t.Error("DeriveURLValsFromJSON unexpected value",
			vals["val"][0])
	}
}
