github.com/SAP/jenkins-library@v1.362.0/cmd/shellExecute_test.go (about)

     1  //go:build unit
     2  // +build unit
     3  
     4  package cmd
     5  
     6  import (
     7  	"net/http"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  
    12  	"github.com/SAP/jenkins-library/pkg/mock"
    13  )
    14  
    15  type shellExecuteMockUtils struct {
    16  	config *shellExecuteOptions
    17  	*mock.ExecMockRunner
    18  	*mock.FilesMock
    19  	*mock.HttpClientMock
    20  	downloadError error
    21  	filename      string
    22  	header        http.Header
    23  	url           string
    24  }
    25  
    26  func (f *shellExecuteMockUtils) DownloadFile(url, filename string, header http.Header, cookies []*http.Cookie) error {
    27  	if f.downloadError != nil {
    28  		return f.downloadError
    29  	}
    30  	f.url = url
    31  	f.filename = filename
    32  	f.header = header
    33  	return nil
    34  }
    35  
    36  func newShellExecuteTestsUtils() *shellExecuteMockUtils {
    37  	utils := shellExecuteMockUtils{
    38  		ExecMockRunner: &mock.ExecMockRunner{},
    39  		FilesMock:      &mock.FilesMock{},
    40  	}
    41  	return &utils
    42  }
    43  
    44  func (v *shellExecuteMockUtils) GetConfig() *shellExecuteOptions {
    45  	return v.config
    46  }
    47  
    48  func TestRunShellExecute(t *testing.T) {
    49  
    50  	t.Run("negative case - script isn't present", func(t *testing.T) {
    51  		c := &shellExecuteOptions{
    52  			Sources: []string{"path/to/script.sh"},
    53  		}
    54  		u := newShellExecuteTestsUtils()
    55  
    56  		err := runShellExecute(c, nil, u)
    57  		assert.EqualError(t, err, "the script 'path/to/script.sh' could not be found")
    58  	})
    59  
    60  	t.Run("success case - script run successfully", func(t *testing.T) {
    61  		o := &shellExecuteOptions{
    62  			Sources: []string{"path/script.sh"},
    63  		}
    64  
    65  		u := newShellExecuteTestsUtils()
    66  		u.AddFile("path/script.sh", []byte(`echo dummy`))
    67  
    68  		err := runShellExecute(o, nil, u)
    69  		assert.Equal(t, "path/script.sh", u.ExecMockRunner.Calls[0].Exec)
    70  		assert.Equal(t, []string{}, u.ExecMockRunner.Calls[0].Params)
    71  		assert.NoError(t, err)
    72  	})
    73  
    74  	t.Run("success case - download script header gets added", func(t *testing.T) {
    75  		o := &shellExecuteOptions{
    76  			Sources:     []string{"https://myScriptLocation/myScript.sh"},
    77  			GithubToken: "dummy@12345",
    78  		}
    79  		u := newShellExecuteTestsUtils()
    80  
    81  		runShellExecute(o, nil, u)
    82  
    83  		assert.Equal(t, http.Header{"Accept": []string{"application/vnd.github.v3.raw"}, "Authorization": []string{"Token dummy@12345"}}, u.header)
    84  	})
    85  
    86  	t.Run("success case - single positional script arguments gets added to the correct script", func(t *testing.T) {
    87  		o := &shellExecuteOptions{
    88  			Sources:         []string{"path1/script1.sh", "path2/script2.sh"},
    89  			ScriptArguments: []string{"arg1", "arg2"},
    90  		}
    91  
    92  		u := newShellExecuteTestsUtils()
    93  		u.AddFile("path1/script1.sh", []byte(`echo dummy1`))
    94  		u.AddFile("path2/script2.sh", []byte(`echo dummy2`))
    95  
    96  		err := runShellExecute(o, nil, u)
    97  
    98  		assert.Equal(t, "path1/script1.sh", u.ExecMockRunner.Calls[0].Exec)
    99  		assert.Equal(t, []string{"arg1"}, u.ExecMockRunner.Calls[0].Params)
   100  		assert.Equal(t, "path2/script2.sh", u.ExecMockRunner.Calls[1].Exec)
   101  		assert.Equal(t, []string{"arg2"}, u.ExecMockRunner.Calls[1].Params)
   102  		assert.NoError(t, err)
   103  	})
   104  
   105  	t.Run("success case - multiple positional script arguments gets added to the correct script", func(t *testing.T) {
   106  		o := &shellExecuteOptions{
   107  			Sources:         []string{"path1/script1.sh", "path2/script2.sh"},
   108  			ScriptArguments: []string{"arg1,arg2", "arg3,arg4"},
   109  		}
   110  
   111  		u := newShellExecuteTestsUtils()
   112  		u.AddFile("path1/script1.sh", []byte(`echo dummy1`))
   113  		u.AddFile("path2/script2.sh", []byte(`echo dummy2`))
   114  
   115  		err := runShellExecute(o, nil, u)
   116  
   117  		assert.Equal(t, "path1/script1.sh", u.ExecMockRunner.Calls[0].Exec)
   118  		assert.Equal(t, []string{"arg1", "arg2"}, u.ExecMockRunner.Calls[0].Params)
   119  		assert.Equal(t, "path2/script2.sh", u.ExecMockRunner.Calls[1].Exec)
   120  		assert.Equal(t, []string{"arg3", "arg4"}, u.ExecMockRunner.Calls[1].Params)
   121  		assert.NoError(t, err)
   122  	})
   123  
   124  	t.Run("success case - no argument for script 1, single argument for script 2 and multiple argument for script3 gets added to the correct script", func(t *testing.T) {
   125  		o := &shellExecuteOptions{
   126  			Sources:         []string{"path1/script1.sh", "path2/script2.sh", "path3/script3.sh"},
   127  			ScriptArguments: []string{"", "arg2.1", "arg3.1,arg3.2"},
   128  		}
   129  
   130  		u := newShellExecuteTestsUtils()
   131  		u.AddFile("path1/script1.sh", []byte(`echo dummy1`))
   132  		u.AddFile("path2/script2.sh", []byte(`echo dummy2`))
   133  		u.AddFile("path3/script3.sh", []byte(`echo dummy3`))
   134  
   135  		err := runShellExecute(o, nil, u)
   136  
   137  		assert.Equal(t, "path1/script1.sh", u.ExecMockRunner.Calls[0].Exec)
   138  		assert.Equal(t, []string{}, u.ExecMockRunner.Calls[0].Params)
   139  		assert.Equal(t, "path2/script2.sh", u.ExecMockRunner.Calls[1].Exec)
   140  		assert.Equal(t, []string{"arg2.1"}, u.ExecMockRunner.Calls[1].Params)
   141  		assert.Equal(t, "path3/script3.sh", u.ExecMockRunner.Calls[2].Exec)
   142  		assert.Equal(t, []string{"arg3.1", "arg3.2"}, u.ExecMockRunner.Calls[2].Params)
   143  		assert.NoError(t, err)
   144  	})
   145  }