FINERACT-1724

- [x] Refactoring ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl
- [x] Fix NPE and test added to ThitsaWorksCreditBureauIntegrationWritePlatformServiceImplTest
This commit is contained in:
Janos Haber
2022-11-21 13:54:55 +01:00
committed by Arnold Gálovics
parent 4f9f71da9b
commit d5b4546886
2 changed files with 174 additions and 146 deletions
@@ -18,10 +18,13 @@
*/
package org.apache.fineract.infrastructure.creditbureau.service;
import static javax.ws.rs.core.HttpHeaders.CONTENT_TYPE;
import static javax.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED;
import static javax.ws.rs.core.MediaType.MULTIPART_FORM_DATA;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonNull;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import java.io.File;
@@ -30,6 +33,12 @@ import java.net.HttpURLConnection;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;
import javax.annotation.Nullable;
import javax.validation.constraints.NotNull;
import okhttp3.HttpUrl;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
@@ -37,6 +46,7 @@ import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import org.apache.commons.lang3.StringUtils;
import org.apache.fineract.commands.domain.CommandWrapper;
import org.apache.fineract.commands.service.CommandWrapperBuilder;
import org.apache.fineract.infrastructure.core.api.JsonCommand;
@@ -67,6 +77,9 @@ import org.springframework.transaction.annotation.Transactional;
public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl implements ThitsaWorksCreditBureauIntegrationWritePlatformService {
private static final Logger LOG = LoggerFactory.getLogger(ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl.class);
public static final String UPLOAD_CREDIT_REPORT = "UploadCreditReport";
public static final String RESPONSE_MESSAGE = "ResponseMessage";
public static final String IS_NOT_AVAILABLE_SUFFIX = ".is.not.available";
private final PlatformSecurityContext context;
private final FromJsonHelper fromApiJsonHelper;
private final TokenRepositoryWrapper tokenRepositoryWrapper;
@@ -97,87 +110,112 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl implemen
@Transactional
@Override
@SuppressWarnings("deprecation")
public String okHttpConnectionMethod(String userName, String password, String subscriptionKey, String subscriptionId, String url,
String token, File file, FormDataContentDisposition fileData, Long uniqueId, String nrcId, String process) {
String reponseMessage = null;
RequestBody requestBody = null;
if (process.equals("UploadCreditReport")) {
String fileName = fileData.getFileName();
requestBody = RequestBody.create(file, MediaType.parse("multipart/form-data"));
requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file", fileName, requestBody)
.addFormDataPart("BODY", "formdata").addFormDataPart("userName", userName).build();
} else if (process.equals("token")) {
final MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
String jsonBody = "" + "BODY=x-www-form-urlencoded&\r" + "grant_type=password&\r" + "userName=" + userName + "&\r" + "password="
+ password + "&\r";
requestBody = RequestBody.create(jsonBody, mediaType);
} else if (process.equals("NRC")) {
final MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
String jsonBody = "BODY=x-www-form-urlencoded&nrc=" + nrcId + "&";
requestBody = RequestBody.create(jsonBody, mediaType);
String token, File file, FormDataContentDisposition fileData, Long uniqueId, String nrcId, @NotNull String process) {
String responseMessage = null;
if (StringUtils.isBlank(url)) {
throw new PlatformDataIntegrityException("error.msg.url.is.null.or.empty", "URL is null or empty");
}
HttpUrl.Builder urlBuilder = HttpUrl.parse(url).newBuilder();
String urlokhttp = urlBuilder.build().toString();
HttpUrl urlBuilder = HttpUrl.parse(url);
if (urlBuilder == null) {
throw new PlatformDataIntegrityException("error.url.not.parsed", "URL not parsed");
}
String okHttpUrl = urlBuilder.toString();
Request request = null;
if (token == null) {
request = new Request.Builder().header("mcix-subscription-key", subscriptionKey).header("mcix-subscription-id", subscriptionId)
.header("Content-Type", "application/x-www-form-urlencoded").url(urlokhttp).post(requestBody).build();
}
if (token != null) {
if (process.equals("CreditReport")) { // GET method for fetching credit report
request = new Request.Builder().header("mcix-subscription-key", subscriptionKey)
.header("mcix-subscription-id", subscriptionId).header("Content-Type", "application/x-www-form-urlencoded")
.header("Authorization", "Bearer " + token).url(urlokhttp).get().build();
} else if (process.equals("UploadCreditReport")) { // POST for uploading Credit-Report(multipart/form-data)
// To ThitsaWork
request = new Request.Builder().header("mcix-subscription-key", subscriptionKey)
.header("mcix-subscription-id", subscriptionId).header("Content-Type", "multipart/form-data")
.header("Authorization", "Bearer " + token).url(urlokhttp).post(requestBody).build();
} else { // POST method for application/x-www-form-urlencoded
request = new Request.Builder().header("mcix-subscription-key", subscriptionKey)
.header("mcix-subscription-id", subscriptionId).header("Content-Type", "application/x-www-form-urlencoded")
.header("Authorization", "Bearer " + token).url(urlokhttp).post(requestBody).build();
}
Request.Builder baseRequestBuilder = createRequestBuilder(subscriptionKey, subscriptionId, token, okHttpUrl);
switch (process) {
case UPLOAD_CREDIT_REPORT -> request = createRequest(baseRequestBuilder, () -> new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", fileData.getFileName(), RequestBody.create(file, MediaType.parse("multipart/form-data")))
.addFormDataPart("BODY", "formdata").addFormDataPart("userName", userName).build(),
(requestBody, builder) -> builder.header(CONTENT_TYPE, MULTIPART_FORM_DATA).post(requestBody).build());
case "CreditReport" -> request = createRequest(baseRequestBuilder,
builder -> builder.header(CONTENT_TYPE, APPLICATION_FORM_URLENCODED).get().build());
case "token" -> request = createRequest(baseRequestBuilder,
() -> RequestBody.create("" + "BODY=x-www-form-urlencoded&\r" + "grant_type=password&\r" + "userName=" + userName
+ "&\r" + "password=" + password + "&\r", MediaType.parse("application/x-www-form-urlencoded")),
(requestBody, builder) -> builder.header(CONTENT_TYPE, APPLICATION_FORM_URLENCODED).post(requestBody).build());
case "NRC" -> request = createRequest(baseRequestBuilder,
() -> RequestBody.create("BODY=x-www-form-urlencoded&nrc=" + nrcId + "&",
MediaType.parse("application/x-www-form-urlencoded")),
(requestBody, builder) -> builder.header(CONTENT_TYPE, APPLICATION_FORM_URLENCODED).post(requestBody).build());
default -> handleAPIIntegrityIssues("Invalid Process");
}
Response response;
Integer responseCode = 0;
int responseCode = 0;
try {
response = client.newCall(request).execute();
responseCode = response.code();
reponseMessage = response.body().string();
responseMessage = response.body().string();
} catch (IOException e) {
LOG.error("error occured in HTTP request-response method.", e);
}
if (responseCode != HttpURLConnection.HTTP_OK) {
this.httpResponse(responseCode, reponseMessage);
this.httpResponse(responseCode, responseMessage);
}
if (process.equals("UploadCreditReport")) { // to show the Response on frontEnd
JsonObject reportObject = JsonParser.parseString(reponseMessage).getAsJsonObject();
String responseMessageJson = reportObject.get("ResponseMessage").getAsString();
if (process.equals(UPLOAD_CREDIT_REPORT)) { // to show the Response on frontEnd
JsonObject reportObject = JsonParser.parseString(responseMessage).getAsJsonObject();
String responseMessageJson = reportObject.get(RESPONSE_MESSAGE).getAsString();
this.handleAPIIntegrityIssues(responseMessageJson);
}
return responseMessage;
return reponseMessage;
}
/**
* Create a request object with the given request builder without request body support (ex: GET)
*
* @param builder
* the request builder object
* @param requestBuilder
* create a request from the builder object with customization
* @return return the generated request object
*/
private Request createRequest(Request.Builder builder, Function<Request.Builder, Request> requestBuilder) {
return requestBuilder.apply(builder);
}
/**
* Create a reuqest obejct with a request body support
*
* @param builder
* the base Builder object
* @param requestBodySupplier
* request body supplier method
* @param requestBuilder
* generate request from the builder object with customization
* @return return the generated request object
*/
private Request createRequest(Request.Builder builder, Supplier<RequestBody> requestBodySupplier,
BiFunction<RequestBody, Request.Builder, Request> requestBuilder) {
return requestBuilder.apply(requestBodySupplier.get(), builder);
}
/**
* Create a request builder for the given url if no token not adds authorization header
*
* @param subscriptionKey
* subscription key parameter
* @param subscriptionId
* subscription id parameter
* @param token
* token can be null
* @param url
* the url to connect
* @return a request builder base object
*/
private Request.Builder createRequestBuilder(String subscriptionKey, String subscriptionId, @Nullable String token, String url) {
Request.Builder base = new Request.Builder().header("mcix-subscription-key", subscriptionKey)
.header("mcix-subscription-id", subscriptionId).url(url);
if (token != null) {
return base.header("Authorization", "Bearer " + token);
}
return base;
}
private void httpResponse(Integer responseCode, String responseMessage) {
@@ -208,17 +246,15 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl implemen
String bureauID = command.stringValueOfParameterNamed("creditBureauID");
Integer creditBureauId = Integer.parseInt(bureauID);
String token = null;
String userName = getCreditBureauConfiguration(creditBureauId, CreditBureauConfigurations.USERNAME.toString());
String password = getCreditBureauConfiguration(creditBureauId, CreditBureauConfigurations.PASSWORD.toString());
String subscriptionId = getCreditBureauConfiguration(creditBureauId, CreditBureauConfigurations.SUBSCRIPTIONID.toString());
String subscriptionKey = getCreditBureauConfiguration(creditBureauId, CreditBureauConfigurations.SUBSCRIPTIONKEY.toString());
CreditBureauToken creditbureautoken = createToken(creditBureauId.longValue());
token = creditbureautoken.getAccessToken();
String token = creditbureautoken.getAccessToken();
// will use only "NRC" part of code from common http method to get data based on nrc
// will use only "NRC" part of code from common http method to get data based on the nrc
String process = "NRC";
String url = getCreditBureauConfiguration(creditBureauId, CreditBureauConfigurations.SEARCHURL.toString());
@@ -227,18 +263,15 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl implemen
String searchResult = this.okHttpConnectionMethod(userName, password, subscriptionKey, subscriptionId, nrcUrl, token, null, null,
0L, nrcId, process);
if (process.equals("NRC")) {
Long uniqueID = this.extractUniqueId(searchResult);
Long uniqueID = this.extractUniqueId(searchResult);
process = "CreditReport";
url = getCreditBureauConfiguration(creditBureauId, CreditBureauConfigurations.CREDITREPORTURL.toString());
process = "CreditReport";
url = getCreditBureauConfiguration(creditBureauId, CreditBureauConfigurations.CREDITREPORTURL.toString());
String creditReportUrl = url + uniqueID;
String creditReportUrl = url + uniqueID;
searchResult = this.okHttpConnectionMethod(userName, password, subscriptionKey, subscriptionId, creditReportUrl, token, null,
null, uniqueID, null, process);
}
searchResult = this.okHttpConnectionMethod(userName, password, subscriptionKey, subscriptionId, creditReportUrl, token, null, null,
uniqueID, null, process);
// after getting the result(creditreport) from httpconnection-response it will assign creditreport to generic
// creditreportdata object
@@ -246,48 +279,35 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl implemen
JsonObject reportObject = JsonParser.parseString(searchResult).getAsJsonObject();
// Credit Reports Stored into Generic CreditReportData
JsonObject jsonData = null;
JsonElement element = reportObject.get("Data");
if (!(element instanceof JsonNull)) { // NOTE : "element instanceof JsonNull" is for handling empty values (and
// assigning null) while fetching data from results
jsonData = (JsonObject) element;
// Extract Data from Credit Report
Optional<JsonObject> jsonData = Optional.ofNullable(reportObject.get("Data")).filter(JsonElement::isJsonObject)
.map(JsonElement::getAsJsonObject);
}
// Extract Borrower from Credit Report data section.
Optional<JsonElement> element = jsonData.map(data -> data.get("BorrowerInfo"));
JsonObject borrowerInfos = null;
String borrowerInfo = null;
// Fill borrower data if present, and it's a json object.
Optional<JsonObject> borrowerInfos = element.filter(JsonElement::isJsonObject).map(JsonElement::getAsJsonObject);
element = jsonData.get("BorrowerInfo");
// Create json object for borrower data.
String borrowerInfo = borrowerInfos.map(data -> new Gson().toJson(data)).orElse(null);
if (!(element instanceof JsonNull)) {
borrowerInfos = (JsonObject) element;
Gson gson = new Gson();
borrowerInfo = gson.toJson(borrowerInfos);
}
String name = borrowerInfos.get("Name").toString();
String gender = borrowerInfos.get("Gender").toString();
String address = borrowerInfos.get("Address").toString();
String name = borrowerInfos.map(data -> data.get("Name")).map(JsonElement::toString).orElse(null);
String gender = borrowerInfos.map(data -> data.get("Gender")).map(JsonElement::toString).orElse(null);
String address = borrowerInfos.map(data -> data.get("Address")).map(JsonElement::toString).orElse(null);
String creditScore = "CreditScore";
creditScore = getJsonObjectToString(creditScore, element, jsonData);
creditScore = getJsonObjectToString(creditScore, jsonData);
String activeLoans = "ActiveLoans";
JsonArray activeLoansArray = getJsonObjectToArray(activeLoans, element, jsonData);
String[] activeLoanStringArray = null;
if (activeLoansArray != null) {
activeLoanStringArray = convertArrayintoStringArray(activeLoansArray);
}
String[] activeLoanStringArray = Optional.ofNullable(getJsonObjectToArray(activeLoans, jsonData))
.map(this::convertArrayintoStringArray).orElse(null);
String writeOffLoans = "WriteOffLoans";
JsonArray writeOffLoansArray = getJsonObjectToArray(writeOffLoans, element, jsonData);
String[] writeoffLoanStringArray = null;
if (writeOffLoansArray != null) {
writeoffLoanStringArray = convertArrayintoStringArray(writeOffLoansArray);
}
String[] writeoffLoanStringArray = Optional.ofNullable(getJsonObjectToArray(writeOffLoans, jsonData))
.map(this::convertArrayintoStringArray).orElse(null);
return CreditBureauReportData.instance(name, gender, address, creditScore, borrowerInfo, activeLoanStringArray,
writeoffLoanStringArray);
@@ -310,17 +330,15 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl implemen
CreditBureauConfiguration addReportURL = this.configDataRepository.getCreditBureauConfigData(creditBureauId, "addCreditReporturl");
String url = addReportURL.getValue();
String process = "UploadCreditReport";
return this.okHttpConnectionMethod(userName, password, subscriptionKey, subscriptionId, url, token, creditReport, fileDetail, 0L,
null, process);
null, UPLOAD_CREDIT_REPORT);
}
private String[] convertArrayintoStringArray(JsonArray jsonResult) {
String[] loanAccounts = new String[jsonResult.size()];
Integer i = 0;
int i = 0;
for (JsonElement ele : jsonResult) {
loanAccounts[i++] = ele.toString();
}
@@ -337,14 +355,14 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl implemen
JsonElement element = reportObject.get("Data");
if (element.isJsonNull()) {
String responseMessage = reportObject.get("ResponseMessage").getAsString();
String responseMessage = reportObject.get(RESPONSE_MESSAGE).getAsString();
handleAPIIntegrityIssues(responseMessage);
}
// to fetch the Unique ID from Result
JsonObject jsonObject = JsonParser.parseString(jsonResult).getAsJsonObject();
Long uniqueID = 0L;
long uniqueID = 0L;
try {
JsonArray dataArray = jsonObject.getAsJsonArray("Data");
@@ -358,7 +376,7 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl implemen
uniqueID = Long.parseLong(trimUniqueId);
} else if (dataArray.size() == 0) {
String responseMessage = reportObject.get("ResponseMessage").getAsString();
String responseMessage = reportObject.get(RESPONSE_MESSAGE).getAsString();
handleAPIIntegrityIssues(responseMessage);
} else {
String nrc;
@@ -376,32 +394,19 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl implemen
}
} catch (IndexOutOfBoundsException e) {
String responseMessage = jsonObject.get("ResponseMessage").getAsString();
String responseMessage = jsonObject.get(RESPONSE_MESSAGE).getAsString();
handleAPIIntegrityIssues(responseMessage);
}
return uniqueID;
}
private String getJsonObjectToString(String fetchData, JsonElement element, JsonObject jsonData) {
String jsonString = null;
element = jsonData.get(fetchData);
if (!(element instanceof JsonNull)) {
JsonObject fetchJson = (JsonObject) element;
Gson gson = new Gson();
jsonString = gson.toJson(fetchJson);
}
return jsonString;
private String getJsonObjectToString(String fetchData, Optional<JsonObject> jsonData) {
return jsonData.map(data -> data.get(fetchData)).filter(JsonElement::isJsonObject).map(JsonElement::getAsJsonObject)
.map(data -> new Gson().toJson(data)).orElse(null);
}
private JsonArray getJsonObjectToArray(String fetchData, JsonElement element, JsonObject jsonData) {
JsonArray fetchJson = null;
element = jsonData.get(fetchData);
if (!(element instanceof JsonNull)) {
fetchJson = (JsonArray) element;
}
return fetchJson;
private JsonArray getJsonObjectToArray(String fetchData, Optional<JsonObject> jsonData) {
return jsonData.map(data -> data.get(fetchData)).filter(JsonElement::isJsonArray).map(JsonElement::getAsJsonArray).orElse(null);
}
@Transactional
@@ -435,21 +440,19 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl implemen
String url = getCreditBureauConfiguration(bureauID.intValue(), CreditBureauConfigurations.TOKENURL.toString());
String process = "token";
String nrcId = null;
Long uniqueID = 0L;
String result = this.okHttpConnectionMethod(userName, password, subscriptionKey, subscriptionId, url, null, null, null,
uniqueID, nrcId, process);
uniqueID, null, process);
// created token will be storing it into database
final CommandWrapper wrapper = new CommandWrapperBuilder().withJson(result).build();
final String json = wrapper.getJson();
JsonCommand apicommand = null;
final JsonElement parsedCommand = this.fromApiJsonHelper.parse(json);
apicommand = JsonCommand.from(json, parsedCommand, this.fromApiJsonHelper, wrapper.getEntityName(), wrapper.getEntityId(),
wrapper.getSubentityId(), wrapper.getGroupId(), wrapper.getClientId(), wrapper.getLoanId(), wrapper.getSavingsId(),
wrapper.getTransactionId(), wrapper.getHref(), wrapper.getProductId(), wrapper.getCreditBureauId(),
wrapper.getOrganisationCreditBureauId(), wrapper.getJobName());
JsonCommand apicommand = JsonCommand.from(json, parsedCommand, this.fromApiJsonHelper, wrapper.getEntityName(),
wrapper.getEntityId(), wrapper.getSubentityId(), wrapper.getGroupId(), wrapper.getClientId(), wrapper.getLoanId(),
wrapper.getSavingsId(), wrapper.getTransactionId(), wrapper.getHref(), wrapper.getProductId(),
wrapper.getCreditBureauId(), wrapper.getOrganisationCreditBureauId(), wrapper.getJobName());
this.fromApiJsonDeserializer.validateForCreate(apicommand.json());
@@ -473,8 +476,8 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl implemen
List<ApiParameterError> dataValidationErrors = new ArrayList<>();
DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors)
.resource("ThitsaWorksCreditBureauIntegration");
String creditBureauConfigurationValue = null;
String creditBureauConfigurationValue;
try {
CreditBureauConfiguration configurationParameterValue = this.configDataRepository.getCreditBureauConfigData(creditBureauId,
@@ -483,10 +486,12 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImpl implemen
creditBureauConfigurationValue = configurationParameterValue.getValue();
if (creditBureauConfigurationValue.isEmpty()) {
baseDataValidator.reset().failWithCode("creditBureau.configuration." + configurationParameterName + ".is.not.available");
baseDataValidator.reset()
.failWithCode("creditBureau.configuration." + configurationParameterName + IS_NOT_AVAILABLE_SUFFIX);
throw new PlatformDataIntegrityException("creditBureau.Configuration." + configurationParameterName + ".is.not.available",
"creditBureau.Configuration." + configurationParameterName + ".is.not.available");
throw new PlatformDataIntegrityException(
"creditBureau.Configuration." + configurationParameterName + IS_NOT_AVAILABLE_SUFFIX,
"creditBureau.Configuration." + configurationParameterName + IS_NOT_AVAILABLE_SUFFIX);
}
} catch (NullPointerException ex) {
@@ -169,6 +169,32 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImplTest {
}
@Test
public void okHttpNullUrlTest() throws IOException {
mockOkHttpCall(request -> createOkhttpResponse(request, 500, "Internal Server Error"));
PlatformDataIntegrityException raisedException = assertThrows(PlatformDataIntegrityException.class, () -> {
underTest.okHttpConnectionMethod("testUser", "testPassword", "subscriptionKey", "subscriptionId", null, "AccessToken", null,
null, 0L, "nrcId", "NRC");
});
assertEquals("error.msg.url.is.null.or.empty", raisedException.getGlobalisationMessageCode());
}
@Test
public void okHttpInvalidProcessTestTest() throws IOException {
mockOkHttpCall(request -> createOkhttpResponse(request, 500, "Internal Server Error"));
PlatformDataIntegrityException raisedException = assertThrows(PlatformDataIntegrityException.class, () -> {
underTest.okHttpConnectionMethod("testUser", "testPassword", "subscriptionKey", "subscriptionId", "https://nrc.test.url.com",
"AccessToken", null, null, 0L, "nrcId", "notValidProcess");
});
assertEquals("Invalid Process", raisedException.getGlobalisationMessageCode());
}
@Test
public void okHttpIOExceptionTest() throws IOException {
mockOkHttpCall(request -> {
@@ -468,8 +494,7 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImplTest {
assertEquals("ADD_CREDIT_RESPONSE", result.getDefaultUserMessage());
}
// TODO: if no borrower is throw NPE
// @Test
@Test
public void getCreditReportFromThitsaWorksEmptyBorrowerTest() throws IOException {
mockTokenGeneration();
mockOkHttpCall(request -> {
@@ -499,8 +524,7 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImplTest {
assertNotNull(result.getCreditScore());
}
// TODO: empty gender not handler correctly (NPE)
// @Test
@Test
public void getCreditReportFromThitsaWorksNoGenderTest() throws IOException {
mockTokenGeneration();
mockOkHttpCall(request -> {
@@ -534,8 +558,7 @@ public class ThitsaWorksCreditBureauIntegrationWritePlatformServiceImplTest {
assertNotNull(result.getCreditScore());
}
// TODO: null credit script invalid result
// @Test
@Test
public void getCreditReportFromThitsaWorksNoLoansTest() throws IOException {
mockTokenGeneration();
mockOkHttpCall(request -> {