From f6b768d07d3877521861b3f9045749c1936b4e0d Mon Sep 17 00:00:00 2001 From: namkyu1999 Date: Sat, 6 May 2023 03:52:17 +0900 Subject: [PATCH] feat: add unit test codes to image registry package Signed-off-by: namkyu1999 --- litmus-portal/graphql-server/go.mod | 5 +- litmus-portal/graphql-server/go.sum | 23 +- .../mongodb/model/mocks/mongo_operator.go | 87 ++++++ .../pkg/image_registry/service_test.go | 259 ++++++++++++++++++ 4 files changed, 365 insertions(+), 9 deletions(-) create mode 100644 litmus-portal/graphql-server/pkg/database/mongodb/model/mocks/mongo_operator.go create mode 100644 litmus-portal/graphql-server/pkg/image_registry/service_test.go diff --git a/litmus-portal/graphql-server/go.mod b/litmus-portal/graphql-server/go.mod index 8c7987253fa..2bc33539b47 100644 --- a/litmus-portal/graphql-server/go.mod +++ b/litmus-portal/graphql-server/go.mod @@ -23,11 +23,12 @@ require ( github.com/prometheus/client_golang v1.12.1 github.com/prometheus/common v0.32.1 github.com/sirupsen/logrus v1.8.1 + github.com/stretchr/testify v1.8.2 github.com/tidwall/gjson v1.14.0 github.com/tidwall/sjson v1.2.4 github.com/vektah/gqlparser/v2 v2.1.0 - go.mongodb.org/mongo-driver v1.8.2 - golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd + go.mongodb.org/mongo-driver v1.11.4 + golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d google.golang.org/grpc v1.44.0 google.golang.org/protobuf v1.27.1 gopkg.in/yaml.v2 v2.4.0 diff --git a/litmus-portal/graphql-server/go.sum b/litmus-portal/graphql-server/go.sum index 2851a6590f3..9d002ff0d90 100644 --- a/litmus-portal/graphql-server/go.sum +++ b/litmus-portal/graphql-server/go.sum @@ -738,7 +738,6 @@ github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-swagger/go-swagger v0.29.0/go.mod h1:Z4GJzI+bHKKkGB2Ji1rawpi3/ldXX8CkzGIa9HAC5EE= github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013/go.mod h1:b65mBPzqzZWxOZGxSWrqs4GInLIn+u99Q9q7p+GKni0= @@ -1381,6 +1380,7 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mohae/deepcopy v0.0.0-20170603005431-491d3605edfb/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= @@ -1730,6 +1730,9 @@ github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1Sd github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -1738,9 +1741,12 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stripe/stripe-go v70.15.0+incompatible/go.mod h1:A1dQZmO/QypXmsL0T8axYZkSN/uA/T/A64pfKdBAMiY= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/gocapability v0.0.0-20160928074757-e7cb7fa329f4/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -1813,10 +1819,12 @@ github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6e github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= -github.com/xdg-go/scram v1.1.0 h1:d70R37I0HrDLsafRrMBXyrD4lmQbCHE873t00Vr0gm0= github.com/xdg-go/scram v1.1.0/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= -github.com/xdg-go/stringprep v1.0.2 h1:6iq84/ryjjeRmMJwxutI51F2GIPlP5BfTvXHeYjyhBc= +github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E= +github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= +github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs= +github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= @@ -1885,8 +1893,9 @@ go.mongodb.org/mongo-driver v1.4.6/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4S go.mongodb.org/mongo-driver v1.5.1/go.mod h1:gRXCHX4Jo7J0IJ1oDQyUxF7jfy19UfxniMS4xxMmUqw= go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= -go.mongodb.org/mongo-driver v1.8.2 h1:8ssUXufb90ujcIvR6MyE1SchaNj0SFxsakiZgxIyrMk= go.mongodb.org/mongo-driver v1.8.2/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY= +go.mongodb.org/mongo-driver v1.11.4 h1:4ayjakA013OdpGyL2K3ZqylTac/rMjrJOMZ1EHizXas= +go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -1977,8 +1986,8 @@ golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220128200615-198e4374d7ed/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd h1:XcWmESyNjXJMLahc3mqVQJcgSTDxFxhETVlfk9uGc38= -golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= diff --git a/litmus-portal/graphql-server/pkg/database/mongodb/model/mocks/mongo_operator.go b/litmus-portal/graphql-server/pkg/database/mongodb/model/mocks/mongo_operator.go new file mode 100644 index 00000000000..2e08ec1e774 --- /dev/null +++ b/litmus-portal/graphql-server/pkg/database/mongodb/model/mocks/mongo_operator.go @@ -0,0 +1,87 @@ +package mocks + +import ( + "context" + + "github.com/stretchr/testify/mock" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +// MongoOperator is an autogenerated mock type for the MongoOperator type +type MongoOperator struct { + mock.Mock +} + +// Create provides a mock function with given fields: ctx, collectionType, document +func (m MongoOperator) Create(ctx context.Context, collectionType int, document interface{}) error { + args := m.Called(ctx, collectionType, document) + return args.Error(0) +} + +// CreateMany provides a mock function with given fields: ctx, collectionType, documents +func (m MongoOperator) CreateMany(ctx context.Context, collectionType int, documents []interface{}) error { + args := m.Called(ctx, collectionType, documents) + return args.Error(0) +} + +// Get provides a mock function with given fields: ctx, collectionType, query +func (m MongoOperator) Get(ctx context.Context, collectionType int, query bson.D) (*mongo.SingleResult, error) { + args := m.Called(ctx, collectionType, query) + return args.Get(0).(*mongo.SingleResult), args.Error(1) +} + +// List provides a mock function with given fields: ctx, collectionType, query +func (m MongoOperator) List(ctx context.Context, collectionType int, query bson.D) (*mongo.Cursor, error) { + args := m.Called(ctx, collectionType, query) + return args.Get(0).(*mongo.Cursor), args.Error(1) +} + +// Update provides a mock function with given fields: ctx, collectionType, query, update, opts +func (m MongoOperator) Update(ctx context.Context, collectionType int, query, update bson.D, opts ...*options.UpdateOptions) (*mongo.UpdateResult, error) { + args := m.Called(ctx, collectionType, query, update, opts) + return args.Get(0).(*mongo.UpdateResult), args.Error(1) +} + +// UpdateMany provides a mock function with given fields: ctx, collectionType, query, update, opts +func (m MongoOperator) UpdateMany(ctx context.Context, collectionType int, query, update bson.D, opts ...*options.UpdateOptions) (*mongo.UpdateResult, error) { + args := m.Called(ctx, collectionType, query, update, opts) + return args.Get(0).(*mongo.UpdateResult), args.Error(1) +} + +// Replace provides a mock function with given fields: ctx, collectionType, query, replacement +func (m MongoOperator) Replace(ctx context.Context, collectionType int, query bson.D, replacement interface{}) (*mongo.UpdateResult, error) { + args := m.Called(ctx, collectionType, query, replacement) + return args.Get(0).(*mongo.UpdateResult), args.Error(1) +} + +// Delete provides a mock function with given fields: ctx, collectionType, query, opts +func (m MongoOperator) Delete(ctx context.Context, collectionType int, query bson.D, opts ...*options.DeleteOptions) (*mongo.DeleteResult, error) { + args := m.Called(ctx, collectionType, query, opts) + return args.Get(0).(*mongo.DeleteResult), args.Error(1) +} + +// CountDocuments provides a mock function with given fields: ctx, collectionType, query, opts +func (m MongoOperator) CountDocuments(ctx context.Context, collectionType int, query bson.D, opts ...*options.CountOptions) (int64, error) { + args := m.Called(ctx, collectionType, query, opts) + return args.Get(0).(int64), args.Error(1) +} + +// Aggregate provides a mock function with given fields: ctx, collectionType, pipeline, opts +func (m MongoOperator) Aggregate(ctx context.Context, collectionType int, pipeline interface{}, opts ...*options.AggregateOptions) (*mongo.Cursor, error) { + args := m.Called(ctx, collectionType, pipeline, opts) + return args.Get(0).(*mongo.Cursor), args.Error(1) +} + +// ListCollection provides a mock function with given fields: ctx, mclient +func (m MongoOperator) ListCollection(ctx context.Context, mclient *mongo.Client) ([]string, error) { + args := m.Called(ctx, mclient) + return args.Get(0).([]string), args.Error(1) +} + +// ListDataBase provides a mock function with given fields: ctx, mclient +func (m MongoOperator) ListDataBase(ctx context.Context, mclient *mongo.Client) ([]string, error) { + args := m.Called(ctx, mclient) + return args.Get(0).([]string), args.Error(1) +} diff --git a/litmus-portal/graphql-server/pkg/image_registry/service_test.go b/litmus-portal/graphql-server/pkg/image_registry/service_test.go new file mode 100644 index 00000000000..5daeba1dec6 --- /dev/null +++ b/litmus-portal/graphql-server/pkg/image_registry/service_test.go @@ -0,0 +1,259 @@ +// Package image_registry_test contains tests for the image_registry package. +package image_registry_test + +import ( + "context" + "errors" + "strconv" + "testing" + + "github.com/google/uuid" + "github.com/litmuschaos/litmus/litmus-portal/graphql-server/graph/model" + "github.com/litmuschaos/litmus/litmus-portal/graphql-server/pkg/database/mongodb" + dbOperationsImageRegistry "github.com/litmuschaos/litmus/litmus-portal/graphql-server/pkg/database/mongodb/image_registry" + mongodbMocks "github.com/litmuschaos/litmus/litmus-portal/graphql-server/pkg/database/mongodb/model/mocks" + "github.com/litmuschaos/litmus/litmus-portal/graphql-server/pkg/image_registry" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" +) + +var ( + mongoOperator = new(mongodbMocks.MongoOperator) + imageRegistryOperator = dbOperationsImageRegistry.NewImageRegistryOperator(mongoOperator) + imageRegistryService = image_registry.NewService(imageRegistryOperator) +) + +// TestImageRegistryService_CreateImageRegistry tests the CreateImageRegistry method of imageRegistryService +func TestImageRegistryService_CreateImageRegistry(t *testing.T) { + // given + ctx := context.Background() + projectID := uuid.NewString() + imageRegistryInfo := model.ImageRegistryInput{ + ImageRegistryName: uuid.NewString(), + ImageRepoName: uuid.NewString(), + ImageRegistryType: uuid.NewString(), + IsDefault: true, + } + testcases := []struct { + name string + given func() + wantErr bool + }{ + { + name: "success", + given: func() { + mongoOperator.On("Create", mock.Anything, mongodb.ImageRegistryCollection, mock.Anything).Return(nil).Once() + }, + }, + { + name: "failure: mongo create error", + given: func() { + mongoOperator.On("Create", mock.Anything, mongodb.ImageRegistryCollection, mock.Anything).Return(errors.New("")).Once() + }, + wantErr: true, + }, + } + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + // given + tc.given() + // when + result, err := imageRegistryService.CreateImageRegistry(ctx, projectID, imageRegistryInfo) + // then + if tc.wantErr { + assert.Error(t, err) + } else { + assert.NoError(t, err) + assert.Equal(t, imageRegistryInfo.ImageRegistryName, result.ImageRegistryInfo.ImageRegistryName) + assert.Equal(t, imageRegistryInfo.ImageRepoName, result.ImageRegistryInfo.ImageRepoName) + assert.Equal(t, imageRegistryInfo.ImageRegistryType, result.ImageRegistryInfo.ImageRegistryType) + assert.Equal(t, projectID, result.ProjectID) + } + }) + } +} + +// TestImageRegistryService_UpdateImageRegistry tests the UpdateImageRegistry method of imageRegistryService +func TestImageRegistryService_UpdateImageRegistry(t *testing.T) { + // given + ctx := context.Background() + projectID, imageRegistryID := uuid.NewString(), uuid.NewString() + imageRegistryInfo := model.ImageRegistryInput{ + ImageRegistryName: uuid.NewString(), + ImageRepoName: uuid.NewString(), + ImageRegistryType: uuid.NewString(), + IsDefault: true, + } + testcases := []struct { + name string + given func() + wantErr bool + }{ + { + name: "success", + given: func() { + mongoOperator.On("Update", mock.Anything, mongodb.ImageRegistryCollection, mock.Anything, mock.Anything, mock.Anything).Return(&mongo.UpdateResult{MatchedCount: 1}, nil).Once() + }, + }, + { + name: "failure: mongo update error", + given: func() { + mongoOperator.On("Update", mock.Anything, mongodb.ImageRegistryCollection, mock.Anything, mock.Anything, mock.Anything).Return(&mongo.UpdateResult{MatchedCount: 0}, errors.New("")).Once() + }, + wantErr: true, + }, + } + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + // given + tc.given() + // when + result, err := imageRegistryService.UpdateImageRegistry(ctx, imageRegistryID, projectID, imageRegistryInfo) + // then + if tc.wantErr { + assert.Error(t, err) + } else { + assert.NoError(t, err) + assert.Equal(t, imageRegistryInfo.ImageRegistryName, result.ImageRegistryInfo.ImageRegistryName) + assert.Equal(t, imageRegistryInfo.ImageRepoName, result.ImageRegistryInfo.ImageRepoName) + assert.Equal(t, imageRegistryInfo.ImageRegistryType, result.ImageRegistryInfo.ImageRegistryType) + assert.Equal(t, projectID, result.ProjectID) + } + }) + } +} + +// TestImageRegistryService_DeleteImageRegistry tests the DeleteImageRegistry method of imageRegistryService +func TestImageRegistryService_DeleteImageRegistry(t *testing.T) { + // given + ctx := context.Background() + projectID, imageRegistryID := uuid.NewString(), uuid.NewString() + testcases := []struct { + name string + given func() + wantErr bool + }{ + { + name: "success", + given: func() { + mongoOperator.On("Update", mock.Anything, mongodb.ImageRegistryCollection, mock.Anything, mock.Anything, mock.Anything).Return(&mongo.UpdateResult{MatchedCount: 1}, nil).Once() + }, + }, + { + name: "failure: mongo delete error", + given: func() { + mongoOperator.On("Update", mock.Anything, mongodb.ImageRegistryCollection, mock.Anything, mock.Anything, mock.Anything).Return(&mongo.UpdateResult{MatchedCount: 0}, errors.New("")).Once() + }, + wantErr: true, + }, + } + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + // given + tc.given() + // when + _, err := imageRegistryService.DeleteImageRegistry(ctx, imageRegistryID, projectID) + // then + if tc.wantErr { + assert.Error(t, err) + } else { + assert.NoError(t, err) + } + }) + } +} + +// TestImageRegistryService_GetImageRegistry tests the GetImageRegistry method of imageRegistryService +func TestImageRegistryService_GetImageRegistry(t *testing.T) { + // given + ctx := context.Background() + projectID, imageRegistryID := uuid.NewString(), uuid.NewString() + testcases := []struct { + name string + given func() + wantErr bool + }{ + { + name: "success", + given: func() { + findResult := bson.D{{"image_registry_id", imageRegistryID}, {"project_id", projectID}} + singleResult := mongo.NewSingleResultFromDocument(findResult, nil, nil) + mongoOperator.On("Get", mock.Anything, mongodb.ImageRegistryCollection, mock.Anything).Return(singleResult, nil).Once() + }, + }, + { + name: "failure: mongo get error", + given: func() { + singleResult := mongo.NewSingleResultFromDocument(nil, nil, nil) + mongoOperator.On("Get", mock.Anything, mongodb.ImageRegistryCollection, mock.Anything).Return(singleResult, errors.New("")).Once() + }, + wantErr: true, + }, + } + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + // given + tc.given() + // when + _, err := imageRegistryService.GetImageRegistry(ctx, imageRegistryID, projectID) + // then + if tc.wantErr { + assert.Error(t, err) + } else { + assert.NoError(t, err) + } + }) + } +} + +// TestImageRegistryService_ListImageRegistries tests the ListImageRegistries method of imageRegistryService +func TestImageRegistryService_ListImageRegistries(t *testing.T) { + // given + ctx := context.Background() + projectID, imageRegistryID := uuid.NewString(), uuid.NewString() + testcases := []struct { + name string + given func() + wantErr bool + }{ + { + name: "success", + given: func() { + imageRegistries := make([]interface{}, 10) + for i := 0; i < 10; i++ { + imageRegistries[i] = dbOperationsImageRegistry.ImageRegistry{ImageRegistryID: imageRegistryID + strconv.Itoa(i), ProjectID: projectID} + } + cursor, _ := mongo.NewCursorFromDocuments(imageRegistries, nil, nil) + mongoOperator.On("List", mock.Anything, mongodb.ImageRegistryCollection, mock.Anything).Return(cursor, nil).Once() + }, + }, + { + name: "failure: mongo list error", + given: func() { + cursor, _ := mongo.NewCursorFromDocuments(nil, nil, nil) + mongoOperator.On("List", mock.Anything, mongodb.ImageRegistryCollection, mock.Anything).Return(cursor, errors.New("")).Once() + }, + wantErr: true, + }, + } + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + // given + tc.given() + // when + result, err := imageRegistryService.ListImageRegistries(ctx, projectID) + // then + if tc.wantErr { + assert.Error(t, err) + } else { + assert.NoError(t, err) + for i, imageRegistry := range result { + assert.Equal(t, projectID, imageRegistry.ProjectID) + assert.Equal(t, imageRegistryID+strconv.Itoa(i), imageRegistry.ImageRegistryID) + } + } + }) + } +}