summaryrefslogtreecommitdiff
path: root/config/python_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'config/python_test.go')
-rw-r--r--config/python_test.go245
1 files changed, 245 insertions, 0 deletions
diff --git a/config/python_test.go b/config/python_test.go
new file mode 100644
index 0000000..5912ae2
--- /dev/null
+++ b/config/python_test.go
@@ -0,0 +1,245 @@
+package config_test
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+
+ "phabricator.wikimedia.org/source/blubber/build"
+ "phabricator.wikimedia.org/source/blubber/config"
+)
+
+func TestPythonConfigUnmarshalMerge(t *testing.T) {
+ cfg, err := config.ReadConfig([]byte(`---
+ base: foo
+ python:
+ version: python2.7
+ requirements: [requirements.txt]
+ variants:
+ test:
+ python:
+ version: python3
+ requirements: [other-requirements.txt, requirements-test.txt]`))
+
+ if assert.NoError(t, err) {
+ assert.Equal(t, []string{"requirements.txt"}, cfg.Python.Requirements)
+ assert.Equal(t, "python2.7", cfg.Python.Version)
+
+ variant, err := config.ExpandVariant(cfg, "test")
+
+ if assert.NoError(t, err) {
+ assert.Equal(t, []string{"other-requirements.txt", "requirements-test.txt"}, variant.Python.Requirements)
+ assert.Equal(t, "python3", variant.Python.Version)
+ }
+ }
+}
+
+func TestPythonConfigMergeEmpty(t *testing.T) {
+ cfg, err := config.ReadConfig([]byte(`---
+ base: foo
+ python:
+ requirements: [requirements.txt]
+ variants:
+ test:
+ python:
+ requirements: []`))
+
+ if assert.NoError(t, err) {
+ assert.Equal(t, []string{"requirements.txt"}, cfg.Python.Requirements)
+
+ variant, err := config.ExpandVariant(cfg, "test")
+
+ if assert.NoError(t, err) {
+ assert.Equal(t, []string{}, variant.Python.Requirements)
+ }
+ }
+}
+
+func TestPythonConfigDoNotMergeNil(t *testing.T) {
+ cfg, err := config.ReadConfig([]byte(`---
+ base: foo
+ python:
+ requirements: [requirements.txt]
+ variants:
+ test:
+ python:
+ requirements: ~`))
+
+ if assert.NoError(t, err) {
+ assert.Equal(t, []string{"requirements.txt"}, cfg.Python.Requirements)
+
+ variant, err := config.ExpandVariant(cfg, "test")
+
+ if assert.NoError(t, err) {
+ assert.Equal(t, []string{"requirements.txt"}, variant.Python.Requirements)
+ }
+ }
+}
+
+func TestPythonConfigInstructionsNoRequirementsWithVersion(t *testing.T) {
+ cfg := config.PythonConfig{
+ Version: "python2.7",
+ }
+
+ t.Run("PhasePrivileged", func(t *testing.T) {
+ assert.Equal(t,
+ []build.Instruction{
+ build.RunAll{[]build.Run{
+ {"python2.7", []string{"-m", "easy_install", "pip"}},
+ {"python2.7", []string{"-m", "pip", "install", "-U", "setuptools", "wheel", "tox"}},
+ }},
+ },
+ 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.Env{map[string]string{
+ "PIP_WHEEL_DIR": "/opt/lib/python",
+ "PIP_FIND_LINKS": "file:///opt/lib/python",
+ }},
+ build.RunAll{[]build.Run{
+ {"mkdir -p", []string{"/opt/lib/python"}},
+ }},
+ },
+ cfg.InstructionsForPhase(build.PhasePreInstall),
+ )
+ })
+
+ t.Run("PhasePostInstall", func(t *testing.T) {
+ assert.Equal(t,
+ []build.Instruction{
+ build.Env{map[string]string{
+ "PIP_NO_INDEX": "1",
+ }},
+ },
+ cfg.InstructionsForPhase(build.PhasePostInstall),
+ )
+ })
+}
+
+func TestPythonConfigInstructionsNoRequirementsNoVersion(t *testing.T) {
+ cfg := config.PythonConfig{}
+
+ 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 TestPythonConfigInstructionsWithRequirements(t *testing.T) {
+ cfg := config.PythonConfig{
+ Version: "python2.7",
+ Requirements: []string{"requirements.txt", "requirements-test.txt", "docs/requirements.txt"},
+ }
+
+ t.Run("PhasePrivileged", func(t *testing.T) {
+ assert.Equal(t,
+ []build.Instruction{
+ build.RunAll{[]build.Run{
+ {"python2.7", []string{"-m", "easy_install", "pip"}},
+ {"python2.7", []string{"-m", "pip", "install", "-U", "setuptools", "wheel", "tox"}},
+ }},
+ },
+ 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.Env{map[string]string{
+ "PIP_WHEEL_DIR": "/opt/lib/python",
+ "PIP_FIND_LINKS": "file:///opt/lib/python",
+ }},
+ build.RunAll{[]build.Run{
+ {"mkdir -p", []string{"/opt/lib/python"}},
+ {"mkdir -p", []string{"docs/"}},
+ }},
+ build.Copy{[]string{"requirements.txt", "requirements-test.txt"}, "./"},
+ build.Copy{[]string{"docs/requirements.txt"}, "docs/"},
+ build.Run{"python2.7", []string{"-m", "pip", "wheel",
+ "-r", "requirements.txt",
+ "-r", "requirements-test.txt",
+ "-r", "docs/requirements.txt",
+ }},
+ },
+ cfg.InstructionsForPhase(build.PhasePreInstall),
+ )
+ })
+
+ t.Run("PhasePostInstall", func(t *testing.T) {
+ assert.Equal(t,
+ []build.Instruction{
+ build.Env{map[string]string{
+ "PIP_NO_INDEX": "1",
+ }},
+ },
+ cfg.InstructionsForPhase(build.PhasePostInstall),
+ )
+ })
+}
+
+func TestPythonConfigRequirementsByDir(t *testing.T) {
+ cfg := config.PythonConfig{
+ Requirements: []string{"foo", "./bar", "./c/c-foo", "b/b-foo", "b/b-bar", "a/a-foo"},
+ }
+
+ sortedDirs, reqsByDir := cfg.RequirementsByDir()
+
+ assert.Equal(t,
+ []string{
+ "./",
+ "a/",
+ "b/",
+ "c/",
+ },
+ sortedDirs,
+ )
+
+ assert.Equal(t,
+ map[string][]string{
+ "./": []string{"foo", "bar"},
+ "c/": []string{"c/c-foo"},
+ "b/": []string{"b/b-foo", "b/b-bar"},
+ "a/": []string{"a/a-foo"},
+ },
+ reqsByDir,
+ )
+}
+
+func TestPythonConfigRequirementsArgs(t *testing.T) {
+ cfg := config.PythonConfig{
+ Requirements: []string{"foo", "bar", "baz/qux"},
+ }
+
+ assert.Equal(t,
+ []string{
+ "-r", "foo",
+ "-r", "bar",
+ "-r", "baz/qux",
+ },
+ cfg.RequirementsArgs(),
+ )
+}