From 45264ea209318a13706f861d4ae5871f79adbd96 Mon Sep 17 00:00:00 2001 From: Arnold Galovics Date: Sun, 20 Feb 2022 12:55:01 +0100 Subject: [PATCH] FINERACT-984: Test improvements to not rely on database storage ordering and some database independent query implementations --- .../domain/PermissionRepository.java | 6 ++++++ .../useradministration/domain/RoleRepository.java | 2 +- .../service/AppUserReadPlatformServiceImpl.java | 4 ++-- .../AppUserWritePlatformServiceJpaRepositoryImpl.java | 4 ++-- .../service/PermissionReadPlatformServiceImpl.java | 8 ++++---- .../service/RoleReadPlatformServiceImpl.java | 2 +- .../integrationtests/CenterIntegrationTest.java | 2 +- .../CreditBureauConfigurationTest.java | 4 ++-- .../fineract/integrationtests/common/CenterHelper.java | 9 +++++++++ .../common/CreditBureauConfigurationHelper.java | 10 +++++----- 10 files changed, 33 insertions(+), 18 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/useradministration/domain/PermissionRepository.java b/fineract-provider/src/main/java/org/apache/fineract/useradministration/domain/PermissionRepository.java index f3fd71b56..6a9f2f84d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/useradministration/domain/PermissionRepository.java +++ b/fineract-provider/src/main/java/org/apache/fineract/useradministration/domain/PermissionRepository.java @@ -19,8 +19,14 @@ package org.apache.fineract.useradministration.domain; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; public interface PermissionRepository extends JpaRepository { + // It's important to use the same case for equality check because there are cases when the codes are not capitalized + // the same way. (UNDOTRANSACTION_CLIENT vs UNDOTRANSACTION_client) + // Also, trimming leading and trailing spaces is critical ("CREATE_STANDINGINSTRUCTION" vs + // "CREATE_STANDINGINSTRUCTION "). + @Query("SELECT p FROM Permission p WHERE LOWER(TRIM(BOTH FROM p.code)) = LOWER(TRIM(BOTH FROM ?1))") Permission findOneByCode(String code); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/useradministration/domain/RoleRepository.java b/fineract-provider/src/main/java/org/apache/fineract/useradministration/domain/RoleRepository.java index 6368c411e..832286eca 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/useradministration/domain/RoleRepository.java +++ b/fineract-provider/src/main/java/org/apache/fineract/useradministration/domain/RoleRepository.java @@ -28,7 +28,7 @@ public interface RoleRepository extends JpaRepository, JpaSpecificat @Query("SELECT COUNT(a) FROM AppUser a JOIN a.roles r WHERE r.id = :roleId AND a.deleted = false") Integer getCountOfRolesAssociatedWithUsers(@Param("roleId") Long roleId); - @Query("SELECT role FROM Role role WHERE role.name = :name") + @Query("SELECT role FROM Role role WHERE LOWER(role.name) = LOWER(:name)") Role getRoleByName(@Param("name") String name); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/AppUserReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/AppUserReadPlatformServiceImpl.java index ac37343ed..f0432adf0 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/AppUserReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/AppUserReadPlatformServiceImpl.java @@ -193,7 +193,7 @@ public class AppUserReadPlatformServiceImpl implements AppUserReadPlatformServic public String schema() { return " u.id as id, u.username as username, u.firstname as firstname, u.lastname as lastname, u.email as email, u.password_never_expires as passwordNeverExpires, " + " u.office_id as officeId, o.name as officeName, u.staff_id as staffId, u.is_self_service_user as isSelfServiceUser from m_appuser u " - + " join m_office o on o.id = u.office_id where o.hierarchy like ? and u.is_deleted=0 order by u.username"; + + " join m_office o on o.id = u.office_id where o.hierarchy like ? and u.is_deleted=false order by u.username"; } } @@ -211,7 +211,7 @@ public class AppUserReadPlatformServiceImpl implements AppUserReadPlatformServic public String schema() { return " u.id as id, u.username as username from m_appuser u " - + " join m_office o on o.id = u.office_id where o.hierarchy like ? and u.is_deleted=0 order by u.username"; + + " join m_office o on o.id = u.office_id where o.hierarchy like ? and u.is_deleted=false order by u.username"; } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/AppUserWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/AppUserWritePlatformServiceJpaRepositoryImpl.java index 48267959a..607ac06e3 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/AppUserWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/AppUserWritePlatformServiceJpaRepositoryImpl.java @@ -317,7 +317,7 @@ public class AppUserWritePlatformServiceJpaRepositoryImpl implements AppUserWrit // TODO: this needs to be fixed. The error condition should be independent from the underlying message and // naming // of the constraint - if (realCause.getMessage().contains("'username_org'")) { + if (realCause.getMessage().contains("username_org")) { final String username = command.stringValueOfParameterNamed("username"); final StringBuilder defaultMessageBuilder = new StringBuilder("User with username ").append(username) .append(" already exists."); @@ -328,7 +328,7 @@ public class AppUserWritePlatformServiceJpaRepositoryImpl implements AppUserWrit // TODO: this needs to be fixed. The error condition should be independent from the underlying message and // naming // of the constraint - if (realCause.getMessage().contains("'unique_self_client'")) { + if (realCause.getMessage().contains("unique_self_client")) { return new PlatformDataIntegrityException("error.msg.user.self.service.user.already.exist", "Self Service User Id is already created. Go to Admin->Users to edit or delete the self-service user."); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/PermissionReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/PermissionReadPlatformServiceImpl.java index c1b57e9c8..fdb03ab82 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/PermissionReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/PermissionReadPlatformServiceImpl.java @@ -96,7 +96,7 @@ public class PermissionReadPlatformServiceImpl implements PermissionReadPlatform /* get all non-CHECKER permissions */ return "select p.grouping, p.code, p.entity_name as entityName, p.action_name as actionName, true as selected" + " from m_permission p " + " where code not like '%\\_CHECKER'" - + " order by p.grouping, ifnull(entity_name, ''), p.code"; + + " order by p.grouping, coalesce(entity_name, ''), p.code"; } public String makerCheckerablePermissionSchema() { @@ -107,13 +107,13 @@ public class PermissionReadPlatformServiceImpl implements PermissionReadPlatform return "select p.grouping, p.code, p.entity_name as entityName, p.action_name as actionName, p.can_maker_checker as selected" + " from m_permission p " + " where `grouping` != 'special' and code not like 'READ_%' and code not like '%\\_CHECKER'" - + " order by p.grouping, ifnull(entity_name, ''), p.code"; + + " order by p.grouping, coalesce(entity_name, ''), p.code"; } public String rolePermissionSchema() { - return "select p.grouping, p.code, p.entity_name as entityName, p.action_name as actionName, if(isnull(rp.role_id), false, true) as selected " + return "select p.grouping, p.code, p.entity_name as entityName, p.action_name as actionName, rp.role_id IS NOT NULL as selected " + " from m_permission p " + " left join m_role_permission rp on rp.permission_id = p.id and rp.role_id = ? " - + " order by p.grouping, ifnull(entity_name, ''), p.code"; + + " order by p.grouping, COALESCE(entity_name, ''), p.code"; } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/RoleReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/RoleReadPlatformServiceImpl.java index a00fb9994..ea3b74f35 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/RoleReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/RoleReadPlatformServiceImpl.java @@ -53,7 +53,7 @@ public class RoleReadPlatformServiceImpl implements RoleReadPlatformService { @Override public Collection retrieveAllActiveRoles() { - final String sql = "select " + this.roleRowMapper.schema() + " where r.is_disabled = 0 order by r.id"; + final String sql = "select " + this.roleRowMapper.schema() + " where r.is_disabled = false order by r.id"; return this.jdbcTemplate.query(sql, this.roleRowMapper); } diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/CenterIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/CenterIntegrationTest.java index 22a35a481..425929672 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/CenterIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/CenterIntegrationTest.java @@ -113,7 +113,7 @@ public class CenterIntegrationTest { @Test public void testVoidCenterRetrieval() { - ArrayList arr = CenterHelper.listCenters(requestSpec, responseSpec); + ArrayList arr = CenterHelper.listCentersOrdered(requestSpec, responseSpec); int id = arr.get(arr.size() - 1).getId() + 1; ResponseSpecification responseSpec = new ResponseSpecBuilder().expectStatusCode(404).build(); CenterDomain center = CenterHelper.retrieveByID(id, requestSpec, responseSpec); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/CreditBureauConfigurationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/CreditBureauConfigurationTest.java index 9d49224d8..70a01a3ec 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/CreditBureauConfigurationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/CreditBureauConfigurationTest.java @@ -56,8 +56,8 @@ public class CreditBureauConfigurationTest { public void creditBureauConfigurationTest() { // create creditBureauConfiguration - final Integer configurationId = CreditBureauConfigurationHelper.createCreditBureauConfiguration(this.requestSpec, - this.responseSpec); + final Integer configurationId = CreditBureauConfigurationHelper.createCreditBureauConfiguration(this.requestSpec, this.responseSpec, + Utils.randomNameGenerator("testConfigKey_", 5)); Assertions.assertNotNull(configurationId); // update creditBureauConfiguration diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/CenterHelper.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/CenterHelper.java index 09816cbdc..b1365699b 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/CenterHelper.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/CenterHelper.java @@ -68,6 +68,15 @@ public final class CenterHelper { return new Gson().fromJson(jsonData, new TypeToken>() {}.getType()); } + public static ArrayList listCentersOrdered(final RequestSpecification requestSpec, + final ResponseSpecification responseSpec) { + final String GET_CENTER = CENTERS_URL + "?limit=-1&orderBy=id&sortOrder=asc&" + Utils.TENANT_IDENTIFIER; + LOG.info("------------------------ RETRIEVING CENTERS-------------------------"); + Object get = Utils.performServerGet(requestSpec, responseSpec, GET_CENTER, ""); + final String jsonData = new Gson().toJson(get); + return new Gson().fromJson(jsonData, new TypeToken>() {}.getType()); + } + public static int createCenter(final String name, final int officeId, final RequestSpecification requestSpec, final ResponseSpecification responseSpec) { return createCenter(name, officeId, null, -1, null, null, requestSpec, responseSpec); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/CreditBureauConfigurationHelper.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/CreditBureauConfigurationHelper.java index 41dda394e..62c68d956 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/CreditBureauConfigurationHelper.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/CreditBureauConfigurationHelper.java @@ -40,18 +40,18 @@ public class CreditBureauConfigurationHelper { this.responseSpec = responseSpec; } - public static Integer createCreditBureauConfiguration(final RequestSpecification requestSpec, - final ResponseSpecification responseSpec) { - return createCreditBureauConfiguration(requestSpec, responseSpec, "1"); + public static Integer createCreditBureauConfiguration(final RequestSpecification requestSpec, final ResponseSpecification responseSpec, + String configKey) { + return createCreditBureauConfiguration(requestSpec, responseSpec, "1", configKey); } public static Integer createCreditBureauConfiguration(final RequestSpecification requestSpec, final ResponseSpecification responseSpec, - final String creditBureauId) { + final String creditBureauId, String configKey) { LOG.info("---------------------------------CREATING A CREDIT_BUREAU_CONFIGURATION---------------------------------------------"); final String CREDITBUREAU_CONFIGURATION_URL = " /fineract-provider/api/v1/CreditBureauConfiguration/configuration/" + creditBureauId + "?" + Utils.TENANT_IDENTIFIER; return Utils.performServerPost(requestSpec, responseSpec, CREDITBUREAU_CONFIGURATION_URL, - creditBureauConfigurationAsJson("testConfigKey", "testConfigKeyValue", "description"), "resourceId"); + creditBureauConfigurationAsJson(configKey, "testConfigKeyValue", "description"), "resourceId"); } /*