package sftp

import (
	"reflect"
	"testing"
)

var sshcmdTests = []struct {
	cfg  Config
	cmd  string
	args []string
	err  string
}{
	{
		Config{User: "user", Host: "host", Path: "dir/subdir"},
		"ssh",
		[]string{"host", "-l", "user", "-s", "sftp"},
		"",
	},
	{
		Config{Host: "host", Path: "dir/subdir"},
		"ssh",
		[]string{"host", "-s", "sftp"},
		"",
	},
	{
		Config{Host: "host", Port: "10022", Path: "/dir/subdir"},
		"ssh",
		[]string{"host", "-p", "10022", "-s", "sftp"},
		"",
	},
	{
		Config{User: "user", Host: "host", Port: "10022", Path: "/dir/subdir"},
		"ssh",
		[]string{"host", "-p", "10022", "-l", "user", "-s", "sftp"},
		"",
	},
	{
		Config{User: "user", Host: "host", Port: "10022", Path: "/dir/subdir", Args: "-i /path/to/id_rsa"},
		"ssh",
		[]string{"host", "-p", "10022", "-l", "user", "-i", "/path/to/id_rsa", "-s", "sftp"},
		"",
	},
	{
		Config{Command: "ssh something", Args: "-i /path/to/id_rsa"},
		"",
		nil,
		"cannot specify both sftp.command and sftp.args options",
	},
	{
		// IPv6 address.
		Config{User: "user", Host: "::1", Path: "dir"},
		"ssh",
		[]string{"::1", "-l", "user", "-s", "sftp"},
		"",
	},
	{
		// IPv6 address with zone and port.
		Config{User: "user", Host: "::1%lo0", Port: "22", Path: "dir"},
		"ssh",
		[]string{"::1%lo0", "-p", "22", "-l", "user", "-s", "sftp"},
		"",
	},
}

func TestBuildSSHCommand(t *testing.T) {
	for i, test := range sshcmdTests {
		t.Run("", func(t *testing.T) {
			cmd, args, err := buildSSHCommand(test.cfg)
			if test.err != "" {
				if err.Error() != test.err {
					t.Fatalf("expected error %v got %v", test.err, err.Error())
				}
			} else {
				if err != nil {
					t.Fatalf("%v in test %d", err, i)
				}
			}

			if cmd != test.cmd {
				t.Fatalf("cmd: want %v, got %v", test.cmd, cmd)
			}

			if !reflect.DeepEqual(test.args, args) {
				t.Fatalf("wrong args in test %d, want:\n  %v\ngot:\n  %v",
					i, test.args, args)
			}
		})
	}
}