blob: 49872176e20d03bb8c00c9ea081f4869d11652fc [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.fineract.integrationtests;
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.github.tomakehurst.wiremock.client.WireMock;
import com.github.tomakehurst.wiremock.junit5.WireMockExtension;
import com.google.gson.Gson;
import com.google.gson.JsonParser;
import io.restassured.builder.RequestSpecBuilder;
import io.restassured.builder.ResponseSpecBuilder;
import io.restassured.http.ContentType;
import io.restassured.specification.RequestSpecification;
import io.restassured.specification.ResponseSpecification;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatterBuilder;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.fineract.infrastructure.creditbureau.data.CreditBureauReportData;
import org.apache.fineract.integrationtests.common.CreditBureauConfigurationHelper;
import org.apache.fineract.integrationtests.common.CreditBureauIntegrationHelper;
import org.apache.fineract.integrationtests.common.Utils;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CreditBureauTest {
private static final Logger LOG = LoggerFactory.getLogger(CreditBureauTest.class);
private ResponseSpecification responseSpec;
private RequestSpecification requestSpec;
private static final ObjectMapper MAPPER = new ObjectMapper();
@RegisterExtension
static WireMockExtension wm = WireMockExtension.newInstance().options(wireMockConfig().port(3558)).build();
@BeforeEach
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();
configureCreditBureauService();
}
private void configureCreditBureauService() {
Object organisations = CreditBureauConfigurationHelper.getOrganizationCreditBureauConfiguration(this.requestSpec,
this.responseSpec);
if (new Gson().fromJson(String.valueOf(organisations), List.class).isEmpty()) {
CreditBureauConfigurationHelper.addOrganisationCreditBureau(this.requestSpec, this.responseSpec, "1", "SAMPLE_ALIAS", true);
} else {
CreditBureauConfigurationHelper.updateOrganisationCreditBureau(this.requestSpec, this.responseSpec, "1", true);
}
List<Map<String, Object>> configurations = CreditBureauConfigurationHelper.getCreditBureauConfiguration(requestSpec, responseSpec,
"1");
Assertions.assertNotNull(configurations);
Map<String, Integer> currentConfiguration = configurations.stream().collect(Collectors
.toMap(k -> String.valueOf(k.get("configurationKey")).toUpperCase(), v -> (int) v.get("creditBureauConfigurationId")));
final Object usernameConfigurationId = CreditBureauConfigurationHelper.updateCreditBureauConfiguration(this.requestSpec,
this.responseSpec, currentConfiguration.get("USERNAME").intValue(), "USERNAME", "testUser");
Assertions.assertNotNull(usernameConfigurationId);
final Object passwordConfigurationId = CreditBureauConfigurationHelper.updateCreditBureauConfiguration(this.requestSpec,
this.responseSpec, currentConfiguration.get("PASSWORD").intValue(), "PASSWORD", "testPassword");
Assertions.assertNotNull(passwordConfigurationId);
final Object creditReportUrlConfigurationId = CreditBureauConfigurationHelper.updateCreditBureauConfiguration(this.requestSpec,
this.responseSpec, currentConfiguration.get("CREDITREPORTURL").intValue(), "CREDITREPORTURL",
"http://localhost:3558/report/");
Assertions.assertNotNull(creditReportUrlConfigurationId);
final Object searchUrlConfigurationId = CreditBureauConfigurationHelper.updateCreditBureauConfiguration(this.requestSpec,
this.responseSpec, currentConfiguration.get("SEARCHURL").intValue(), "SEARCHURL", "http://localhost:3558/search/");
Assertions.assertNotNull(searchUrlConfigurationId);
final Object tokenUrlConfigurationId = CreditBureauConfigurationHelper.updateCreditBureauConfiguration(this.requestSpec,
this.responseSpec, currentConfiguration.get("TOKENURL").intValue(), "TOKENURL", "http://localhost:3558/token/");
Assertions.assertNotNull(tokenUrlConfigurationId);
final Object subscriptionIdConfigurationId = CreditBureauConfigurationHelper.updateCreditBureauConfiguration(this.requestSpec,
this.responseSpec, currentConfiguration.get("SUBSCRIPTIONID").intValue(), "SUBSCRIPTIONID", "subscriptionID123");
Assertions.assertNotNull(subscriptionIdConfigurationId);
final Object subscriptionKeyConfigurationId = CreditBureauConfigurationHelper.updateCreditBureauConfiguration(this.requestSpec,
this.responseSpec, currentConfiguration.get("SUBSCRIPTIONKEY").intValue(), "SUBSCRIPTIONKEY", "subscriptionKey456");
Assertions.assertNotNull(subscriptionKeyConfigurationId);
final Object addCreditReportUrlId = CreditBureauConfigurationHelper.updateCreditBureauConfiguration(this.requestSpec,
this.responseSpec, currentConfiguration.get("ADDCREDITREPORTURL").intValue(), "addCreditReporturl",
"http://localhost:3558/upload/");
Assertions.assertNotNull(addCreditReportUrlId);
}
@Test
public void creditBureauIntegrationTest() throws JsonProcessingException {
ObjectNode jsonResponse = MAPPER.createObjectNode();
jsonResponse.put("access_token", "AccessToken");
jsonResponse.put("expires_in", 3600);
jsonResponse.put("token_type", "Bearer");
jsonResponse.put("userName", "testUser");
jsonResponse.put(".issued", "sample");
jsonResponse.put(".expires", ZonedDateTime.now(ZoneId.systemDefault()).plusSeconds(3600)
.format(new DateTimeFormatterBuilder().appendPattern("EEE, dd MMM yyyy kk:mm:ss zzz").toFormatter()));
wm.stubFor(WireMock.post("/token/").willReturn(WireMock.jsonResponse(MAPPER.writeValueAsString(jsonResponse), 200)));
wm.stubFor(WireMock.post("/search/NRC213")
.willReturn(WireMock.jsonResponse("{\"ResponseMessage\":\"OK\",\"Data\":[{\"UniqueID\":\"123456\"}]}", 200)));
wm.stubFor(WireMock.get("/report/123456").willReturn(
WireMock.jsonResponse("{\"ResponseMessage\":\"OK\",\"Data\":{" + "\"BorrowerInfo\":{" + "\"Name\":\"Test Name\","
+ "\"Gender\":\"male\"," + "\"Address\":\"Test Address\"" + "}," + "\"CreditScore\": {\"Score\": \"500\"},"
+ "\"ActiveLoans\": [\"Loan1\", \"Loan2\"]," + "\"WriteOffLoans\": [\"Loan3\", \"Loan4\"]" + "}}", 200)));
Object serviceResult = CreditBureauIntegrationHelper.getCreditReport(this.requestSpec, this.responseSpec, "1", "NRC213");
Assertions.assertNotNull(serviceResult);
Gson gson = new Gson();
CreditBureauReportData responseData = gson.fromJson(
gson.toJson(JsonParser.parseString(String.valueOf(serviceResult)).getAsJsonObject().get("creditBureauReportData")),
CreditBureauReportData.class);
Assertions.assertEquals("\"Test Name\"", responseData.getName());
Assertions.assertEquals("{\"Score\":\"500\"}", responseData.getCreditScore());
Assertions.assertEquals("\"male\"", responseData.getGender());
Assertions.assertEquals("\"Test Address\"", responseData.getAddress());
Assertions.assertEquals(2, responseData.getClosedAccounts().length);
Assertions.assertEquals(2, responseData.getOpenAccounts().length);
Assertions.assertEquals("\"Loan3\"", responseData.getClosedAccounts()[0]);
Assertions.assertEquals("\"Loan4\"", responseData.getClosedAccounts()[1]);
Assertions.assertEquals("\"Loan1\"", responseData.getOpenAccounts()[0]);
Assertions.assertEquals("\"Loan2\"", responseData.getOpenAccounts()[1]);
}
@Test
public void creditBureauNoLoanTest() throws JsonProcessingException {
ObjectNode jsonResponse = MAPPER.createObjectNode();
jsonResponse.put("access_token", "AccessToken");
jsonResponse.put("expires_in", 3600);
jsonResponse.put("token_type", "Bearer");
jsonResponse.put("userName", "testUser");
jsonResponse.put(".issued", "sample");
jsonResponse.put(".expires", ZonedDateTime.now(ZoneId.systemDefault()).plusSeconds(3600)
.format(new DateTimeFormatterBuilder().appendPattern("EEE, dd MMM yyyy kk:mm:ss zzz").toFormatter()));
wm.stubFor(WireMock.post("/token/").willReturn(WireMock.jsonResponse(MAPPER.writeValueAsString(jsonResponse), 200)));
wm.stubFor(WireMock.post("/search/NRC213")
.willReturn(WireMock.jsonResponse("{\"ResponseMessage\":\"OK\",\"Data\":[{\"UniqueID\":\"123456\"}]}", 200)));
wm.stubFor(WireMock.get("/report/123456")
.willReturn(WireMock.jsonResponse("{\"ResponseMessage\":\"OK\",\"Data\":{" + "\"BorrowerInfo\":{"
+ "\"Name\":\"Test Name\"," + "\"Gender\":\"male\"," + "\"Address\":\"Test Address\"" + "},"
+ "\"CreditScore\": {\"Score\": \"500\"}," + "\"ActiveLoans\": []," + "\"WriteOffLoans\": []" + "}}", 200)));
Object serviceResult = CreditBureauIntegrationHelper.getCreditReport(this.requestSpec, this.responseSpec, "1", "NRC213");
Assertions.assertNotNull(serviceResult);
Gson gson = new Gson();
CreditBureauReportData responseData = gson.fromJson(
gson.toJson(JsonParser.parseString(String.valueOf(serviceResult)).getAsJsonObject().get("creditBureauReportData")),
CreditBureauReportData.class);
Assertions.assertEquals("\"Test Name\"", responseData.getName());
Assertions.assertEquals("{\"Score\":\"500\"}", responseData.getCreditScore());
Assertions.assertEquals("\"male\"", responseData.getGender());
Assertions.assertEquals("\"Test Address\"", responseData.getAddress());
Assertions.assertEquals(0, responseData.getClosedAccounts().length);
Assertions.assertEquals(0, responseData.getOpenAccounts().length);
}
}