mirror of
https://github.com/SAP/jenkins-library.git
synced 2024-12-14 11:03:09 +02:00
58e7e4be44
This change adds a buildDescriptorExcludeList parameter to npmExecuteScripts, to enable the exclusion of certain directories when executing npm scripts. Previously, npmExecuteScripts could only execute scripts in all packages. Now it is possible to provide paths or patterns as elements of the buildDescriptorExcludeList to exclude packages when executing npm scripts.
198 lines
7.6 KiB
Go
198 lines
7.6 KiB
Go
package cmd
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/SAP/jenkins-library/pkg/mock"
|
|
"github.com/SAP/jenkins-library/pkg/npm"
|
|
"github.com/stretchr/testify/assert"
|
|
"testing"
|
|
)
|
|
|
|
// npmMockUtilsBundle for mocking
|
|
type npmMockUtilsBundle struct {
|
|
*mock.FilesMock
|
|
execRunner *mock.ExecMockRunner
|
|
}
|
|
|
|
// GetExecRunner return the execRunner mock
|
|
func (u *npmMockUtilsBundle) GetExecRunner() npm.ExecRunner {
|
|
return u.execRunner
|
|
}
|
|
|
|
// newNpmMockUtilsBundle creates an instance of npmMockUtilsBundle
|
|
func newNpmMockUtilsBundle() npmMockUtilsBundle {
|
|
utils := npmMockUtilsBundle{FilesMock: &mock.FilesMock{}, execRunner: &mock.ExecMockRunner{}}
|
|
return utils
|
|
}
|
|
|
|
// npmConfig holds the config parameters needed for checking if the function is called with correct parameters
|
|
type npmConfig struct {
|
|
install bool
|
|
runScripts []string
|
|
runOptions []string
|
|
scriptOptions []string
|
|
virtualFrameBuffer bool
|
|
excludeList []string
|
|
}
|
|
|
|
// npmExecutorMock mocking struct
|
|
type npmExecutorMock struct {
|
|
utils npmMockUtilsBundle
|
|
config npmConfig
|
|
}
|
|
|
|
// FindPackageJSONFiles mock implementation
|
|
func (n *npmExecutorMock) FindPackageJSONFiles() []string {
|
|
packages, _ := n.utils.Glob("**/package.json")
|
|
return packages
|
|
}
|
|
|
|
// FindPackageJSONFiles mock implementation
|
|
func (n *npmExecutorMock) FindPackageJSONFilesWithExcludes(excludeList []string) ([]string, error) {
|
|
packages, _ := n.utils.Glob("**/package.json")
|
|
return packages, nil
|
|
}
|
|
|
|
// FindPackageJSONFilesWithScript mock implementation
|
|
func (n *npmExecutorMock) FindPackageJSONFilesWithScript(packageJSONFiles []string, script string) ([]string, error) {
|
|
return packageJSONFiles, nil
|
|
}
|
|
|
|
// RunScriptsInAllPackages mock implementation
|
|
func (n *npmExecutorMock) RunScriptsInAllPackages(runScripts []string, runOptions []string, scriptOptions []string, virtualFrameBuffer bool, excludeList []string) error {
|
|
if len(runScripts) != len(n.config.runScripts) {
|
|
return fmt.Errorf("RunScriptsInAllPackages was called with a different list of runScripts than config.runScripts")
|
|
}
|
|
for i, script := range runScripts {
|
|
if script != n.config.runScripts[i] {
|
|
return fmt.Errorf("RunScriptsInAllPackages was called with a different list of runScripts than config.runScripts")
|
|
}
|
|
}
|
|
|
|
if len(scriptOptions) != len(n.config.scriptOptions) {
|
|
return fmt.Errorf("RunScriptsInAllPackages was called with a different list of scriptOptions than config.scriptOptions")
|
|
}
|
|
|
|
if len(runOptions) != len(n.config.runOptions) {
|
|
return fmt.Errorf("RunScriptsInAllPackages was called with a different list of runOptions than config.runOptions")
|
|
}
|
|
|
|
if virtualFrameBuffer != n.config.virtualFrameBuffer {
|
|
return fmt.Errorf("RunScriptsInAllPackages was called with a different value of virtualFrameBuffer than config.virtualFrameBuffer")
|
|
}
|
|
|
|
if len(excludeList) != len(n.config.excludeList) {
|
|
return fmt.Errorf("RunScriptsInAllPackages was called with a different value of excludeList than config.excludeList")
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// InstallAllDependencies mock implementation
|
|
func (n *npmExecutorMock) InstallAllDependencies(packageJSONFiles []string) error {
|
|
allPackages := n.FindPackageJSONFiles()
|
|
if len(packageJSONFiles) != len(allPackages) {
|
|
return fmt.Errorf("packageJSONFiles != n.FindPackageJSONFiles()")
|
|
}
|
|
for i, packageJSON := range packageJSONFiles {
|
|
if packageJSON != allPackages[i] {
|
|
return fmt.Errorf("InstallAllDependencies was called with a different list of package.json files than result of n.FindPackageJSONFiles()")
|
|
}
|
|
}
|
|
|
|
if !n.config.install {
|
|
return fmt.Errorf("InstallAllDependencies was called but config.install was false")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// SetNpmRegistries mock implementation
|
|
func (n *npmExecutorMock) SetNpmRegistries() error {
|
|
return nil
|
|
}
|
|
|
|
func TestNpmExecuteScripts(t *testing.T) {
|
|
t.Run("Call with excludeList", func(t *testing.T) {
|
|
config := npmExecuteScriptsOptions{Install: true, RunScripts: []string{"ci-build", "ci-test"}, BuildDescriptorExcludeList: []string{"**/path/**"}}
|
|
utils := newNpmMockUtilsBundle()
|
|
utils.AddFile("package.json", []byte("{\"name\": \"Test\" }"))
|
|
utils.AddFile("src/package.json", []byte("{\"name\": \"Test\" }"))
|
|
|
|
npmExecutor := npmExecutorMock{utils: utils, config: npmConfig{install: config.Install, runScripts: config.RunScripts, excludeList: config.BuildDescriptorExcludeList}}
|
|
err := runNpmExecuteScripts(&npmExecutor, &config)
|
|
|
|
assert.NoError(t, err)
|
|
})
|
|
|
|
t.Run("Call with scriptOptions", func(t *testing.T) {
|
|
config := npmExecuteScriptsOptions{Install: true, RunScripts: []string{"ci-build", "ci-test"}, ScriptOptions: []string{"--run"}}
|
|
utils := newNpmMockUtilsBundle()
|
|
utils.AddFile("package.json", []byte("{\"name\": \"Test\" }"))
|
|
utils.AddFile("src/package.json", []byte("{\"name\": \"Test\" }"))
|
|
|
|
npmExecutor := npmExecutorMock{utils: utils, config: npmConfig{install: config.Install, runScripts: config.RunScripts, scriptOptions: config.ScriptOptions}}
|
|
err := runNpmExecuteScripts(&npmExecutor, &config)
|
|
|
|
assert.NoError(t, err)
|
|
})
|
|
|
|
t.Run("Call with install", func(t *testing.T) {
|
|
config := npmExecuteScriptsOptions{Install: true, RunScripts: []string{"ci-build", "ci-test"}}
|
|
utils := newNpmMockUtilsBundle()
|
|
utils.AddFile("package.json", []byte("{\"name\": \"Test\" }"))
|
|
utils.AddFile("src/package.json", []byte("{\"name\": \"Test\" }"))
|
|
|
|
npmExecutor := npmExecutorMock{utils: utils, config: npmConfig{install: config.Install, runScripts: config.RunScripts}}
|
|
err := runNpmExecuteScripts(&npmExecutor, &config)
|
|
|
|
assert.NoError(t, err)
|
|
})
|
|
|
|
t.Run("Call without install", func(t *testing.T) {
|
|
config := npmExecuteScriptsOptions{Install: true, RunScripts: []string{"ci-build", "ci-test"}}
|
|
utils := newNpmMockUtilsBundle()
|
|
utils.AddFile("package.json", []byte("{\"name\": \"Test\" }"))
|
|
utils.AddFile("src/package.json", []byte("{\"name\": \"Test\" }"))
|
|
|
|
npmExecutor := npmExecutorMock{utils: utils, config: npmConfig{install: config.Install, runScripts: config.RunScripts}}
|
|
err := runNpmExecuteScripts(&npmExecutor, &config)
|
|
|
|
assert.NoError(t, err)
|
|
})
|
|
|
|
t.Run("Call with virtualFrameBuffer", func(t *testing.T) {
|
|
config := npmExecuteScriptsOptions{Install: true, RunScripts: []string{"ci-build", "ci-test"}, VirtualFrameBuffer: true}
|
|
utils := newNpmMockUtilsBundle()
|
|
utils.AddFile("package.json", []byte("{\"name\": \"Test\" }"))
|
|
utils.AddFile("src/package.json", []byte("{\"name\": \"Test\" }"))
|
|
|
|
npmExecutor := npmExecutorMock{utils: utils, config: npmConfig{install: config.Install, runScripts: config.RunScripts, virtualFrameBuffer: config.VirtualFrameBuffer}}
|
|
err := runNpmExecuteScripts(&npmExecutor, &config)
|
|
|
|
assert.NoError(t, err)
|
|
})
|
|
|
|
t.Run("Test integration with npm pkg", func(t *testing.T) {
|
|
config := npmExecuteScriptsOptions{Install: true, RunScripts: []string{"ci-build"}}
|
|
|
|
options := npm.ExecutorOptions{SapNpmRegistry: config.SapNpmRegistry, DefaultNpmRegistry: config.DefaultNpmRegistry}
|
|
|
|
utils := newNpmMockUtilsBundle()
|
|
utils.AddFile("package.json", []byte("{\"scripts\": { \"ci-build\": \"\" } }"))
|
|
utils.AddFile("package-lock.json", []byte(""))
|
|
|
|
npmExecutor := npm.Execute{Utils: &utils, Options: options}
|
|
|
|
err := runNpmExecuteScripts(&npmExecutor, &config)
|
|
|
|
if assert.NoError(t, err) {
|
|
if assert.Equal(t, 6, len(utils.execRunner.Calls)) {
|
|
assert.Equal(t, mock.ExecCall{Exec: "npm", Params: []string{"config", "get", "registry"}}, utils.execRunner.Calls[0])
|
|
assert.Equal(t, mock.ExecCall{Exec: "npm", Params: []string{"config", "get", "@sap:registry"}}, utils.execRunner.Calls[1])
|
|
assert.Equal(t, mock.ExecCall{Exec: "npm", Params: []string{"ci"}}, utils.execRunner.Calls[2])
|
|
assert.Equal(t, mock.ExecCall{Exec: "npm", Params: []string{"run", "ci-build"}}, utils.execRunner.Calls[5])
|
|
}
|
|
}
|
|
})
|
|
}
|