github.com/splunk/dan1-qbec@v0.7.3/internal/commands/diff_test.go (about) 1 /* 2 Copyright 2019 Splunk Inc. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package commands 18 19 import ( 20 "encoding/base64" 21 "regexp" 22 "testing" 23 24 "github.com/stretchr/testify/assert" 25 "github.com/stretchr/testify/require" 26 ) 27 28 func TestDiffBasicNoDiffs(t *testing.T) { 29 s := newScaffold(t) 30 defer s.reset() 31 d := &dg{cmValue: "bar"} 32 s.client.getFunc = d.get 33 err := s.executeCommand("diff", "dev", "-k", "configmaps", "--ignore-all-annotations", "--ignore-all-labels", "--show-deletes=false") 34 require.Nil(t, err) 35 } 36 37 func TestDiffBasic(t *testing.T) { 38 s := newScaffold(t) 39 defer s.reset() 40 d := &dg{cmValue: "baz", secretValue: "baz"} 41 s.client.getFunc = d.get 42 s.client.listFunc = stdLister 43 err := s.executeCommand("diff", "dev") 44 require.NotNil(t, err) 45 stats := s.outputStats() 46 a := assert.New(t) 47 a.True(regexp.MustCompile(`\d+ object\(s\) different`).MatchString(err.Error())) 48 a.EqualValues([]interface{}{"ConfigMap:bar-system:svc2-cm", "Secret:bar-system:svc2-secret"}, stats["changes"]) 49 a.EqualValues([]interface{}{"Deployment:bar-system:svc2-previous-deploy"}, stats["deletions"]) 50 adds, ok := stats["additions"].([]interface{}) 51 require.True(t, ok) 52 a.Contains(adds, "Job::tj-<xxxxx>") 53 secretValue := base64.StdEncoding.EncodeToString([]byte("baz")) 54 redactedValue := base64.RawStdEncoding.EncodeToString([]byte("redacted.")) 55 a.Contains(s.stdout(), redactedValue) 56 a.Contains(s.stdout(), "qbec.io/component: service2") 57 a.NotContains(s.stdout(), secretValue) 58 } 59 60 func TestDiffGetFail(t *testing.T) { 61 s := newScaffold(t) 62 defer s.reset() 63 err := s.executeCommand("diff", "dev", "--parallel=1") 64 require.NotNil(t, err) 65 a := assert.New(t) 66 a.Contains(err.Error(), "not implemented") 67 } 68 69 func TestDiffListFail(t *testing.T) { 70 s := newScaffold(t) 71 defer s.reset() 72 d := &dg{cmValue: "baz", secretValue: "baz"} 73 s.client.getFunc = d.get 74 err := s.executeCommand("diff", "dev") 75 require.NotNil(t, err) 76 a := assert.New(t) 77 a.Contains(err.Error(), "not implemented") 78 } 79 80 func TestDiffBasicNoLabels(t *testing.T) { 81 s := newScaffold(t) 82 defer s.reset() 83 d := &dg{cmValue: "baz", secretValue: "baz"} 84 s.client.getFunc = d.get 85 err := s.executeCommand("diff", "dev", "--ignore-all-labels", "-S", "--show-deletes=false") 86 require.NotNil(t, err) 87 a := assert.New(t) 88 secretValue := base64.StdEncoding.EncodeToString([]byte("baz")) 89 redactedValue := base64.RawStdEncoding.EncodeToString([]byte("redacted.")) 90 a.NotContains(s.stdout(), redactedValue) 91 a.Contains(s.stdout(), secretValue) 92 a.NotContains(s.stdout(), "qbec.io/environment") 93 } 94 95 func TestDiffBasicNoSpecificLabels(t *testing.T) { 96 s := newScaffold(t) 97 defer s.reset() 98 d := &dg{cmValue: "baz", secretValue: "baz"} 99 s.client.getFunc = d.get 100 err := s.executeCommand("diff", "dev", "--ignore-label", "qbec.io/environment", "--show-deletes=false") 101 require.NotNil(t, err) 102 a := assert.New(t) 103 a.NotContains(s.stdout(), "qbec.io/environment:") 104 a.Contains(s.stdout(), "qbec.io/application:") 105 } 106 107 func TestDiffBasicNoSpecificAnnotation(t *testing.T) { 108 s := newScaffold(t) 109 defer s.reset() 110 d := &dg{cmValue: "baz", secretValue: "baz"} 111 s.client.getFunc = d.get 112 err := s.executeCommand("diff", "dev", "--ignore-annotation", "ann/foo", "--show-deletes=false") 113 require.NotNil(t, err) 114 a := assert.New(t) 115 a.NotContains(s.stdout(), "ann/foo") 116 a.Contains(s.stdout(), "ann/bar") 117 } 118 119 func TestDiffBasicNoAnnotations(t *testing.T) { 120 s := newScaffold(t) 121 defer s.reset() 122 d := &dg{cmValue: "baz", secretValue: "baz"} 123 s.client.getFunc = d.get 124 err := s.executeCommand("diff", "dev", "--ignore-all-annotations", "--show-deletes=false") 125 require.NotNil(t, err) 126 a := assert.New(t) 127 a.NotContains(s.stdout(), "ann/foo") 128 a.NotContains(s.stdout(), "ann/bar") 129 } 130 131 func TestDiffNegative(t *testing.T) { 132 tests := []struct { 133 name string 134 args []string 135 asserter func(s *scaffold, err error) 136 }{ 137 { 138 name: "no env", 139 args: []string{"diff"}, 140 asserter: func(s *scaffold, err error) { 141 a := assert.New(s.t) 142 a.True(isUsageError(err)) 143 a.Equal("exactly one environment required", err.Error()) 144 }, 145 }, 146 { 147 name: "2 envs", 148 args: []string{"diff", "dev", "prod"}, 149 asserter: func(s *scaffold, err error) { 150 a := assert.New(s.t) 151 a.True(isUsageError(err)) 152 a.Equal("exactly one environment required", err.Error()) 153 }, 154 }, 155 { 156 name: "bad env", 157 args: []string{"diff", "foo"}, 158 asserter: func(s *scaffold, err error) { 159 a := assert.New(s.t) 160 a.False(isUsageError(err)) 161 a.Equal("invalid environment \"foo\"", err.Error()) 162 }, 163 }, 164 { 165 name: "baseline env", 166 args: []string{"diff", "_"}, 167 asserter: func(s *scaffold, err error) { 168 a := assert.New(s.t) 169 a.True(isUsageError(err)) 170 a.Equal("cannot diff baseline environment, use a real environment", err.Error()) 171 }, 172 }, 173 { 174 name: "c and C", 175 args: []string{"diff", "dev", "-c", "cluster-objects", "-C", "service2"}, 176 asserter: func(s *scaffold, err error) { 177 a := assert.New(s.t) 178 a.True(isUsageError(err)) 179 a.Equal(`cannot include as well as exclude components, specify one or the other`, err.Error()) 180 }, 181 }, 182 { 183 name: "k and K", 184 args: []string{"diff", "dev", "-k", "namespace", "-K", "secret"}, 185 asserter: func(s *scaffold, err error) { 186 a := assert.New(s.t) 187 a.True(isUsageError(err)) 188 a.Equal(`cannot include as well as exclude kinds, specify one or the other`, err.Error()) 189 }, 190 }, 191 } 192 for _, test := range tests { 193 t.Run(test.name, func(t *testing.T) { 194 s := newScaffold(t) 195 defer s.reset() 196 err := s.executeCommand(test.args...) 197 require.NotNil(t, err) 198 test.asserter(s, err) 199 }) 200 } 201 202 }