github.com/argoproj/argo-cd/v2@v2.10.9/applicationset/services/repo_service_test.go (about)

     1  package services
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"testing"
     7  
     8  	"github.com/argoproj/argo-cd/v2/applicationset/services/mocks"
     9  	"github.com/argoproj/argo-cd/v2/reposerver/apiclient"
    10  	repo_mocks "github.com/argoproj/argo-cd/v2/reposerver/apiclient/mocks"
    11  	db_mocks "github.com/argoproj/argo-cd/v2/util/db/mocks"
    12  	"github.com/argoproj/argo-cd/v2/util/git"
    13  	"github.com/stretchr/testify/assert"
    14  	"github.com/stretchr/testify/mock"
    15  
    16  	"github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
    17  )
    18  
    19  func TestGetDirectories(t *testing.T) {
    20  
    21  	type fields struct {
    22  		repositoriesDBFuncs   []func(*mocks.RepositoryDB)
    23  		storecreds            git.CredsStore
    24  		submoduleEnabled      bool
    25  		repoServerClientFuncs []func(*repo_mocks.RepoServerServiceClient)
    26  	}
    27  	type args struct {
    28  		ctx             context.Context
    29  		repoURL         string
    30  		revision        string
    31  		noRevisionCache bool
    32  	}
    33  	tests := []struct {
    34  		name    string
    35  		fields  fields
    36  		args    args
    37  		want    []string
    38  		wantErr assert.ErrorAssertionFunc
    39  	}{
    40  		{name: "ErrorGettingRepos", fields: fields{
    41  			repositoriesDBFuncs: []func(*mocks.RepositoryDB){
    42  				func(db *mocks.RepositoryDB) {
    43  					db.On("GetRepository", mock.Anything, mock.Anything).Return(nil, fmt.Errorf("unable to get repos"))
    44  				},
    45  			},
    46  		}, args: args{}, want: nil, wantErr: assert.Error},
    47  		{name: "ErrorGettingDirs", fields: fields{
    48  			repositoriesDBFuncs: []func(*mocks.RepositoryDB){
    49  				func(db *mocks.RepositoryDB) {
    50  					db.On("GetRepository", mock.Anything, mock.Anything).Return(&v1alpha1.Repository{}, nil)
    51  				},
    52  			},
    53  			repoServerClientFuncs: []func(*repo_mocks.RepoServerServiceClient){
    54  				func(client *repo_mocks.RepoServerServiceClient) {
    55  					client.On("GetGitDirectories", mock.Anything, mock.Anything).Return(nil, fmt.Errorf("unable to get dirs"))
    56  				},
    57  			},
    58  		}, args: args{}, want: nil, wantErr: assert.Error},
    59  		{name: "HappyCase", fields: fields{
    60  			repositoriesDBFuncs: []func(*mocks.RepositoryDB){
    61  				func(db *mocks.RepositoryDB) {
    62  					db.On("GetRepository", mock.Anything, mock.Anything).Return(&v1alpha1.Repository{}, nil)
    63  				},
    64  			},
    65  			repoServerClientFuncs: []func(*repo_mocks.RepoServerServiceClient){
    66  				func(client *repo_mocks.RepoServerServiceClient) {
    67  					client.On("GetGitDirectories", mock.Anything, mock.Anything).Return(&apiclient.GitDirectoriesResponse{
    68  						Paths: []string{"foo", "foo/bar", "bar/foo"},
    69  					}, nil)
    70  				},
    71  			},
    72  		}, args: args{}, want: []string{"foo", "foo/bar", "bar/foo"}, wantErr: assert.NoError},
    73  	}
    74  	for _, tt := range tests {
    75  		t.Run(tt.name, func(t *testing.T) {
    76  			mockDb := &mocks.RepositoryDB{}
    77  			mockRepoClient := &repo_mocks.RepoServerServiceClient{}
    78  			// decorate the mocks
    79  			for i := range tt.fields.repositoriesDBFuncs {
    80  				tt.fields.repositoriesDBFuncs[i](mockDb)
    81  			}
    82  			for i := range tt.fields.repoServerClientFuncs {
    83  				tt.fields.repoServerClientFuncs[i](mockRepoClient)
    84  			}
    85  
    86  			a := &argoCDService{
    87  				repositoriesDB:      mockDb,
    88  				storecreds:          tt.fields.storecreds,
    89  				submoduleEnabled:    tt.fields.submoduleEnabled,
    90  				repoServerClientSet: &repo_mocks.Clientset{RepoServerServiceClient: mockRepoClient},
    91  			}
    92  			got, err := a.GetDirectories(tt.args.ctx, tt.args.repoURL, tt.args.revision, tt.args.noRevisionCache)
    93  			if !tt.wantErr(t, err, fmt.Sprintf("GetDirectories(%v, %v, %v, %v)", tt.args.ctx, tt.args.repoURL, tt.args.revision, tt.args.noRevisionCache)) {
    94  				return
    95  			}
    96  			assert.Equalf(t, tt.want, got, "GetDirectories(%v, %v, %v, %v)", tt.args.ctx, tt.args.repoURL, tt.args.revision, tt.args.noRevisionCache)
    97  		})
    98  	}
    99  }
   100  
   101  func TestGetFiles(t *testing.T) {
   102  	type fields struct {
   103  		repositoriesDBFuncs   []func(*mocks.RepositoryDB)
   104  		storecreds            git.CredsStore
   105  		submoduleEnabled      bool
   106  		repoServerClientFuncs []func(*repo_mocks.RepoServerServiceClient)
   107  	}
   108  	type args struct {
   109  		ctx             context.Context
   110  		repoURL         string
   111  		revision        string
   112  		pattern         string
   113  		noRevisionCache bool
   114  	}
   115  	tests := []struct {
   116  		name    string
   117  		fields  fields
   118  		args    args
   119  		want    map[string][]byte
   120  		wantErr assert.ErrorAssertionFunc
   121  	}{
   122  		{name: "ErrorGettingRepos", fields: fields{
   123  			repositoriesDBFuncs: []func(*mocks.RepositoryDB){
   124  				func(db *mocks.RepositoryDB) {
   125  					db.On("GetRepository", mock.Anything, mock.Anything).Return(nil, fmt.Errorf("unable to get repos"))
   126  				},
   127  			},
   128  		}, args: args{}, want: nil, wantErr: assert.Error},
   129  		{name: "ErrorGettingFiles", fields: fields{
   130  			repositoriesDBFuncs: []func(*mocks.RepositoryDB){
   131  				func(db *mocks.RepositoryDB) {
   132  					db.On("GetRepository", mock.Anything, mock.Anything).Return(&v1alpha1.Repository{}, nil)
   133  				},
   134  			},
   135  			repoServerClientFuncs: []func(*repo_mocks.RepoServerServiceClient){
   136  				func(client *repo_mocks.RepoServerServiceClient) {
   137  					client.On("GetGitFiles", mock.Anything, mock.Anything).Return(nil, fmt.Errorf("unable to get files"))
   138  				},
   139  			},
   140  		}, args: args{}, want: nil, wantErr: assert.Error},
   141  		{name: "HappyCase", fields: fields{
   142  			repositoriesDBFuncs: []func(*mocks.RepositoryDB){
   143  				func(db *mocks.RepositoryDB) {
   144  					db.On("GetRepository", mock.Anything, mock.Anything).Return(&v1alpha1.Repository{}, nil)
   145  				},
   146  			},
   147  			repoServerClientFuncs: []func(*repo_mocks.RepoServerServiceClient){
   148  				func(client *repo_mocks.RepoServerServiceClient) {
   149  					client.On("GetGitFiles", mock.Anything, mock.Anything).Return(&apiclient.GitFilesResponse{
   150  						Map: map[string][]byte{
   151  							"foo.json": []byte("hello: world!"),
   152  							"bar.yaml": []byte("yay: appsets"),
   153  						},
   154  					}, nil)
   155  				},
   156  			},
   157  		}, args: args{}, want: map[string][]byte{
   158  			"foo.json": []byte("hello: world!"),
   159  			"bar.yaml": []byte("yay: appsets"),
   160  		}, wantErr: assert.NoError},
   161  	}
   162  	for _, tt := range tests {
   163  		t.Run(tt.name, func(t *testing.T) {
   164  			mockDb := &mocks.RepositoryDB{}
   165  			mockRepoClient := &repo_mocks.RepoServerServiceClient{}
   166  			// decorate the mocks
   167  			for i := range tt.fields.repositoriesDBFuncs {
   168  				tt.fields.repositoriesDBFuncs[i](mockDb)
   169  			}
   170  			for i := range tt.fields.repoServerClientFuncs {
   171  				tt.fields.repoServerClientFuncs[i](mockRepoClient)
   172  			}
   173  
   174  			a := &argoCDService{
   175  				repositoriesDB:      mockDb,
   176  				storecreds:          tt.fields.storecreds,
   177  				submoduleEnabled:    tt.fields.submoduleEnabled,
   178  				repoServerClientSet: &repo_mocks.Clientset{RepoServerServiceClient: mockRepoClient},
   179  			}
   180  			got, err := a.GetFiles(tt.args.ctx, tt.args.repoURL, tt.args.revision, tt.args.pattern, tt.args.noRevisionCache)
   181  			if !tt.wantErr(t, err, fmt.Sprintf("GetFiles(%v, %v, %v, %v, %v)", tt.args.ctx, tt.args.repoURL, tt.args.revision, tt.args.pattern, tt.args.noRevisionCache)) {
   182  				return
   183  			}
   184  			assert.Equalf(t, tt.want, got, "GetFiles(%v, %v, %v, %v, %v)", tt.args.ctx, tt.args.repoURL, tt.args.revision, tt.args.pattern, tt.args.noRevisionCache)
   185  		})
   186  	}
   187  }
   188  
   189  func TestNewArgoCDService(t *testing.T) {
   190  	service, err := NewArgoCDService(&db_mocks.ArgoDB{}, false, &repo_mocks.Clientset{}, false)
   191  	assert.NoError(t, err, err)
   192  	assert.NotNil(t, service)
   193  }