package cmd

import (
	"io/ioutil"
	"os"
	"path"
	"reflect"
	"testing"

	"github.com/deis/workflow-cli/controller/api"
)

func TestGetKey(t *testing.T) {
	t.Parallel()

	file, err := ioutil.TempFile("", "deis-key")

	if err != nil {
		t.Fatal(err)
	}

	toWrite := []byte("ssh-rsa abc test@example.com")

	expected := api.KeyCreateRequest{
		ID:     "test@example.com",
		Public: string(toWrite),
		Name:   file.Name(),
	}

	if _, err = file.Write(toWrite); err != nil {
		t.Fatal(err)
	}

	key, err := getKey(file.Name())

	if err != nil {
		t.Fatal(err)
	}

	if !reflect.DeepEqual(expected, key) {
		t.Errorf("Expected %v, Got %v", expected, key)
	}
}

func TestGetKeyNoComment(t *testing.T) {
	t.Parallel()

	file, err := ioutil.TempFile("", "deis-key")

	if err != nil {
		t.Fatal(err)
	}

	toWrite := []byte("ssh-rsa abc")

	expected := api.KeyCreateRequest{
		ID:     path.Base(file.Name()),
		Public: string(toWrite),
		Name:   file.Name(),
	}

	if _, err = file.Write(toWrite); err != nil {
		t.Fatal(err)
	}

	key, err := getKey(file.Name())

	if err != nil {
		t.Fatal(err)
	}

	if !reflect.DeepEqual(expected, key) {
		t.Errorf("Expected %v, Got %v", expected, key)
	}
}

func TestListKeys(t *testing.T) {
	name, err := ioutil.TempDir("", "deis-key")

	if err != nil {
		t.Fatal(err)
	}

	os.Setenv("HOME", name)

	folder := path.Join(name, ".ssh")

	if err = os.Mkdir(folder, 0755); err != nil {
		t.Fatal(err)
	}

	toWrite := []byte("ssh-rsa abc test@example.com")
	fileNames := []string{"test1.pub", "test2.pub"}

	expected := []api.KeyCreateRequest{
		{
			ID:     "test@example.com",
			Public: string(toWrite),
			Name:   path.Join(folder, fileNames[0]),
		},
		{
			ID:     "test@example.com",
			Public: string(toWrite),
			Name:   path.Join(folder, fileNames[1]),
		},
	}

	for _, file := range fileNames {
		if err = ioutil.WriteFile(path.Join(folder, file), toWrite, 0775); err != nil {
			t.Fatal(err)
		}
	}

	keys, err := listKeys()

	if err != nil {
		t.Fatal(err)
	}

	if !reflect.DeepEqual(expected, keys) {
		t.Errorf("Expected %v, Got %v", expected, keys)
	}
}
