github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/pkg/gradle/gradle_test.go (about)

     1  //go:build unit
     2  // +build unit
     3  
     4  package gradle
     5  
     6  import (
     7  	"errors"
     8  	"os"
     9  
    10  	"github.com/SAP/jenkins-library/pkg/mock"
    11  
    12  	"testing"
    13  
    14  	"github.com/stretchr/testify/assert"
    15  )
    16  
    17  type MockUtils struct {
    18  	existingFiles []string
    19  	writtenFiles  []string
    20  	removedFiles  []string
    21  	*mock.FilesMock
    22  	*mock.ExecMockRunner
    23  }
    24  
    25  func (m *MockUtils) FileExists(filePath string) (bool, error) {
    26  	for _, filename := range m.existingFiles {
    27  		if filename == filePath {
    28  			return true, nil
    29  		}
    30  	}
    31  	return false, nil
    32  }
    33  
    34  func (m *MockUtils) FileWrite(path string, content []byte, perm os.FileMode) error {
    35  	m.writtenFiles = append(m.writtenFiles, path)
    36  	return nil
    37  }
    38  
    39  func (m *MockUtils) FileRemove(path string) error {
    40  	m.removedFiles = append(m.removedFiles, path)
    41  	return nil
    42  }
    43  
    44  func TestExecute(t *testing.T) {
    45  	t.Run("success - run command use gradle tool", func(t *testing.T) {
    46  		utils := &MockUtils{
    47  			FilesMock:      &mock.FilesMock{},
    48  			ExecMockRunner: &mock.ExecMockRunner{},
    49  			existingFiles:  []string{"path/to/build.gradle"},
    50  		}
    51  		opts := ExecuteOptions{
    52  			BuildGradlePath:   "path/to",
    53  			Task:              "build",
    54  			InitScriptContent: "",
    55  			UseWrapper:        false,
    56  			ProjectProperties: map[string]string{"propName": "propValue"},
    57  		}
    58  
    59  		_, err := Execute(&opts, utils)
    60  		assert.NoError(t, err)
    61  		assert.Equal(t, 1, len(utils.Calls))
    62  		assert.Equal(t, mock.ExecCall{Exec: "gradle", Params: []string{"build", "-p", "path/to", "-PpropName=propValue"}}, utils.Calls[0])
    63  		assert.Equal(t, []string(nil), utils.writtenFiles)
    64  		assert.Equal(t, []string(nil), utils.removedFiles)
    65  	})
    66  
    67  	t.Run("success - run command use gradlew tool", func(t *testing.T) {
    68  		utils := &MockUtils{
    69  			FilesMock:      &mock.FilesMock{},
    70  			ExecMockRunner: &mock.ExecMockRunner{},
    71  			existingFiles:  []string{"path/to/build.gradle", "gradlew"},
    72  		}
    73  		opts := ExecuteOptions{
    74  			BuildGradlePath:   "path/to",
    75  			Task:              "build",
    76  			InitScriptContent: "",
    77  			UseWrapper:        true,
    78  		}
    79  
    80  		_, err := Execute(&opts, utils)
    81  		assert.NoError(t, err)
    82  
    83  		assert.Equal(t, 1, len(utils.Calls))
    84  		assert.Equal(t, mock.ExecCall{Exec: "./gradlew", Params: []string{"build", "-p", "path/to"}}, utils.Calls[0])
    85  		assert.Equal(t, []string(nil), utils.writtenFiles)
    86  		assert.Equal(t, []string(nil), utils.removedFiles)
    87  	})
    88  
    89  	t.Run("use init script to apply plugin", func(t *testing.T) {
    90  		utils := &MockUtils{
    91  			FilesMock:      &mock.FilesMock{},
    92  			ExecMockRunner: &mock.ExecMockRunner{},
    93  			existingFiles:  []string{"path/to/build.gradle.kts"},
    94  		}
    95  		opts := ExecuteOptions{
    96  			BuildGradlePath:   "path/to",
    97  			Task:              "build",
    98  			InitScriptContent: "some content",
    99  			UseWrapper:        false,
   100  		}
   101  
   102  		_, err := Execute(&opts, utils)
   103  		assert.NoError(t, err)
   104  
   105  		assert.Equal(t, 2, len(utils.Calls))
   106  		assert.Equal(t, mock.ExecCall{Exec: "gradle", Params: []string{"tasks", "-p", "path/to"}}, utils.Calls[0])
   107  		assert.Equal(t, mock.ExecCall{Execution: (*mock.Execution)(nil), Async: false, Exec: "gradle", Params: []string{"build", "-p", "path/to", "--init-script", "initScript.gradle.tmp"}}, utils.Calls[1])
   108  		assert.Equal(t, []string{"initScript.gradle.tmp"}, utils.writtenFiles)
   109  		assert.Equal(t, []string{"initScript.gradle.tmp"}, utils.removedFiles)
   110  	})
   111  
   112  	t.Run("failed - use init script to apply plugin", func(t *testing.T) {
   113  		utils := &MockUtils{
   114  			FilesMock: &mock.FilesMock{},
   115  			ExecMockRunner: &mock.ExecMockRunner{
   116  				ShouldFailOnCommand: map[string]error{"gradle tasks -p path/to": errors.New("failed to get tasks")},
   117  			},
   118  			existingFiles: []string{"path/to/build.gradle.kts"},
   119  		}
   120  		opts := ExecuteOptions{
   121  			BuildGradlePath:   "path/to",
   122  			Task:              "build",
   123  			InitScriptContent: "some content",
   124  			UseWrapper:        false,
   125  		}
   126  
   127  		_, err := Execute(&opts, utils)
   128  		assert.Error(t, err)
   129  		assert.Contains(t, err.Error(), "failed to get tasks")
   130  	})
   131  
   132  	t.Run("use init script to apply an existing plugin", func(t *testing.T) {
   133  		utils := &MockUtils{
   134  			FilesMock:      &mock.FilesMock{},
   135  			ExecMockRunner: &mock.ExecMockRunner{},
   136  			existingFiles:  []string{"path/to/build.gradle.kts"},
   137  		}
   138  		utils.StdoutReturn = map[string]string{"gradle tasks -p path/to": "createBom"}
   139  		opts := ExecuteOptions{
   140  			BuildGradlePath:   "path/to",
   141  			Task:              "createBom",
   142  			InitScriptContent: "some content",
   143  			UseWrapper:        false,
   144  		}
   145  
   146  		_, err := Execute(&opts, utils)
   147  		assert.NoError(t, err)
   148  
   149  		assert.Equal(t, 2, len(utils.Calls))
   150  		assert.Equal(t, mock.ExecCall{Exec: "gradle", Params: []string{"tasks", "-p", "path/to"}}, utils.Calls[0])
   151  		assert.Equal(t, mock.ExecCall{Execution: (*mock.Execution)(nil), Async: false, Exec: "gradle", Params: []string{"createBom", "-p", "path/to"}}, utils.Calls[1])
   152  		assert.Equal(t, []string(nil), utils.writtenFiles)
   153  		assert.Equal(t, []string(nil), utils.removedFiles)
   154  	})
   155  
   156  	t.Run("failed - run command", func(t *testing.T) {
   157  		utils := &MockUtils{
   158  			FilesMock: &mock.FilesMock{},
   159  			ExecMockRunner: &mock.ExecMockRunner{
   160  				ShouldFailOnCommand: map[string]error{"gradle build -p path/to": errors.New("failed to build")},
   161  			},
   162  			existingFiles: []string{"path/to/build.gradle"},
   163  		}
   164  		opts := ExecuteOptions{
   165  			BuildGradlePath:   "path/to",
   166  			Task:              "build",
   167  			InitScriptContent: "",
   168  			UseWrapper:        false,
   169  		}
   170  
   171  		_, err := Execute(&opts, utils)
   172  		assert.Error(t, err)
   173  		assert.Contains(t, err.Error(), "failed to build")
   174  	})
   175  
   176  	t.Run("failed - missing gradle build script", func(t *testing.T) {
   177  		utils := &MockUtils{
   178  			FilesMock:      &mock.FilesMock{},
   179  			ExecMockRunner: &mock.ExecMockRunner{},
   180  			existingFiles:  []string{},
   181  		}
   182  		opts := ExecuteOptions{
   183  			BuildGradlePath:   "path/to",
   184  			Task:              "build",
   185  			InitScriptContent: "",
   186  			UseWrapper:        false,
   187  		}
   188  
   189  		_, err := Execute(&opts, utils)
   190  		assert.Error(t, err)
   191  		assert.Contains(t, err.Error(), "the specified gradle build script could not be found")
   192  	})
   193  
   194  	t.Run("success - should return stdOut", func(t *testing.T) {
   195  		expectedOutput := "mocked output"
   196  		utils := &MockUtils{
   197  			FilesMock:      &mock.FilesMock{},
   198  			ExecMockRunner: &mock.ExecMockRunner{},
   199  			existingFiles:  []string{"path/to/build.gradle"},
   200  		}
   201  		utils.StdoutReturn = map[string]string{"gradle build -p path/to": expectedOutput}
   202  		opts := ExecuteOptions{
   203  			BuildGradlePath:   "path/to",
   204  			Task:              "build",
   205  			InitScriptContent: "",
   206  			UseWrapper:        false,
   207  		}
   208  
   209  		actualOutput, err := Execute(&opts, utils)
   210  		assert.NoError(t, err)
   211  
   212  		assert.Equal(t, expectedOutput, actualOutput)
   213  	})
   214  }