package util

import (
	"fmt"
	"os"
	"os/user"
	"path/filepath"
	"runtime"
	"strings"
	"testing"

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

func TestFileExist(t *testing.T) {
	assert.True(t, FileExists("utils.go"))
}

func TestFileExistNot(t *testing.T) {
	assert.True(t, !FileExists("Utils2.go"))
}

func TestJoiningSlash1(t *testing.T) {
	actual := JoiningSlash("http://my.tld/docs/", "bla/", "blub/")
	expected := "http://my.tld/docs/bla/blub/"
	assert.Equal(t, expected, actual)
}

func TestJoiningSlash2(t *testing.T) {
	actual := JoiningSlash("http://my.tld", "bla", "blub")
	assert.Equal(t, "http://my.tld/bla/blub", actual)
}

func TestJoiningSlash3(t *testing.T) {
	actual := JoiningSlash("http://my.tld/", "bla", "blub")
	assert.Equal(t, "http://my.tld/bla/blub", actual)
}
func TestJoiningSlash4(t *testing.T) {
	actual := JoiningSlash("http://my.tld", "bla/", "blub")
	assert.Equal(t, "http://my.tld/bla/blub", actual)
}
func TestJoiningSlash5(t *testing.T) {
	actual := JoiningSlash("http://my.tld/docs", "bla/", "blub")
	expected := "http://my.tld/docs/bla/blub"
	assert.Equal(t, expected, actual)
}

func TestJoiningSlash6(t *testing.T) {
	actual := JoiningSlash("http://my.tld/docs/", "bla/", "blub")
	expected := "http://my.tld/docs/bla/blub"
	assert.Equal(t, expected, actual)
}

/*
Can run only as admin within windows or linux
e.g. sudo TESTASSUDO=yes /usr/local/go/bin/go test -timeout 30s -run ^TestIsSuperUser$
*/
func TestIsSuperUser(t *testing.T) {
	if !strings.EqualFold(os.Getenv("TESTASSUDO"), "yes") {
		t.Skip("Skipping in normal tests")
	}
	cuser, err := user.Current()
	assert.Nil(t, err)
	assert.NotNil(t, cuser)
	assert.True(t, IsSuperUser())
}

func TestGlobalConfigurationDirectoryWindows(t *testing.T) {
	if runtime.GOOS != "windows" {
		t.Skip(fmt.Sprintf("Skipping on OS %s", runtime.GOOS))
	}
	appFolder := GetGlobalConfigurationDirectory("myapp")
	assert.Equal(t, filepath.Join(os.Getenv("APPDATA"), "myapp"), appFolder)
}

func TestGlobalConfigurationDirectoryLinux(t *testing.T) {
	if runtime.GOOS != "linux" {
		t.Skip(fmt.Sprintf("Skipping on OS %s", runtime.GOOS))
	}
	appFolder := GetGlobalConfigurationDirectory("myapp")
	assert.Equal(t, "/etc/myapp", appFolder)
}

func TestGlobalConfigurationDirectoryMacOS(t *testing.T) {
	if runtime.GOOS != "darwin" {
		t.Skip(fmt.Sprintf("Skipping on OS %s", runtime.GOOS))
	}
	appFolder := GetGlobalConfigurationDirectory("myapp")
	assert.Equal(t, "/etc/myapp", appFolder)
}