package config_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"gerrit.wikimedia.org/r/blubber/build"
|
|
"gerrit.wikimedia.org/r/blubber/config"
|
|
)
|
|
|
|
func TestNodeConfigYAML(t *testing.T) {
|
|
cfg, err := config.ReadYAMLConfig([]byte(`---
|
|
version: v4
|
|
base: foo
|
|
node:
|
|
requirements: [package.json]
|
|
env: foo
|
|
variants:
|
|
build:
|
|
node:
|
|
requirements: []
|
|
env: bar`))
|
|
|
|
if assert.NoError(t, err) {
|
|
assert.Equal(t, []string{"package.json"}, cfg.Node.Requirements)
|
|
assert.Equal(t, "foo", cfg.Node.Env)
|
|
|
|
variant, err := config.ExpandVariant(cfg, "build")
|
|
|
|
if assert.NoError(t, err) {
|
|
assert.Empty(t, variant.Node.Requirements)
|
|
assert.Equal(t, "bar", variant.Node.Env)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestNodeConfigInstructionsNoRequirements(t *testing.T) {
|
|
cfg := config.NodeConfig{}
|
|
|
|
t.Run("PhasePrivileged", func(t *testing.T) {
|
|
assert.Empty(t, cfg.InstructionsForPhase(build.PhasePrivileged))
|
|
})
|
|
|
|
t.Run("PhasePrivilegeDropped", func(t *testing.T) {
|
|
assert.Empty(t, cfg.InstructionsForPhase(build.PhasePrivilegeDropped))
|
|
})
|
|
|
|
t.Run("PhasePreInstall", func(t *testing.T) {
|
|
assert.Empty(t, cfg.InstructionsForPhase(build.PhasePreInstall))
|
|
})
|
|
|
|
t.Run("PhasePostInstall", func(t *testing.T) {
|
|
assert.Empty(t, cfg.InstructionsForPhase(build.PhasePostInstall))
|
|
})
|
|
}
|
|
|
|
func TestNodeConfigInstructionsNonProduction(t *testing.T) {
|
|
cfg := config.NodeConfig{Requirements: []string{"package.json"}, Env: "foo"}
|
|
|
|
t.Run("PhasePrivileged", func(t *testing.T) {
|
|
assert.Empty(t, cfg.InstructionsForPhase(build.PhasePrivileged))
|
|
})
|
|
|
|
t.Run("PhasePrivilegeDropped", func(t *testing.T) {
|
|
assert.Empty(t, cfg.InstructionsForPhase(build.PhasePrivilegeDropped))
|
|
})
|
|
|
|
t.Run("PhasePreInstall", func(t *testing.T) {
|
|
assert.Equal(t,
|
|
[]build.Instruction{
|
|
build.Copy{[]string{"package.json"}, "./"},
|
|
build.RunAll{[]build.Run{
|
|
{"npm install", []string{}},
|
|
}},
|
|
},
|
|
cfg.InstructionsForPhase(build.PhasePreInstall),
|
|
)
|
|
})
|
|
|
|
t.Run("PhasePostInstall", func(t *testing.T) {
|
|
assert.Equal(t,
|
|
[]build.Instruction{
|
|
build.Env{map[string]string{
|
|
"NODE_ENV": "foo",
|
|
}},
|
|
},
|
|
cfg.InstructionsForPhase(build.PhasePostInstall),
|
|
)
|
|
})
|
|
}
|
|
|
|
func TestNodeConfigInstructionsProduction(t *testing.T) {
|
|
cfg := config.NodeConfig{Requirements: []string{"package.json", "package-lock.json"}, Env: "production"}
|
|
|
|
t.Run("PhasePrivileged", func(t *testing.T) {
|
|
assert.Empty(t, cfg.InstructionsForPhase(build.PhasePrivileged))
|
|
})
|
|
|
|
t.Run("PhasePrivilegeDropped", func(t *testing.T) {
|
|
assert.Empty(t, cfg.InstructionsForPhase(build.PhasePrivilegeDropped))
|
|
})
|
|
|
|
t.Run("PhasePreInstall", func(t *testing.T) {
|
|
assert.Equal(t,
|
|
[]build.Instruction{
|
|
build.Copy{[]string{"package.json", "package-lock.json"}, "./"},
|
|
build.RunAll{[]build.Run{
|
|
{"npm install", []string{"--production"}},
|
|
{"npm dedupe", []string{}},
|
|
}},
|
|
},
|
|
cfg.InstructionsForPhase(build.PhasePreInstall),
|
|
)
|
|
})
|
|
|
|
t.Run("PhasePostInstall", func(t *testing.T) {
|
|
assert.Equal(t,
|
|
[]build.Instruction{
|
|
build.Env{map[string]string{
|
|
"NODE_ENV": "production",
|
|
}},
|
|
},
|
|
cfg.InstructionsForPhase(build.PhasePostInstall),
|
|
)
|
|
})
|
|
}
|
|
|
|
func TestNodeConfigInstructionsEnvironmentOnly(t *testing.T) {
|
|
cfg := config.NodeConfig{Env: "production"}
|
|
|
|
t.Run("PhasePrivileged", func(t *testing.T) {
|
|
assert.Empty(t, cfg.InstructionsForPhase(build.PhasePrivileged))
|
|
})
|
|
|
|
t.Run("PhasePrivilegeDropped", func(t *testing.T) {
|
|
assert.Empty(t, cfg.InstructionsForPhase(build.PhasePrivilegeDropped))
|
|
})
|
|
|
|
t.Run("PhasePreInstall", func(t *testing.T) {
|
|
assert.Empty(t, cfg.InstructionsForPhase(build.PhasePreInstall))
|
|
})
|
|
|
|
t.Run("PhasePostInstall", func(t *testing.T) {
|
|
assert.Equal(t,
|
|
[]build.Instruction{
|
|
build.Env{map[string]string{
|
|
"NODE_ENV": "production",
|
|
}},
|
|
},
|
|
cfg.InstructionsForPhase(build.PhasePostInstall),
|
|
)
|
|
})
|
|
}
|
|
|
|
func TestNodeConfigValidation(t *testing.T) {
|
|
t.Run("env", func(t *testing.T) {
|
|
t.Run("ok", func(t *testing.T) {
|
|
err := config.Validate(config.NodeConfig{
|
|
Env: "production",
|
|
})
|
|
|
|
assert.False(t, config.IsValidationError(err))
|
|
})
|
|
|
|
t.Run("optional", func(t *testing.T) {
|
|
err := config.Validate(config.NodeConfig{})
|
|
|
|
assert.False(t, config.IsValidationError(err))
|
|
})
|
|
|
|
t.Run("bad", func(t *testing.T) {
|
|
err := config.Validate(config.NodeConfig{
|
|
Env: "foo bar",
|
|
})
|
|
|
|
if assert.True(t, config.IsValidationError(err)) {
|
|
msg := config.HumanizeValidationError(err)
|
|
|
|
assert.Equal(t, `env: "foo bar" is not a valid Node environment name`, msg)
|
|
}
|
|
})
|
|
})
|
|
}
|