Skip to content

Commit

Permalink
[MODORDERS-1209-2]. Change validation to throw an exception
Browse files Browse the repository at this point in the history
  • Loading branch information
BKadirkhodjaev committed Dec 19, 2024
1 parent ba3fd62 commit e06264f
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 44 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,16 @@
import lombok.extern.log4j.Log4j2;
import one.util.streamex.StreamEx;
import org.apache.commons.lang3.tuple.Pair;
import org.folio.HttpStatus;
import org.folio.rest.acq.model.Organization;
import org.folio.rest.core.RestClient;
import org.folio.rest.core.exceptions.HttpException;
import org.folio.rest.core.models.RequestContext;
import org.folio.rest.jaxrs.model.ClaimingCollection;
import org.folio.rest.jaxrs.model.ClaimingPieceResult;
import org.folio.rest.jaxrs.model.ClaimingResults;
import org.folio.rest.jaxrs.model.Error;
import org.folio.rest.jaxrs.model.Errors;
import org.folio.rest.jaxrs.model.Piece;
import org.folio.rest.jaxrs.model.PieceBatchStatusCollection;
import org.folio.service.caches.ConfigurationEntriesCache;
Expand Down Expand Up @@ -96,9 +99,8 @@ public Future<ClaimingResults> sendClaims(ClaimingCollection claimingCollection,
log.info("createVendorPiecePair:: Using pieces by vendor map, vendorId: {}, piecesByVendor: {}", key.getId(), value));
var vendorWithoutIntegrationDetails = checkVendorIntegrationDetails(config, pieceIdsByVendors);
if (Objects.nonNull(vendorWithoutIntegrationDetails)) {
return Future.succeededFuture(new ClaimingResults()
.withClaimingPieceResults(List.of(new ClaimingPieceResult().withStatus(FAILURE)
.withError(new Error().withMessage(String.format(UNABLE_TO_GENERATE_CLAIMS_FOR_ORG_NO_INTEGRATION_DETAILS.getValue(), vendorWithoutIntegrationDetails.getCode()))))));
var errors = List.of(new Error().withMessage(String.format(UNABLE_TO_GENERATE_CLAIMS_FOR_ORG_NO_INTEGRATION_DETAILS.getValue(), vendorWithoutIntegrationDetails.getCode())));
throw new HttpException(HttpStatus.HTTP_UNPROCESSABLE_ENTITY.toInt(), new Errors().withErrors(errors).withTotalRecords(errors.size()));
}
return createJobsByVendor(claimingCollection, config, pieceIdsByVendors, requestContext);
});
Expand Down
94 changes: 53 additions & 41 deletions src/test/java/org/folio/rest/impl/PiecesClaimingApiTest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.folio.rest.impl;

import io.netty.handler.codec.http.HttpResponseStatus;
import io.restassured.http.Header;
import io.vertx.core.json.JsonObject;
import io.vertx.junit5.VertxExtension;
Expand All @@ -8,6 +9,7 @@
import org.folio.ApiTestSuite;
import org.folio.Organization;
import org.folio.config.ApplicationConfig;
import org.folio.rest.core.exceptions.HttpException;
import org.folio.rest.jaxrs.model.ClaimingCollection;
import org.folio.rest.jaxrs.model.ClaimingPieceResult;
import org.folio.rest.jaxrs.model.ClaimingResults;
Expand All @@ -29,6 +31,7 @@
import java.util.stream.Stream;

import static io.netty.handler.codec.http.HttpResponseStatus.CREATED;
import static io.netty.handler.codec.http.HttpResponseStatus.UNPROCESSABLE_ENTITY;
import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
import static org.folio.RestTestUtils.prepareHeaders;
import static org.folio.RestTestUtils.verifyPostResponse;
Expand Down Expand Up @@ -106,8 +109,8 @@ private static Stream<Arguments> testPostPiecesClaimArgs() {
var payloadFile = "send-claims-1-piece-1-vendor-1-job.json";
var mockHitDto = new MockHitDto(3, 2, 2, 1, 1, 1, 1, 1);
return Stream.of(
Arguments.of("One piece One vendor One Job", 0, 17, 69, mockHitDto, payloadFile, EXIST_CONFIG_X_OKAPI_TENANT_LIMIT_10_CLAIMS, SUCCESS),
Arguments.of("One piece One vendor No Job", 0, 17, 69, null, payloadFile, EXIST_CONFIG_X_OKAPI_TENANT_LIMIT_10, FAILURE)
Arguments.of("One piece One vendor One Job", 0, 17, 69, mockHitDto, payloadFile, EXIST_CONFIG_X_OKAPI_TENANT_LIMIT_10_CLAIMS, SUCCESS, CREATED),
Arguments.of("One piece One vendor No Job", 0, 17, 69, null, payloadFile, EXIST_CONFIG_X_OKAPI_TENANT_LIMIT_10, FAILURE, UNPROCESSABLE_ENTITY)
);
}

Expand Down Expand Up @@ -139,7 +142,8 @@ public MockHitDto(int pieceSearches, int polSearches, int purchaseOrderRetrieval
@ParameterizedTest
@MethodSource("testPostPiecesClaimArgs")
void testPostPiecesClaim(String name, int vendorIdx, int poLineIdx, int pieceIdx, MockHitDto dto,
String payloadFile, Header header, ClaimingPieceResult.Status expectedStatus) {
String payloadFile, Header header, ClaimingPieceResult.Status expectedStatus,
HttpResponseStatus expectedResponseStatus) {
logger.info("Testing postPiecesClaim, name: {}", name);

var organization = getMockAsJson(ORGANIZATION_COLLECTION)
Expand All @@ -162,9 +166,8 @@ void testPostPiecesClaim(String name, int vendorIdx, int poLineIdx, int pieceIdx
addMockEntry(PIECES_STORAGE, piece);

var mockDataPath = BASE_MOCK_DATA_PATH + CLAIMING_MOCK_DATA_FOLDER + payloadFile;
var request = getMockAsJson(mockDataPath).mapTo(ClaimingCollection.class);
var response = verifyPostResponse(PIECES_CLAIMING_ENDPOINT, JsonObject.mapFrom(request).encode(), prepareHeaders(header), APPLICATION_JSON, CREATED.code())
.as(ClaimingResults.class);
var request = getMockAsJson(mockDataPath).mapTo(ClaimingCollection.class);
var response = verifyPostResponse(PIECES_CLAIMING_ENDPOINT, JsonObject.mapFrom(request).encode(), prepareHeaders(header), APPLICATION_JSON, expectedResponseStatus.code());

// Filter out any dummy pieces without ids that are loaded from other tests
var pieceSearches = getPieceSearches().stream()
Expand All @@ -182,47 +185,56 @@ void testPostPiecesClaim(String name, int vendorIdx, int poLineIdx, int pieceIdx
.map(JsonObject::mapFrom).map(json -> json.getString(ENTRY_ID))
.filter(Objects::nonNull).filter(poLineId -> poLineId.equals(purchaseOrder.getId()))
.toList();

purchaseOrderRetrievals.forEach(entry -> logger.info("PurchaseOrders: {}", entry));

var organizationSearches = getOrganizationSearches();
var pieceUpdates = getPieceUpdates();
var jobCreations = getDataExportSpringJobCreations();
var jobExecutions = getDataExportSpringJobExecutions();

if (Objects.nonNull(dto)) {
assertThat(pieceSearches, not(nullValue()));
assertThat(polSearches, not(nullValue()));
assertThat(purchaseOrderRetrievals, not(nullValue()));
assertThat(organizationSearches, not(nullValue()));
assertThat(pieceUpdates, not(nullValue()));
assertThat(jobCreations, not(nullValue()));
assertThat(jobExecutions, not(nullValue()));
assertThat(pieceSearches, hasSize(dto.pieceSearches));
assertThat(polSearches, hasSize(dto.polSearches));
assertThat(purchaseOrderRetrievals, hasSize(dto.purchaseOrderRetrievals));
assertThat(organizationSearches, hasSize(dto.organizationSearches));
assertThat(pieceUpdates, hasSize(dto.pieceUpdates));
assertThat(jobCreations, hasSize(dto.jobCreations));
assertThat(jobExecutions, hasSize(dto.jobExecutions));
assertThat(response.getClaimingPieceResults().size(), equalTo(dto.claimingResults));
pieceUpdates.forEach(pieceUpdate -> logger.info("Updated piece: {}", pieceUpdate.encodePrettily()));
var claimedPieceIds = jobCreations.stream()
.peek(job -> logger.info("Created job: {}", JsonObject.mapFrom(job).encodePrettily()))
.map(job -> job.getJsonObject(EXPORT_TYPE_SPECIFIC_PARAMETERS.getValue())
.getJsonObject(VENDOR_EDI_ORDERS_EXPORT_CONFIG.getValue())
.getJsonArray(CLAIM_PIECE_IDS.getValue()).size())
.mapToInt(value -> value).sum();
assertThat(claimedPieceIds, equalTo(request.getClaimingPieceIds().size()));
pieceUpdates.forEach(pieceUpdate -> logger.info("Updated piece: {}", pieceUpdate.encodePrettily()));

if (response instanceof ClaimingResults claimingResults) {
if (Objects.nonNull(dto)) {
assertThat(pieceSearches, not(nullValue()));
assertThat(polSearches, not(nullValue()));
assertThat(purchaseOrderRetrievals, not(nullValue()));
assertThat(organizationSearches, not(nullValue()));
assertThat(pieceUpdates, not(nullValue()));
assertThat(jobCreations, not(nullValue()));
assertThat(jobExecutions, not(nullValue()));
assertThat(pieceSearches, hasSize(dto.pieceSearches));
assertThat(polSearches, hasSize(dto.polSearches));
assertThat(purchaseOrderRetrievals, hasSize(dto.purchaseOrderRetrievals));
assertThat(organizationSearches, hasSize(dto.organizationSearches));
assertThat(pieceUpdates, hasSize(dto.pieceUpdates));
assertThat(jobCreations, hasSize(dto.jobCreations));
assertThat(jobExecutions, hasSize(dto.jobExecutions));
assertThat(claimingResults.getClaimingPieceResults().size(), equalTo(dto.claimingResults));

var claimedPieceIds = jobCreations.stream()
.peek(job -> logger.info("Created job: {}", JsonObject.mapFrom(job).encodePrettily()))
.map(job -> job.getJsonObject(EXPORT_TYPE_SPECIFIC_PARAMETERS.getValue())
.getJsonObject(VENDOR_EDI_ORDERS_EXPORT_CONFIG.getValue())
.getJsonArray(CLAIM_PIECE_IDS.getValue()).size())
.mapToInt(value -> value).sum();
assertThat(claimedPieceIds, equalTo(request.getClaimingPieceIds().size()));

claimingResults.getClaimingPieceResults()
.forEach(result -> {
if (expectedStatus == SUCCESS) {
assertThat(result.getPieceId(), not(nullValue()));
assertThat(result.getError(), is(nullValue()));
} else {
assertThat(result.getError(), is(notNullValue()));
}
assertThat(result.getStatus(), is(expectedStatus));
});
}
} else if (response instanceof HttpException exception) {
assertThat(exception.getErrors().getErrors().size(), is(1));
assertThat(exception.getError().getMessage(), is("Unable to generate claims for AMAZ because no claim integrations exist"));
}

response.getClaimingPieceResults()
.forEach(result -> {
if (expectedStatus == SUCCESS) {
assertThat(result.getPieceId(), not(nullValue()));
assertThat(result.getError(), is(nullValue()));
} else {
assertThat(result.getError(), is(notNullValue()));
}
assertThat(result.getStatus(), is(expectedStatus));
});
}
}

0 comments on commit e06264f

Please sign in to comment.