package main

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

func TestAdvEngine(t *testing.T) {
	type TestCases struct {
		url     string
		success string
	}
	is := is.New(t)
	testCases := []TestCases{
		{`http://192.168.44.40/example/?utm_source=google&utm_medium=email`, "google"},
		{`http://xsolla.com/pay2play/?utm_source=aport.ru&utm_medium=banner&utm_campaign=p2p_october&utm_term=companies`, "aport"},
		{`http://xsolla.com/pay2play/?utm_source=directadvert.ru&utm_medium=banner&utm_campaign=p2p_october&utm_term=companies`, "directadvert"},
		{`http://xsolla.com/pay2play/?utm_source=adwords&utm_medium=banner&utm_campaign=p2p_october&utm_term=companies`, "google"},
		{`http://xsolla.com/pay2play/?utm_source=nnn.ru&utm_medium=banner&utm_campaign=p2p_october&utm_term=companies`, "nnn"},
		{`http://xsolla.com/pay2play/?utm_source=price&utm_medium=banner&utm_campaign=p2p_october&utm_term=companies`, "price.ru"},
		{`http://xsolla.com/pay2play/?utm_source=mytarget&utm_medium=banner&utm_campaign=p2p_october&utm_term=companies`, "targetmailru"},
		{`http://xsolla.com/pay2play/?utm_source=trorer&utm_medium=banner&utm_campaign=p2p_october&utm_term=companies`, "rorer"},
		{`http://xsolla.com/pay2play/?utm_source=ubn.ua&utm_medium=banner&utm_campaign=p2p_october&utm_term=companies`, "banner.ua"},
		{`http://xsolla.com/pay2play/?utm_source=vk&utm_medium=banner&utm_campaign=p2p_october&utm_term=companies`, "vkontakte"},
	}

	hit := map[string]string{}
	hit["Referer"] = "https://google.com"

	for i := range testCases {
		URL := parseUrlParams(testCases[i].url)
		utm(hit, URL)
		advEngine(hit)
		val, ok := hit["AdvEngine"]
		is.True(ok)
		is.Equal(val, testCases[i].success)
	}
}

const facebookAdsReferrer = "https://facebook.com"
const facebookAdsEngine = "facebook"

/*
	Кейс1: utm_source определен, входит в список сорсов (кегль НЕ совпадает)
*/
func TestAdvEngineUtmSource(t *testing.T) {
	is := is.New(t)
	u := `http://xsolla.com/pay2play/?utm_source=Facebook&utm_medium=banner&utm_campaign=p2p_october&utm_term=companies`
	URL := parseUrlParams(u)
	hit := map[string]string{}
	hit["Referer"] = facebookAdsReferrer
	utm(hit, URL)
	openstat(hit, URL)
	advEngine(hit)

	val, ok := hit["AdvEngine"]
	is.True(ok)
	is.Equal(val, facebookAdsEngine)
}

/*
	Кейс1-1: utm_source определен, входит в список сорсов (проходит по switch)
*/
func TestAdvEngineUtmSourceEngine(t *testing.T) {
	is := is.New(t)
	u := `http://xsolla.com/pay2play/?utm_source=fb&utm_medium=banner&utm_campaign=p2p_october&utm_term=companies`
	URL := parseUrlParams(u)
	hit := map[string]string{}
	hit["Referer"] = facebookAdsReferrer
	utm(hit, URL)
	openstat(hit, URL)
	advEngine(hit)

	val, ok := hit["AdvEngine"]
	is.True(ok)
	is.Equal(val, facebookAdsEngine)
}

/*
	Кейс2: utm_source определен, не входит в список сорсов, определен utm_medium, входит в список медиумов
*/
func TestAdvEngineOtherSource(t *testing.T) {
	is := is.New(t)
	u := `https://developers.xsolla.com/changelog.html?utm_source=sina&utm_medium=cpc&utm_term=payment%20account%20management&utm_campaign=april%20changelog`
	URL := parseUrlParams(u)
	hit := map[string]string{}
	hit["Referer"] = "http://blog.sina.com.cn/s/blog_e948a4370102x5d9.html"
	utm(hit, URL)
	openstat(hit, URL)
	advEngine(hit)

	val, ok := hit["AdvEngine"]
	is.True(ok)
	is.Equal(val, OtherEngine)
}

/*
	Кейс3: utm_source определен, не входит в список сорсов, определен utm_medium, НЕ входит в список медиумов
*/
func TestAdvEngineUtmSourceFalse(t *testing.T) {
	is := is.New(t)
	u := `https://developers.xsolla.com/changelog.html?utm_source=changelog&utm_medium=blog&utm_term=payment%20account%20management&utm_campaign=april%20changelog`
	URL := parseUrlParams(u)
	hit := map[string]string{}
	hit["Referer"] = "http://blog.sina.com.cn/s/blog_e948a4370102x5d9.html"
	utm(hit, URL)
	openstat(hit, URL)
	advEngine(hit)

	val, ok := hit["AdvEngine"]
	is.True(ok)
	is.Equal(val, "")
}

/*
	Кейс4: OpenstatService определен, входит в список сорсов
*/
func TestAdvEngineOpenstatService(t *testing.T) {
	is := is.New(t)
	u := `https://xsolla.com/en/?_openstat=YWRyaXZlcjs7Ow%3D%3D`
	URL := parseUrlParams(u)
	hit := map[string]string{}
	hit["Referer"] = "http://nova.rambler.ru/search?query=%CF%EB%E0%F2%E5%E6%ED%E0%FF%20%F1%E8%F1%F2%E5%EC%E0%20PayPal%20%E2%20%EA%EE%F0%E5%E5"
	utm(hit, URL)
	openstat(hit, URL)
	advEngine(hit)

	val, ok := hit["AdvEngine"]
	is.True(ok)
	is.Equal(val, "adriver")
}

/*
	Кейс5: OpenstatService определен, не входит в список сорсов, определен OpenstatSource, не входит в список медиумов
*/
func TestAdvEngineOpenstatFalse(t *testing.T) {
	is := is.New(t)
	u := `https://xsolla.com/en/?_openstat=TWFya2V0YXRvcjYwOzs7`
	URL := parseUrlParams(u)
	hit := map[string]string{}
	hit["Referer"] = "https://nova.rambler.ru/search?query=Xsolla&utm_source=head&utm_medium=button&utm_campaign=self_promo&utm_content=search&_openstat=UmFtYmxlcl9NYWluOzs7"
	utm(hit, URL)
	openstat(hit, URL)
	advEngine(hit)

	val, ok := hit["AdvEngine"]
	is.True(ok)
	is.Equal(val, "")
}

/*
	Кейс6: OpenstatService определен, не входит в список сорсов, определен OpenstatSource, входит в список медиумов
*/
func TestAdvEngineOtherOpenstat(t *testing.T) {
	is := is.New(t)
	u := `https://xsolla.com/en/?_openstat=TWFya2V0YXRvcjYwOzs7ZGlzcGxheQ%3D%3D`
	URL := parseUrlParams(u)
	hit := map[string]string{}
	hit["Referer"] = "https://nova.rambler.ru/search?query=Xsolla&utm_source=head&utm_medium=button&utm_campaign=self_promo&utm_content=search&_openstat=UmFtYmxlcl9NYWluOzs7"
	utm(hit, URL)
	openstat(hit, URL)
	advEngine(hit)

	val, ok := hit["AdvEngine"]
	is.True(ok)
	is.Equal(val, OtherEngine)
}

/*
	Кейс7: utm_source не определен, OpenstatService не определен
*/
func TestAdvEngineFalse(t *testing.T) {
	is := is.New(t)
	u := `https://www.xsolla.com/en/`
	URL := parseUrlParams(u)
	hit := map[string]string{}
	hit["Referer"] = "https://www.google.com.br/"
	utm(hit, URL)
	openstat(hit, URL)
	advEngine(hit)

	val, ok := hit["AdvEngine"]
	is.True(ok)
	is.Equal(val, "")
}
