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  }