// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

package command

import (
	"testing"

	"github.com/hashicorp/nomad/ci"
	"github.com/mitchellh/cli"
	"github.com/shoenig/test/must"
)

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", // dns resolution error messages changes with Go, OS version
		},
	}

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

			must.Eq(t, code, c.expectedCode, must.Sprintf("expected exit code %d, got: %d: %s", c.expectedCode, code, stdErr))
			must.StrContains(t, stdOut, c.expectedOutput)
			must.StrContains(t, stdErr, c.expectedError)

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