Skip to content

Commit

Permalink
[MODORDERS-1209]. Add unit tests, add ClaimingError enum
Browse files Browse the repository at this point in the history
  • Loading branch information
BKadirkhodjaev committed Dec 9, 2024
1 parent bbed9aa commit 93f0be0
Show file tree
Hide file tree
Showing 7 changed files with 366 additions and 36 deletions.
18 changes: 18 additions & 0 deletions src/main/java/org/folio/models/claiming/ClaimingError.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.folio.models.claiming;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum ClaimingError {
CANNOT_SEND_CLAIMS_PIECE_IDS_ARE_EMPTY("Cannot send claims, piece ids are empty"),
CANNOT_RETRIEVE_CONFIG_ENTRIES("Cannot retrieve config entries"),
CANNOT_GROUP_PIECES_BY_VENDOR_MESSAGE("Cannot group pieces by vendor"),
CANNOT_CREATE_JOBS_AND_UPDATE_PIECES("Cannot create jobs and update pieces"),
CANNOT_FIND_A_PIECE_BY_ID("Cannot find a piece by '%s' id"),
CANNOT_FIND_PIECES_WITH_LATE_STATUS_TO_PROCESS("Cannot find pieces with LATE status to process"),
CANNOT_COMPLETE_REQ("Cannot complete request to an optional module mod-data-export-spring is unreachable");

private final String value;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

@Getter
@AllArgsConstructor
public enum IntegrationDetail {
public enum IntegrationDetailField {
EXPORT_TYPE_SPECIFIC_PARAMETERS("exportTypeSpecificParameters"),
VENDOR_EDI_ORDERS_EXPORT_CONFIG("vendorEdiOrdersExportConfig"),
CLAIM_PIECE_IDS("claimPieceIds");
Expand Down
45 changes: 23 additions & 22 deletions src/main/java/org/folio/service/pieces/PiecesClaimingService.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,15 @@

import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.toList;
import static org.folio.models.claiming.IntegrationDetail.CLAIM_PIECE_IDS;
import static org.folio.models.claiming.IntegrationDetail.EXPORT_TYPE_SPECIFIC_PARAMETERS;
import static org.folio.models.claiming.IntegrationDetail.VENDOR_EDI_ORDERS_EXPORT_CONFIG;
import static org.folio.models.claiming.ClaimingError.CANNOT_COMPLETE_REQ;
import static org.folio.models.claiming.ClaimingError.CANNOT_CREATE_JOBS_AND_UPDATE_PIECES;
import static org.folio.models.claiming.ClaimingError.CANNOT_FIND_A_PIECE_BY_ID;
import static org.folio.models.claiming.ClaimingError.CANNOT_GROUP_PIECES_BY_VENDOR_MESSAGE;
import static org.folio.models.claiming.ClaimingError.CANNOT_RETRIEVE_CONFIG_ENTRIES;
import static org.folio.models.claiming.ClaimingError.CANNOT_SEND_CLAIMS_PIECE_IDS_ARE_EMPTY;
import static org.folio.models.claiming.IntegrationDetailField.CLAIM_PIECE_IDS;
import static org.folio.models.claiming.IntegrationDetailField.EXPORT_TYPE_SPECIFIC_PARAMETERS;
import static org.folio.models.claiming.IntegrationDetailField.VENDOR_EDI_ORDERS_EXPORT_CONFIG;
import static org.folio.orders.utils.HelperUtils.DATA_EXPORT_SPRING_CONFIG_MODULE_NAME;
import static org.folio.orders.utils.HelperUtils.collectResultsOnSuccess;
import static org.folio.orders.utils.ResourcePathResolver.DATA_EXPORT_SPRING_CREATE_JOB;
Expand All @@ -49,12 +55,8 @@ public class PiecesClaimingService {

private static final String JOB_STATUS = "status";
private static final String EXPORT_TYPE_CLAIMS = "CLAIMS";
private static final String CANNOT_SEND_CLAIMS_PIECE_IDS_ARE_EMPTY = "Cannot send claims, piece ids are empty";
private static final String CANNOT_RETRIEVE_CONFIG_ENTRIES = "Cannot retrieve config entries";
private static final String CANNOT_GROUP_PIECES_BY_VENDOR_MESSAGE = "Cannot group pieces by vendor";
private static final String CANNOT_CREATE_JOBS_AND_UPDATE_PIECES = "Cannot create jobs and update pieces";
private static final String CANNOT_FIND_A_PIECE_BY_ID = "Cannot find a piece by '%s' id";
private static final String CANNOT_COMPLETE_REQ = "Cannot complete request to an optional module mod-data-export-spring is unreachable";
private static final String CANNOT_FIND_PIECES_WITH_LATE_STATUS_TO_PROCESS = "Cannot find pieces with LATE status to process";


private final ConfigurationEntriesCache configurationEntriesCache;
private final PieceStorageService pieceStorageService;
Expand All @@ -74,32 +76,29 @@ public class PiecesClaimingService {
public Future<ClaimingResults> sendClaims(ClaimingCollection claimingCollection, RequestContext requestContext) {
if (CollectionUtils.isEmpty(claimingCollection.getClaimingPieceIds())) {
log.info("sendClaims:: No claims are sent, claiming piece ids are empty");
return Future.succeededFuture(createEmptyClaimingResults(CANNOT_SEND_CLAIMS_PIECE_IDS_ARE_EMPTY));
return Future.succeededFuture(createEmptyClaimingResults(CANNOT_SEND_CLAIMS_PIECE_IDS_ARE_EMPTY.getValue()));
}
return configurationEntriesCache.loadConfiguration(DATA_EXPORT_SPRING_CONFIG_MODULE_NAME, requestContext)
.compose(config -> {
if (CollectionUtils.isEmpty(config.getMap())) {
log.info("sendClaims:: No claims are sent, config has no entries");
return Future.succeededFuture(createEmptyClaimingResults(CANNOT_RETRIEVE_CONFIG_ENTRIES));
return Future.succeededFuture(createEmptyClaimingResults(CANNOT_RETRIEVE_CONFIG_ENTRIES.getValue()));
}
var pieceIds = claimingCollection.getClaimingPieceIds().stream().toList();
log.info("sendClaims:: Received pieces to be claimed, pieceIds: {}", pieceIds);
return groupPieceIdsByVendorId(pieceIds, requestContext)
.compose(pieceIdsByVendorIds -> {
if (CollectionUtils.isEmpty(pieceIdsByVendorIds)) {
return Future.succeededFuture(createEmptyClaimingResults("Cannot find pieces with LATE status to process"));
return Future.succeededFuture(createEmptyClaimingResults(CANNOT_FIND_PIECES_WITH_LATE_STATUS_TO_PROCESS));
}
log.info("sendClaims:: Using pieces by vendor id map, map: {}", pieceIdsByVendorIds);
return createJobsByVendor(config, pieceIdsByVendorIds, requestContext);
});
})
.onFailure(t -> log.error("sendClaims:: Failed send claims: {}", JsonObject.mapFrom(claimingCollection).encodePrettily(), t));
}

private Future<Map<String, List<String>>> groupPieceIdsByVendorId(List<String> pieceIds, RequestContext requestContext) {
if (CollectionUtils.isEmpty(pieceIds)) {
log.info("groupPieceIdsByVendorId:: No pieces are grouped by vendor, pieceIds is empty");
return Future.succeededFuture();
}
log.info("groupPieceIdsByVendorId:: Grouping pieces by vendor, pieceIds count: {}", pieceIds.size());
return pieceStorageService.getPiecesByIds(pieceIds, requestContext)
.compose(pieces -> {
Expand All @@ -123,7 +122,7 @@ private List<Future<Pair<String, String>>> createPieceIdByVendorFutures(List<Pie
uniquePiecePoLinePairs.forEach(piecePoLinePairs -> {
var foundPiece = pieces.stream()
.filter(Objects::nonNull).filter(piece -> Objects.nonNull(piece.getId())).filter(piece -> piece.getId().equals(piecePoLinePairs.getRight()))
.findFirst().orElseThrow(() -> new NoSuchElementException(String.format(CANNOT_FIND_A_PIECE_BY_ID, piecePoLinePairs.getRight())));
.findFirst().orElseThrow(() -> new NoSuchElementException(String.format(CANNOT_FIND_A_PIECE_BY_ID.getValue(), piecePoLinePairs.getRight())));
var pieceIdByVendorIdFuture = createVendorPiecePair(piecePoLinePairs, foundPiece, requestContext);
if (Objects.nonNull(pieceIdByVendorIdFuture)) {
pieceIdByVendorIdFutures.add(pieceIdByVendorIdFuture);
Expand Down Expand Up @@ -160,17 +159,19 @@ private Future<ClaimingResults> createJobsByVendor(JsonObject config, Map<String
if (CollectionUtils.isEmpty(pieceIdsByVendorId)) {
log.info("createJobsByVendor:: No jobs are created, pieceIdsByVendorId is empty");
return Future.succeededFuture(new ClaimingResults()
.withClaimingPieceResults(createErrorClaimingResults(pieceIdsByVendorId, CANNOT_GROUP_PIECES_BY_VENDOR_MESSAGE)));
.withClaimingPieceResults(createErrorClaimingResults(pieceIdsByVendorId, CANNOT_GROUP_PIECES_BY_VENDOR_MESSAGE.getValue())));
}
return collectResultsOnSuccess(createUpdatePiecesAndJobFutures(config, pieceIdsByVendorId, requestContext))
.map(updatedPieceLists -> {
if (CollectionUtils.isEmpty(updatedPieceLists)) {
log.info("createJobsByVendor:: No pieces were processed for claiming");
return new ClaimingResults().withClaimingPieceResults(createErrorClaimingResults(pieceIdsByVendorId, CANNOT_CREATE_JOBS_AND_UPDATE_PIECES));
return new ClaimingResults().withClaimingPieceResults(createErrorClaimingResults(pieceIdsByVendorId, CANNOT_CREATE_JOBS_AND_UPDATE_PIECES.getValue()));
}
var successClaimingPieceResults = createSuccessClaimingResults(updatedPieceLists);
log.info("createJobsByVendor:: Successfully processed pieces for claiming, count: {}", successClaimingPieceResults.size());
return new ClaimingResults().withClaimingPieceResults(successClaimingPieceResults);
var claimingResults = new ClaimingResults().withClaimingPieceResults(successClaimingPieceResults);
log.info("createJobsByVendor:: Returning claiming results, claimingResults: {}", JsonObject.mapFrom(claimingResults).encodePrettily());
return claimingResults;
});
}

Expand Down Expand Up @@ -225,11 +226,11 @@ private Future<Void> createJob(String configKey, Object configValue, List<String
var createdJob = new JsonObject(String.valueOf(response));
log.info("createJob:: Created job, config key: {}, job status: {}", configKey, createdJob.getString(JOB_STATUS));
return restClient.postEmptyResponse(resourcesPath(DATA_EXPORT_SPRING_EXECUTE_JOB), createdJob, requestContext)
.onSuccess(v -> log.info("createJob:: Executed job, config key: {}, job status: {}", configKey, createdJob.getString(JOB_STATUS)));
.onSuccess(v -> log.info("createJob:: Executed job, config key: {}", configKey));
})
.onComplete(asyncResult -> {
if (asyncResult.failed()) {
throw new IllegalStateException(CANNOT_COMPLETE_REQ, asyncResult.cause());
throw new IllegalStateException(CANNOT_COMPLETE_REQ.getValue(), asyncResult.cause());
}
})
.mapEmpty();
Expand Down
5 changes: 5 additions & 0 deletions src/test/java/org/folio/ApiTestSuite.java
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@
import org.folio.service.pieces.PieceServiceTest;
import org.folio.service.pieces.PieceStorageServiceTest;
import org.folio.service.pieces.PieceUpdateInventoryServiceTest;
import org.folio.service.pieces.PiecesClaimingServiceTest;
import org.folio.service.pieces.flows.BasePieceFlowHolderBuilderTest;
import org.folio.service.pieces.flows.DefaultPieceFlowsValidatorTest;
import org.folio.service.pieces.flows.create.PieceCreateFlowInventoryManagerTest;
Expand Down Expand Up @@ -550,4 +551,8 @@ class SettingsRetrieverTestNested extends SettingsRetrieverTest {
@Nested
class PiecesClaimingApiTestNested extends PiecesClaimingApiTest {
}

@Nested
class PiecesClaimingServiceNested extends PiecesClaimingServiceTest {
}
}
6 changes: 3 additions & 3 deletions src/test/java/org/folio/rest/impl/PiecesClaimingApiTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@
import static org.folio.TestConstants.PIECES_CLAIMING_ENDPOINT;
import static org.folio.TestUtils.getMinimalOrder;
import static org.folio.TestUtils.getMockAsJson;
import static org.folio.models.claiming.IntegrationDetail.CLAIM_PIECE_IDS;
import static org.folio.models.claiming.IntegrationDetail.EXPORT_TYPE_SPECIFIC_PARAMETERS;
import static org.folio.models.claiming.IntegrationDetail.VENDOR_EDI_ORDERS_EXPORT_CONFIG;
import static org.folio.models.claiming.IntegrationDetailField.CLAIM_PIECE_IDS;
import static org.folio.models.claiming.IntegrationDetailField.EXPORT_TYPE_SPECIFIC_PARAMETERS;
import static org.folio.models.claiming.IntegrationDetailField.VENDOR_EDI_ORDERS_EXPORT_CONFIG;
import static org.folio.orders.utils.ResourcePathResolver.ORGANIZATION_STORAGE;
import static org.folio.orders.utils.ResourcePathResolver.PIECES_STORAGE;
import static org.folio.orders.utils.ResourcePathResolver.PO_LINES_STORAGE;
Expand Down
10 changes: 0 additions & 10 deletions src/test/java/org/folio/service/claiming/ClaimingServiceTest.java

This file was deleted.

Loading

0 comments on commit 93f0be0

Please sign in to comment.