package command

import (
	"testing"
)

func TestInternalPlugin_InternalProviders(t *testing.T) {
	m := new(Meta)
	providers := m.internalProviders()
	// terraform is the only provider moved back to internal
	for _, name := range []string{"terraform"} {
		pf, ok := providers[name]
		if !ok {
			t.Errorf("Expected to find %s in InternalProviders", name)
		}

		provider, err := pf()
		if err != nil {
			t.Fatal(err)
		}

		if provider == nil {
			t.Fatal("provider factory returned a nil provider")
		}
	}
}

func TestInternalPlugin_InternalProvisioners(t *testing.T) {
	for _, name := range []string{"chef", "file", "local-exec", "remote-exec", "salt-masterless"} {
		if _, ok := InternalProvisioners[name]; !ok {
			t.Errorf("Expected to find %s in InternalProvisioners", name)
		}
	}
}

func TestInternalPlugin_BuildPluginCommandString(t *testing.T) {
	actual, err := BuildPluginCommandString("provisioner", "remote-exec")
	if err != nil {
		t.Fatalf(err.Error())
	}

	expected := "-TFSPACE-internal-plugin-TFSPACE-provisioner-TFSPACE-remote-exec"
	if actual[len(actual)-len(expected):] != expected {
		t.Errorf("Expected command to end with %s; got:\n%s\n", expected, actual)
	}
}

func TestInternalPlugin_StripArgFlags(t *testing.T) {
	actual := StripArgFlags([]string{"provisioner", "remote-exec", "-var-file=my_vars.tfvars", "-flag"})
	expected := []string{"provisioner", "remote-exec"}
	// Must be same length and order.
	if len(actual) != len(expected) || expected[0] != actual[0] || actual[1] != actual[1] {
		t.Fatalf("Expected args to be exactly '%s', got '%s'", expected, actual)
	}
}
