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 }