// +build unit

package utils

import (
	"testing"
	"time"
)

func TestExec(t *testing.T) {
	testCommand := "echo"
	testArguments := []string{"Hello World"}

	result := Exec("/", testCommand, testArguments)

	if result != "Hello World" {
		t.Log("Expected 'Hello World' but got", "'"+result+"'")
		t.Fail()
	}
}

func ExampleExecAndStream() {
	ExecAndStream("/", "echo", []string{"Hello"})
	// Output:
	// Hello
	//
	// out:
	// Hello
	//
	// err:
}

func ExampleExecAndStreamExecutableNotFound() {
	ExecAndStream("/", "testcommand", []string{"Hello"})
	// Output:
	// cmd.Run() failed with exec: "testcommand": executable file not found in $PATH
	//
	// out:
	//
	// err:
}

func ExampleExecAndStreamError() {
	ExecAndStream("/", "man", []string{"Hello"})
	// Output:
	// cmd.Run() failed with exit status 16
	//
	// out:
	//
	// err:
	// No manual entry for Hello
}

func TestExecAndGetLines(t *testing.T) {
	testCommand := "echo"
	testArguments := []string{"$'Line1\nLine2\nLine3'"}
	var result []string

	scanner := ExecAndGetLines("/", testCommand, testArguments)

	for scanner.Scan() {
		result = append(result, scanner.Text())
	}

	if len(result) != 3 {
		t.Log("Expected 3 lines but got ", len(result))
		t.Fail()
	}
}

func TestDeleteEmptySlices(t *testing.T) {
	testSlice := []string{"Line1", "", "Line3"}

	resultSlice := DeleteEmptySlices(testSlice)

	if (len(resultSlice)) != 2 {
		t.Log("Expected 2 slices but got ", len(resultSlice))
		t.Fail()
	}

}

func TestGetPath(t *testing.T) {
	invalidPathKey := "test"

	result := GetPath(invalidPathKey)
	if result != "" {
		t.Log("Expected empty result but got ", result)
		t.Fail()
	}

	result = GetPath(WsPath)
	if result != "/home/system/components/ws/" {
		t.Log("Expected /home/system/components/ws/ but got", result)
		t.Fail()
	}
}

func TestGetSQLiteFormattedDateTime(t *testing.T) {
	datetime := time.Date(2021, time.Month(1), 01, 1, 30, 15, 0, time.UTC)
	result := GetSQLiteFormattedDateTime(datetime)

	if result != "2021-01-01 01:30:15" {
		t.Log("Expected 2021-01-01 01:30:15 but got ", result)
		t.Fail()
	}
}