github.com/splunk/dan1-qbec@v0.7.3/internal/commands/component_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 "regexp" 21 "strings" 22 "testing" 23 24 "github.com/stretchr/testify/assert" 25 "github.com/stretchr/testify/require" 26 ) 27 28 func TestComponentListBasic(t *testing.T) { 29 s := newScaffold(t) 30 defer s.reset() 31 err := s.executeCommand("component", "list", "dev") 32 require.Nil(t, err) 33 lines := strings.Split(strings.Trim(s.stdout(), "\n"), "\n") 34 a := assert.New(t) 35 a.Equal(4, len(lines)) 36 s.assertOutputLineMatch(regexp.MustCompile(`COMPONENT\s+FILE`)) 37 s.assertOutputLineMatch(regexp.MustCompile(`cluster-objects\s+components/cluster-objects.yaml`)) 38 s.assertOutputLineMatch(regexp.MustCompile(`service2\s+components/service2.jsonnet`)) 39 s.assertOutputLineMatch(regexp.MustCompile(`test-job\s+components/test-job.yaml`)) 40 } 41 42 func TestComponentListYAML(t *testing.T) { 43 s := newScaffold(t) 44 defer s.reset() 45 err := s.executeCommand("component", "list", "dev", "-o", "yaml") 46 require.Nil(t, err) 47 out, err := s.yamlOutput() 48 require.Nil(t, err) 49 assert.True(t, len(out) > 0) 50 } 51 52 func TestComponentListJSON(t *testing.T) { 53 s := newScaffold(t) 54 defer s.reset() 55 err := s.executeCommand("component", "list", "dev", "-o", "json") 56 require.Nil(t, err) 57 var data interface{} 58 err = s.jsonOutput(&data) 59 require.Nil(t, err) 60 } 61 62 func TestComponentListObjects(t *testing.T) { 63 s := newScaffold(t) 64 defer s.reset() 65 err := s.executeCommand("component", "list", "dev", "-O") 66 require.Nil(t, err) 67 s.assertOutputLineMatch(regexp.MustCompile(`COMPONENT\s+KIND\s+NAME\s+NAMESPACE`)) 68 s.assertOutputLineMatch(regexp.MustCompile(`cluster-objects\s+ClusterRole\s+allow-root-psp-policy`)) 69 s.assertOutputLineMatch(regexp.MustCompile(`service2\s+ConfigMap\s+svc2-cm\s+bar-system`)) 70 } 71 72 func TestComponentDiffBasic(t *testing.T) { 73 s := newScaffold(t) 74 defer s.reset() 75 err := s.executeCommand("component", "diff", "dev") 76 require.Nil(t, err) 77 s.assertOutputLineMatch(regexp.MustCompile(`--- baseline`)) 78 s.assertOutputLineMatch(regexp.MustCompile(`\+\+\+ environment: dev`)) 79 s.assertOutputLineMatch(regexp.MustCompile(`\+service2\s+components/service2.jsonnet`)) 80 } 81 82 func TestComponentDiff2Envs(t *testing.T) { 83 s := newScaffold(t) 84 defer s.reset() 85 err := s.executeCommand("component", "diff", "dev", "prod") 86 require.Nil(t, err) 87 s.assertOutputLineMatch(regexp.MustCompile(`--- environment: dev`)) 88 s.assertOutputLineMatch(regexp.MustCompile(`\+\+\+ environment: prod`)) 89 s.assertOutputLineMatch(regexp.MustCompile(`\++service1\s+components/service1.jsonnet`)) 90 } 91 92 func TestComponentDiff2EnvObjects(t *testing.T) { 93 s := newScaffold(t) 94 defer s.reset() 95 err := s.executeCommand("component", "diff", "dev", "prod", "-O") 96 require.Nil(t, err) 97 s.assertOutputLineMatch(regexp.MustCompile(`--- environment: dev`)) 98 s.assertOutputLineMatch(regexp.MustCompile(`\+\+\+ environment: prod`)) 99 s.assertOutputLineMatch(regexp.MustCompile(`\+service1\s+ConfigMap\s+svc1-cm\s+foo-system`)) 100 } 101 102 func TestComponentDiffObjects(t *testing.T) { 103 s := newScaffold(t) 104 defer s.reset() 105 err := s.executeCommand("component", "diff", "dev", "-O") 106 require.Nil(t, err) 107 s.assertOutputLineMatch(regexp.MustCompile(`--- baseline`)) 108 s.assertOutputLineMatch(regexp.MustCompile(`\+\+\+ environment: dev`)) 109 s.assertOutputLineMatch(regexp.MustCompile(`\+service2\s+ConfigMap\s+svc2-cm\s+bar-system`)) 110 s.assertOutputLineMatch(regexp.MustCompile(`-service1\s+ConfigMap\s+svc1-cm\s+foo-system`)) 111 } 112 113 func TestComponentNegative(t *testing.T) { 114 tests := []struct { 115 name string 116 args []string 117 asserter func(s *scaffold, err error) 118 }{ 119 { 120 name: "list no env", 121 args: []string{"component", "list"}, 122 asserter: func(s *scaffold, err error) { 123 a := assert.New(s.t) 124 a.True(isUsageError(err)) 125 a.Equal("exactly one environment required", err.Error()) 126 }, 127 }, 128 { 129 name: "list 2 envs", 130 args: []string{"component", "list", "dev", "prod"}, 131 asserter: func(s *scaffold, err error) { 132 a := assert.New(s.t) 133 a.True(isUsageError(err)) 134 a.Equal("exactly one environment required", err.Error()) 135 }, 136 }, 137 { 138 name: "list bad format", 139 args: []string{"component", "list", "dev", "-o", "table"}, 140 asserter: func(s *scaffold, err error) { 141 a := assert.New(s.t) 142 a.True(isUsageError(err)) 143 a.Equal(`listComponents: unsupported format "table"`, err.Error()) 144 }, 145 }, 146 { 147 name: "list bad env", 148 args: []string{"component", "list", "foo"}, 149 asserter: func(s *scaffold, err error) { 150 a := assert.New(s.t) 151 a.False(isUsageError(err)) 152 a.Equal(`invalid environment "foo"`, err.Error()) 153 }, 154 }, 155 { 156 name: "diff no env", 157 args: []string{"component", "diff"}, 158 asserter: func(s *scaffold, err error) { 159 a := assert.New(s.t) 160 a.True(isUsageError(err)) 161 a.Equal(`one or two environments required`, err.Error()) 162 }, 163 }, 164 { 165 name: "diff 3 envs", 166 args: []string{"component", "diff", "dev", "prod", "_"}, 167 asserter: func(s *scaffold, err error) { 168 a := assert.New(s.t) 169 a.True(isUsageError(err)) 170 a.Equal(`one or two environments required`, err.Error()) 171 }, 172 }, 173 { 174 name: "diff bad envs", 175 args: []string{"component", "diff", "foo"}, 176 asserter: func(s *scaffold, err error) { 177 a := assert.New(s.t) 178 a.False(isUsageError(err)) 179 a.Equal(`invalid environment "foo"`, err.Error()) 180 }, 181 }, 182 } 183 184 for _, test := range tests { 185 t.Run(test.name, func(t *testing.T) { 186 s := newScaffold(t) 187 defer s.reset() 188 err := s.executeCommand(test.args...) 189 require.NotNil(t, err) 190 test.asserter(s, err) 191 }) 192 } 193 }