package utils

import (
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestTrimHostPort(t *testing.T) {
	assert.EqualValues(t, "aa", TrimHostPort("aa"))
	assert.EqualValues(t, "", TrimHostPort(":"))
	assert.EqualValues(t, "example.com", TrimHostPort("example.com:80"))
}

// TestCleanPath is mostly copied from fasthttp, to keep the behaviour we had before migrating away from it.
// Source (MIT licensed): https://github.com/valyala/fasthttp/blob/v1.48.0/uri_test.go#L154
// Copyright (c) 2015-present Aliaksandr Valialkin, VertaMedia, Kirill Danshin, Erik Dubbelboer, FastHTTP Authors
func TestCleanPath(t *testing.T) {
	// double slash
	testURIPathNormalize(t, "/aa//bb", "/aa/bb")

	// triple slash
	testURIPathNormalize(t, "/x///y/", "/x/y/")

	// multi slashes
	testURIPathNormalize(t, "/abc//de///fg////", "/abc/de/fg/")

	// encoded slashes
	testURIPathNormalize(t, "/xxxx%2fyyy%2f%2F%2F", "/xxxx/yyy/")

	// dotdot
	testURIPathNormalize(t, "/aaa/..", "/")

	// dotdot with trailing slash
	testURIPathNormalize(t, "/xxx/yyy/../", "/xxx/")

	// multi dotdots
	testURIPathNormalize(t, "/aaa/bbb/ccc/../../ddd", "/aaa/ddd")

	// dotdots separated by other data
	testURIPathNormalize(t, "/a/b/../c/d/../e/..", "/a/c/")

	// too many dotdots
	testURIPathNormalize(t, "/aaa/../../../../xxx", "/xxx")
	testURIPathNormalize(t, "/../../../../../..", "/")
	testURIPathNormalize(t, "/../../../../../../", "/")

	// encoded dotdots
	testURIPathNormalize(t, "/aaa%2Fbbb%2F%2E.%2Fxxx", "/aaa/xxx")

	// double slash with dotdots
	testURIPathNormalize(t, "/aaa////..//b", "/b")

	// fake dotdot
	testURIPathNormalize(t, "/aaa/..bbb/ccc/..", "/aaa/..bbb/")

	// single dot
	testURIPathNormalize(t, "/a/./b/././c/./d.html", "/a/b/c/d.html")
	testURIPathNormalize(t, "./foo/", "/foo/")
	testURIPathNormalize(t, "./../.././../../aaa/bbb/../../../././../", "/")
	testURIPathNormalize(t, "./a/./.././../b/./foo.html", "/b/foo.html")
}

func testURIPathNormalize(t *testing.T, requestURI, expectedPath string) {
	cleanedPath := CleanPath(requestURI)
	if cleanedPath != expectedPath {
		t.Fatalf("Unexpected path %q. Expected %q. requestURI=%q", cleanedPath, expectedPath, requestURI)
	}
}