| package unittest_test |
| |
| import ( |
| "fmt" |
| "io/ioutil" |
| "testing" |
| "time" |
| |
| "github.com/bradleyjkemp/cupaloy/v2" |
| . "github.com/lrills/helm-unittest/unittest" |
| "github.com/lrills/helm-unittest/unittest/snapshot" |
| "github.com/stretchr/testify/assert" |
| "gopkg.in/yaml.v2" |
| "helm.sh/helm/v3/pkg/chart/loader" |
| |
| v2util "k8s.io/helm/pkg/chartutil" |
| ) |
| |
| func makeTestJobResultSnapshotable(result *TestJobResult) *TestJobResult { |
| result.Duration, _ = time.ParseDuration("0s") |
| return result |
| } |
| |
| func TestUnmarshalableJobFromYAML(t *testing.T) { |
| manifest := ` |
| it: should do something |
| values: |
| - values.yaml |
| set: |
| a.b.c: ABC |
| x.y.z: XYZ |
| asserts: |
| - equal: |
| path: a.b |
| value: c |
| - matchRegex: |
| path: x.y |
| pattern: /z/ |
| ` |
| var tj TestJob |
| err := yaml.Unmarshal([]byte(manifest), &tj) |
| |
| a := assert.New(t) |
| a.Nil(err) |
| a.Equal(tj.Name, "should do something") |
| a.Equal(tj.Values, []string{"values.yaml"}) |
| a.Equal(tj.Set, map[string]interface{}{ |
| "a.b.c": "ABC", |
| "x.y.z": "XYZ", |
| }) |
| assertions := make([]*Assertion, 2) |
| yaml.Unmarshal([]byte(` |
| - equal: |
| path: a.b |
| value: c |
| - matchRegex: |
| path: x.y |
| pattern: /z/ |
| `), &assertions) |
| a.Equal(tj.Assertions, assertions) |
| } |
| |
| func TestV2RunJobOk(t *testing.T) { |
| c, _ := v2util.Load(testV2BasicChart) |
| manifest := ` |
| it: should work |
| asserts: |
| - equal: |
| path: kind |
| value: Deployment |
| documentIndex: 0 |
| template: deployment.yaml |
| - matchRegex: |
| path: metadata.name |
| pattern: -basic$ |
| documentIndex: 0 |
| template: deployment.yaml |
| ` |
| var tj TestJob |
| yaml.Unmarshal([]byte(manifest), &tj) |
| |
| testResult := tj.RunV2(c, &snapshot.Cache{}, &TestJobResult{}) |
| |
| a := assert.New(t) |
| cupaloy.SnapshotT(t, makeTestJobResultSnapshotable(testResult)) |
| |
| a.Nil(testResult.ExecError) |
| a.True(testResult.Passed) |
| a.Equal(2, len(testResult.AssertsResult)) |
| } |
| |
| func TestV2RunJobWithNOTESTemplateOk(t *testing.T) { |
| c, _ := v2util.Load(testV2BasicChart) |
| manifest := ` |
| it: should work |
| template: NOTES.txt |
| asserts: |
| - equalRaw: |
| value: | |
| 1. Get the application URL by running these commands: |
| export POD_NAME=$(kubectl get pods --namespace NAMESPACE -l "app=basic,release=RELEASE-NAME" -o jsonpath="{.items[0].metadata.name}") |
| echo "Visit http://127.0.0.1:8080 to use your application" |
| kubectl port-forward $POD_NAME 8080:80 |
| - matchRegexRaw: |
| pattern: ^1. Get the application URL by running these commands |
| ` |
| var tj TestJob |
| yaml.Unmarshal([]byte(manifest), &tj) |
| |
| testResult := tj.RunV2(c, &snapshot.Cache{}, &TestJobResult{}) |
| |
| a := assert.New(t) |
| cupaloy.SnapshotT(t, makeTestJobResultSnapshotable(testResult)) |
| |
| a.Nil(testResult.ExecError) |
| a.True(testResult.Passed) |
| a.Equal(2, len(testResult.AssertsResult)) |
| } |
| |
| func TestV2RunJobWithTestJobTemplateOk(t *testing.T) { |
| c, _ := v2util.Load(testV2BasicChart) |
| manifest := ` |
| it: should work |
| template: deployment.yaml |
| documentIndex: 0 |
| asserts: |
| - equal: |
| path: kind |
| value: Deployment |
| - matchRegex: |
| path: metadata.name |
| pattern: -basic$ |
| ` |
| var tj TestJob |
| yaml.Unmarshal([]byte(manifest), &tj) |
| |
| testResult := tj.RunV2(c, &snapshot.Cache{}, &TestJobResult{}) |
| |
| a := assert.New(t) |
| cupaloy.SnapshotT(t, makeTestJobResultSnapshotable(testResult)) |
| |
| a.Nil(testResult.ExecError) |
| a.True(testResult.Passed) |
| a.Equal(2, len(testResult.AssertsResult)) |
| } |
| |
| func TestV2RunJobWithTestMissingRequiredValueOk(t *testing.T) { |
| c, _ := v2util.Load(testV2BasicChart) |
| manifest := ` |
| it: should work |
| set: |
| ingress.enabled: true |
| service.externalPort: "" |
| template: ingress.yaml |
| asserts: |
| - failedTemplate: |
| errorType: required |
| errorMessage: The externalPort is required |
| ` |
| var tj TestJob |
| yaml.Unmarshal([]byte(manifest), &tj) |
| |
| testResult := tj.RunV2(c, &snapshot.Cache{}, &TestJobResult{}) |
| |
| a := assert.New(t) |
| cupaloy.SnapshotT(t, makeTestJobResultSnapshotable(testResult)) |
| |
| a.Nil(testResult.ExecError) |
| a.True(testResult.Passed) |
| a.Equal(1, len(testResult.AssertsResult)) |
| } |
| |
| func TestV2RunJobWithAssertionFail(t *testing.T) { |
| c, _ := v2util.Load(testV2BasicChart) |
| manifest := ` |
| it: should work |
| asserts: |
| - equal: |
| path: kind |
| value: WrongKind |
| documentIndex: 0 |
| template: deployment.yaml |
| - matchRegex: |
| path: metadata.name |
| pattern: pattern-not-match |
| documentIndex: 0 |
| template: deployment.yaml |
| ` |
| var tj TestJob |
| yaml.Unmarshal([]byte(manifest), &tj) |
| |
| testResult := tj.RunV2(c, &snapshot.Cache{}, &TestJobResult{}) |
| // Write Buffer |
| |
| a := assert.New(t) |
| cupaloy.SnapshotT(t, makeTestJobResultSnapshotable(testResult)) |
| |
| a.Nil(testResult.ExecError) |
| a.False(testResult.Passed) |
| a.Equal(2, len(testResult.AssertsResult)) |
| } |
| |
| func TestV2RunJobWithValueSet(t *testing.T) { |
| c, _ := v2util.Load(testV2BasicChart) |
| manifest := ` |
| it: should work |
| set: |
| nameOverride: john-doe |
| asserts: |
| - equal: |
| path: metadata.name |
| value: RELEASE-NAME-john-doe |
| documentIndex: 0 |
| template: deployment.yaml |
| ` |
| var tj TestJob |
| yaml.Unmarshal([]byte(manifest), &tj) |
| |
| testResult := tj.RunV2(c, &snapshot.Cache{}, &TestJobResult{}) |
| |
| a := assert.New(t) |
| cupaloy.SnapshotT(t, makeTestJobResultSnapshotable(testResult)) |
| |
| a.Nil(testResult.ExecError) |
| a.True(testResult.Passed) |
| a.Equal(1, len(testResult.AssertsResult)) |
| } |
| |
| func TestV2RunJobWithValuesFile(t *testing.T) { |
| c, _ := v2util.Load(testV2BasicChart) |
| manifest := ` |
| it: should work |
| values: |
| - %s |
| asserts: |
| - equal: |
| path: metadata.name |
| value: RELEASE-NAME-mary-jane |
| documentIndex: 0 |
| template: deployment.yaml |
| ` |
| file, _ := ioutil.TempFile("", "testjob_test_TestRunJobWithValuesFile.yaml") |
| file.WriteString("nameOverride: mary-jane") |
| |
| var tj TestJob |
| yaml.Unmarshal([]byte(fmt.Sprintf(manifest, file.Name())), &tj) |
| |
| testResult := tj.RunV2(c, &snapshot.Cache{}, &TestJobResult{}) |
| |
| a := assert.New(t) |
| cupaloy.SnapshotT(t, makeTestJobResultSnapshotable(testResult)) |
| |
| a.Nil(testResult.ExecError) |
| a.True(testResult.Passed) |
| a.Equal(1, len(testResult.AssertsResult)) |
| } |
| |
| func TestV2RunJobWithReleaseSettings(t *testing.T) { |
| c, _ := v2util.Load(testV2BasicChart) |
| manifest := ` |
| it: should work |
| release: |
| name: my-release |
| namespace: test |
| asserts: |
| - equal: |
| path: metadata.name |
| value: my-release-basic |
| documentIndex: 0 |
| template: deployment.yaml |
| ` |
| var tj TestJob |
| yaml.Unmarshal([]byte(manifest), &tj) |
| |
| testResult := tj.RunV2(c, &snapshot.Cache{}, &TestJobResult{}) |
| |
| a := assert.New(t) |
| cupaloy.SnapshotT(t, makeTestJobResultSnapshotable(testResult)) |
| |
| a.Nil(testResult.ExecError) |
| a.True(testResult.Passed) |
| a.Equal(1, len(testResult.AssertsResult)) |
| } |
| |
| func TestV3RunJobOk(t *testing.T) { |
| c, _ := loader.Load(testV3BasicChart) |
| manifest := ` |
| it: should work |
| asserts: |
| - equal: |
| path: kind |
| value: Deployment |
| documentIndex: 0 |
| template: deployment.yaml |
| - matchRegex: |
| path: metadata.name |
| pattern: -basic$ |
| documentIndex: 0 |
| template: deployment.yaml |
| ` |
| var tj TestJob |
| yaml.Unmarshal([]byte(manifest), &tj) |
| |
| testResult := tj.RunV3(c, &snapshot.Cache{}, &TestJobResult{}) |
| |
| a := assert.New(t) |
| cupaloy.SnapshotT(t, makeTestJobResultSnapshotable(testResult)) |
| |
| a.Nil(testResult.ExecError) |
| a.True(testResult.Passed) |
| a.Equal(2, len(testResult.AssertsResult)) |
| } |
| |
| func TestV3RunJobWithTestJobTemplateOk(t *testing.T) { |
| c, _ := loader.Load(testV3BasicChart) |
| manifest := ` |
| it: should work |
| template: deployment.yaml |
| documentIndex: 0 |
| asserts: |
| - equal: |
| path: kind |
| value: Deployment |
| - matchRegex: |
| path: metadata.name |
| pattern: -basic$ |
| ` |
| var tj TestJob |
| yaml.Unmarshal([]byte(manifest), &tj) |
| |
| testResult := tj.RunV3(c, &snapshot.Cache{}, &TestJobResult{}) |
| |
| a := assert.New(t) |
| cupaloy.SnapshotT(t, makeTestJobResultSnapshotable(testResult)) |
| |
| a.Nil(testResult.ExecError) |
| a.True(testResult.Passed) |
| a.Equal(2, len(testResult.AssertsResult)) |
| } |
| |
| func TestV3RunJobWithTestMissingRequiredValueOk(t *testing.T) { |
| c, _ := loader.Load(testV3BasicChart) |
| manifest := ` |
| it: should work |
| set: |
| ingress.enabled: true |
| service.externalPort: "" |
| template: ingress.yaml |
| asserts: |
| - failedTemplate: |
| errorType: required |
| errorMessage: The externalPort is required |
| ` |
| var tj TestJob |
| yaml.Unmarshal([]byte(manifest), &tj) |
| |
| testResult := tj.RunV3(c, &snapshot.Cache{}, &TestJobResult{}) |
| |
| a := assert.New(t) |
| cupaloy.SnapshotT(t, makeTestJobResultSnapshotable(testResult)) |
| |
| a.Nil(testResult.ExecError) |
| a.True(testResult.Passed) |
| a.Equal(1, len(testResult.AssertsResult)) |
| } |
| |
| func TestV3RunJobWithAssertionFail(t *testing.T) { |
| c, _ := loader.Load(testV3BasicChart) |
| manifest := ` |
| it: should work |
| asserts: |
| - equal: |
| path: kind |
| value: WrongKind |
| documentIndex: 0 |
| template: deployment.yaml |
| - matchRegex: |
| path: metadata.name |
| pattern: pattern-not-match |
| documentIndex: 0 |
| template: deployment.yaml |
| ` |
| var tj TestJob |
| yaml.Unmarshal([]byte(manifest), &tj) |
| |
| testResult := tj.RunV3(c, &snapshot.Cache{}, &TestJobResult{}) |
| // Write Buffer |
| |
| a := assert.New(t) |
| cupaloy.SnapshotT(t, makeTestJobResultSnapshotable(testResult)) |
| |
| a.Nil(testResult.ExecError) |
| a.False(testResult.Passed) |
| a.Equal(2, len(testResult.AssertsResult)) |
| } |
| |
| func TestV3RunJobWithValueSet(t *testing.T) { |
| c, _ := loader.Load(testV3BasicChart) |
| manifest := ` |
| it: should work |
| set: |
| nameOverride: john-doe |
| asserts: |
| - equal: |
| path: metadata.name |
| value: RELEASE-NAME-john-doe |
| documentIndex: 0 |
| template: deployment.yaml |
| ` |
| var tj TestJob |
| yaml.Unmarshal([]byte(manifest), &tj) |
| |
| testResult := tj.RunV3(c, &snapshot.Cache{}, &TestJobResult{}) |
| |
| a := assert.New(t) |
| cupaloy.SnapshotT(t, makeTestJobResultSnapshotable(testResult)) |
| |
| a.Nil(testResult.ExecError) |
| a.True(testResult.Passed) |
| a.Equal(1, len(testResult.AssertsResult)) |
| } |
| |
| func TestV3RunJobWithValuesFile(t *testing.T) { |
| c, _ := loader.Load(testV3BasicChart) |
| manifest := ` |
| it: should work |
| values: |
| - %s |
| asserts: |
| - equal: |
| path: metadata.name |
| value: RELEASE-NAME-mary-jane |
| documentIndex: 0 |
| template: deployment.yaml |
| ` |
| file, _ := ioutil.TempFile("", "testjob_test_TestRunJobWithValuesFile.yaml") |
| file.WriteString("nameOverride: mary-jane") |
| |
| var tj TestJob |
| yaml.Unmarshal([]byte(fmt.Sprintf(manifest, file.Name())), &tj) |
| |
| testResult := tj.RunV3(c, &snapshot.Cache{}, &TestJobResult{}) |
| |
| a := assert.New(t) |
| cupaloy.SnapshotT(t, makeTestJobResultSnapshotable(testResult)) |
| |
| a.Nil(testResult.ExecError) |
| a.True(testResult.Passed) |
| a.Equal(1, len(testResult.AssertsResult)) |
| } |
| |
| func TestV3RunJobWithReleaseSettings(t *testing.T) { |
| c, _ := loader.Load(testV3BasicChart) |
| manifest := ` |
| it: should work |
| release: |
| name: my-release |
| namespace: test |
| asserts: |
| - equal: |
| path: metadata.name |
| value: my-release-basic |
| documentIndex: 0 |
| template: deployment.yaml |
| ` |
| var tj TestJob |
| yaml.Unmarshal([]byte(manifest), &tj) |
| |
| testResult := tj.RunV3(c, &snapshot.Cache{}, &TestJobResult{}) |
| |
| a := assert.New(t) |
| cupaloy.SnapshotT(t, makeTestJobResultSnapshotable(testResult)) |
| |
| a.Nil(testResult.ExecError) |
| a.True(testResult.Passed) |
| a.Equal(1, len(testResult.AssertsResult)) |
| } |