github.com/jaylevin/jenkins-library@v1.230.4/cmd/gradleExecuteBuild_test.go (about)

     1  package cmd
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/pkg/errors"
     7  	"github.com/stretchr/testify/assert"
     8  
     9  	"github.com/SAP/jenkins-library/pkg/mock"
    10  )
    11  
    12  type gradleExecuteBuildMockUtils struct {
    13  	*mock.ExecMockRunner
    14  	*mock.FilesMock
    15  }
    16  
    17  func TestRunGradleExecuteBuild(t *testing.T) {
    18  
    19  	t.Run("failed case - build.gradle isn't present", func(t *testing.T) {
    20  		utils := gradleExecuteBuildMockUtils{
    21  			ExecMockRunner: &mock.ExecMockRunner{},
    22  			FilesMock:      &mock.FilesMock{},
    23  		}
    24  		options := &gradleExecuteBuildOptions{
    25  			Path:       "path/to",
    26  			Task:       "build",
    27  			UseWrapper: false,
    28  		}
    29  
    30  		err := runGradleExecuteBuild(options, nil, utils)
    31  		assert.Error(t, err)
    32  		assert.Contains(t, err.Error(), "the specified gradle build script could not be found")
    33  	})
    34  
    35  	t.Run("success case - only build", func(t *testing.T) {
    36  		utils := gradleExecuteBuildMockUtils{
    37  			ExecMockRunner: &mock.ExecMockRunner{},
    38  			FilesMock:      &mock.FilesMock{},
    39  		}
    40  		utils.FilesMock.AddFile("path/to/build.gradle", []byte{})
    41  		options := &gradleExecuteBuildOptions{
    42  			Path:       "path/to",
    43  			Task:       "build",
    44  			UseWrapper: false,
    45  		}
    46  
    47  		err := runGradleExecuteBuild(options, nil, utils)
    48  		assert.NoError(t, err)
    49  		assert.Equal(t, 1, len(utils.Calls))
    50  		assert.Equal(t, mock.ExecCall{Exec: "gradle", Params: []string{"build", "-p", "path/to"}}, utils.Calls[0])
    51  	})
    52  
    53  	t.Run("success case - bom creation", func(t *testing.T) {
    54  		utils := gradleExecuteBuildMockUtils{
    55  			ExecMockRunner: &mock.ExecMockRunner{},
    56  			FilesMock:      &mock.FilesMock{},
    57  		}
    58  		utils.FilesMock.AddFile("path/to/build.gradle", []byte{})
    59  		options := &gradleExecuteBuildOptions{
    60  			Path:       "path/to",
    61  			Task:       "build",
    62  			UseWrapper: false,
    63  			CreateBOM:  true,
    64  		}
    65  
    66  		err := runGradleExecuteBuild(options, nil, utils)
    67  		assert.NoError(t, err)
    68  		assert.Equal(t, 3, len(utils.Calls))
    69  		assert.Equal(t, mock.ExecCall{Exec: "gradle", Params: []string{"tasks", "-p", "path/to"}}, utils.Calls[0])
    70  		assert.Equal(t, mock.ExecCall{Execution: (*mock.Execution)(nil), Async: false, Exec: "gradle", Params: []string{"cyclonedxBom", "-p", "path/to", "--init-script", "initScript.gradle.tmp"}}, utils.Calls[1])
    71  		assert.Equal(t, mock.ExecCall{Exec: "gradle", Params: []string{"build", "-p", "path/to"}}, utils.Calls[2])
    72  		assert.True(t, utils.HasWrittenFile("initScript.gradle.tmp"))
    73  		assert.True(t, utils.HasRemovedFile("initScript.gradle.tmp"))
    74  	})
    75  
    76  	t.Run("success case - publishing of artifacts", func(t *testing.T) {
    77  		utils := gradleExecuteBuildMockUtils{
    78  			ExecMockRunner: &mock.ExecMockRunner{},
    79  			FilesMock:      &mock.FilesMock{},
    80  		}
    81  		utils.FilesMock.AddFile("path/to/build.gradle", []byte{})
    82  		options := &gradleExecuteBuildOptions{
    83  			Path:       "path/to",
    84  			Task:       "build",
    85  			UseWrapper: false,
    86  			Publish:    true,
    87  		}
    88  
    89  		err := runGradleExecuteBuild(options, nil, utils)
    90  		assert.NoError(t, err)
    91  		assert.Equal(t, 3, len(utils.Calls))
    92  		assert.Equal(t, mock.ExecCall{Exec: "gradle", Params: []string{"build", "-p", "path/to"}}, utils.Calls[0])
    93  		assert.Equal(t, mock.ExecCall{Exec: "gradle", Params: []string{"tasks", "-p", "path/to"}}, utils.Calls[1])
    94  		assert.Equal(t, mock.ExecCall{Execution: (*mock.Execution)(nil), Async: false, Exec: "gradle", Params: []string{"publish", "-p", "path/to", "--init-script", "initScript.gradle.tmp"}}, utils.Calls[2])
    95  		assert.True(t, utils.HasWrittenFile("initScript.gradle.tmp"))
    96  		assert.True(t, utils.HasRemovedFile("initScript.gradle.tmp"))
    97  	})
    98  
    99  	t.Run("success case - build using wrapper", func(t *testing.T) {
   100  		utils := gradleExecuteBuildMockUtils{
   101  			ExecMockRunner: &mock.ExecMockRunner{},
   102  			FilesMock:      &mock.FilesMock{},
   103  		}
   104  		utils.FilesMock.AddFile("path/to/build.gradle", []byte{})
   105  		utils.FilesMock.AddFile("gradlew", []byte{})
   106  		options := &gradleExecuteBuildOptions{
   107  			Path:       "path/to",
   108  			Task:       "build",
   109  			UseWrapper: true,
   110  		}
   111  
   112  		err := runGradleExecuteBuild(options, nil, utils)
   113  		assert.NoError(t, err)
   114  		assert.Equal(t, 1, len(utils.Calls))
   115  		assert.Equal(t, mock.ExecCall{Exec: "./gradlew", Params: []string{"build", "-p", "path/to"}}, utils.Calls[0])
   116  	})
   117  
   118  	t.Run("failed case - build", func(t *testing.T) {
   119  		utils := gradleExecuteBuildMockUtils{
   120  			ExecMockRunner: &mock.ExecMockRunner{
   121  				ShouldFailOnCommand: map[string]error{"gradle build -p path/to": errors.New("failed to build")},
   122  			},
   123  			FilesMock: &mock.FilesMock{},
   124  		}
   125  		utils.FilesMock.AddFile("path/to/build.gradle", []byte{})
   126  		options := &gradleExecuteBuildOptions{
   127  			Path:       "path/to",
   128  			Task:       "build",
   129  			UseWrapper: false,
   130  		}
   131  
   132  		err := runGradleExecuteBuild(options, nil, utils)
   133  		assert.Error(t, err)
   134  		assert.Contains(t, err.Error(), "failed to build")
   135  	})
   136  
   137  	t.Run("failed case - bom creation", func(t *testing.T) {
   138  		utils := gradleExecuteBuildMockUtils{
   139  			ExecMockRunner: &mock.ExecMockRunner{
   140  				ShouldFailOnCommand: map[string]error{"./gradlew cyclonedxBom -p path/to --init-script initScript.gradle.tmp": errors.New("failed to create bom")},
   141  			},
   142  			FilesMock: &mock.FilesMock{},
   143  		}
   144  		utils.FilesMock.AddFile("path/to/build.gradle", []byte{})
   145  		utils.FilesMock.AddFile("gradlew", []byte{})
   146  		options := &gradleExecuteBuildOptions{
   147  			Path:       "path/to",
   148  			Task:       "build",
   149  			UseWrapper: true,
   150  			CreateBOM:  true,
   151  		}
   152  
   153  		err := runGradleExecuteBuild(options, nil, utils)
   154  		assert.Error(t, err)
   155  		assert.Contains(t, err.Error(), "failed to create bom")
   156  	})
   157  
   158  	t.Run("failed case - publish artifacts", func(t *testing.T) {
   159  		utils := gradleExecuteBuildMockUtils{
   160  			ExecMockRunner: &mock.ExecMockRunner{
   161  				ShouldFailOnCommand: map[string]error{"./gradlew publish -p path/to --init-script initScript.gradle.tmp": errors.New("failed to publish artifacts")},
   162  			},
   163  			FilesMock: &mock.FilesMock{},
   164  		}
   165  		utils.FilesMock.AddFile("path/to/build.gradle", []byte{})
   166  		utils.FilesMock.AddFile("gradlew", []byte{})
   167  		options := &gradleExecuteBuildOptions{
   168  			Path:       "path/to",
   169  			Task:       "build",
   170  			UseWrapper: true,
   171  			Publish:    true,
   172  		}
   173  
   174  		err := runGradleExecuteBuild(options, nil, utils)
   175  		assert.Error(t, err)
   176  		assert.Contains(t, err.Error(), "failed to publish artifacts")
   177  	})
   178  }