github.com/argoproj/argo-cd/v3@v3.2.1/cmd/argocd/commands/applicationset_test.go (about) 1 package commands 2 3 import ( 4 "io" 5 "os" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 "github.com/stretchr/testify/require" 10 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 11 12 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" 13 ) 14 15 func TestPrintApplicationSetNames(t *testing.T) { 16 output, _ := captureOutput(func() error { 17 appSet := &v1alpha1.ApplicationSet{ 18 ObjectMeta: metav1.ObjectMeta{ 19 Name: "test", 20 }, 21 } 22 appSet2 := &v1alpha1.ApplicationSet{ 23 ObjectMeta: metav1.ObjectMeta{ 24 Namespace: "team-one", 25 Name: "test", 26 }, 27 } 28 printApplicationSetNames([]v1alpha1.ApplicationSet{*appSet, *appSet2}) 29 return nil 30 }) 31 expectation := "test\nteam-one/test\n" 32 require.Equalf(t, output, expectation, "Incorrect print params output %q, should be %q", output, expectation) 33 } 34 35 func TestPrintApplicationSetTable(t *testing.T) { 36 output, err := captureOutput(func() error { 37 app := &v1alpha1.ApplicationSet{ 38 ObjectMeta: metav1.ObjectMeta{ 39 Name: "app-name", 40 }, 41 Spec: v1alpha1.ApplicationSetSpec{ 42 Generators: []v1alpha1.ApplicationSetGenerator{ 43 { 44 Git: &v1alpha1.GitGenerator{ 45 RepoURL: "https://github.com/argoproj/argo-cd.git", 46 Revision: "head", 47 Directories: []v1alpha1.GitDirectoryGeneratorItem{ 48 { 49 Path: "applicationset/examples/git-generator-directory/cluster-addons/*", 50 }, 51 }, 52 }, 53 }, 54 }, 55 Template: v1alpha1.ApplicationSetTemplate{ 56 Spec: v1alpha1.ApplicationSpec{ 57 Project: "default", 58 }, 59 }, 60 }, 61 Status: v1alpha1.ApplicationSetStatus{ 62 Conditions: []v1alpha1.ApplicationSetCondition{ 63 { 64 Status: v1alpha1.ApplicationSetConditionStatusTrue, 65 Type: v1alpha1.ApplicationSetConditionResourcesUpToDate, 66 }, 67 }, 68 }, 69 } 70 71 app2 := &v1alpha1.ApplicationSet{ 72 ObjectMeta: metav1.ObjectMeta{ 73 Name: "app-name", 74 Namespace: "team-two", 75 }, 76 Spec: v1alpha1.ApplicationSetSpec{ 77 Generators: []v1alpha1.ApplicationSetGenerator{ 78 { 79 Git: &v1alpha1.GitGenerator{ 80 RepoURL: "https://github.com/argoproj/argo-cd.git", 81 Revision: "head", 82 Directories: []v1alpha1.GitDirectoryGeneratorItem{ 83 { 84 Path: "applicationset/examples/git-generator-directory/cluster-addons/*", 85 }, 86 }, 87 }, 88 }, 89 }, 90 Template: v1alpha1.ApplicationSetTemplate{ 91 Spec: v1alpha1.ApplicationSpec{ 92 Project: "default", 93 }, 94 }, 95 }, 96 Status: v1alpha1.ApplicationSetStatus{ 97 Conditions: []v1alpha1.ApplicationSetCondition{ 98 { 99 Status: v1alpha1.ApplicationSetConditionStatusTrue, 100 Type: v1alpha1.ApplicationSetConditionResourcesUpToDate, 101 }, 102 }, 103 }, 104 } 105 output := "table" 106 printApplicationSetTable([]v1alpha1.ApplicationSet{*app, *app2}, &output) 107 return nil 108 }) 109 require.NoError(t, err) 110 expectation := "NAME PROJECT SYNCPOLICY CONDITIONS\napp-name default nil [{ResourcesUpToDate <nil> True }]\nteam-two/app-name default nil [{ResourcesUpToDate <nil> True }]\n" 111 assert.Equal(t, expectation, output) 112 } 113 114 func TestPrintAppSetSummaryTable(t *testing.T) { 115 baseAppSet := &v1alpha1.ApplicationSet{ 116 ObjectMeta: metav1.ObjectMeta{ 117 Name: "app-name", 118 }, 119 Spec: v1alpha1.ApplicationSetSpec{ 120 Generators: []v1alpha1.ApplicationSetGenerator{ 121 { 122 Git: &v1alpha1.GitGenerator{ 123 RepoURL: "https://github.com/argoproj/argo-cd.git", 124 Revision: "head", 125 Directories: []v1alpha1.GitDirectoryGeneratorItem{ 126 { 127 Path: "applicationset/examples/git-generator-directory/cluster-addons/*", 128 }, 129 }, 130 }, 131 }, 132 }, 133 Template: v1alpha1.ApplicationSetTemplate{ 134 Spec: v1alpha1.ApplicationSpec{ 135 Project: "default", 136 }, 137 }, 138 }, 139 Status: v1alpha1.ApplicationSetStatus{ 140 Conditions: []v1alpha1.ApplicationSetCondition{ 141 { 142 Status: v1alpha1.ApplicationSetConditionStatusTrue, 143 Type: v1alpha1.ApplicationSetConditionResourcesUpToDate, 144 }, 145 }, 146 }, 147 } 148 appsetSpecSource := baseAppSet.DeepCopy() 149 appsetSpecSource.Spec.Template.Spec.Source = &v1alpha1.ApplicationSource{ 150 RepoURL: "test1", 151 TargetRevision: "master1", 152 Path: "/test1", 153 } 154 155 appsetSpecSources := baseAppSet.DeepCopy() 156 appsetSpecSources.Spec.Template.Spec.Sources = v1alpha1.ApplicationSources{ 157 { 158 RepoURL: "test1", 159 TargetRevision: "master1", 160 Path: "/test1", 161 }, 162 { 163 RepoURL: "test2", 164 TargetRevision: "master2", 165 Path: "/test2", 166 }, 167 } 168 169 appsetSpecSyncPolicy := baseAppSet.DeepCopy() 170 appsetSpecSyncPolicy.Spec.SyncPolicy = &v1alpha1.ApplicationSetSyncPolicy{ 171 PreserveResourcesOnDeletion: true, 172 } 173 174 appSetTemplateSpecSyncPolicy := baseAppSet.DeepCopy() 175 appSetTemplateSpecSyncPolicy.Spec.Template.Spec.SyncPolicy = &v1alpha1.SyncPolicy{ 176 Automated: &v1alpha1.SyncPolicyAutomated{ 177 SelfHeal: true, 178 }, 179 } 180 181 appSetBothSyncPolicies := baseAppSet.DeepCopy() 182 appSetBothSyncPolicies.Spec.SyncPolicy = &v1alpha1.ApplicationSetSyncPolicy{ 183 PreserveResourcesOnDeletion: true, 184 } 185 appSetBothSyncPolicies.Spec.Template.Spec.SyncPolicy = &v1alpha1.SyncPolicy{ 186 Automated: &v1alpha1.SyncPolicyAutomated{ 187 SelfHeal: true, 188 }, 189 } 190 191 for _, tt := range []struct { 192 name string 193 appSet *v1alpha1.ApplicationSet 194 expectedOutput string 195 }{ 196 { 197 name: "appset with only spec.syncPolicy set", 198 appSet: appsetSpecSyncPolicy, 199 expectedOutput: `Name: app-name 200 Project: default 201 Server: 202 Namespace: 203 Source: 204 - Repo: 205 Target: 206 SyncPolicy: <none> 207 `, 208 }, 209 { 210 name: "appset with only spec.template.spec.syncPolicy set", 211 appSet: appSetTemplateSpecSyncPolicy, 212 expectedOutput: `Name: app-name 213 Project: default 214 Server: 215 Namespace: 216 Source: 217 - Repo: 218 Target: 219 SyncPolicy: Automated 220 `, 221 }, 222 { 223 name: "appset with both spec.SyncPolicy and spec.template.spec.syncPolicy set", 224 appSet: appSetBothSyncPolicies, 225 expectedOutput: `Name: app-name 226 Project: default 227 Server: 228 Namespace: 229 Source: 230 - Repo: 231 Target: 232 SyncPolicy: Automated 233 `, 234 }, 235 { 236 name: "appset with a single source", 237 appSet: appsetSpecSource, 238 expectedOutput: `Name: app-name 239 Project: default 240 Server: 241 Namespace: 242 Source: 243 - Repo: test1 244 Target: master1 245 Path: /test1 246 SyncPolicy: <none> 247 `, 248 }, 249 { 250 name: "appset with a multiple sources", 251 appSet: appsetSpecSources, 252 expectedOutput: `Name: app-name 253 Project: default 254 Server: 255 Namespace: 256 Sources: 257 - Repo: test1 258 Target: master1 259 Path: /test1 260 - Repo: test2 261 Target: master2 262 Path: /test2 263 SyncPolicy: <none> 264 `, 265 }, 266 } { 267 t.Run(tt.name, func(t *testing.T) { 268 oldStdout := os.Stdout 269 defer func() { 270 os.Stdout = oldStdout 271 }() 272 273 r, w, _ := os.Pipe() 274 os.Stdout = w 275 276 printAppSetSummaryTable(tt.appSet) 277 w.Close() 278 279 out, err := io.ReadAll(r) 280 require.NoError(t, err) 281 assert.Equal(t, tt.expectedOutput, string(out)) 282 }) 283 } 284 }