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  }