1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2024-12-12 10:55:20 +02:00
sap-jenkins-library/cmd/npmExecuteScripts_test.go
2020-04-24 18:29:30 +02:00

139 lines
5.4 KiB
Go

package cmd
import (
"github.com/SAP/jenkins-library/pkg/mock"
"github.com/bmatcuk/doublestar"
"github.com/stretchr/testify/assert"
"sort"
"testing"
)
type npmExecuteScriptsMockUtilsBundle struct {
execRunner mock.ExecMockRunner
files map[string][]byte
}
func (u *npmExecuteScriptsMockUtilsBundle) fileExists(path string) (bool, error) {
_, exists := u.files[path]
return exists, nil
}
// duplicated from nexusUpload_test.go for now, refactor later?
func (u *npmExecuteScriptsMockUtilsBundle) glob(pattern string) ([]string, error) {
var matches []string
for path := range u.files {
matched, _ := doublestar.Match(pattern, path)
if matched {
matches = append(matches, path)
}
}
// The order in m.files is not deterministic, this would result in flaky tests.
sort.Sort(byLen(matches))
return matches, nil
}
func (u *npmExecuteScriptsMockUtilsBundle) getwd() (dir string, err error) {
return "/project", nil
}
func (u *npmExecuteScriptsMockUtilsBundle) chdir(dir string) error {
return nil
}
func (u *npmExecuteScriptsMockUtilsBundle) getExecRunner() execRunner {
return &u.execRunner
}
func TestNpmExecuteScripts(t *testing.T) {
t.Run("Call without install and run-scripts", func(t *testing.T) {
utils := newNpmExecuteScriptsMockUtilsBundle()
utils.files["package.json"] = []byte(`abc`)
utils.files["package-lock.json"] = []byte(`abc`)
options := npmExecuteScriptsOptions{}
err := runNpmExecuteScripts(&utils, &options)
assert.NoError(t, err)
assert.Equal(t, 2, len(utils.execRunner.Calls))
})
t.Run("Project with package lock", func(t *testing.T) {
utils := newNpmExecuteScriptsMockUtilsBundle()
utils.files["package.json"] = []byte(`abc`)
utils.files["foo/bar/node_modules/package.json"] = []byte(`abc`) // is filtered out
utils.files["gen/bar/package.json"] = []byte(`abc`) // is filtered out
utils.files["foo/gen/package.json"] = []byte(`abc`) // is filtered out
utils.files["package-lock.json"] = []byte(`abc`)
options := npmExecuteScriptsOptions{}
options.Install = true
options.RunScripts = []string{"foo", "bar"}
options.DefaultNpmRegistry = "foo.bar"
err := runNpmExecuteScripts(&utils, &options)
assert.NoError(t, err)
assert.Equal(t, mock.ExecCall{Exec: "npm", Params: []string{"ci"}}, utils.execRunner.Calls[2])
assert.Equal(t, mock.ExecCall{Exec: "npm", Params: []string{"run-script", "foo", "--if-present"}}, utils.execRunner.Calls[3])
assert.Equal(t, mock.ExecCall{Exec: "npm", Params: []string{"run-script", "bar", "--if-present"}}, utils.execRunner.Calls[4])
assert.Equal(t, 5, len(utils.execRunner.Calls))
})
t.Run("Project with two package json files", func(t *testing.T) {
utils := newNpmExecuteScriptsMockUtilsBundle()
utils.files["package.json"] = []byte(`abc`)
utils.files["foo/bar/package.json"] = []byte(`abc`)
utils.files["package-lock.json"] = []byte(`abc`)
options := npmExecuteScriptsOptions{}
options.Install = true
options.RunScripts = []string{"foo", "bar"}
err := runNpmExecuteScripts(&utils, &options)
assert.NoError(t, err)
assert.Equal(t, mock.ExecCall{Exec: "npm", Params: []string{"ci"}}, utils.execRunner.Calls[2])
assert.Equal(t, mock.ExecCall{Exec: "npm", Params: []string{"run-script", "foo", "--if-present"}}, utils.execRunner.Calls[3])
assert.Equal(t, mock.ExecCall{Exec: "npm", Params: []string{"run-script", "bar", "--if-present"}}, utils.execRunner.Calls[4])
assert.Equal(t, mock.ExecCall{Exec: "npm", Params: []string{"ci"}}, utils.execRunner.Calls[7])
assert.Equal(t, mock.ExecCall{Exec: "npm", Params: []string{"run-script", "foo", "--if-present"}}, utils.execRunner.Calls[8])
assert.Equal(t, mock.ExecCall{Exec: "npm", Params: []string{"run-script", "bar", "--if-present"}}, utils.execRunner.Calls[9])
assert.Equal(t, 10, len(utils.execRunner.Calls))
})
t.Run("Project with yarn lock", func(t *testing.T) {
utils := newNpmExecuteScriptsMockUtilsBundle()
utils.files["package.json"] = []byte(`abc`)
utils.files["yarn.lock"] = []byte(`abc`)
options := npmExecuteScriptsOptions{}
options.Install = true
options.RunScripts = []string{"foo", "bar"}
err := runNpmExecuteScripts(&utils, &options)
assert.NoError(t, err)
assert.Equal(t, mock.ExecCall{Exec: "yarn", Params: []string{"install", "--frozen-lockfile"}}, utils.execRunner.Calls[2])
assert.Equal(t, mock.ExecCall{Exec: "npm", Params: []string{"run-script", "foo", "--if-present"}}, utils.execRunner.Calls[3])
assert.Equal(t, mock.ExecCall{Exec: "npm", Params: []string{"run-script", "bar", "--if-present"}}, utils.execRunner.Calls[4])
})
t.Run("Project without lock file", func(t *testing.T) {
utils := newNpmExecuteScriptsMockUtilsBundle()
utils.files["package.json"] = []byte(`abc`)
options := npmExecuteScriptsOptions{}
options.Install = true
options.RunScripts = []string{"foo", "bar"}
err := runNpmExecuteScripts(&utils, &options)
assert.NoError(t, err)
assert.Equal(t, mock.ExecCall{Exec: "npm", Params: []string{"install"}}, utils.execRunner.Calls[2])
assert.Equal(t, mock.ExecCall{Exec: "npm", Params: []string{"run-script", "foo", "--if-present"}}, utils.execRunner.Calls[3])
assert.Equal(t, mock.ExecCall{Exec: "npm", Params: []string{"run-script", "bar", "--if-present"}}, utils.execRunner.Calls[4])
})
}
func newNpmExecuteScriptsMockUtilsBundle() npmExecuteScriptsMockUtilsBundle {
utils := npmExecuteScriptsMockUtilsBundle{}
utils.files = map[string][]byte{}
return utils
}