package main

import (
	"github.com/matryer/is"
	"testing"
)

func TestHit(t *testing.T) {
	is := is.New(t)
	payload := `{\x22null_value\x22:null,\x22et\x22:1,\x22eid1\x22:313084823,\x22eid2\x22:-2147483647,\x22eid3\x22:2.147483647,\x22eid4\x22:1.5,\x22null\x22:null}`
	hit, err := processHit("2017-10-13T03:37:51+00:00", "192.168.0.1, 127.0.0.1", payload, "", "", "1535101156.444")

	is.NoErr(err)
	val := hit["et"]
	is.True(val == "1")

	if _, ok := hit["null"]; ok {
		is.Fail()
	}
	if _, ok := hit["null_value"]; ok {
		is.Fail() // значения null не должны попавдать в базу
	}

	val = hit["eid1"]
	is.Equal(val, "313084823")

	val = hit["eid2"]
	is.Equal(val, "-2147483647")
	val = hit["eid4"]
	is.Equal(val, "1.5")
	val = hit["eid3"]
	is.Equal(val, "2.147483647")
	is.Equal(hit["internal_ip"], "192.168.0.1")
}

func TestHitError(t *testing.T) {
	is := is.New(t)
	payload := "{\x22null_value\x22:null,\x22et\x22:1,\x22eid1\x22:313084823,\x22eid2\x22:-2147483647,\x22eid3\x22:2.147483647,\x22eid4\x22:1.5,\x22null\x22:null}"
	_, err := processHit("2017-10-13T03:37:51+00:00", "192.168.0.1, 127.0.0.1", payload, "", "", "1535101156.444")
	if err == nil {
		is.Fail()
	}
}

func TestArray(t *testing.T) {
	is := is.New(t)
	payload := `{\x22et\x22:1,\x22eid1\x22:313084823,\x22eid2\x22:-2147483647,\x22eid3\x22:2.147483647,\x22eid4\x22:1.5,\x22torrent_size\x22:[10,20,30,40,50,60,70,80,90,100],\x22torrent_nil\x22:[],\x22null\x22:null}`
	hit, err := processHit("2017-10-13T03:37:51+00:00", "192.168.0.1, 127.0.0.1", payload, "", "", "1535101156.444")

	is.NoErr(err)
	val := hit["et"]
	is.True(val == "1")

	// null элементы не должны попасть в json
	if _, ok := hit["null"]; ok {
		is.Fail()
	}

	val = hit["internal_date"]
	is.Equal(val, "2017-10-13")

	val = hit["internal_time"]
	is.Equal(val, "2017-10-13 03:37:51")

	val = hit["internal_msec"]
	is.Equal(val, "1535101156444")

	val = hit["eid1"]
	is.Equal(val, "313084823")

	val = hit["eid2"]
	is.Equal(val, "-2147483647")
	val = hit["eid4"]
	is.Equal(val, "1.5")
	val = hit["eid3"]
	is.Equal(val, "2.147483647")
	is.Equal(hit["internal_ip"], "192.168.0.1")
}

func TestProcessInput(t *testing.T) {
	is := is.New(t)
	payload := `2020-10-21T08:59:40+00:00	-	{\x22internal_ip\x22:\x221.1.1.1\x22,\x22internal_date\x22:\x2201-01-2020\x22,\x22XsollaUID\x22:11111,\x22internal_time\x22:\x2201-01-2020\x22,\x22date\x22:\x2201-01-2020\x22,\x22ip\x22:\x221.1.1.2\x22,\x22location_url\x22:\x22qwe\x22,\x22location_host\x22:\x22asd\x22,\x22location_path\x22:\x22zxc\x22,\x22location_search\x22:\x22rty\x22,\x22browser\x22:\x22fgh\x22,\x22browser_version\x22:\x22vbn\x22,\x22redirect_time\x22:12,\x22html_load_time\x22:13,\x22dom_content_load_time\x22:14,\x22geoip_country\x22:\x22q\x22,\x22geoip_region\x22:\x22a\x22,\x22geoip_city\x22:\x22z\x22,\x22geoip_latitude\x22:\x22w\x22,\x22geoip_longitude\x22:\x22s\x22,\x22server_name\x22:\x22x\x22}	Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36`
	result, err := processInput(payload)
	is.NoErr(err)
	success := `{"XsollaUID":"0","browser":"fgh","browser_version":"vbn","date":"01-01-2020","dom_content_load_time":"14","geoip_city":"z","geoip_country":"q","geoip_latitude":"w","geoip_longitude":"s","geoip_region":"a","html_load_time":"13","internal_date":"2020-10-21","internal_ip":"-","internal_time":"2020-10-21 08:59:40","ip":"1.1.1.2","location_host":"asd","location_path":"zxc","location_search":"rty","location_url":"qwe","redirect_time":"12","server_name":"x"}`
	is.Equal(result, success)
}
