package run

import (
	"github.com/golang/mock/gomock"
	"github.com/pelotech/drone-helm3/internal/env"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/suite"
	"strings"
	"testing"
)

type HelpTestSuite struct {
	suite.Suite
}

func TestHelpTestSuite(t *testing.T) {
	suite.Run(t, new(HelpTestSuite))
}

func (suite *HelpTestSuite) TestNewHelp() {
	cfg := env.Config{
		Command: "everybody dance NOW!!",
	}
	help := NewHelp(cfg)
	suite.Require().NotNil(help)
	suite.Equal("everybody dance NOW!!", help.helmCommand)
}

func (suite *HelpTestSuite) TestPrepare() {
	ctrl := gomock.NewController(suite.T())
	defer ctrl.Finish()

	mCmd := NewMockcmd(ctrl)
	originalCommand := command

	command = func(path string, args ...string) cmd {
		assert.Equal(suite.T(), helmBin, path)
		assert.Equal(suite.T(), []string{"help"}, args)
		return mCmd
	}
	defer func() { command = originalCommand }()

	stdout := strings.Builder{}
	stderr := strings.Builder{}

	mCmd.EXPECT().
		Stdout(&stdout)
	mCmd.EXPECT().
		Stderr(&stderr)

	cfg := env.Config{
		Stdout: &stdout,
		Stderr: &stderr,
	}

	h := NewHelp(cfg)
	err := h.Prepare()
	suite.NoError(err)
}

func (suite *HelpTestSuite) TestExecute() {
	ctrl := gomock.NewController(suite.T())
	defer ctrl.Finish()
	mCmd := NewMockcmd(ctrl)

	mCmd.EXPECT().
		Run().
		Times(2)

	help := NewHelp(env.Config{Command: "help"})
	help.cmd = mCmd
	suite.NoError(help.Execute())

	help.helmCommand = "get down on friday"
	suite.EqualError(help.Execute(), "unknown command 'get down on friday'")
}
