From e06264f7b31ca3c0837b56d7bf3ab4c60729f3cb Mon Sep 17 00:00:00 2001 From: BKadirkhodjaev Date: Thu, 19 Dec 2024 19:26:50 +0500 Subject: [PATCH] [MODORDERS-1209-2]. Change validation to throw an exception --- .../service/pieces/PiecesClaimingService.java | 8 +- .../rest/impl/PiecesClaimingApiTest.java | 94 +++++++++++-------- 2 files changed, 58 insertions(+), 44 deletions(-) diff --git a/src/main/java/org/folio/service/pieces/PiecesClaimingService.java b/src/main/java/org/folio/service/pieces/PiecesClaimingService.java index dd47f300c..2b725342a 100644 --- a/src/main/java/org/folio/service/pieces/PiecesClaimingService.java +++ b/src/main/java/org/folio/service/pieces/PiecesClaimingService.java @@ -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; @@ -96,9 +99,8 @@ public Future 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); }); diff --git a/src/test/java/org/folio/rest/impl/PiecesClaimingApiTest.java b/src/test/java/org/folio/rest/impl/PiecesClaimingApiTest.java index 2a59dd47e..0e747c885 100644 --- a/src/test/java/org/folio/rest/impl/PiecesClaimingApiTest.java +++ b/src/test/java/org/folio/rest/impl/PiecesClaimingApiTest.java @@ -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; @@ -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; @@ -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; @@ -106,8 +109,8 @@ private static Stream 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) ); } @@ -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) @@ -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() @@ -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)); - }); } }