From 29e15a4d954ae4f5c9725c272400a5b4a583ff5d Mon Sep 17 00:00:00 2001 From: lordspinach Date: Tue, 6 Dec 2022 17:13:47 +0300 Subject: [PATCH] src: tests: added tests for generic repository GetList --- src/infrastructure/GormGenericRepository.go | 3 + src/tests/GenericRepositoryTester.go | 168 ++++++++++++++++++++ src/tests/GenericRepository_test.go | 7 + 3 files changed, 178 insertions(+) diff --git a/src/infrastructure/GormGenericRepository.go b/src/infrastructure/GormGenericRepository.go index 92fff0b3..673b7bc4 100644 --- a/src/infrastructure/GormGenericRepository.go +++ b/src/infrastructure/GormGenericRepository.go @@ -154,6 +154,9 @@ func generateOrderString(orderBy string, orderDirection string) string { // error - if an error occurs, otherwise nil func (g *GormGenericRepository[EntityIDType, EntityType]) GetList(ctx context.Context, orderBy string, orderDirection string, page int, size int, queryBuilder interfaces.IQueryBuilder) ([]EntityType, error) { g.log(ctx, "debug", fmt.Sprintf("GetList: IN: orderBy=%s, orderDirection=%s, page=%d, size=%d, queryBuilder=%s", orderBy, orderDirection, page, size, queryBuilder)) + if page < 0 || size < 0 { + return nil, errors.Internal.New("page and page size cannot be negative") + } model := new(EntityType) entities := []EntityType{} offset := int64((page - 1) * size) diff --git a/src/tests/GenericRepositoryTester.go b/src/tests/GenericRepositoryTester.go index 70e5647a..8837a6a7 100644 --- a/src/tests/GenericRepositoryTester.go +++ b/src/tests/GenericRepositoryTester.go @@ -122,6 +122,7 @@ type IGenericRepositoryTester interface { TestDeleteAll() TestGetByID() TestGetByIDExtended() + TestGetList() TestDelete() TestIsExist() TestCount() @@ -582,3 +583,170 @@ func (t *GenericRepositoryTester[IDType, EntityType]) TestCount() { assert.Equal(t.t, 0, countIterSecond) })) } + +//TestGetList testing for GetList method +func (t *GenericRepositoryTester[IDType, EntityType]) TestGetList() { + t.t.Run(fmt.Sprintf("%s/NoOrderParams/OK", t.getTestBaseName()), + t.createEntitiesAndDeferClean(3, func(entities []EntityType) { + list, err := t.repo.GetList(t.ctx, "", "", 1, 3, nil) + assert.NoError(t.t, err) + assert.Equal(t.t, 3, len(list)) + })) + t.t.Run(fmt.Sprintf("%s/NegativePageAndPageSize/OK", t.getTestBaseName()), + t.createEntitiesAndDeferClean(3, func(entities []EntityType) { + list, err := t.repo.GetList(t.ctx, "", "", -1, -1, nil) + assert.Equal(t.t, true, errors.As(err, errors.Internal)) + assert.Equal(t.t, 0, len(list)) + })) + t.t.Run(fmt.Sprintf("%s/OrderByAscending/OK", t.getTestBaseName()), + t.createEntitiesAndDeferClean(3, func(entities []EntityType) { + list, err := t.repo.GetList(t.ctx, "Iterator", "asc", 1, 3, nil) + assert.NoError(t.t, err) + assert.Equal(t.t, 0, list[0].GetDataFields().Iterator) + })) + t.t.Run(fmt.Sprintf("%s/OrderByDescending/OK", t.getTestBaseName()), + t.createEntitiesAndDeferClean(3, func(entities []EntityType) { + list, err := t.repo.GetList(t.ctx, "Iterator", "desc", 1, 3, nil) + assert.NoError(t.t, err) + assert.Equal(t.t, 2, list[0].GetDataFields().Iterator) + })) + t.t.Run(fmt.Sprintf("%s/OrderByNonExistentField/Error", t.getTestBaseName()), + t.createEntitiesAndDeferClean(3, func(entities []EntityType) { + list, err := t.repo.GetList(t.ctx, "NonExistentField", "desc", 1, 3, nil) + assert.Equal(t.t, true, errors.As(err, errors.Internal)) + assert.Equal(t.t, 0, len(list)) + })) + t.t.Run(fmt.Sprintf("%s/Pagination/OK", t.getTestBaseName()), + t.createEntitiesAndDeferClean(10, func(entities []EntityType) { + fList, err := t.repo.GetList(t.ctx, "Iterator", "asc", 1, 5, nil) + assert.NoError(t.t, err) + assert.Equal(t.t, true, fList[0].GetDataFields().Iterator == 0) + sList, err := t.repo.GetList(t.ctx, "Iterator", "asc", 2, 5, nil) + assert.NoError(t.t, err) + assert.Equal(t.t, true, sList[0].GetDataFields().Iterator == 5) + })) + t.t.Run(fmt.Sprintf("%s/PageSize/OK", t.getTestBaseName()), + t.createEntitiesAndDeferClean(3, func(entities []EntityType) { + list, err := t.repo.GetList(t.ctx, "", "", 1, 1, nil) + assert.NoError(t.t, err) + assert.Equal(t.t, 1, len(list)) + count, err := t.repo.Count(t.ctx, nil) + assert.Equal(t.t, 3, count) + + })) + t.t.Run(fmt.Sprintf("%s/EmptyConditions/OK", t.getTestBaseName()), + t.createEntitiesAndDeferClean(3, func(entities []EntityType) { + queryBuilder := t.repo.NewQueryBuilder(t.ctx) + list, err := t.repo.GetList(t.ctx, "", "", 1, 3, queryBuilder) + assert.NoError(t.t, err) + assert.Equal(t.t, 3, len(list)) + })) + t.t.Run(fmt.Sprintf("%s/NotExistedFieldCondition/Error", t.getTestBaseName()), + t.createEntitiesAndDeferClean(3, func(entities []EntityType) { + queryBuilder := t.repo.NewQueryBuilder(t.ctx) + queryBuilder.Where("NonExistentField", "==", t.getNotExistedID()) + list, err := t.repo.GetList(t.ctx, "", "", 1, 3, queryBuilder) + assert.Equal(t.t, true, errors.As(err, errors.Internal)) + assert.Equal(t.t, 0, len(list)) + })) + t.t.Run(fmt.Sprintf("%s/OneFieldCondition/OK", t.getTestBaseName()), + t.createEntitiesAndDeferClean(3, func(entities []EntityType) { + queryBuilder := t.repo.NewQueryBuilder(t.ctx) + queryBuilder.Where("ID", "==", entities[1].GetID()) + list, err := t.repo.GetList(t.ctx, "", "", 1, 3, queryBuilder) + assert.NoError(t.t, err) + assert.Equal(t.t, 1, len(list)) + assert.Equal(t.t, true, list[0].GetID() == entities[1].GetID()) + })) + t.t.Run(fmt.Sprintf("%s/NonExistentIDCondition/OK", t.getTestBaseName()), + t.createEntitiesAndDeferClean(3, func(entities []EntityType) { + queryBuilder := t.repo.NewQueryBuilder(t.ctx) + queryBuilder.Where("ID", "==", t.getNotExistedID()) + list, err := t.repo.GetList(t.ctx, "", "", 1, 3, queryBuilder) + assert.NoError(t.t, err) + assert.Equal(t.t, 0, len(list)) + })) + + t.t.Run(fmt.Sprintf("%s/FilterByWrongType/OK", t.getTestBaseName()), + t.createEntitiesAndDeferClean(3, func(entities []EntityType) { + queryBuilder := t.repo.NewQueryBuilder(t.ctx) + queryBuilder.Where("SecondString", "==", 1) + list, err := t.repo.GetList(t.ctx, "", "", 1, 3, queryBuilder) + assert.NoError(t.t, err) + assert.Equal(t.t, 0, len(list)) + })) + t.t.Run(fmt.Sprintf("%s/FilterByNilField/OK", t.getTestBaseName()), + t.createEntitiesAndDeferClean(3, func(entities []EntityType) { + queryBuilder := t.repo.NewQueryBuilder(t.ctx) + queryBuilder.Where("NullDate", "==", nil) + list, err := t.repo.GetList(t.ctx, "", "", 1, 3, queryBuilder) + assert.NoError(t.t, err) + assert.Equal(t.t, 3, len(list)) + })) + t.t.Run(fmt.Sprintf("%s/SearchFilter/OK", t.getTestBaseName()), + t.createEntitiesAndDeferClean(3, func(entities []EntityType) { + queryBuilder := t.repo.NewQueryBuilder(t.ctx) + queryBuilder.Where("SearchString", "LIKE", "%example%") + list, err := t.repo.GetList(t.ctx, "", "", 1, 3, queryBuilder) + assert.NoError(t.t, err) + assert.Equal(t.t, 3, len(list)) + })) + t.t.Run(fmt.Sprintf("%s/OrFilter/OK", t.getTestBaseName()), + t.createEntitiesAndDeferClean(3, func(entities []EntityType) { + queryBuilder := t.repo.NewQueryBuilder(t.ctx) + queryBuilder.Or("Iterator", "==", 0).Or("Iterator", "==", 2) + list, err := t.repo.GetList(t.ctx, "Iterator", "asc", 1, 3, queryBuilder) + assert.NoError(t.t, err) + assert.Equal(t.t, 2, len(list)) + assert.Equal(t.t, true, list[0].GetDataFields().Iterator == 0) + assert.Equal(t.t, true, list[1].GetDataFields().Iterator == 2) + })) + t.t.Run(fmt.Sprintf("%s/NestedWhereFilter/OK", t.getTestBaseName()), + t.createEntitiesAndDeferClean(3, func(entities []EntityType) { + queryBuilder := t.repo.NewQueryBuilder(t.ctx) + queryBuilder.Where("SecondString", "==", "second") + nestedQuery := t.repo.NewQueryBuilder(t.ctx) + nestedQuery.Where("Iterator", ">", 0).Where("Iterator", "<", 2) + queryBuilder = queryBuilder.WhereQuery(nestedQuery) + list, err := t.repo.GetList(t.ctx, "", "", 1, 3, queryBuilder) + assert.NoError(t.t, err) + assert.Equal(t.t, 1, len(list)) + })) + t.t.Run(fmt.Sprintf("%s/NestedOrFilter/OK", t.getTestBaseName()), + t.createEntitiesAndDeferClean(3, func(entities []EntityType) { + queryBuilder := t.repo.NewQueryBuilder(t.ctx) + queryBuilder.Where("Iterator", "==", 0) + nestedQuery := t.repo.NewQueryBuilder(t.ctx) + nestedQuery.Where("Iterator", "==", 2) + queryBuilder = queryBuilder.OrQuery(nestedQuery) + list, err := t.repo.GetList(t.ctx, "", "", 1, 3, queryBuilder) + assert.NoError(t.t, err) + assert.Equal(t.t, 2, len(list)) + })) + t.t.Run(fmt.Sprintf("%s/TwoNestedWhereFilters/OK", t.getTestBaseName()), + t.createEntitiesAndDeferClean(5, func(entities []EntityType) { + queryBuilder := t.repo.NewQueryBuilder(t.ctx) + queryBuilder.Where("SecondString", "==", "second") + fNestedQuery := t.repo.NewQueryBuilder(t.ctx) + fNestedQuery.Where("Iterator", ">", 0).Where("Iterator", "<", 4) + sNestedQuery := t.repo.NewQueryBuilder(t.ctx) + sNestedQuery.Where("Iterator", ">", 2) + queryBuilder = queryBuilder.WhereQuery(fNestedQuery).WhereQuery(sNestedQuery) + list, err := t.repo.GetList(t.ctx, "", "", 1, 3, queryBuilder) + assert.NoError(t.t, err) + assert.Equal(t.t, 1, len(list)) + })) + t.t.Run(fmt.Sprintf("%s/TwoNestedOrFilters/OK", t.getTestBaseName()), + t.createEntitiesAndDeferClean(5, func(entities []EntityType) { + queryBuilder := t.repo.NewQueryBuilder(t.ctx) + queryBuilder.Where("Iterator", "==", 0) + fNestedQuery := t.repo.NewQueryBuilder(t.ctx) + fNestedQuery.Where("Iterator", "==", 2) + sNestedQuery := t.repo.NewQueryBuilder(t.ctx) + sNestedQuery.Where("Iterator", "==", 3) + queryBuilder = queryBuilder.OrQuery(fNestedQuery).OrQuery(sNestedQuery) + list, err := t.repo.GetList(t.ctx, "", "", 1, 3, queryBuilder) + assert.NoError(t.t, err) + assert.Equal(t.t, 3, len(list)) + })) +} diff --git a/src/tests/GenericRepository_test.go b/src/tests/GenericRepository_test.go index c9ef799a..d7ac85aa 100644 --- a/src/tests/GenericRepository_test.go +++ b/src/tests/GenericRepository_test.go @@ -40,6 +40,13 @@ func Test_GenericRepo_GetByIDExtended(t *testing.T) { } } +func Test_GenericRepo_GetList(t *testing.T) { + for _, tester := range repoTesters { + tester.SetTesting(t) + tester.TestGetList() + } +} + func Test_GenericRepo_Delete(t *testing.T) { for _, tester := range repoTesters { tester.SetTesting(t)