package command

import (
	"testing"

	"github.com/hashicorp/nomad/ci"
	"github.com/mitchellh/cli"
	"github.com/stretchr/testify/require"
)

var _ cli.Command = &OperatorMetricsCommand{}

func TestCommand_Metrics_Cases(t *testing.T) {
	ci.Parallel(t)

	srv, _, url := testServer(t, false, nil)
	defer srv.Shutdown()

	ui := cli.NewMockUi()
	cmd := &OperatorMetricsCommand{Meta: Meta{Ui: ui}}

	cases := []struct {
		name           string
		args           []string
		expectedCode   int
		expectedOutput string
		expectedError  string
	}{
		{
			"gotemplate MetricsSummary",
			[]string{"-address=" + url, "-t", "'{{ .Timestamp }}'"},
			0,
			"UTC",
			"",
		},
		{
			"json formatted MetricsSummary",
			[]string{"-address=" + url, "-json"},
			0,
			"{",
			"",
		},
		{
			"pretty print json",
			[]string{"-address=" + url, "-pretty"},
			0,
			"{",
			"",
		},
		{
			"prometheus format",
			[]string{"-address=" + url, "-format", "prometheus"},
			0,
			"# HELP",
			"",
		},
		{
			"bad argument",
			[]string{"-address=" + url, "-foo", "bar"},
			1,
			"Usage: nomad operator metrics",
			"flag provided but not defined: -foo",
		},
		{
			"bad address - no protocol",
			[]string{"-address=foo"},
			1,
			"",
			"Error getting metrics: Get \"/v1/metrics\": unsupported protocol scheme",
		},
		{
			"bad address - fake host",
			[]string{"-address=http://foo"},
			1,
			"",
			"dial tcp: lookup foo: Temporary failure in name resolution",
		},
	}

	for _, c := range cases {
		t.Run(c.name, func(t *testing.T) {
			code := cmd.Run(c.args)
			out := ui.OutputWriter.String()
			outerr := ui.ErrorWriter.String()

			require.Equalf(t, code, c.expectedCode, "expected exit code %d, got: %d: %s", c.expectedCode, code, outerr)
			require.Contains(t, out, c.expectedOutput, "expected output \"%s\", got \"%s\"", c.expectedOutput, out)
			require.Containsf(t, outerr, c.expectedError, "expected error \"%s\", got \"%s\"", c.expectedError, outerr)

			ui.OutputWriter.Reset()
			ui.ErrorWriter.Reset()
		})
	}
}
