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

     1  package cmd
     2  
     3  import (
     4  	"errors"
     5  	"net/http"
     6  	"os"
     7  	"path/filepath"
     8  	"testing"
     9  
    10  	"github.com/SAP/jenkins-library/pkg/mock"
    11  	"github.com/ghodss/yaml"
    12  	"github.com/stretchr/testify/assert"
    13  )
    14  
    15  type mtaBuildTestUtilsBundle struct {
    16  	*mock.ExecMockRunner
    17  	*mock.FilesMock
    18  	projectSettingsFile            string
    19  	globalSettingsFile             string
    20  	registryUsedInSetNpmRegistries string
    21  }
    22  
    23  func (m *mtaBuildTestUtilsBundle) SetNpmRegistries(defaultNpmRegistry string) error {
    24  	m.registryUsedInSetNpmRegistries = defaultNpmRegistry
    25  	return nil
    26  }
    27  
    28  func (m *mtaBuildTestUtilsBundle) InstallAllDependencies(defaultNpmRegistry string) error {
    29  	return errors.New("Test should not install dependencies.") //TODO implement test
    30  }
    31  
    32  func (m *mtaBuildTestUtilsBundle) DownloadAndCopySettingsFiles(globalSettingsFile string, projectSettingsFile string) error {
    33  	m.projectSettingsFile = projectSettingsFile
    34  	m.globalSettingsFile = globalSettingsFile
    35  	return nil
    36  }
    37  
    38  func (m *mtaBuildTestUtilsBundle) DownloadFile(url, filename string, header http.Header, cookies []*http.Cookie) error {
    39  	return errors.New("Test should not download files.")
    40  }
    41  
    42  func newMtaBuildTestUtilsBundle() *mtaBuildTestUtilsBundle {
    43  	utilsBundle := mtaBuildTestUtilsBundle{
    44  		ExecMockRunner: &mock.ExecMockRunner{},
    45  		FilesMock:      &mock.FilesMock{},
    46  	}
    47  	return &utilsBundle
    48  }
    49  
    50  func TestMtaBuild(t *testing.T) {
    51  
    52  	cpe := mtaBuildCommonPipelineEnvironment{}
    53  
    54  	t.Run("Application name not set", func(t *testing.T) {
    55  
    56  		utilsMock := newMtaBuildTestUtilsBundle()
    57  		options := mtaBuildOptions{}
    58  
    59  		err := runMtaBuild(options, &cpe, utilsMock)
    60  
    61  		assert.NotNil(t, err)
    62  		assert.Equal(t, "'mta.yaml' not found in project sources and 'applicationName' not provided as parameter - cannot generate 'mta.yaml' file", err.Error())
    63  
    64  	})
    65  
    66  	t.Run("Provide default npm registry", func(t *testing.T) {
    67  
    68  		utilsMock := newMtaBuildTestUtilsBundle()
    69  		options := mtaBuildOptions{ApplicationName: "myApp", Platform: "CF", DefaultNpmRegistry: "https://example.org/npm", MtarName: "myName", Source: "./", Target: "./"}
    70  
    71  		utilsMock.AddFile("package.json", []byte("{\"name\": \"myName\", \"version\": \"1.2.3\"}"))
    72  
    73  		err := runMtaBuild(options, &cpe, utilsMock)
    74  
    75  		assert.Nil(t, err)
    76  
    77  		assert.Equal(t, "https://example.org/npm", utilsMock.registryUsedInSetNpmRegistries)
    78  	})
    79  
    80  	t.Run("Package json does not exist", func(t *testing.T) {
    81  
    82  		utilsMock := newMtaBuildTestUtilsBundle()
    83  
    84  		options := mtaBuildOptions{ApplicationName: "myApp"}
    85  
    86  		err := runMtaBuild(options, &cpe, utilsMock)
    87  
    88  		assert.NotNil(t, err)
    89  
    90  		assert.Equal(t, "package.json file does not exist", err.Error())
    91  
    92  	})
    93  
    94  	t.Run("Write yaml file", func(t *testing.T) {
    95  
    96  		utilsMock := newMtaBuildTestUtilsBundle()
    97  
    98  		options := mtaBuildOptions{ApplicationName: "myApp", Platform: "CF", MtarName: "myName", Source: "./", Target: "./"}
    99  
   100  		utilsMock.AddFile("package.json", []byte("{\"name\": \"myName\", \"version\": \"1.2.3\"}"))
   101  
   102  		err := runMtaBuild(options, &cpe, utilsMock)
   103  
   104  		assert.Nil(t, err)
   105  
   106  		type MtaResult struct {
   107  			Version    string
   108  			ID         string `yaml:"ID,omitempty"`
   109  			Parameters map[string]string
   110  			Modules    []struct {
   111  				Name       string
   112  				Type       string
   113  				Parameters map[string]interface{}
   114  			}
   115  		}
   116  
   117  		assert.True(t, utilsMock.HasWrittenFile("mta.yaml"))
   118  
   119  		var result MtaResult
   120  		mtaContent, _ := utilsMock.FileRead("mta.yaml")
   121  		yaml.Unmarshal(mtaContent, &result)
   122  
   123  		assert.Equal(t, "myName", result.ID)
   124  		assert.Equal(t, "1.2.3", result.Version)
   125  		assert.Equal(t, "myApp", result.Modules[0].Name)
   126  		assert.Regexp(t, "^1\\.2\\.3-[\\d]{14}$", result.Modules[0].Parameters["version"])
   127  		assert.Equal(t, "myApp", result.Modules[0].Parameters["name"])
   128  
   129  	})
   130  
   131  	t.Run("Dont write mta yaml file when already present no timestamp placeholder", func(t *testing.T) {
   132  
   133  		utilsMock := newMtaBuildTestUtilsBundle()
   134  
   135  		options := mtaBuildOptions{ApplicationName: "myApp"}
   136  
   137  		utilsMock.AddFile("package.json", []byte("{\"name\": \"myName\", \"version\": \"1.2.3\"}"))
   138  		utilsMock.AddFile("mta.yaml", []byte("already there"))
   139  
   140  		_ = runMtaBuild(options, &cpe, utilsMock)
   141  
   142  		assert.False(t, utilsMock.HasWrittenFile("mta.yaml"))
   143  	})
   144  
   145  	t.Run("Write mta yaml file when already present with timestamp placeholder", func(t *testing.T) {
   146  
   147  		utilsMock := newMtaBuildTestUtilsBundle()
   148  
   149  		options := mtaBuildOptions{ApplicationName: "myApp"}
   150  
   151  		utilsMock.AddFile("package.json", []byte("{\"name\": \"myName\", \"version\": \"1.2.3\"}"))
   152  		utilsMock.AddFile("mta.yaml", []byte("already there with-${timestamp}"))
   153  
   154  		_ = runMtaBuild(options, &cpe, utilsMock)
   155  
   156  		assert.True(t, utilsMock.HasWrittenFile("mta.yaml"))
   157  	})
   158  
   159  	t.Run("Mta build mbt toolset", func(t *testing.T) {
   160  
   161  		utilsMock := newMtaBuildTestUtilsBundle()
   162  
   163  		cpe.mtarFilePath = ""
   164  
   165  		options := mtaBuildOptions{ApplicationName: "myApp", Platform: "CF", MtarName: "myName.mtar", Source: "./", Target: "./"}
   166  
   167  		utilsMock.AddFile("package.json", []byte("{\"name\": \"myName\", \"version\": \"1.2.3\"}"))
   168  
   169  		err := runMtaBuild(options, &cpe, utilsMock)
   170  
   171  		assert.Nil(t, err)
   172  
   173  		if assert.Len(t, utilsMock.Calls, 1) {
   174  			assert.Equal(t, "mbt", utilsMock.Calls[0].Exec)
   175  			assert.Equal(t, []string{"build", "--mtar", "myName.mtar", "--platform", "CF", "--source", filepath.FromSlash("./"), "--target", filepath.FromSlash(_ignoreError(os.Getwd()))}, utilsMock.Calls[0].Params)
   176  		}
   177  		assert.Equal(t, "myName.mtar", cpe.mtarFilePath)
   178  	})
   179  
   180  	t.Run("Source and target related tests", func(t *testing.T) {
   181  		t.Run("Mta build mbt toolset with custom source and target paths", func(t *testing.T) {
   182  
   183  			utilsMock := newMtaBuildTestUtilsBundle()
   184  
   185  			cpe.mtarFilePath = ""
   186  
   187  			options := mtaBuildOptions{ApplicationName: "myApp", Platform: "CF", MtarName: "myName.mtar", Source: "mySourcePath/", Target: "myTargetPath/"}
   188  
   189  			utilsMock.AddFile("package.json", []byte("{\"name\": \"myName\", \"version\": \"1.2.3\"}"))
   190  
   191  			err := runMtaBuild(options, &cpe, utilsMock)
   192  
   193  			assert.Nil(t, err)
   194  
   195  			if assert.Len(t, utilsMock.Calls, 1) {
   196  				assert.Equal(t, "mbt", utilsMock.Calls[0].Exec)
   197  				assert.Equal(t, []string{"build", "--mtar", "myName.mtar", "--platform", "CF",
   198  					"--source", filepath.FromSlash("mySourcePath/"),
   199  					"--target", filepath.Join(_ignoreError(os.Getwd()), filepath.FromSlash("mySourcePath/myTargetPath/"))},
   200  					utilsMock.Calls[0].Params)
   201  			}
   202  			assert.Equal(t, "mySourcePath/myTargetPath/myName.mtar", cpe.mtarFilePath)
   203  			assert.Equal(t, "mySourcePath/mta.yaml", cpe.custom.mtaBuildToolDesc)
   204  		})
   205  	})
   206  
   207  	t.Run("M2Path related tests", func(t *testing.T) {
   208  		t.Run("Mta build mbt toolset with m2Path", func(t *testing.T) {
   209  
   210  			utilsMock := newMtaBuildTestUtilsBundle()
   211  			utilsMock.CurrentDir = "root_folder/workspace"
   212  			cpe.mtarFilePath = ""
   213  
   214  			options := mtaBuildOptions{ApplicationName: "myApp", Platform: "CF", MtarName: "myName.mtar", Source: "./", Target: "./", M2Path: ".pipeline/local_repo"}
   215  
   216  			utilsMock.AddFile("mta.yaml", []byte("ID: \"myNameFromMtar\""))
   217  
   218  			err := runMtaBuild(options, &cpe, utilsMock)
   219  
   220  			assert.Nil(t, err)
   221  			assert.Contains(t, utilsMock.Env, filepath.FromSlash("MAVEN_OPTS=-Dmaven.repo.local=/root_folder/workspace/.pipeline/local_repo"))
   222  		})
   223  	})
   224  
   225  	t.Run("Settings file releatd tests", func(t *testing.T) {
   226  
   227  		t.Run("Copy global settings file", func(t *testing.T) {
   228  
   229  			utilsMock := newMtaBuildTestUtilsBundle()
   230  			utilsMock.AddFile("mta.yaml", []byte("ID: \"myNameFromMtar\""))
   231  
   232  			options := mtaBuildOptions{ApplicationName: "myApp", GlobalSettingsFile: "/opt/maven/settings.xml", Platform: "CF", MtarName: "myName", Source: "./", Target: "./"}
   233  
   234  			err := runMtaBuild(options, &cpe, utilsMock)
   235  
   236  			assert.Nil(t, err)
   237  
   238  			assert.Equal(t, "/opt/maven/settings.xml", utilsMock.globalSettingsFile)
   239  			assert.Equal(t, "", utilsMock.projectSettingsFile)
   240  		})
   241  
   242  		t.Run("Copy project settings file", func(t *testing.T) {
   243  
   244  			utilsMock := newMtaBuildTestUtilsBundle()
   245  			utilsMock.AddFile("mta.yaml", []byte("ID: \"myNameFromMtar\""))
   246  
   247  			options := mtaBuildOptions{ApplicationName: "myApp", ProjectSettingsFile: "/my/project/settings.xml", Platform: "CF", MtarName: "myName", Source: "./", Target: "./"}
   248  
   249  			err := runMtaBuild(options, &cpe, utilsMock)
   250  
   251  			assert.Nil(t, err)
   252  
   253  			assert.Equal(t, "/my/project/settings.xml", utilsMock.projectSettingsFile)
   254  			assert.Equal(t, "", utilsMock.globalSettingsFile)
   255  		})
   256  	})
   257  
   258  	t.Run("publish related tests", func(t *testing.T) {
   259  
   260  		t.Run("error when no repository url", func(t *testing.T) {
   261  
   262  			utilsMock := newMtaBuildTestUtilsBundle()
   263  			utilsMock.AddFile("mta.yaml", []byte("ID: \"myNameFromMtar\""))
   264  
   265  			options := mtaBuildOptions{ApplicationName: "myApp", GlobalSettingsFile: "/opt/maven/settings.xml", Platform: "CF", MtarName: "myName", Source: "./", Target: "./", Publish: true}
   266  
   267  			err := runMtaBuild(options, &cpe, utilsMock)
   268  
   269  			assert.Equal(t, "mtaDeploymentRepositoryUser, mtaDeploymentRepositoryPassword and mtaDeploymentRepositoryURL not found , must be present", err.Error())
   270  		})
   271  
   272  		t.Run("error when no mtar group", func(t *testing.T) {
   273  
   274  			utilsMock := newMtaBuildTestUtilsBundle()
   275  			utilsMock.AddFile("mta.yaml", []byte("ID: \"myNameFromMtar\""))
   276  
   277  			options := mtaBuildOptions{ApplicationName: "myApp", GlobalSettingsFile: "/opt/maven/settings.xml", Platform: "CF", MtarName: "myName", Source: "./", Target: "./", Publish: true,
   278  				MtaDeploymentRepositoryURL: "dummy", MtaDeploymentRepositoryPassword: "dummy", MtaDeploymentRepositoryUser: "dummy"}
   279  
   280  			err := runMtaBuild(options, &cpe, utilsMock)
   281  
   282  			assert.Equal(t, "mtarGroup, version not found and must be present", err.Error())
   283  		})
   284  	})
   285  }
   286  
   287  func TestMtaBuildSourceDir(t *testing.T) {
   288  
   289  	t.Run("getSourcePath", func(t *testing.T) {
   290  		t.Parallel()
   291  
   292  		t.Run("getPath dir unset", func(t *testing.T) {
   293  			options := mtaBuildOptions{Source: "", Target: ""}
   294  			assert.Equal(t, filepath.FromSlash("./"), getSourcePath(options))
   295  			assert.Equal(t, filepath.FromSlash("./"), getTargetPath(options))
   296  		})
   297  		t.Run("getPath source set", func(t *testing.T) {
   298  			options := mtaBuildOptions{Source: "spath", Target: ""}
   299  			assert.Equal(t, filepath.FromSlash("spath"), getSourcePath(options))
   300  			assert.Equal(t, filepath.FromSlash("./"), getTargetPath(options))
   301  		})
   302  		t.Run("getPath target set", func(t *testing.T) {
   303  			options := mtaBuildOptions{Source: "", Target: "tpath"}
   304  			assert.Equal(t, filepath.FromSlash("./"), getSourcePath(options))
   305  			assert.Equal(t, filepath.FromSlash("tpath"), getTargetPath(options))
   306  		})
   307  		t.Run("getPath dir set to relative path", func(t *testing.T) {
   308  			options := mtaBuildOptions{Source: "spath", Target: "tpath"}
   309  			assert.Equal(t, filepath.FromSlash("spath"), getSourcePath(options))
   310  			assert.Equal(t, filepath.FromSlash("tpath"), getTargetPath(options))
   311  		})
   312  		t.Run("getPath dir ends with seperator", func(t *testing.T) {
   313  			options := mtaBuildOptions{Source: "spath/", Target: "tpath/"}
   314  			assert.Equal(t, filepath.FromSlash("spath/"), getSourcePath(options))
   315  			assert.Equal(t, filepath.FromSlash("tpath/"), getTargetPath(options))
   316  		})
   317  		t.Run("getPath dir set to absolute path", func(t *testing.T) {
   318  			sourcePath := filepath.Join(_ignoreError(os.Getwd()), "spath")
   319  			targetPath := filepath.Join(_ignoreError(os.Getwd()), "tpath")
   320  			options := mtaBuildOptions{Source: sourcePath, Target: targetPath}
   321  			assert.Equal(t, filepath.FromSlash(sourcePath), getSourcePath(options))
   322  			assert.Equal(t, filepath.FromSlash(targetPath), getTargetPath(options))
   323  		})
   324  	})
   325  
   326  	t.Run("find build tool descriptor from configuration", func(t *testing.T) {
   327  		t.Parallel()
   328  		cpe := mtaBuildCommonPipelineEnvironment{}
   329  		t.Run("default mta.yaml", func(t *testing.T) {
   330  			utilsMock := newMtaBuildTestUtilsBundle()
   331  
   332  			utilsMock.AddFile("mta.yaml", []byte("already there"))
   333  
   334  			_ = runMtaBuild(mtaBuildOptions{ApplicationName: "myApp"}, &cpe, utilsMock)
   335  
   336  			assert.False(t, utilsMock.HasWrittenFile("mta.yaml"))
   337  		})
   338  		t.Run("create mta.yaml from config.source", func(t *testing.T) {
   339  			utilsMock := newMtaBuildTestUtilsBundle()
   340  
   341  			utilsMock.AddFile("package.json", []byte("{\"name\": \"myName\", \"version\": \"1.2.3\"}"))
   342  
   343  			_ = runMtaBuild(mtaBuildOptions{ApplicationName: "myApp", Source: "create"}, &cpe, utilsMock)
   344  
   345  			assert.True(t, utilsMock.HasWrittenFile("create/mta.yaml"))
   346  		})
   347  		t.Run("read yaml from config.source", func(t *testing.T) {
   348  			utilsMock := newMtaBuildTestUtilsBundle()
   349  
   350  			utilsMock.AddFile("path/mta.yaml", []byte("already there"))
   351  
   352  			_ = runMtaBuild(mtaBuildOptions{ApplicationName: "myApp", Source: "path"}, &cpe, utilsMock)
   353  
   354  			assert.False(t, utilsMock.HasWrittenFile("path/mta.yaml"))
   355  		})
   356  	})
   357  
   358  }
   359  
   360  func TestMtaBuildMtar(t *testing.T) {
   361  
   362  	t.Run("getMtarName", func(t *testing.T) {
   363  		t.Parallel()
   364  
   365  		t.Run("mtar name from yaml", func(t *testing.T) {
   366  			utilsMock := newMtaBuildTestUtilsBundle()
   367  			utilsMock.AddFile("mta.yaml", []byte("ID: \"nameFromMtar\""))
   368  
   369  			assert.Equal(t, filepath.FromSlash("nameFromMtar.mtar"), _ignoreError(getMtarName(mtaBuildOptions{MtarName: ""}, "mta.yaml", utilsMock)))
   370  		})
   371  		t.Run("mtar name from config", func(t *testing.T) {
   372  			utilsMock := newMtaBuildTestUtilsBundle()
   373  			utilsMock.AddFile("mta.yaml", []byte("ID: \"nameFromMtar\""))
   374  
   375  			assert.Equal(t, filepath.FromSlash("nameFromConfig.mtar"), _ignoreError(getMtarName(mtaBuildOptions{MtarName: "nameFromConfig.mtar"}, "mta.yaml", utilsMock)))
   376  		})
   377  	})
   378  
   379  	t.Run("getMtarFilePath", func(t *testing.T) {
   380  		t.Parallel()
   381  
   382  		t.Run("plain mtar name", func(t *testing.T) {
   383  			assert.Equal(t, "mta.mtar", getMtarFilePath(mtaBuildOptions{Source: "", Target: ""}, "mta.mtar"))
   384  		})
   385  		t.Run("plain mtar name from default", func(t *testing.T) {
   386  			assert.Equal(t, "mta.mtar", getMtarFilePath(mtaBuildOptions{Source: "./", Target: "./"}, "mta.mtar"))
   387  		})
   388  		t.Run("source path", func(t *testing.T) {
   389  			assert.Equal(t, filepath.FromSlash("source/mta.mtar"), getMtarFilePath(mtaBuildOptions{Source: "source", Target: ""}, "mta.mtar"))
   390  		})
   391  		t.Run("target path", func(t *testing.T) {
   392  			assert.Equal(t, filepath.FromSlash("target/mta.mtar"), getMtarFilePath(mtaBuildOptions{Source: "", Target: "target"}, "mta.mtar"))
   393  		})
   394  		t.Run("source and target path", func(t *testing.T) {
   395  			assert.Equal(t, filepath.FromSlash("source/target/mta.mtar"), getMtarFilePath(mtaBuildOptions{Source: "source", Target: "target"}, "mta.mtar"))
   396  		})
   397  	})
   398  
   399  }
   400  
   401  func _ignoreError(s string, e error) string {
   402  	return s
   403  }