diff --git a/README.md b/README.md index cf33a41..a9565d4 100644 --- a/README.md +++ b/README.md @@ -487,14 +487,19 @@ L] [Bank Info Lookup API](https://developer.mastercard.com/send-cross-border/doc - OI calls the service to retrieve Bank Information but there are no matching records for the input criteria, use case 10 - The above use cases just shows two the examples of error handling -M] [Validate IBAN API](https://developer.mastercard.com/send-cross-border/documentation/api-ref/validate-iban-apis#account-validation-api): +M] [Validate Account API](https://developer.mastercard.com/cross-border-services/documentation/api-ref/bank-account-validation-api/#account-validation-api): -> Case 1: **VALIDATE ACCOUNT WITH ACCOUNT TYPE AND VALUE** +> Case 1: **VALIDATE IBAN WITH ACCOUNT TYPE AND VALUE** - OI can call this method to validate the IBAN account - In this use case, we need to pass partner ID and populate all the account type and value. The service provides a successful or rejection response. - Use case link -> Case 2: **ERROR HANDLING** +> Case 2: **VALIDATE PAN WITH ACCOUNT TYPE AND VALUE** +- OI can call this method to validate the Card Eligibility for cross-border transaction +- In this use case, we need to pass partner ID and populate all the account type and card number. The service provides eligibility of a card for cross-border transaction. +- Use case link + +> Case 3: **ERROR HANDLING** - OI calls the service to Validate the account but the value field is null, use case 14 - OI calls the service to Validate the account but the account number contains invalid check digit, - The above use cases just shows two of the examples of error handling diff --git a/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/request/AccountDetails.java b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/request/AccountDetails.java new file mode 100644 index 0000000..85889f1 --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/request/AccountDetails.java @@ -0,0 +1,12 @@ +package com.mastercard.crossborder.api.rest.vas.bav.api.request; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class AccountDetails { + private AccountHolder accountHolder; + private String accountCurrency; + private Bic bic; +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/request/AccountHolder.java b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/request/AccountHolder.java new file mode 100644 index 0000000..90c81bc --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/request/AccountHolder.java @@ -0,0 +1,13 @@ +package com.mastercard.crossborder.api.rest.vas.bav.api.request; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class AccountHolder { + + private Name name; + private String governmentId; + +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/request/AccountUri.java b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/request/AccountUri.java index e0e7a26..5435439 100644 --- a/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/request/AccountUri.java +++ b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/request/AccountUri.java @@ -1,9 +1,15 @@ package com.mastercard.crossborder.api.rest.vas.bav.api.request; import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; import lombok.ToString; @ToString +@NoArgsConstructor +@AllArgsConstructor +@Data public class AccountUri { @JsonProperty(value = "type") private String type; @@ -11,35 +17,4 @@ public class AccountUri { @JsonProperty(value = "value") private String value; - public String getType() { - return type; - } - - public AccountUri() { - } - - public AccountUri(String type, String value) { - this.type = type; - this.value = value; - } - - public void setType(String type) { - this.type = type; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - @Override - public String toString() { - return "{" + - "type='" + type + '\'' + - ", value='" + value + '\'' + - '}'; - } } diff --git a/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/request/Bic.java b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/request/Bic.java new file mode 100644 index 0000000..2e91c28 --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/request/Bic.java @@ -0,0 +1,12 @@ +package com.mastercard.crossborder.api.rest.vas.bav.api.request; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class Bic { + private String value; + private String type; + +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/request/IBanValidationRequest.java b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/request/IBanValidationRequest.java index 9a08638..3d4e91f 100644 --- a/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/request/IBanValidationRequest.java +++ b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/request/IBanValidationRequest.java @@ -1,31 +1,29 @@ package com.mastercard.crossborder.api.rest.vas.bav.api.request; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.mastercard.crossborder.api.rest.vas.bav.api.request.ValidateReq.ValidateRequestType; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; import lombok.ToString; @ToString +@Data +@NoArgsConstructor +@AllArgsConstructor public class IBanValidationRequest { + @JsonInclude(Include.NON_NULL) + private ValidateRequestType requestType; + private AccountUri accountUri; - public IBanValidationRequest() { - } + @JsonInclude(Include.NON_NULL) + private AccountDetails accountDetails; public IBanValidationRequest(AccountUri accountUri) { this.accountUri = accountUri; } - public AccountUri getAccountUri() { - return accountUri; - } - - public void setAccountUri(AccountUri accountUri) { - this.accountUri = accountUri; - } - - @Override - public String toString() { - return "IBanValidationRequest{" + - "accountUri=" + accountUri + - '}'; - } } diff --git a/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/request/Name.java b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/request/Name.java new file mode 100644 index 0000000..4295b52 --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/request/Name.java @@ -0,0 +1,14 @@ +package com.mastercard.crossborder.api.rest.vas.bav.api.request; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class Name { + + private String firstName; + private String middleName; + private String lastName; + +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/request/ValidateReq/ValidateRequestType.java b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/request/ValidateReq/ValidateRequestType.java new file mode 100644 index 0000000..f2ec148 --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/request/ValidateReq/ValidateRequestType.java @@ -0,0 +1,7 @@ +package com.mastercard.crossborder.api.rest.vas.bav.api.request.ValidateReq; + +public enum ValidateRequestType { + IVS, + CES, + ASV; +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/response/Bic.java b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/response/Bic.java index 04b8bb6..582e5ab 100644 --- a/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/response/Bic.java +++ b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/response/Bic.java @@ -1,38 +1,15 @@ package com.mastercard.crossborder.api.rest.vas.bav.api.response; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@ToString public class Bic { String type; String value; - - public Bic(String type, String value) { - this.type = type; - this.value = value; - } - - public Bic() { - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - @Override - public String toString() { - return "Bic{" + - "type='" + type + '\'' + - ", value='" + value + '\'' + - '}'; - } } diff --git a/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/response/ValidateAccountResponse.java b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/response/ValidateAccountResponse.java index c4edf04..f9b6fb0 100644 --- a/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/response/ValidateAccountResponse.java +++ b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/response/ValidateAccountResponse.java @@ -1,41 +1,19 @@ package com.mastercard.crossborder.api.rest.vas.bav.api.response; +import com.mastercard.crossborder.api.rest.vas.bav.api.response.validateRes.ReceivingEligibility; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@ToString public class ValidateAccountResponse { + private String refId; private String status; private String message; private AccountMatch accountMatch; - - public ValidateAccountResponse() { - } - - public ValidateAccountResponse(String status, String message, AccountMatch accountMatch, Bank bank) { - this.status = status; - this.message = message; - this.accountMatch = accountMatch; - } - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public AccountMatch getAccountMatch() { - return accountMatch; - } - - public void setAccountMatch(AccountMatch accountMatch) { - this.accountMatch = accountMatch; - } - + private ReceivingEligibility receivingEligibility; } diff --git a/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/response/validateRes/AccountStatus.java b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/response/validateRes/AccountStatus.java new file mode 100644 index 0000000..9ea35bf --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/response/validateRes/AccountStatus.java @@ -0,0 +1,6 @@ +package com.mastercard.crossborder.api.rest.vas.bav.api.response.validateRes; + +public enum AccountStatus { + ELIGIBLE, + INELIGIBLE, +} \ No newline at end of file diff --git a/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/response/validateRes/CrossBorder.java b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/response/validateRes/CrossBorder.java new file mode 100644 index 0000000..0a1763f --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/response/validateRes/CrossBorder.java @@ -0,0 +1,14 @@ +package com.mastercard.crossborder.api.rest.vas.bav.api.response.validateRes; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@ToString +@Getter +@Setter +public class CrossBorder { + + private YesNo eligible; + private YesNo fasterFunds; +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/response/validateRes/ReceivingEligibility.java b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/response/validateRes/ReceivingEligibility.java new file mode 100644 index 0000000..545c5b6 --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/response/validateRes/ReceivingEligibility.java @@ -0,0 +1,17 @@ +package com.mastercard.crossborder.api.rest.vas.bav.api.response.validateRes; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString +public class ReceivingEligibility { + + private CrossBorder crossBorder; + private String paymentSystem; + private String product; + private AccountStatus status; +} + diff --git a/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/response/validateRes/YesNo.java b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/response/validateRes/YesNo.java new file mode 100644 index 0000000..75af698 --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/vas/bav/api/response/validateRes/YesNo.java @@ -0,0 +1,8 @@ +package com.mastercard.crossborder.api.rest.vas.bav.api.response.validateRes; + +public enum YesNo { + Y, + N, + U +} + diff --git a/src/main/java/com/mastercard/crossborder/api/service/impl/RestClientServiceImpl.java b/src/main/java/com/mastercard/crossborder/api/service/impl/RestClientServiceImpl.java index 1d636e9..b4a42b3 100644 --- a/src/main/java/com/mastercard/crossborder/api/service/impl/RestClientServiceImpl.java +++ b/src/main/java/com/mastercard/crossborder/api/service/impl/RestClientServiceImpl.java @@ -315,7 +315,7 @@ private List mapAccountValues(String response,Class listElementClass CollectionType listType = mapper.getTypeFactory().constructCollectionType(ArrayList.class,listElementClass); return mapper.readValue(response, listType); - }catch(JsonProcessingException e){ + }catch(IOException e){ logger.warn("Error while processing response"); } } diff --git a/src/test/java/com/mastercard/crossborder/vas/bav/api/AccountValidationTest.java b/src/test/java/com/mastercard/crossborder/vas/bav/api/AccountValidationTest.java index 5f22256..01be16e 100644 --- a/src/test/java/com/mastercard/crossborder/vas/bav/api/AccountValidationTest.java +++ b/src/test/java/com/mastercard/crossborder/vas/bav/api/AccountValidationTest.java @@ -71,6 +71,58 @@ public void validateAccount() { } } + @Test + public void validateCard() { + logger.info("Test case to validate card for Cross-Border Services"); + Map requestParams = new HashMap<>(); + requestParams.put("partner-id", partnerId); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); + httpHeaders.add(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON); + try { + IBanValidationRequest request = BavHelperApi.validateCardEligibility(); + System.out.println("Request Payload >>>>>>>>>>>>> "+request); + ValidateAccountResponse response = bavApi.validateAccount(httpHeaders, requestParams, request); + if(response != null) { + logger.info("Card Eligibility response message {} ", response.getMessage()); + Assert.assertEquals("SUCCESS",response.getStatus()); + } + else{ + logger.info("Card Eligibility request has failed"); + Assert.fail("Card Eligibility request has failed"); + } + } catch (ServiceException re) { + logger.error("Card Eligibility request failed as : {}", re.getMessage()); + Assert.fail(re.getMessage()); + } + } + + @Test + public void validateAccountStatus(){ + logger.info("Test case to validate card for Cross-Border Services"); + Map requestParams = new HashMap<>(); + requestParams.put("partner-id", partnerId); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); + httpHeaders.add(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON); + try{ + IBanValidationRequest request = BavHelperApi.validateAccountStatus(); + logger.info("Request Payload >>>>>>>>>>>>> "+request); + ValidateAccountResponse response = bavApi.validateAccount(httpHeaders, requestParams, request); + if(response != null) { + logger.info("ASV response message {} ", response.getMessage()); + Assert.assertEquals("IN_PROGRESS",response.getStatus()); + } + else{ + logger.info("ASV request has failed"); + Assert.fail("ASV request has failed"); + } + } catch (ServiceException re) { + logger.error("ASV request failed as : {}", re.getMessage()); + Assert.fail(re.getMessage()); + } + } + /* ** * This is an error scenario test case, where the mandatory field i.e the type is sent as "" empty */ diff --git a/src/test/java/com/mastercard/crossborder/vas/bav/api/helper/BavHelperApi.java b/src/test/java/com/mastercard/crossborder/vas/bav/api/helper/BavHelperApi.java index ebdfe68..e594080 100644 --- a/src/test/java/com/mastercard/crossborder/vas/bav/api/helper/BavHelperApi.java +++ b/src/test/java/com/mastercard/crossborder/vas/bav/api/helper/BavHelperApi.java @@ -1,6 +1,7 @@ package com.mastercard.crossborder.vas.bav.api.helper; import com.mastercard.crossborder.api.rest.vas.bav.api.request.*; +import com.mastercard.crossborder.api.rest.vas.bav.api.request.ValidateReq.ValidateRequestType; import com.mastercard.crossborder.api.rest.vas.bav.api.response.Bic; public class BavHelperApi { @@ -57,6 +58,19 @@ public static IBanValidationRequest createAccount(){ return new IBanValidationRequest(new AccountUri("IBAN","GB33BUKB20201555555555")); } + public static IBanValidationRequest validateCardEligibility(){ + AccountUri accountUri = new AccountUri("PAN","4960144263583144"); + return new IBanValidationRequest(ValidateRequestType.CES, accountUri, null); + } + + public static IBanValidationRequest validateAccountStatus(){ + AccountUri accountUri = new AccountUri("BAN","98000987651232"); + AccountHolder accountHolder = new AccountHolder(new Name("Tim","John","Smith"), "1234567"); + com.mastercard.crossborder.api.rest.vas.bav.api.request.Bic bic = new com.mastercard.crossborder.api.rest.vas.bav.api.request.Bic("123456789", "ABA"); + AccountDetails accountDetails = new AccountDetails(accountHolder, "USD", bic); + return new IBanValidationRequest(ValidateRequestType.ASV, accountUri, accountDetails); + } + public static IBanValidationRequest createAccountWithEmptyType(){ return new IBanValidationRequest(new AccountUri("IBAN",null)); }