From 20b0251a9e583596281428d0444d75b87c6331f1 Mon Sep 17 00:00:00 2001 From: Sherry Hom Date: Thu, 10 Apr 2014 23:47:19 -0700 Subject: [PATCH] MIFOSX-1046 JUnit test cases for code and code values API's --- .../integrationtests/SystemCodeTest.java | 359 ++++++++++++++++++ .../common/system/CodeHelper.java | 163 ++++++++ .../CodeValueReadPlatformServiceImpl.java | 17 +- 3 files changed, 535 insertions(+), 4 deletions(-) create mode 100644 mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/SystemCodeTest.java create mode 100644 mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/system/CodeHelper.java diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/SystemCodeTest.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/SystemCodeTest.java new file mode 100644 index 000000000..965ccabc9 --- /dev/null +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/SystemCodeTest.java @@ -0,0 +1,359 @@ +package org.mifosplatform.integrationtests; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +import java.util.HashMap; +import java.util.List; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; +import org.mifosplatform.integrationtests.common.CommonConstants; +import org.mifosplatform.integrationtests.common.Utils; +import org.mifosplatform.integrationtests.common.system.CodeHelper; + +import com.jayway.restassured.builder.RequestSpecBuilder; +import com.jayway.restassured.builder.ResponseSpecBuilder; +import com.jayway.restassured.http.ContentType; +import com.jayway.restassured.specification.RequestSpecification; +import com.jayway.restassured.specification.ResponseSpecification; + +/** + * Test for creating, updating, deleting codes and code values + * + */ +public class SystemCodeTest { + + private ResponseSpecification responseSpec; + private ResponseSpecification generalResponseSpec; + private RequestSpecification requestSpec; + + @Before + public void setup() { + Utils.initializeRESTAssured(); + this.requestSpec = new RequestSpecBuilder().setContentType( + ContentType.JSON).build(); + this.requestSpec + .header("Authorization", + "Basic " + + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey()); + this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200) + .build(); + + this.generalResponseSpec = new ResponseSpecBuilder().build(); + + } + + // @Ignore() + @Test + // scenario 57, 58, 59, 60 + public void testCreateCode() { + final String codeName = "Client Marital Status"; + + final Integer createResponseId = (Integer) CodeHelper.createCode( + this.requestSpec, this.responseSpec, codeName, + CodeHelper.RESPONSE_ID_ATTRIBUTE_NAME); + + // verify code created + final HashMap newCodeAttributes = (HashMap) CodeHelper.getCodeById( + this.requestSpec, this.responseSpec, createResponseId, ""); + + Assert.assertNotNull(newCodeAttributes); + assertEquals("Verify value of codeId", createResponseId, + newCodeAttributes.get(CodeHelper.CODE_ID_ATTRIBUTE_NAME)); + + assertEquals("Verify code name", codeName, + newCodeAttributes.get(CodeHelper.CODE_NAME_ATTRIBUTE_NAME)); + assertEquals("Verify system defined is false", false, + newCodeAttributes + .get(CodeHelper.CODE_SYSTEM_DEFINED_ATTRIBUTE_NAME)); + + // update code + final HashMap updateChangeResponse = (HashMap) CodeHelper.updateCode( + this.requestSpec, this.responseSpec, createResponseId, codeName + + "(CHANGE)", "changes"); + + assertEquals("Verify code name updated", codeName + "(CHANGE)", + updateChangeResponse.get(CodeHelper.CODE_NAME_ATTRIBUTE_NAME)); + + // delete code + final Integer deleteResponseId = (Integer) CodeHelper.deleteCodeById( + this.requestSpec, this.responseSpec, createResponseId, + CodeHelper.RESPONSE_ID_ATTRIBUTE_NAME); + assertEquals("Verify code deleted", createResponseId, deleteResponseId); + + // verify code deleted + final HashMap deletedCodeValues = (HashMap) CodeHelper.getCodeById( + this.requestSpec, this.generalResponseSpec, deleteResponseId, + ""); + + Assert.assertNotNull(deletedCodeValues); + assertNull("Verify value of codeId", + deletedCodeValues.get(CodeHelper.CODE_ID_ATTRIBUTE_NAME)); + + assertNull("Verify code name", + deletedCodeValues.get(CodeHelper.CODE_NAME_ATTRIBUTE_NAME)); + assertNull("Verify system defined is false", + deletedCodeValues + .get(CodeHelper.CODE_SYSTEM_DEFINED_ATTRIBUTE_NAME)); + } + + // @Ignore() + @Test + // scenario 57, 60 + public void testPreventCreateDuplicateCode() { + final String codeName = "Client Marital Status"; + + // create code + final Integer createResponseId = (Integer) CodeHelper.createCode( + this.requestSpec, this.responseSpec, codeName, + CodeHelper.RESPONSE_ID_ATTRIBUTE_NAME); + + // verify code created + final HashMap newCodeAttributes = (HashMap) CodeHelper.getCodeById( + this.requestSpec, this.responseSpec, createResponseId, ""); + + Assert.assertNotNull(newCodeAttributes); + assertEquals("Verify value of codeId", createResponseId, + newCodeAttributes.get(CodeHelper.CODE_ID_ATTRIBUTE_NAME)); + + assertEquals("Verify code name", codeName, + newCodeAttributes.get(CodeHelper.CODE_NAME_ATTRIBUTE_NAME)); + assertEquals("Verify system defined is false", false, + newCodeAttributes + .get(CodeHelper.CODE_SYSTEM_DEFINED_ATTRIBUTE_NAME)); + + // try to create duplicate-- should fail + final List error = (List) CodeHelper.createCode( + this.requestSpec, this.generalResponseSpec, codeName, + CommonConstants.RESPONSE_ERROR); + + assertEquals("Verify duplication error", + "error.msg.code.duplicate.name", + error.get(0).get("userMessageGlobalisationCode")); + + // delete code that was just created + + final Integer deleteResponseId = (Integer) CodeHelper.deleteCodeById( + this.requestSpec, this.responseSpec, createResponseId, + CodeHelper.RESPONSE_ID_ATTRIBUTE_NAME); + assertEquals("Verify code deleted", createResponseId, deleteResponseId); + + // verify code deleted + final HashMap deletedCodeAttributes = (HashMap) CodeHelper.getCodeById( + this.requestSpec, this.generalResponseSpec, deleteResponseId, + ""); + + Assert.assertNotNull(deletedCodeAttributes); + assertNull("Verify value of codeId", + deletedCodeAttributes.get(CodeHelper.CODE_ID_ATTRIBUTE_NAME)); + + assertNull("Verify code name", + deletedCodeAttributes.get(CodeHelper.CODE_NAME_ATTRIBUTE_NAME)); + assertNull("Verify system defined is false", + deletedCodeAttributes + .get(CodeHelper.CODE_SYSTEM_DEFINED_ATTRIBUTE_NAME)); + + } + + // @Ignore + @Test + public void testUpdateDeleteSystemDefinedCode() { + + // get any systemDefined code + final HashMap systemDefinedCode = (HashMap) CodeHelper + .getSystemDefinedCodes(this.requestSpec, this.responseSpec); + + // delete system-defined code should fail + final List error = (List) CodeHelper.deleteCodeById( + this.requestSpec, this.generalResponseSpec, + (Integer) systemDefinedCode + .get(CodeHelper.CODE_ID_ATTRIBUTE_NAME), + CommonConstants.RESPONSE_ERROR); + + assertEquals("Cannot delete system-defined code", + "error.msg.code.systemdefined", + error.get(0).get("userMessageGlobalisationCode")); + + // update system-defined code should fail + final List updateError = (List) CodeHelper.updateCode( + this.requestSpec, this.generalResponseSpec, + (Integer) systemDefinedCode + .get(CodeHelper.CODE_ID_ATTRIBUTE_NAME), + systemDefinedCode.get(CodeHelper.CODE_NAME_ATTRIBUTE_NAME) + + "CHANGE", CommonConstants.RESPONSE_ERROR); + + assertEquals("Cannot update system-defined code", + "error.msg.code.systemdefined", + error.get(0).get("userMessageGlobalisationCode")); + + } + + // @Ignore + @Test + public void testCodeValuesNotAssignedToTable() { + + final String codeName = "Client Marital Status"; + + final String codeValue1 = "Married"; + final String codeValue2 = "Unmarried"; + + final int codeValue1Position = 1; + final int codeValue2Position = 2; + + // create code + final Integer createCodeResponseId = (Integer) CodeHelper.createCode( + this.requestSpec, this.responseSpec, codeName, + CodeHelper.RESPONSE_ID_ATTRIBUTE_NAME); + + // create first code value + final Integer createCodeValueResponseId1 = (Integer) CodeHelper + .createCodeValue(this.requestSpec, this.responseSpec, + createCodeResponseId, codeValue1, codeValue1Position, + CodeHelper.SUBRESPONSE_ID_ATTRIBUTE_NAME); + + // create second code value + final Integer createCodeValueResponseId2 = (Integer) CodeHelper + .createCodeValue(this.requestSpec, this.responseSpec, + createCodeResponseId, codeValue2, codeValue2Position, + CodeHelper.SUBRESPONSE_ID_ATTRIBUTE_NAME); + + // verify two code values created + + final List codeValuesList = (List) CodeHelper + .getCodeValuesForCode(this.requestSpec, this.responseSpec, + createCodeResponseId, ""); + + assertEquals("Number of code values returned matches number created", + 2, codeValuesList.size()); + + // verify values of first code value + final HashMap codeValuesAttributes1 = (HashMap) CodeHelper + .getCodeValueById(this.requestSpec, this.responseSpec, + createCodeResponseId, createCodeValueResponseId1, ""); + + Assert.assertNotNull(codeValuesAttributes1); + assertEquals("Verify value of codeValueId", createCodeValueResponseId1, + codeValuesAttributes1 + .get(CodeHelper.CODE_VALUE_ID_ATTRIBUTE_NAME)); + + assertEquals("Verify value of code name", codeValue1, + codeValuesAttributes1 + .get(CodeHelper.CODE_VALUE_NAME_ATTRIBUTE_NAME)); + + assertEquals("Verify position of code value", codeValue1Position, + codeValuesAttributes1 + .get(CodeHelper.CODE_VALUE_POSITION_ATTRIBUTE_NAME)); + + // verify values of second code value + final HashMap codeValuesAttributes2 = (HashMap) CodeHelper + .getCodeValueById(this.requestSpec, this.responseSpec, + createCodeResponseId, createCodeValueResponseId2, ""); + + Assert.assertNotNull(codeValuesAttributes2); + assertEquals("Verify value of codeValueId", createCodeValueResponseId2, + codeValuesAttributes2 + .get(CodeHelper.CODE_VALUE_ID_ATTRIBUTE_NAME)); + + assertEquals("Verify value of code name", codeValue2, + codeValuesAttributes2 + .get(CodeHelper.CODE_VALUE_NAME_ATTRIBUTE_NAME)); + + assertEquals("Verify position of code value", codeValue2Position, + codeValuesAttributes2 + .get(CodeHelper.CODE_VALUE_POSITION_ATTRIBUTE_NAME)); + + // update code value 1 + + final HashMap codeValueChanges = (HashMap) CodeHelper + .updateCodeValue(this.requestSpec, this.responseSpec, + createCodeResponseId, createCodeValueResponseId1, + codeValue1 + "CHANGE", 4, "changes"); + + assertEquals("Verify changed code value name", + codeValueChanges.get("name"), codeValue1 + "CHANGE"); + + // delete code value + final Integer deletedCodeValueResponseId1 = (Integer) CodeHelper + .deleteCodeValueById(this.requestSpec, + this.generalResponseSpec, createCodeResponseId, + createCodeValueResponseId1, + CodeHelper.RESPONSE_ID_ATTRIBUTE_NAME); + + // Verify code value deleted + + final HashMap deletedCodeValueAttributes1 = (HashMap) CodeHelper + .getCodeValueById(this.requestSpec, this.generalResponseSpec, + createCodeResponseId, deletedCodeValueResponseId1, ""); + + // Assert.assertNotNull(deletedCodeValueAttributes1); + assertNull("Verify value of codeValueId", + deletedCodeValueAttributes1 + .get(CodeHelper.CODE_VALUE_ID_ATTRIBUTE_NAME)); + + assertNull("Verify value of code name", + deletedCodeValueAttributes1 + .get(CodeHelper.CODE_VALUE_NAME_ATTRIBUTE_NAME)); + + assertNull("Verify position of code value", + deletedCodeValueAttributes1 + .get(CodeHelper.CODE_VALUE_POSITION_ATTRIBUTE_NAME)); + + final List deletedCodeValuesList = (List) CodeHelper + .getCodeValuesForCode(this.requestSpec, this.responseSpec, + createCodeResponseId, ""); + + assertEquals("Number of code values is 1", 1, + deletedCodeValuesList.size()); + + // delete code, remaining code values automatically deleted + + final Integer deleteCodeResponseId = (Integer) CodeHelper + .deleteCodeById(this.requestSpec, this.generalResponseSpec, + createCodeResponseId, + CodeHelper.RESPONSE_ID_ATTRIBUTE_NAME); + assertEquals("Verify code deleted", createCodeResponseId, + deleteCodeResponseId); + + // verify code deleted + final HashMap deletedCodeAttributes = (HashMap) CodeHelper.getCodeById( + this.requestSpec, this.generalResponseSpec, + createCodeResponseId, ""); + + Assert.assertNotNull(deletedCodeAttributes); + assertNull("Verify value of codeId is null", + deletedCodeAttributes.get(CodeHelper.CODE_ID_ATTRIBUTE_NAME)); + + assertNull("Verify code name is null", + deletedCodeAttributes.get(CodeHelper.CODE_NAME_ATTRIBUTE_NAME)); + assertNull("Verify system defined is null", + deletedCodeAttributes + .get(CodeHelper.CODE_SYSTEM_DEFINED_ATTRIBUTE_NAME)); + + // Verify remaining code value deleted + final HashMap deletedCodeValues2 = (HashMap) CodeHelper + .getCodeValueById(this.requestSpec, this.generalResponseSpec, + createCodeResponseId, createCodeValueResponseId2, ""); + + assertNull("Verify value of codeValueId is null", + deletedCodeValues2.get(CodeHelper.CODE_VALUE_ID_ATTRIBUTE_NAME)); + + assertNull("Verify value of code name is null", + deletedCodeValues2 + .get(CodeHelper.CODE_VALUE_NAME_ATTRIBUTE_NAME)); + + assertNull("Verify position of code value null", + deletedCodeValues2 + .get(CodeHelper.CODE_VALUE_POSITION_ATTRIBUTE_NAME)); + + } + + @Ignore + @Test + public void testCodeValuesAssignedToTable() { + + } + +} \ No newline at end of file diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/system/CodeHelper.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/system/CodeHelper.java new file mode 100644 index 000000000..06b45d1f9 --- /dev/null +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/system/CodeHelper.java @@ -0,0 +1,163 @@ +package org.mifosplatform.integrationtests.common.system; + +import static com.jayway.restassured.RestAssured.given; + +import java.util.HashMap; + +import org.mifosplatform.integrationtests.common.Utils; + +import com.google.gson.Gson; +import com.jayway.restassured.path.json.JsonPath; +import com.jayway.restassured.specification.RequestSpecification; +import com.jayway.restassured.specification.ResponseSpecification; + +public class CodeHelper { + + public static final String CODE_ID_ATTRIBUTE_NAME = "id"; + public static final String RESPONSE_ID_ATTRIBUTE_NAME = "resourceId"; + public static final String SUBRESPONSE_ID_ATTRIBUTE_NAME = "subResourceId"; + public static final String CODE_NAME_ATTRIBUTE_NAME = "name"; + public static final String CODE_SYSTEM_DEFINED_ATTRIBUTE_NAME = "systemDefined"; + public static final String CODE_URL = "/mifosng-provider/api/v1/codes"; + + public static final String CODE_VALUE_ID_ATTRIBUTE_NAME = "id"; + public static final String CODE_VALUE_NAME_ATTRIBUTE_NAME = "name"; + public static final String CODE_VALUE_POSITION_ATTRIBUTE_NAME = "position"; + public static final String CODE_VALUE_URL = "/mifosng-provider/api/v1/codes/[codeId]/codevalues"; + + public static Object createCode(final RequestSpecification requestSpec, + final ResponseSpecification responseSpec, final String codeName, + final String jsonAttributeToGetback) { + + return Utils.performServerPost(requestSpec, responseSpec, CODE_URL + + "?" + Utils.TENANT_IDENTIFIER, getTestCodeAsJSON(codeName), + jsonAttributeToGetback); + } + + public static Object updateCode(final RequestSpecification requestSpec, + final ResponseSpecification responseSpec, final Integer codeId, + final String codeName, final String jsonAttributeToGetback) { + + return Utils.performServerPut(requestSpec, responseSpec, CODE_URL + "/" + + codeId + "?" + Utils.TENANT_IDENTIFIER, + getTestCodeAsJSON(codeName), jsonAttributeToGetback); + } + + public static Object getCodeById(final RequestSpecification requestSpec, + final ResponseSpecification responseSpec, final Integer codeId, + final String jsonAttributeToGetback) { + + return Utils.performServerGet(requestSpec, responseSpec, CODE_URL + "/" + + codeId + "?" + Utils.TENANT_IDENTIFIER, + jsonAttributeToGetback); + + } + + public static Object getAllCodes(final RequestSpecification requestSpec, + final ResponseSpecification responseSpec) { + + return Utils.performServerGet(requestSpec, responseSpec, CODE_URL + "?" + + Utils.TENANT_IDENTIFIER, ""); + + } + + public static Object getSystemDefinedCodes( + final RequestSpecification requestSpec, + final ResponseSpecification responseSpec) { + + final String getResponse = given().spec(requestSpec).expect() + .spec(responseSpec).when() + .get(CodeHelper.CODE_URL + "?" + Utils.TENANT_IDENTIFIER) + .asString(); + + final JsonPath getResponseJsonPath = new JsonPath(getResponse); + + // get any systemDefined code + return getResponseJsonPath.get("find { e -> e.systemDefined == true }"); + + } + + public static String getTestCodeAsJSON(final String codeName) { + final HashMap map = new HashMap(); + map.put(CODE_NAME_ATTRIBUTE_NAME, codeName); + return new Gson().toJson(map); + } + + public static String getTestCodeValueAsJSON(final String codeValueName, + final Integer position) { + final HashMap map = new HashMap(); + map.put(CODE_VALUE_NAME_ATTRIBUTE_NAME, codeValueName); + map.put(CODE_VALUE_POSITION_ATTRIBUTE_NAME, position); + return new Gson().toJson(map); + } + + public static Object deleteCodeById(final RequestSpecification requestSpec, + final ResponseSpecification responseSpec, final Integer codeId, + final String jsonAttributeToGetback) { + + return Utils.performServerDelete(requestSpec, responseSpec, CODE_URL + + "/" + codeId + "?" + Utils.TENANT_IDENTIFIER, + jsonAttributeToGetback); + + } + + public static Object createCodeValue( + final RequestSpecification requestSpec, + final ResponseSpecification responseSpec, final Integer codeId, + final String codeValueName, final Integer position, + final String jsonAttributeToGetback) { + + return Utils.performServerPost(requestSpec, responseSpec, + CODE_VALUE_URL.replace("[codeId]", codeId.toString()) + "?" + + Utils.TENANT_IDENTIFIER, + getTestCodeValueAsJSON(codeValueName, position), + jsonAttributeToGetback); + } + + public static Object getCodeValuesForCode( + final RequestSpecification requestSpec, + final ResponseSpecification responseSpec, final Integer codeId, + final String jsonAttributeToGetback) { + + return Utils.performServerGet(requestSpec, responseSpec, + CODE_VALUE_URL.replace("[codeId]", codeId.toString()) + "?" + + Utils.TENANT_IDENTIFIER, jsonAttributeToGetback); + } + + public static Object getCodeValueById( + final RequestSpecification requestSpec, + final ResponseSpecification responseSpec, final Integer codeId, + final Integer codeValueId, final String jsonAttributeToGetback) { + + + return Utils.performServerGet(requestSpec, responseSpec, + CODE_VALUE_URL.replace("[codeId]", codeId.toString()) + "/" + + codeValueId.toString() + "?" + + Utils.TENANT_IDENTIFIER, jsonAttributeToGetback); + } + + public static Object deleteCodeValueById( + final RequestSpecification requestSpec, + final ResponseSpecification responseSpec, final Integer codeId, + final Integer codeValueId, final String jsonAttributeToGetback) { + + return Utils.performServerDelete(requestSpec, responseSpec, + CODE_VALUE_URL.replace("[codeId]", codeId.toString()) + "/" + + codeValueId.toString() + "?" + + Utils.TENANT_IDENTIFIER, jsonAttributeToGetback); + } + + public static Object updateCodeValue( + final RequestSpecification requestSpec, + final ResponseSpecification responseSpec, final Integer codeId, + final Integer codeValueId, final String codeValueName, + final Integer position, final String jsonAttributeToGetback) { + + return Utils.performServerPut(requestSpec, responseSpec, + CODE_VALUE_URL.replace("[codeId]", codeId.toString()) + "/" + + codeValueId + "?" + Utils.TENANT_IDENTIFIER, + getTestCodeValueAsJSON(codeValueName, position), + jsonAttributeToGetback); + } + +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/codes/service/CodeValueReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/codes/service/CodeValueReadPlatformServiceImpl.java index 1d92d0657..e73ccbee2 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/codes/service/CodeValueReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/codes/service/CodeValueReadPlatformServiceImpl.java @@ -10,10 +10,12 @@ import java.sql.SQLException; import java.util.Collection; import org.mifosplatform.infrastructure.codes.data.CodeValueData; +import org.mifosplatform.infrastructure.codes.exception.CodeValueNotFoundException; import org.mifosplatform.infrastructure.core.service.RoutingDataSource; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Service; @@ -74,12 +76,19 @@ public class CodeValueReadPlatformServiceImpl implements CodeValueReadPlatformSe @Override public CodeValueData retrieveCodeValue(final Long codeValueId) { - this.context.authenticatedUser(); + try { + this.context.authenticatedUser(); - final CodeValueDataMapper rm = new CodeValueDataMapper(); - final String sql = "select " + rm.schema() + "where cv.id = ? order by position"; + final CodeValueDataMapper rm = new CodeValueDataMapper(); + final String sql = "select " + rm.schema() + + "where cv.id = ? order by position"; + + return this.jdbcTemplate.queryForObject(sql, rm, + new Object[] { codeValueId }); + } catch (final EmptyResultDataAccessException e) { + throw new CodeValueNotFoundException(codeValueId); + } - return this.jdbcTemplate.queryForObject(sql, rm, new Object[] { codeValueId }); } } \ No newline at end of file