package cmd

import (
	"testing"

	fn "knative.dev/func/pkg/functions"
	"knative.dev/func/pkg/mock"
)

// TestList_Namespace ensures that list command options for specifying a
// namespace (--namespace) or all namespaces (--all-namespaces) are  properly
// evaluated.
func TestList_Namespace(t *testing.T) {
	_ = fromTempDirectory(t)

	tests := []struct {
		name      string
		all       bool   // --all-namespaces
		namespace string // use specific namespace
		expected  string // expected
		err       bool   // expected error
	}{
		{
			name:     "default",
			expected: "func", // see ./testdata/default_kubeconfig
		},
		{
			name:      "namespace provided",
			namespace: "ns",
			expected:  "ns",
		},
		{
			name:     "all namespaces",
			all:      true,
			expected: "", // blank is implemented by lister as meaning all
		},
		{
			name:      "both flags error",
			namespace: "ns",
			all:       true,
			err:       true,
		},
	}
	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			var (
				lister = mock.NewLister()
				client = fn.New(fn.WithLister(lister))
			)
			cmd := NewListCmd(func(cc ClientConfig, options ...fn.Option) (*fn.Client, func()) {
				if cc.Namespace != test.expected {
					t.Fatalf("expected '%v', got '%v'", test.expected, cc.Namespace)
				}
				return client, func() {}
			})
			args := []string{}
			if test.namespace != "" {
				args = append(args, "--namespace", test.namespace)
			}
			if test.all {
				args = append(args, "-A")
			}
			cmd.SetArgs(args)

			err := cmd.Execute()
			if err != nil && !test.err {
				// TODO: typed error for --namespace with -A.  Perhaps ErrFlagConflict?
				t.Fatalf("unexpected error: %v", err)
			}
			if err == nil && test.err {
				t.Fatalf("did not receive expected error ")
			}
		})
	}
}
