2020-02-25 15:33:34 +02:00
package cmd
import (
2020-11-10 18:14:55 +02:00
"errors"
"net/http"
2021-03-03 23:58:29 +02:00
"path/filepath"
2020-05-05 15:54:50 +02:00
"testing"
2020-02-27 13:11:22 +02:00
"github.com/SAP/jenkins-library/pkg/mock"
2020-05-05 15:54:50 +02:00
"github.com/ghodss/yaml"
2020-02-25 15:33:34 +02:00
"github.com/stretchr/testify/assert"
)
2020-11-10 18:14:55 +02:00
type mtaBuildTestUtilsBundle struct {
* mock . ExecMockRunner
* mock . FilesMock
projectSettingsFile string
globalSettingsFile string
registryUsedInSetNpmRegistries string
}
func ( m * mtaBuildTestUtilsBundle ) SetNpmRegistries ( defaultNpmRegistry string ) error {
m . registryUsedInSetNpmRegistries = defaultNpmRegistry
return nil
}
func ( m * mtaBuildTestUtilsBundle ) InstallAllDependencies ( defaultNpmRegistry string ) error {
return errors . New ( "Test should not install dependencies." ) //TODO implement test
}
func ( m * mtaBuildTestUtilsBundle ) DownloadAndCopySettingsFiles ( globalSettingsFile string , projectSettingsFile string ) error {
m . projectSettingsFile = projectSettingsFile
m . globalSettingsFile = globalSettingsFile
return nil
}
func ( m * mtaBuildTestUtilsBundle ) DownloadFile ( url , filename string , header http . Header , cookies [ ] * http . Cookie ) error {
return errors . New ( "Test should not download files." )
}
func newMtaBuildTestUtilsBundle ( ) * mtaBuildTestUtilsBundle {
utilsBundle := mtaBuildTestUtilsBundle {
ExecMockRunner : & mock . ExecMockRunner { } ,
FilesMock : & mock . FilesMock { } ,
}
return & utilsBundle
}
2020-02-25 15:33:34 +02:00
func TestMarBuild ( t * testing . T ) {
cpe := mtaBuildCommonPipelineEnvironment { }
t . Run ( "Application name not set" , func ( t * testing . T ) {
2020-11-10 18:14:55 +02:00
utilsMock := newMtaBuildTestUtilsBundle ( )
2020-02-25 15:33:34 +02:00
options := mtaBuildOptions { }
2020-11-10 18:14:55 +02:00
err := runMtaBuild ( options , & cpe , utilsMock )
2020-02-25 15:33:34 +02:00
assert . NotNil ( t , err )
assert . Equal ( t , "'mta.yaml' not found in project sources and 'applicationName' not provided as parameter - cannot generate 'mta.yaml' file" , err . Error ( ) )
} )
t . Run ( "Provide default npm registry" , func ( t * testing . T ) {
2020-11-10 18:14:55 +02:00
utilsMock := newMtaBuildTestUtilsBundle ( )
2021-06-14 16:06:47 +02:00
options := mtaBuildOptions { ApplicationName : "myApp" , Platform : "CF" , DefaultNpmRegistry : "https://example.org/npm" , MtarName : "myName" , Source : "./" , Target : "./" }
2020-02-25 15:33:34 +02:00
2020-11-10 18:14:55 +02:00
utilsMock . AddFile ( "package.json" , [ ] byte ( "{\"name\": \"myName\", \"version\": \"1.2.3\"}" ) )
2020-06-18 17:30:17 +02:00
2020-11-10 18:14:55 +02:00
err := runMtaBuild ( options , & cpe , utilsMock )
2020-02-25 15:33:34 +02:00
assert . Nil ( t , err )
2020-11-10 18:14:55 +02:00
assert . Equal ( t , "https://example.org/npm" , utilsMock . registryUsedInSetNpmRegistries )
2020-02-25 15:33:34 +02:00
} )
t . Run ( "Package json does not exist" , func ( t * testing . T ) {
2020-11-10 18:14:55 +02:00
utilsMock := newMtaBuildTestUtilsBundle ( )
2020-02-25 15:33:34 +02:00
options := mtaBuildOptions { ApplicationName : "myApp" }
2020-11-10 18:14:55 +02:00
err := runMtaBuild ( options , & cpe , utilsMock )
2020-02-25 15:33:34 +02:00
assert . NotNil ( t , err )
assert . Equal ( t , "package.json file does not exist" , err . Error ( ) )
} )
t . Run ( "Write yaml file" , func ( t * testing . T ) {
2020-11-10 18:14:55 +02:00
utilsMock := newMtaBuildTestUtilsBundle ( )
2020-02-25 15:33:34 +02:00
2021-06-14 16:06:47 +02:00
options := mtaBuildOptions { ApplicationName : "myApp" , Platform : "CF" , MtarName : "myName" , Source : "./" , Target : "./" }
2020-02-25 15:33:34 +02:00
2020-11-10 18:14:55 +02:00
utilsMock . AddFile ( "package.json" , [ ] byte ( "{\"name\": \"myName\", \"version\": \"1.2.3\"}" ) )
2020-02-25 15:33:34 +02:00
2020-11-10 18:14:55 +02:00
err := runMtaBuild ( options , & cpe , utilsMock )
2020-02-25 15:33:34 +02:00
assert . Nil ( t , err )
type MtaResult struct {
Version string
ID string ` yaml:"ID,omitempty" `
Parameters map [ string ] string
Modules [ ] struct {
Name string
Type string
Parameters map [ string ] interface { }
}
}
2020-11-10 18:14:55 +02:00
assert . True ( t , utilsMock . HasWrittenFile ( "mta.yaml" ) )
2020-02-25 15:33:34 +02:00
var result MtaResult
2020-11-10 18:14:55 +02:00
mtaContent , _ := utilsMock . FileRead ( "mta.yaml" )
yaml . Unmarshal ( mtaContent , & result )
2020-02-25 15:33:34 +02:00
assert . Equal ( t , "myName" , result . ID )
assert . Equal ( t , "1.2.3" , result . Version )
assert . Equal ( t , "myApp" , result . Modules [ 0 ] . Name )
2020-11-10 18:14:55 +02:00
assert . Regexp ( t , "^1\\.2\\.3-[\\d]{14}$" , result . Modules [ 0 ] . Parameters [ "version" ] )
2020-02-25 15:33:34 +02:00
assert . Equal ( t , "myApp" , result . Modules [ 0 ] . Parameters [ "name" ] )
} )
t . Run ( "Dont write mta yaml file when already present no timestamp placeholder" , func ( t * testing . T ) {
2020-11-10 18:14:55 +02:00
utilsMock := newMtaBuildTestUtilsBundle ( )
2020-02-25 15:33:34 +02:00
2021-05-19 08:45:38 +02:00
options := mtaBuildOptions { ApplicationName : "myApp" }
2020-02-25 15:33:34 +02:00
2020-11-10 18:14:55 +02:00
utilsMock . AddFile ( "package.json" , [ ] byte ( "{\"name\": \"myName\", \"version\": \"1.2.3\"}" ) )
utilsMock . AddFile ( "mta.yaml" , [ ] byte ( "already there" ) )
2020-02-25 15:33:34 +02:00
2020-11-10 18:14:55 +02:00
_ = runMtaBuild ( options , & cpe , utilsMock )
2020-02-25 15:33:34 +02:00
2020-11-10 18:14:55 +02:00
assert . False ( t , utilsMock . HasWrittenFile ( "mta.yaml" ) )
2020-02-25 15:33:34 +02:00
} )
t . Run ( "Write mta yaml file when already present with timestamp placeholder" , func ( t * testing . T ) {
2020-11-10 18:14:55 +02:00
utilsMock := newMtaBuildTestUtilsBundle ( )
2020-02-25 15:33:34 +02:00
2021-05-19 08:45:38 +02:00
options := mtaBuildOptions { ApplicationName : "myApp" }
2020-02-25 15:33:34 +02:00
2020-11-10 18:14:55 +02:00
utilsMock . AddFile ( "package.json" , [ ] byte ( "{\"name\": \"myName\", \"version\": \"1.2.3\"}" ) )
utilsMock . AddFile ( "mta.yaml" , [ ] byte ( "already there with-${timestamp}" ) )
2020-02-25 15:33:34 +02:00
2020-11-10 18:14:55 +02:00
_ = runMtaBuild ( options , & cpe , utilsMock )
2020-02-25 15:33:34 +02:00
2020-11-10 18:14:55 +02:00
assert . True ( t , utilsMock . HasWrittenFile ( "mta.yaml" ) )
2020-02-25 15:33:34 +02:00
} )
t . Run ( "Mta build mbt toolset" , func ( t * testing . T ) {
2020-11-10 18:14:55 +02:00
utilsMock := newMtaBuildTestUtilsBundle ( )
2020-02-25 15:33:34 +02:00
cpe . mtarFilePath = ""
2021-06-14 16:06:47 +02:00
options := mtaBuildOptions { ApplicationName : "myApp" , Platform : "CF" , MtarName : "myName.mtar" , Source : "./" , Target : "./" }
2020-02-25 15:33:34 +02:00
2020-11-10 18:14:55 +02:00
utilsMock . AddFile ( "package.json" , [ ] byte ( "{\"name\": \"myName\", \"version\": \"1.2.3\"}" ) )
2020-02-25 15:33:34 +02:00
2020-11-10 18:14:55 +02:00
err := runMtaBuild ( options , & cpe , utilsMock )
2020-02-25 15:33:34 +02:00
assert . Nil ( t , err )
2020-11-10 18:14:55 +02:00
if assert . Len ( t , utilsMock . Calls , 1 ) {
assert . Equal ( t , "mbt" , utilsMock . Calls [ 0 ] . Exec )
2021-06-14 16:06:47 +02:00
assert . Equal ( t , [ ] string { "build" , "--mtar" , "myName.mtar" , "--platform" , "CF" , "--source" , "./" , "--target" , "./" } , utilsMock . Calls [ 0 ] . Params )
2020-02-25 15:33:34 +02:00
}
assert . Equal ( t , "myName.mtar" , cpe . mtarFilePath )
} )
2021-06-14 16:06:47 +02:00
t . Run ( "Source and target related tests" , func ( t * testing . T ) {
t . Run ( "Mta build mbt toolset with custom source and target paths" , func ( t * testing . T ) {
utilsMock := newMtaBuildTestUtilsBundle ( )
cpe . mtarFilePath = ""
options := mtaBuildOptions { ApplicationName : "myApp" , Platform : "CF" , MtarName : "myName.mtar" , Source : "mySourcePath/" , Target : "myTargetPath/" }
utilsMock . AddFile ( "package.json" , [ ] byte ( "{\"name\": \"myName\", \"version\": \"1.2.3\"}" ) )
err := runMtaBuild ( options , & cpe , utilsMock )
assert . Nil ( t , err )
if assert . Len ( t , utilsMock . Calls , 1 ) {
assert . Equal ( t , "mbt" , utilsMock . Calls [ 0 ] . Exec )
assert . Equal ( t , [ ] string { "build" , "--mtar" , "myName.mtar" , "--platform" , "CF" , "--source" , "mySourcePath/" , "--target" , "myTargetPath/" } , utilsMock . Calls [ 0 ] . Params )
}
assert . Equal ( t , "myName.mtar" , cpe . mtarFilePath )
} )
} )
2020-07-28 17:06:17 +02:00
t . Run ( "M2Path related tests" , func ( t * testing . T ) {
t . Run ( "Mta build mbt toolset with m2Path" , func ( t * testing . T ) {
2020-11-10 18:14:55 +02:00
utilsMock := newMtaBuildTestUtilsBundle ( )
utilsMock . CurrentDir = "root_folder/workspace"
2020-07-28 17:06:17 +02:00
cpe . mtarFilePath = ""
2021-06-14 16:06:47 +02:00
options := mtaBuildOptions { ApplicationName : "myApp" , Platform : "CF" , MtarName : "myName.mtar" , Source : "./" , Target : "./" , M2Path : ".pipeline/local_repo" }
2020-07-28 17:06:17 +02:00
2020-11-10 18:14:55 +02:00
utilsMock . AddFile ( "mta.yaml" , [ ] byte ( "ID: \"myNameFromMtar\"" ) )
2020-07-28 17:06:17 +02:00
2020-11-10 18:14:55 +02:00
err := runMtaBuild ( options , & cpe , utilsMock )
2020-07-28 17:06:17 +02:00
assert . Nil ( t , err )
2021-03-03 23:58:29 +02:00
assert . Contains ( t , utilsMock . Env , filepath . FromSlash ( "MAVEN_OPTS=-Dmaven.repo.local=/root_folder/workspace/.pipeline/local_repo" ) )
2020-07-28 17:06:17 +02:00
} )
} )
2020-02-25 15:33:34 +02:00
t . Run ( "Settings file releatd tests" , func ( t * testing . T ) {
t . Run ( "Copy global settings file" , func ( t * testing . T ) {
2020-11-10 18:14:55 +02:00
utilsMock := newMtaBuildTestUtilsBundle ( )
utilsMock . AddFile ( "mta.yaml" , [ ] byte ( "ID: \"myNameFromMtar\"" ) )
2020-02-25 15:33:34 +02:00
2021-06-14 16:06:47 +02:00
options := mtaBuildOptions { ApplicationName : "myApp" , GlobalSettingsFile : "/opt/maven/settings.xml" , Platform : "CF" , MtarName : "myName" , Source : "./" , Target : "./" }
2020-02-25 15:33:34 +02:00
2020-11-10 18:14:55 +02:00
err := runMtaBuild ( options , & cpe , utilsMock )
2020-02-25 15:33:34 +02:00
assert . Nil ( t , err )
2020-11-10 18:14:55 +02:00
assert . Equal ( t , "/opt/maven/settings.xml" , utilsMock . globalSettingsFile )
assert . Equal ( t , "" , utilsMock . projectSettingsFile )
2020-02-25 15:33:34 +02:00
} )
t . Run ( "Copy project settings file" , func ( t * testing . T ) {
2020-11-10 18:14:55 +02:00
utilsMock := newMtaBuildTestUtilsBundle ( )
utilsMock . AddFile ( "mta.yaml" , [ ] byte ( "ID: \"myNameFromMtar\"" ) )
2020-02-25 15:33:34 +02:00
2021-06-14 16:06:47 +02:00
options := mtaBuildOptions { ApplicationName : "myApp" , ProjectSettingsFile : "/my/project/settings.xml" , Platform : "CF" , MtarName : "myName" , Source : "./" , Target : "./" }
2020-02-25 15:33:34 +02:00
2020-11-10 18:14:55 +02:00
err := runMtaBuild ( options , & cpe , utilsMock )
2020-02-25 15:33:34 +02:00
assert . Nil ( t , err )
2020-11-10 18:14:55 +02:00
assert . Equal ( t , "/my/project/settings.xml" , utilsMock . projectSettingsFile )
assert . Equal ( t , "" , utilsMock . globalSettingsFile )
2020-02-25 15:33:34 +02:00
} )
} )
}