github.com/argoproj/argo-cd/v3@v3.2.1/cmd/argocd/commands/tree_test.go (about) 1 package commands 2 3 import ( 4 "bytes" 5 "testing" 6 "text/tabwriter" 7 8 "github.com/stretchr/testify/assert" 9 "github.com/stretchr/testify/require" 10 11 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" 12 ) 13 14 func TestTreeViewAppGet(t *testing.T) { 15 var parent v1alpha1.ResourceNode 16 parent.ResourceRef = v1alpha1.ResourceRef{Group: "argoproj.io", Version: "", Kind: "Rollout", Namespace: "sandbox-rollout-numalogic-demo", Name: "numalogic-rollout-demo", UID: "87f3aab0-f634-4b2c-959a-7ddd30675ed0"} 17 objs := make(map[string]v1alpha1.ResourceNode) 18 objs["87f3aab0-f634-4b2c-959a-7ddd30675ed0"] = parent 19 var child v1alpha1.ResourceNode 20 child.ResourceRef = v1alpha1.ResourceRef{Group: "apps", Version: "v1", Kind: "ReplicaSet", Namespace: "sandbox-rollout-numalogic-demo", Name: "numalogic-rollout-demo-5dcd5457d5", UID: "75c30dce-1b66-414f-a86c-573a74be0f40"} 21 child.ParentRefs = []v1alpha1.ResourceRef{{Group: "argoproj.io", Version: "", Kind: "Rollout", Namespace: "sandbox-rollout-numalogic-demo", Name: "numalogic-rollout-demo", UID: "87f3aab0-f634-4b2c-959a-7ddd30675ed0"}} 22 23 objs["75c30dce-1b66-414f-a86c-573a74be0f40"] = child 24 25 childMapping := make(map[string][]string) 26 childMapping["87f3aab0-f634-4b2c-959a-7ddd30675ed0"] = []string{"75c30dce-1b66-414f-a86c-573a74be0f40"} 27 28 stateMap := make(map[string]*resourceState) 29 stateMap["Rollout/numalogic-rollout-demo"] = &resourceState{ 30 Status: "Running", 31 Health: "Healthy", 32 Hook: "", 33 Message: "No Issues", 34 Name: "sandbox-rollout-numalogic-demo", 35 Kind: "Rollout", 36 Group: "argoproj.io", 37 } 38 39 buf := &bytes.Buffer{} 40 w := tabwriter.NewWriter(buf, 0, 0, 2, ' ', 0) 41 treeViewAppGet("", objs, childMapping, parent, stateMap, w) 42 require.NoError(t, w.Flush()) 43 output := buf.String() 44 assert.Contains(t, output, "ReplicaSet") 45 assert.Contains(t, output, "Rollout") 46 assert.Contains(t, output, "numalogic-rollout") 47 assert.Contains(t, output, "Healthy") 48 assert.Contains(t, output, "No Issues") 49 } 50 51 func TestTreeViewDetailedAppGet(t *testing.T) { 52 var parent v1alpha1.ResourceNode 53 parent.ResourceRef = v1alpha1.ResourceRef{Group: "argoproj.io", Version: "", Kind: "Rollout", Namespace: "sandbox-rollout-numalogic-demo", Name: "numalogic-rollout-demo", UID: "87f3aab0-f634-4b2c-959a-7ddd30675ed0"} 54 objs := make(map[string]v1alpha1.ResourceNode) 55 objs["87f3aab0-f634-4b2c-959a-7ddd30675ed0"] = parent 56 var child v1alpha1.ResourceNode 57 child.ResourceRef = v1alpha1.ResourceRef{Group: "apps", Version: "v1", Kind: "ReplicaSet", Namespace: "sandbox-rollout-numalogic-demo", Name: "numalogic-rollout-demo-5dcd5457d5", UID: "75c30dce-1b66-414f-a86c-573a74be0f40"} 58 child.ParentRefs = []v1alpha1.ResourceRef{{Group: "argoproj.io", Version: "", Kind: "Rollout", Namespace: "sandbox-rollout-numalogic-demo", Name: "numalogic-rollout-demo", UID: "87f3aab0-f634-4b2c-959a-7ddd30675ed0"}} 59 child.Health = &v1alpha1.HealthStatus{Status: "Degraded", Message: "Readiness Gate failed"} 60 objs["75c30dce-1b66-414f-a86c-573a74be0f40"] = child 61 62 childMapping := make(map[string][]string) 63 childMapping["87f3aab0-f634-4b2c-959a-7ddd30675ed0"] = []string{"75c30dce-1b66-414f-a86c-573a74be0f40"} 64 65 stateMap := make(map[string]*resourceState) 66 stateMap["Rollout/numalogic-rollout-demo"] = &resourceState{ 67 Status: "Running", 68 Health: "Healthy", 69 Hook: "", 70 Message: "No Issues", 71 Name: "sandbox-rollout-numalogic-demo", 72 Kind: "Rollout", 73 Group: "argoproj.io", 74 } 75 76 buf := &bytes.Buffer{} 77 w := tabwriter.NewWriter(buf, 0, 0, 2, ' ', 0) 78 detailedTreeViewAppGet("", objs, childMapping, parent, stateMap, w) 79 require.NoError(t, w.Flush()) 80 81 output := buf.String() 82 83 assert.Contains(t, output, "ReplicaSet") 84 assert.Contains(t, output, "Rollout") 85 assert.Contains(t, output, "numalogic-rollout") 86 assert.Contains(t, output, "Healthy") 87 assert.Contains(t, output, "No Issues") 88 assert.Contains(t, output, "Degraded") 89 assert.Contains(t, output, "Readiness Gate failed") 90 } 91 92 func TestTreeViewAppResources(t *testing.T) { 93 var parent v1alpha1.ResourceNode 94 parent.ResourceRef = v1alpha1.ResourceRef{Group: "argoproj.io", Version: "", Kind: "Rollout", Namespace: "sandbox-rollout-numalogic-demo", Name: "numalogic-rollout-demo", UID: "87f3aab0-f634-4b2c-959a-7ddd30675ed0"} 95 objs := make(map[string]v1alpha1.ResourceNode) 96 objs["87f3aab0-f634-4b2c-959a-7ddd30675ed0"] = parent 97 var child v1alpha1.ResourceNode 98 child.ResourceRef = v1alpha1.ResourceRef{Group: "apps", Version: "v1", Kind: "ReplicaSet", Namespace: "sandbox-rollout-numalogic-demo", Name: "numalogic-rollout-demo-5dcd5457d5", UID: "75c30dce-1b66-414f-a86c-573a74be0f40"} 99 child.ParentRefs = []v1alpha1.ResourceRef{{Group: "argoproj.io", Version: "", Kind: "Rollout", Namespace: "sandbox-rollout-numalogic-demo", Name: "numalogic-rollout-demo", UID: "87f3aab0-f634-4b2c-959a-7ddd30675ed0"}} 100 101 objs["75c30dce-1b66-414f-a86c-573a74be0f40"] = child 102 103 childMapping := make(map[string][]string) 104 childMapping["87f3aab0-f634-4b2c-959a-7ddd30675ed0"] = []string{"75c30dce-1b66-414f-a86c-573a74be0f40"} 105 106 buf := &bytes.Buffer{} 107 w := tabwriter.NewWriter(buf, 0, 0, 2, ' ', 0) 108 109 treeViewAppResourcesNotOrphaned("", objs, childMapping, parent, w) 110 111 var orphan v1alpha1.ResourceNode 112 orphan.ResourceRef = v1alpha1.ResourceRef{Group: "apps", Version: "v1", Kind: "ReplicaSet", Namespace: "sandbox-rollout-numalogic-demo", Name: "numalogic-rollout-demo-5dcdnk457d5", UID: "75c30dce-1b66-41hf-a86c-573a74be0f40"} 113 objsOrphan := make(map[string]v1alpha1.ResourceNode) 114 objsOrphan["75c30dce-1b66-41hf-a86c-573a74be0f40"] = orphan 115 orphanchildMapping := make(map[string][]string) 116 orphanParent := orphan 117 118 treeViewAppResourcesOrphaned("", objsOrphan, orphanchildMapping, orphanParent, w) 119 require.NoError(t, w.Flush()) 120 output := buf.String() 121 122 assert.Contains(t, output, "ReplicaSet") 123 assert.Contains(t, output, "Rollout") 124 assert.Contains(t, output, "numalogic-rollout") 125 assert.Contains(t, output, "argoproj.io") 126 assert.Contains(t, output, "No") 127 assert.Contains(t, output, "Yes") 128 assert.Contains(t, output, "numalogic-rollout-demo-5dcdnk457d5") 129 } 130 131 func TestTreeViewDetailedAppResources(t *testing.T) { 132 var parent v1alpha1.ResourceNode 133 parent.ResourceRef = v1alpha1.ResourceRef{Group: "argoproj.io", Version: "", Kind: "Rollout", Namespace: "sandbox-rollout-numalogic-demo", Name: "numalogic-rollout-demo", UID: "87f3aab0-f634-4b2c-959a-7ddd30675ed0"} 134 objs := make(map[string]v1alpha1.ResourceNode) 135 objs["87f3aab0-f634-4b2c-959a-7ddd30675ed0"] = parent 136 var child v1alpha1.ResourceNode 137 child.ResourceRef = v1alpha1.ResourceRef{Group: "apps", Version: "v1", Kind: "ReplicaSet", Namespace: "sandbox-rollout-numalogic-demo", Name: "numalogic-rollout-demo-5dcd5457d5", UID: "75c30dce-1b66-414f-a86c-573a74be0f40"} 138 child.ParentRefs = []v1alpha1.ResourceRef{{Group: "argoproj.io", Version: "", Kind: "Rollout", Namespace: "sandbox-rollout-numalogic-demo", Name: "numalogic-rollout-demo", UID: "87f3aab0-f634-4b2c-959a-7ddd30675ed0"}} 139 objs["75c30dce-1b66-414f-a86c-573a74be0f40"] = child 140 childMapping := make(map[string][]string) 141 childMapping["87f3aab0-f634-4b2c-959a-7ddd30675ed0"] = []string{"75c30dce-1b66-414f-a86c-573a74be0f40"} 142 buf := &bytes.Buffer{} 143 w := tabwriter.NewWriter(buf, 0, 0, 2, ' ', 0) 144 detailedTreeViewAppResourcesNotOrphaned("", objs, childMapping, parent, w) 145 var orphan v1alpha1.ResourceNode 146 orphan.ResourceRef = v1alpha1.ResourceRef{Group: "apps", Version: "v1", Kind: "ReplicaSet", Namespace: "sandbox-rollout-numalogic-demo", Name: "numalogic-rollout-demo-5dcdnk457d5", UID: "75c30dce-1b66-41hf-a86c-573a74be0f40"} 147 orphan.Health = &v1alpha1.HealthStatus{ 148 Status: "Degraded", 149 Message: "Readiness Gate failed", 150 } 151 objsOrphan := make(map[string]v1alpha1.ResourceNode) 152 objsOrphan["75c30dce-1b66-41hf-a86c-573a74be0f40"] = orphan 153 154 orphanchildMapping := make(map[string][]string) 155 orphanParent := orphan 156 detailedTreeViewAppResourcesOrphaned("", objsOrphan, orphanchildMapping, orphanParent, w) 157 require.NoError(t, w.Flush()) 158 output := buf.String() 159 160 assert.Contains(t, output, "ReplicaSet") 161 assert.Contains(t, output, "Rollout") 162 assert.Contains(t, output, "numalogic-rollout") 163 assert.Contains(t, output, "argoproj.io") 164 assert.Contains(t, output, "No") 165 assert.Contains(t, output, "Yes") 166 assert.Contains(t, output, "numalogic-rollout-demo-5dcdnk457d5") 167 assert.Contains(t, output, "Degraded") 168 assert.Contains(t, output, "Readiness Gate failed") 169 } 170 171 func TestPrintPrefix(t *testing.T) { 172 tests := []struct { 173 input string 174 expected string 175 name string 176 }{ 177 { 178 input: "", 179 expected: "", 180 name: "empty string", 181 }, 182 { 183 input: firstElemPrefix, 184 expected: firstElemPrefix, 185 name: "only first element prefix", 186 }, 187 { 188 input: lastElemPrefix, 189 expected: lastElemPrefix, 190 name: "only last element prefix", 191 }, 192 { 193 input: firstElemPrefix + firstElemPrefix, 194 expected: pipe + firstElemPrefix, 195 name: "double first element prefix", 196 }, 197 { 198 input: firstElemPrefix + lastElemPrefix, 199 expected: pipe + lastElemPrefix, 200 name: "first then last element prefix", 201 }, 202 } 203 204 for _, test := range tests { 205 t.Run(test.name, func(t *testing.T) { 206 got := printPrefix(test.input) 207 assert.Equal(t, test.expected, got) 208 }) 209 } 210 }