github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/cmd/mtaBuild_test.go (about)

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