44 "bytes"
55 "context"
66 "os"
7+ "regexp"
78 "testing"
89
910 apps "github.com/ninech/apis/apps/v1alpha1"
@@ -15,8 +16,8 @@ import (
1516 "github.com/stretchr/testify/assert"
1617 "github.com/stretchr/testify/require"
1718 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
18- "sigs.k8s.io/controller-runtime/pkg/client"
19- "sigs.k8s.io/controller-runtime/pkg/client/fake"
19+ sigs "sigs.k8s.io/controller-runtime/pkg/client"
20+ fake "sigs.k8s.io/controller-runtime/pkg/client/fake"
2021)
2122
2223func TestAllContent (t * testing.T ) {
@@ -25,45 +26,41 @@ func TestAllContent(t *testing.T) {
2526 organization := "evilcorp"
2627
2728 for name , testCase := range map [string ]struct {
28- projects []client .Object
29- objects []client .Object
29+ projects []sigs .Object
30+ objects []sigs .Object
3031 projectName string
3132 outputFormat outputFormat
3233 allProjects bool
3334 includeNineResources bool
3435 kinds []string
3536 output string
3637 errorExpected bool
38+ expectRegexp * regexp.Regexp
3739 }{
3840 "all resources from one project, full format" : {
3941 projects : test .Projects (organization , "dev" , "staging" , "prod" ),
40- objects : []client .Object {testApplication ("banana" , "dev" ), testRelease ("pear" , "dev" )},
42+ objects : []sigs .Object {testApplication ("banana" , "dev" ), testRelease ("pear" , "dev" )},
4143 outputFormat : full ,
4244 projectName : "dev" ,
43- output : `PROJECT NAME KIND GROUP
44- dev banana Application apps.nine.ch
45- dev pear Release apps.nine.ch
46- ` ,
45+ expectRegexp : regexp .MustCompile (`PROJECT\s+NAME\s+KIND\s+GROUP\ndev\s+banana\s+Application\s+apps.nine.ch\ndev\s+pear\s+Release\s+apps.nine.ch\n` ),
4746 },
4847 "all resources from one project, no header" : {
4948 projects : test .Projects (organization , "dev" , "staging" , "prod" ),
50- objects : []client .Object {testApplication ("banana" , "dev" ), testRelease ("pear" , "dev" )},
49+ objects : []sigs .Object {testApplication ("banana" , "dev" ), testRelease ("pear" , "dev" )},
5150 outputFormat : noHeader ,
5251 projectName : "dev" ,
53- output : `dev banana Application apps.nine.ch
54- dev pear Release apps.nine.ch
55- ` ,
52+ expectRegexp : regexp .MustCompile (`dev\s+banana\s+Application\s+apps.nine.ch\ndev\s+pear\s+Release\s+apps.nine.ch\n` ),
5653 },
5754 "all resources from one project, yaml format" : {
5855 projects : test .Projects (organization , "dev" , "staging" , "prod" ),
59- objects : []client .Object {testApplication ("banana" , "dev" ), testRelease ("pear" , "dev" )},
56+ objects : []sigs .Object {testApplication ("banana" , "dev" ), testRelease ("pear" , "dev" )},
6057 outputFormat : yamlOut ,
6158 projectName : "dev" ,
6259 output : "apiVersion: apps.nine.ch/v1alpha1\n kind: Application\n metadata:\n creationTimestamp: null\n name: banana\n namespace: dev\n spec:\n forProvider:\n buildEnv: null\n config:\n env: null\n port: null\n replicas: null\n size: \" \" \n dockerfileBuild:\n enabled: false\n git:\n revision: \" \" \n subPath: \" \" \n url: \" \" \n paused: false\n status:\n atProvider:\n defaultURLs: null\n ---\n apiVersion: apps.nine.ch/v1alpha1\n creationTimestampNano: 0\n kind: Release\n metadata:\n creationTimestamp: null\n name: pear\n namespace: dev\n spec:\n forProvider:\n build:\n name: \" \" \n configuration:\n size:\n origin: \" \" \n value: \" \" \n defaultHosts: null\n healthProbeConfiguration: null\n image: {}\n paused: false\n status:\n atProvider:\n owning: false\n " ,
6360 },
6461 "all resources from one project, json format" : {
6562 projects : test .Projects (organization , "dev" , "staging" , "prod" ),
66- objects : []client .Object {testApplication ("banana" , "dev" ), testRelease ("pear" , "dev" )},
63+ objects : []sigs .Object {testApplication ("banana" , "dev" ), testRelease ("pear" , "dev" )},
6764 outputFormat : jsonOut ,
6865 projectName : "dev" ,
6966 output : `[
@@ -138,54 +135,43 @@ dev pear Release apps.nine.ch
138135 },
139136 "all projects, full format" : {
140137 projects : test .Projects (organization , "dev" , "staging" , "prod" ),
141- objects : []client .Object {
138+ objects : []sigs .Object {
142139 testApplication ("banana" , "dev" ), testRelease ("pear" , "dev" ),
143140 testApplication ("apple" , "staging" ), testRelease ("melon" , "staging" ),
144141 testCluster ("orange" , "prod" ),
145142 },
146143 outputFormat : full ,
147144 allProjects : true ,
148- output : `PROJECT NAME KIND GROUP
149- dev banana Application apps.nine.ch
150- dev pear Release apps.nine.ch
151- prod orange KubernetesCluster infrastructure.nine.ch
152- staging apple Application apps.nine.ch
153- staging melon Release apps.nine.ch
154- ` ,
145+ expectRegexp : regexp .MustCompile (`PROJECT\s+NAME\s+KIND\s+GROUP\ndev\s+banana\s+Application\s+apps.nine.ch\ndev\s+pear\s+Release\s+apps.nine.ch\nprod\s+orange\s+KubernetesCluster\s+infrastructure.nine.ch\nstaging\s+apple\s+Application\s+apps.nine.ch\nstaging\s+melon\s+Release\s+apps.nine.ch\n` ),
155146 },
156147 "all projects, no headers format" : {
157148 projects : test .Projects (organization , "dev" , "staging" , "prod" ),
158- objects : []client .Object {
149+ objects : []sigs .Object {
159150 testApplication ("banana" , "dev" ), testRelease ("pear" , "dev" ),
160151 testApplication ("apple" , "staging" ), testRelease ("melon" , "staging" ),
161152 testCluster ("orange" , "prod" ),
162153 },
163154 outputFormat : noHeader ,
164155 allProjects : true ,
165- output : `dev banana Application apps.nine.ch
166- dev pear Release apps.nine.ch
167- prod orange KubernetesCluster infrastructure.nine.ch
168- staging apple Application apps.nine.ch
169- staging melon Release apps.nine.ch
170- ` ,
156+ expectRegexp : regexp .MustCompile (`dev\s+banana\s+Application\s+apps.nine.ch\ndev\s+pear\s+Release\s+apps.nine.ch\nprod\s+orange\s+KubernetesCluster\s+infrastructure.nine.ch\nstaging\s+apple\s+Application\s+apps.nine.ch\nstaging\s+melon\s+Release\s+apps.nine.ch\n` ),
171157 },
172158 "empty resources of a specific project, full format" : {
173159 projects : test .Projects (organization , "dev" ),
174- objects : []client .Object {},
160+ objects : []sigs .Object {},
175161 outputFormat : full ,
176162 projectName : "dev" ,
177163 output : "no Resources found in project dev\n " ,
178164 },
179165 "empty resources of all projects, full format" : {
180166 projects : test .Projects (organization , "dev" , "staging" ),
181- objects : []client .Object {},
167+ objects : []sigs .Object {},
182168 outputFormat : full ,
183169 allProjects : true ,
184170 output : "no Resources found in any project\n " ,
185171 },
186172 "filter nine resources, no headers format" : {
187173 projects : test .Projects (organization , "dev" , "staging" , "prod" ),
188- objects : []client .Object {
174+ objects : []sigs .Object {
189175 testApplication ("banana" , "dev" ), testRelease ("pear" , "dev" ),
190176 testApplication ("apple" , "staging" ), testRelease ("melon" , "staging" ), testRelease ("cherry" , "staging" ),
191177 testCluster ("orange" , "prod" ),
@@ -199,17 +185,11 @@ staging melon Release apps.nine.ch
199185 },
200186 outputFormat : noHeader ,
201187 allProjects : true ,
202- output : `dev banana Application apps.nine.ch
203- dev pear Release apps.nine.ch
204- prod orange KubernetesCluster infrastructure.nine.ch
205- staging apple Application apps.nine.ch
206- staging cherry Release apps.nine.ch
207- staging melon Release apps.nine.ch
208- ` ,
188+ expectRegexp : regexp .MustCompile (`dev\s+banana\s+Application\s+apps.nine.ch\ndev\s+pear\s+Release\s+apps.nine.ch\nprod\s+orange\s+KubernetesCluster\s+infrastructure.nine.ch\nstaging\s+apple\s+Application\s+apps.nine.ch\nstaging\s+cherry\s+Release\s+apps.nine.ch\nstaging\s+melon\s+Release\s+apps.nine.ch\n` ),
209189 },
210190 "include nine resources, no headers format" : {
211191 projects : test .Projects (organization , "dev" , "staging" , "prod" ),
212- objects : []client .Object {
192+ objects : []sigs .Object {
213193 testApplication ("banana" , "dev" ), testRelease ("pear" , "dev" ),
214194 testApplication ("apple" , "staging" ), testRelease ("melon" , "staging" ), testRelease ("cherry" , "staging" ),
215195 testCluster ("orange" , "prod" ),
@@ -224,33 +204,23 @@ staging melon Release apps.nine.ch
224204 outputFormat : noHeader ,
225205 allProjects : true ,
226206 includeNineResources : true ,
227- output : `dev banana Application apps.nine.ch
228- dev kiwi Application apps.nine.ch
229- dev pear Release apps.nine.ch
230- prod orange KubernetesCluster infrastructure.nine.ch
231- staging apple Application apps.nine.ch
232- staging cherry Release apps.nine.ch
233- staging melon Release apps.nine.ch
234- ` ,
207+ expectRegexp : regexp .MustCompile (`dev\s+banana\s+Application\s+apps.nine.ch\ndev\s+kiwi\s+Application\s+apps.nine.ch\ndev\s+pear\s+Release\s+apps.nine.ch\nprod\s+orange\s+KubernetesCluster\s+infrastructure.nine.ch\nstaging\s+apple\s+Application\s+apps.nine.ch\nstaging\s+cherry\s+Release\s+apps.nine.ch\nstaging\s+melon\s+Release\s+apps.nine.ch\n` ),
235208 },
236209 "only certain kind" : {
237210 projects : test .Projects (organization , "dev" , "staging" , "prod" ),
238- objects : []client .Object {
211+ objects : []sigs .Object {
239212 testApplication ("banana" , "dev" ), testRelease ("pear" , "dev" ),
240213 testApplication ("apple" , "staging" ), testRelease ("melon" , "staging" ), testRelease ("cherry" , "staging" ),
241214 testCluster ("orange" , "prod" ),
242215 },
243216 outputFormat : full ,
244217 allProjects : true ,
245218 kinds : []string {"application" },
246- output : `PROJECT NAME KIND GROUP
247- dev banana Application apps.nine.ch
248- staging apple Application apps.nine.ch
249- ` ,
219+ expectRegexp : regexp .MustCompile (`PROJECT\s+NAME\s+KIND\s+GROUP\ndev\s+banana\s+Application\s+apps.nine.ch\nstaging\s+apple\s+Application\s+apps.nine.ch\n` ),
250220 },
251221 "multiple certain kinds, no header format" : {
252222 projects : test .Projects (organization , "dev" , "staging" , "prod" ),
253- objects : []client .Object {
223+ objects : []sigs .Object {
254224 testApplication ("banana" , "dev" ), testRelease ("pear" , "dev" ),
255225 testApplication ("apple" , "staging" ), testRelease ("melon" , "staging" ), testRelease ("cherry" , "staging" ),
256226 testCluster ("orange" , "prod" ),
@@ -259,33 +229,25 @@ staging apple Application apps.nine.ch
259229 outputFormat : noHeader ,
260230 allProjects : true ,
261231 kinds : []string {"release" , "kubernetescluster" },
262- output : `dev dragonfruit KubernetesCluster infrastructure.nine.ch
263- dev pear Release apps.nine.ch
264- prod orange KubernetesCluster infrastructure.nine.ch
265- staging cherry Release apps.nine.ch
266- staging melon Release apps.nine.ch
267- ` ,
232+ expectRegexp : regexp .MustCompile (`dev\s+dragonfruit\s+KubernetesCluster\s+infrastructure.nine.ch\ndev\s+pear\s+Release\s+apps.nine.ch\nprod\s+orange\s+KubernetesCluster\s+infrastructure.nine.ch\nstaging\s+cherry\s+Release\s+apps.nine.ch\nstaging\s+melon\s+Release\s+apps.nine.ch\n` ),
268233 },
269234 "not known kind leads to an error" : {
270235 projects : test .Projects (organization , "dev" , "staging" , "prod" ),
271- objects : []client .Object {},
236+ objects : []sigs .Object {},
272237 outputFormat : noHeader ,
273238 allProjects : true ,
274239 kinds : []string {"jackofalltrades" },
275240 errorExpected : true ,
276241 },
277242 "excluded list kinds are not shown" : {
278243 projects : test .Projects (organization , "dev" ),
279- objects : []client .Object {
244+ objects : []sigs .Object {
280245 testApplication ("banana" , "dev" ), testRelease ("pear" , "dev" ),
281246 testClusterData (),
282247 },
283248 outputFormat : full ,
284249 allProjects : true ,
285- output : `PROJECT NAME KIND GROUP
286- dev banana Application apps.nine.ch
287- dev pear Release apps.nine.ch
288- ` ,
250+ expectRegexp : regexp .MustCompile (`PROJECT\s+NAME\s+KIND\s+GROUP\ndev\s+banana\s+Application\s+apps.nine.ch\ndev\s+pear\s+Release\s+apps.nine.ch\n` ),
289251 },
290252 } {
291253 t .Run (name , func (t * testing.T ) {
@@ -307,15 +269,15 @@ dev pear Release apps.nine.ch
307269
308270 client := fake .NewClientBuilder ().
309271 WithScheme (scheme ).
310- WithIndex (& management.Project {}, "metadata.name" , func (o client .Object ) []string {
272+ WithIndex (& management.Project {}, "metadata.name" , func (o sigs .Object ) []string {
311273 return []string {o .GetName ()}
312274 }).
313275 WithObjects (append (testCase .projects , testCase .objects ... )... ).Build ()
314276
315277 apiClient := & api.Client {WithWatch : client , Project : testCase .projectName }
316- kubeconfig , err := test .CreateTestKubeconfig (apiClient , organization )
278+ kubecfg , err := test .CreateTestKubeconfig (apiClient , organization )
317279 require .NoError (t , err )
318- defer os .Remove (kubeconfig )
280+ defer os .Remove (kubecfg )
319281
320282 cmd := allCmd {
321283 IncludeNineResources : testCase .includeNineResources ,
@@ -328,7 +290,11 @@ dev pear Release apps.nine.ch
328290 return
329291 }
330292 require .NoError (t , err )
331- assert .Equal (t , testCase .output , outputBuffer .String ())
293+ if testCase .expectRegexp != nil {
294+ assert .Regexp (t , testCase .expectRegexp , outputBuffer .String ())
295+ } else {
296+ assert .Equal (t , testCase .output , outputBuffer .String ())
297+ }
332298 })
333299 }
334300}
0 commit comments