diff --git a/diff/diff_test.go b/diff/diff_test.go index 3508678f..ad9450b0 100644 --- a/diff/diff_test.go +++ b/diff/diff_test.go @@ -1,9 +1,13 @@ package diff import ( - "testing" "bytes" + "testing" + "github.com/mgutz/ansi" + "github.com/stretchr/testify/require" + + "github.com/databus23/helm-diff/manifest" ) var text1 = "" + @@ -121,3 +125,44 @@ func assertDiff(t *testing.T, before, after string, context int, expected string t.Errorf("Unexpected diff output: \nExpected:\n#%v# \nActual:\n#%v#", expected, actual) } } + +func TestDiffManifests(t *testing.T) { + specBeta := map[string]*manifest.MappingResult{ + "default, nginx, Deployment (apps)": &manifest.MappingResult{ + + Name: "default, nginx, Deployment (apps)", + Kind: "Deployment", + Content: ` +apiVersion: apps/v1beta1 +kind: Deployment +metadata: + name: nginx +`, + }} + + specRelease := map[string]*manifest.MappingResult{ + "default, nginx, Deployment (apps)": &manifest.MappingResult{ + + Name: "default, nginx, Deployment (apps)", + Kind: "Deployment", + Content: ` +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx +`, + }} + + var buf bytes.Buffer + DiffManifests(specBeta, specRelease, []string{}, 10, &buf) + + require.Equal(t, `default, nginx, Deployment (apps) has changed: + +- apiVersion: apps/v1beta1 ++ apiVersion: apps/v1 + kind: Deployment + metadata: + name: nginx + +`, buf.String()) +} diff --git a/glide.lock b/glide.lock index ac152cbb..be547687 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ -hash: 02bce39773133aecd03781f0284dd7e215876a47a3c1fb3303d7805063d9529f -updated: 2018-04-27T00:46:18.988457+02:00 +hash: 577ed63de6e9ee86cafc0e6051f2aaa2095ec5c3f009fa5d986b652c0f041495 +updated: 2018-07-12T17:35:13.372814615-07:00 imports: - name: github.com/aryann/difflib version: a1a4dd44eb11820695fbe83e00fb2301ee6eb54c @@ -131,4 +131,17 @@ imports: - pkg/tlsutil - pkg/urlutil - pkg/version -testImports: [] +testImports: +- name: github.com/davecgh/go-spew + version: 782f4967f2dc4564575ca782fe2d04090b5faca8 + subpackages: + - spew +- name: github.com/pmezard/go-difflib + version: d8ed2627bdf02c080bf22230dbb337003b7aba2d + subpackages: + - difflib +- name: github.com/stretchr/testify + version: f35b8ab0b5a2cef36673838d662e249dd9c94686 + subpackages: + - assert + - require diff --git a/glide.yaml b/glide.yaml index c81e4e2d..c0fc9e68 100644 --- a/glide.yaml +++ b/glide.yaml @@ -15,3 +15,6 @@ import: version: 1.7.2 - package: golang.org/x/net version: 1c05540f6879653db88113bc4a2b70aec4bd491f +testImport: +- package: github.com/stretchr/testify + version: ^1.2.2 diff --git a/manifest/parse.go b/manifest/parse.go index d60f9f39..fdbc9f8e 100644 --- a/manifest/parse.go +++ b/manifest/parse.go @@ -28,7 +28,13 @@ type metadata struct { } func (m metadata) String() string { - return fmt.Sprintf("%s, %s, %s (%s)", m.Metadata.Namespace, m.Metadata.Name, m.Kind, m.ApiVersion) + apiBase := m.ApiVersion + sp := strings.Split(apiBase, "/") + if len(sp) > 1 { + apiBase = strings.Join(sp[:len(sp)-1], "/") + } + + return fmt.Sprintf("%s, %s, %s (%s)", m.Metadata.Namespace, m.Metadata.Name, m.Kind, apiBase) } func scanYamlSpecs(data []byte, atEOF bool) (advance int, token []byte, err error) { diff --git a/manifest/parse_test.go b/manifest/parse_test.go new file mode 100644 index 00000000..fe9ffc2d --- /dev/null +++ b/manifest/parse_test.go @@ -0,0 +1,60 @@ +package manifest_test + +import ( + "io/ioutil" + "sort" + "testing" + + "github.com/stretchr/testify/require" + + . "github.com/databus23/helm-diff/manifest" +) + +func foundObjects(result map[string]*MappingResult) []string { + objs := make([]string, 0, len(result)) + for k, _ := range result { + objs = append(objs, k) + } + sort.Strings(objs) + return objs +} + +func TestPod(t *testing.T) { + spec, err := ioutil.ReadFile("testdata/pod.yaml") + require.NoError(t, err) + + require.Equal(t, + []string{"default, nginx, Pod (v1)"}, + foundObjects(Parse(string(spec), "default")), + ) +} + +func TestPodNamespace(t *testing.T) { + spec, err := ioutil.ReadFile("testdata/pod_namespace.yaml") + require.NoError(t, err) + + require.Equal(t, + []string{"batcave, nginx, Pod (v1)"}, + foundObjects(Parse(string(spec), "default")), + ) +} + +func TestDeployV1(t *testing.T) { + spec, err := ioutil.ReadFile("testdata/deploy_v1.yaml") + require.NoError(t, err) + + require.Equal(t, + []string{"default, nginx, Deployment (apps)"}, + foundObjects(Parse(string(spec), "default")), + ) +} + +func TestDeployV1Beta1(t *testing.T) { + spec, err := ioutil.ReadFile("testdata/deploy_v1beta1.yaml") + require.NoError(t, err) + + require.Equal(t, + []string{"default, nginx, Deployment (apps)"}, + foundObjects(Parse(string(spec), "default")), + ) +} diff --git a/manifest/testdata/deploy_v1.yaml b/manifest/testdata/deploy_v1.yaml new file mode 100644 index 00000000..d97987c2 --- /dev/null +++ b/manifest/testdata/deploy_v1.yaml @@ -0,0 +1,22 @@ + +--- +# Source: nginx/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx +spec: + replicas: 3 + selector: + matchLabels: + app: nginx + template: + metadata: + labels: + app: nginx + spec: + containers: + - name: nginx + image: nginx:1.7.9 + ports: + - containerPort: 80 diff --git a/manifest/testdata/deploy_v1beta1.yaml b/manifest/testdata/deploy_v1beta1.yaml new file mode 100644 index 00000000..9d2af539 --- /dev/null +++ b/manifest/testdata/deploy_v1beta1.yaml @@ -0,0 +1,22 @@ + +--- +# Source: nginx/deployment.yaml +apiVersion: apps/v1beta1 +kind: Deployment +metadata: + name: nginx +spec: + replicas: 3 + selector: + matchLabels: + app: nginx + template: + metadata: + labels: + app: nginx + spec: + containers: + - name: nginx + image: nginx:1.7.9 + ports: + - containerPort: 80 diff --git a/manifest/testdata/pod.yaml b/manifest/testdata/pod.yaml new file mode 100644 index 00000000..8811a0f7 --- /dev/null +++ b/manifest/testdata/pod.yaml @@ -0,0 +1,13 @@ + +--- +# Source: nginx/pod.yaml +apiVersion: v1 +kind: Pod +metadata: + name: nginx +spec: + containers: + - name: nginx + image: nginx:1.7.9 + ports: + - containerPort: 80 diff --git a/manifest/testdata/pod_namespace.yaml b/manifest/testdata/pod_namespace.yaml new file mode 100644 index 00000000..1f5b997c --- /dev/null +++ b/manifest/testdata/pod_namespace.yaml @@ -0,0 +1,14 @@ + +--- +# Source: nginx/pod.yaml +apiVersion: v1 +kind: Pod +metadata: + name: nginx + namespace: batcave +spec: + containers: + - name: nginx + image: nginx:1.7.9 + ports: + - containerPort: 80