use of org.folio.TestConstants.ID in project mod-orders by folio-org.
the class PurchaseOrdersApiTest method testPutOrdersByIdToChangeStatusToOpenButWithErrorCreatingItemsForSecondPOL.
@Test
void testPutOrdersByIdToChangeStatusToOpenButWithErrorCreatingItemsForSecondPOL() throws Exception {
logger.info("=== Test Put Order By Id to change Order's status to Open - Inventory errors expected on items creation for second POL ===");
/*============== Preparation ==============*/
// Get Open Order
CompositePurchaseOrder reqData = getMockDraftOrder().mapTo(CompositePurchaseOrder.class);
reqData.setId(ID_FOR_PRINT_MONOGRAPH_ORDER);
reqData.setWorkflowStatus(CompositePurchaseOrder.WorkflowStatus.OPEN);
MockServer.addMockTitles(reqData.getCompositePoLines());
int polCount = reqData.getCompositePoLines().size();
// Make sure that mock PO has 2 lines
assertThat(reqData.getCompositePoLines(), hasSize(2));
// Make sure that inventory interaction is expected for each PO line
for (CompositePoLine pol : reqData.getCompositePoLines()) {
assertTrue(calculateInventoryItemsQuantity(pol) > 0);
}
// Set location ids to one which emulates item creation failure
CompositePoLine line1 = reqData.getCompositePoLines().get(0);
CompositePoLine line2 = reqData.getCompositePoLines().get(1);
reqData.getCompositePoLines().get(1).getLocations().forEach(location -> location.withLocationId(ID_FOR_INTERNAL_SERVER_ERROR));
reqData.getCompositePoLines().get(1).getLocations().get(0).setLocationId(UUID.randomUUID().toString());
preparePiecesForCompositePo(reqData);
String path = String.format(COMPOSITE_ORDERS_BY_ID_PATH, reqData.getId());
/*============== Assert result ==============*/
// Server Error expected as a result because not all items created
verifyPut(path, JsonObject.mapFrom(reqData), APPLICATION_JSON, 500);
List<JsonObject> respOrder = MockServer.serverRqRs.get(PURCHASE_ORDER_STORAGE, HttpMethod.GET);
CompositePurchaseOrder compPo = respOrder.get(0).mapTo(CompositePurchaseOrder.class);
List<JsonObject> respLines = MockServer.serverRqRs.get(PO_LINES_STORAGE, HttpMethod.PUT);
CompositePoLine respLine1 = respLines.stream().filter(line -> line.getString(ID).equals(line1.getId())).peek(line -> line.remove("reportingCodes")).map(line -> line.mapTo(CompositePoLine.class)).distinct().findAny().get();
CompositePoLine respLine2 = respLines.stream().filter(line -> line.getString(ID).equals(line2.getId())).peek(line -> line.remove("reportingCodes")).map(line -> line.mapTo(CompositePoLine.class)).findAny().get();
compPo.setCompositePoLines(List.of(respLine1, respLine2));
// Check that search of the existing instances and items was done for each PO line
List<JsonObject> instancesSearches = getInstancesSearches();
assertNotNull(instancesSearches);
assertNotNull(getItemsSearches());
assertNotNull(getPieceSearches());
assertEquals(polCount, instancesSearches.size());
// Check that 2 new instances created and items created successfully only for first POL
List<JsonObject> createdInstances = getCreatedInstances();
List<JsonObject> createdPieces = getCreatedPieces();
assertNotNull(createdInstances);
assertNotNull(getCreatedItems());
assertNotNull(createdPieces);
assertEquals(polCount, createdInstances.size());
List<JsonObject> items = joinExistingAndNewItems();
// Check instance Ids not exist for polines
verifyInstanceLinksNotCreatedForPoLine();
// Verify pieces were created
assertEquals(calculateTotalQuantity(compPo.getCompositePoLines().get(0)) + calculateTotalQuantity(compPo.getCompositePoLines().get(1)) - 1, createdPieces.size());
// Effectively remove non-processed locations with ID_FOR_INTERNAL_SERVER_ERROR to exclude them from
// created pieces verification
compPo.getCompositePoLines().forEach(poLine -> poLine.getLocations().removeIf(l -> {
if (l.getLocationId().equals(ID_FOR_INTERNAL_SERVER_ERROR)) {
if (poLine.getCost().getQuantityElectronic() != null) {
poLine.getCost().setQuantityElectronic(poLine.getCost().getQuantityElectronic() - l.getQuantityElectronic());
}
if (poLine.getCost().getQuantityPhysical() != null) {
poLine.getCost().setQuantityPhysical(poLine.getCost().getQuantityPhysical() - l.getQuantityPhysical());
}
return true;
} else {
return false;
}
}));
verifyPiecesCreated(items, compPo.getCompositePoLines(), createdPieces);
}
use of org.folio.TestConstants.ID in project mod-orders by folio-org.
the class PurchaseOrdersApiTest method testPostOpenOrderInventoryUpdateWithOrderFormatOther.
@Test
@Disabled
// TODO must be fixed in scope of https://issues.folio.org/browse/MODORDERS-587
void testPostOpenOrderInventoryUpdateWithOrderFormatOther() throws Exception {
logger.info("=== Test POST Order By Id to change status of Order to Open - inventory interaction required only for first POL ===");
// Get Open Order
CompositePurchaseOrder reqData = getMockDraftOrder().mapTo(CompositePurchaseOrder.class);
MockServer.addMockTitles(reqData.getCompositePoLines());
// Make sure that mock po has 2 po lines
assertThat(reqData.getCompositePoLines(), hasSize(2));
// Make sure that mock po has the first PO line with 3 locations
assertThat(reqData.getCompositePoLines().get(0).getLocations(), hasSize(3));
// Make sure that Order moves to Open
reqData.setWorkflowStatus(CompositePurchaseOrder.WorkflowStatus.OPEN);
// Prepare second POL
CompositePoLine secondPol = reqData.getCompositePoLines().get(1);
List<Location> secondPolLocations = secondPol.getLocations();
// MODORDERS-117 Setting OrderFormat to OTHER which means it behaves similar
// to Physical order
secondPol.setOrderFormat(CompositePoLine.OrderFormat.OTHER);
Physical physical = new Physical();
physical.setCreateInventory(CreateInventory.NONE);
secondPol.setPhysical(physical);
// Specify correct quantities for OTHER format
secondPol.getCost().setQuantityElectronic(0);
secondPol.getCost().setListUnitPriceElectronic(null);
secondPol.getCost().setListUnitPrice(10d);
secondPol.getCost().setQuantityPhysical(secondPolLocations.size());
secondPol.setEresource(null);
secondPolLocations.forEach(location -> {
location.setQuantityElectronic(0);
location.setQuantityPhysical(1);
});
LocalDate now = LocalDate.now();
final CompositePurchaseOrder resp = verifyPostResponse(COMPOSITE_ORDERS_PATH, JsonObject.mapFrom(reqData).toString(), prepareHeaders(EXIST_CONFIG_X_OKAPI_TENANT_LIMIT_10, X_OKAPI_USER_ID), APPLICATION_JSON, 201).as(CompositePurchaseOrder.class);
LocalDate dateOrdered = resp.getDateOrdered().toInstant().atZone(ZoneId.of(ZoneOffset.UTC.getId())).toLocalDate();
assertThat(dateOrdered.getMonth(), equalTo(now.getMonth()));
assertThat(dateOrdered.getYear(), equalTo(now.getYear()));
// Check that search of the existing instances and items was done for first PO line only
List<JsonObject> instancesSearches = getInstancesSearches();
List<JsonObject> holdingsSearches = getHoldingsSearches();
List<JsonObject> itemsSearches = getItemsSearches();
assertNotNull(instancesSearches);
assertNull(holdingsSearches);
assertNotNull(itemsSearches);
assertEquals(1, instancesSearches.size());
CompositePoLine respLine1 = resp.getCompositePoLines().get(0);
respLine1.getLocations().forEach(location -> {
assertNull(location.getLocationId());
assertNotNull(location.getHoldingId());
});
CompositePoLine respLine2 = resp.getCompositePoLines().get(1);
respLine2.getLocations().forEach(location -> {
assertNotNull(location.getLocationId());
assertNull(location.getHoldingId());
});
List<JsonObject> createdInstances = getCreatedInstances();
assertEquals(1, createdInstances.size(), "Quantity of created instance must be equal of line, if create inventory include instance");
assertNotNull("Line must be connected to instance, if create inventory include instance", respLine1.getInstanceId());
assertNotNull("Line must be connected to instance, if create inventory include instance", respLine2.getInstanceId());
List<JsonObject> createdHoldings = getCreatedHoldings();
assertEquals(3, createdHoldings.size(), "Quantity of created instance must be depended of quantity in the locations and create inventory include holding");
verifyHoldingsCreated(3, createdHoldings, respLine1);
verifyHoldingsCreated(0, createdHoldings, respLine2);
// All existing and created items
List<JsonObject> items = joinExistingAndNewItems();
verifyItemsCreated(EXIST_CONFIG_X_OKAPI_TENANT_LIMIT_10, 4, items, respLine1);
verifyItemsCreated(EXIST_CONFIG_X_OKAPI_TENANT_LIMIT_10, 0, items, respLine2);
List<JsonObject> createdPieces = getCreatedPieces();
createdPieces.stream().map(json -> json.mapTo(Piece.class)).filter(piece -> !OTHER.equals(piece.getFormat())).forEach(piece -> {
assertNull(piece.getLocationId());
assertNotNull(piece.getHoldingId());
});
createdPieces.stream().map(json -> json.mapTo(Piece.class)).filter(piece -> OTHER.equals(piece.getFormat())).forEach(piece -> {
assertNotNull(piece.getLocationId());
assertNull(piece.getHoldingId());
});
verifyOpenOrderPiecesCreated(items, resp.getCompositePoLines(), createdPieces, 4);
verifyCalculatedData(resp);
}
use of org.folio.TestConstants.ID in project mod-orders by folio-org.
the class PurchaseOrdersApiTest method testPutOrdersByIdTotalPiecesEqualsTotalQuantityWhenCreateInventoryIsFalse.
@Test
@Disabled
// TODO must be fixed in scope of https://issues.folio.org/browse/MODORDERS-587
void testPutOrdersByIdTotalPiecesEqualsTotalQuantityWhenCreateInventoryIsFalse() throws Exception {
logger.info("=== Test Put Order By Id create Pieces when Item record does not exist ===");
CompositePurchaseOrder reqData = getMockDraftOrder().mapTo(CompositePurchaseOrder.class);
reqData.setId(ID_FOR_PRINT_MONOGRAPH_ORDER);
// Make sure that mock PO has 2 po lines
assertThat(reqData.getCompositePoLines(), hasSize(2));
MockServer.addMockTitles(reqData.getCompositePoLines());
CompositePoLine line1 = reqData.getCompositePoLines().get(0);
CompositePoLine line2 = reqData.getCompositePoLines().get(1);
line2.getEresource().setCreateInventory(Eresource.CreateInventory.NONE);
reqData.setWorkflowStatus(CompositePurchaseOrder.WorkflowStatus.OPEN);
preparePiecesForCompositePo(reqData);
verifyPut(String.format(COMPOSITE_ORDERS_BY_ID_PATH, reqData.getId()), JsonObject.mapFrom(reqData), "", 204);
List<JsonObject> respOrder = MockServer.serverRqRs.get(PURCHASE_ORDER_STORAGE, HttpMethod.GET);
CompositePurchaseOrder compPo = respOrder.get(0).mapTo(CompositePurchaseOrder.class);
List<JsonObject> respLines = MockServer.serverRqRs.get(PO_LINES_STORAGE, HttpMethod.PUT);
CompositePoLine respLine1 = respLines.stream().filter(line -> line.getString(ID).equals(line1.getId())).peek(line -> line.remove("reportingCodes")).map(line -> line.mapTo(CompositePoLine.class)).filter(line -> Objects.nonNull(line.getLocations().get(0).getHoldingId())).distinct().findAny().get();
CompositePoLine respLine2 = respLines.stream().filter(line -> line.getString(ID).equals(line2.getId())).peek(line -> line.remove("reportingCodes")).map(line -> line.mapTo(CompositePoLine.class)).findAny().get();
compPo.setCompositePoLines(List.of(respLine1, respLine2));
List<JsonObject> items = joinExistingAndNewItems();
List<JsonObject> createdPieces = getCreatedPieces();
verifyPiecesQuantityForSuccessCase(compPo.getCompositePoLines(), createdPieces);
verifyOpenOrderPiecesCreated(items, compPo.getCompositePoLines(), createdPieces, 0);
}
use of org.folio.TestConstants.ID in project mod-orders by folio-org.
the class PieceDeleteFlowManagerTest method shouldUpdateLineQuantityIfPoLineIsNotPackageAndManualPieceCreateFalseAndInventoryInstanceVsHoldingAndDeleteHoldingAndPiece.
@Test
void shouldUpdateLineQuantityIfPoLineIsNotPackageAndManualPieceCreateFalseAndInventoryInstanceVsHoldingAndDeleteHoldingAndPiece() throws ExecutionException, InterruptedException {
String orderId = UUID.randomUUID().toString();
String holdingId = UUID.randomUUID().toString();
String lineId = UUID.randomUUID().toString();
String itemId = UUID.randomUUID().toString();
String locationId = UUID.randomUUID().toString();
JsonObject holding = new JsonObject();
holding.put(ID, holdingId);
holding.put(HOLDING_PERMANENT_LOCATION_ID, locationId);
JsonObject item = new JsonObject().put(ID, itemId);
item.put(ITEM_STATUS, new JsonObject().put(ITEM_STATUS_NAME, ItemStatus.ON_ORDER.value()));
Piece piece = new Piece().withId(UUID.randomUUID().toString()).withPoLineId(lineId).withHoldingId(holdingId).withFormat(Piece.Format.ELECTRONIC);
Location loc = new Location().withHoldingId(holdingId).withQuantityElectronic(1).withQuantity(1);
Cost cost = new Cost().withQuantityElectronic(1).withListUnitPriceElectronic(1d).withExchangeRate(1d).withCurrency("USD").withPoLineEstimatedPrice(1d);
PoLine poLine = new PoLine().withIsPackage(false).withCheckinItems(false).withOrderFormat(PoLine.OrderFormat.ELECTRONIC_RESOURCE).withEresource(new Eresource().withCreateInventory(Eresource.CreateInventory.INSTANCE_HOLDING)).withPurchaseOrderId(orderId).withId(lineId).withLocations(List.of(loc)).withCost(cost);
PurchaseOrder purchaseOrder = new PurchaseOrder().withId(orderId).withWorkflowStatus(PurchaseOrder.WorkflowStatus.OPEN);
doReturn(completedFuture(piece)).when(pieceStorageService).getPieceById(piece.getId(), requestContext);
doReturn(completedFuture(null)).when(protectionService).isOperationRestricted(any(List.class), any(ProtectedOperationType.class), eq(requestContext));
doReturn(completedFuture(null)).when(pieceStorageService).deletePiece(eq(piece.getId()), eq(true), eq(requestContext));
doReturn(completedFuture(null)).when(inventoryManager).getNumberOfRequestsByItemId(eq(piece.getItemId()), eq(requestContext));
doReturn(completedFuture(holding)).when(inventoryManager).getHoldingById(holdingId, requestContext);
doReturn(completedFuture(null)).when(inventoryManager).getItemsByHoldingId(holdingId, requestContext);
doReturn(completedFuture(null)).when(inventoryManager).deleteHoldingById(piece.getHoldingId(), true, requestContext);
doReturn(completedFuture(null)).when(inventoryManager).getItemRecordById(itemId, true, requestContext);
doReturn(completedFuture(null)).when(inventoryManager).deleteItem(itemId, true, requestContext);
doReturn(completedFuture(holding)).when(inventoryManager).getHoldingById(holdingId, true, requestContext);
doReturn(completedFuture(null)).when(pieceUpdateInventoryService).deleteHoldingConnectedToPiece(piece, requestContext);
doReturn(completedFuture(new ArrayList())).when(inventoryManager).getItemsByHoldingId(holdingId, requestContext);
final ArgumentCaptor<PieceDeletionHolder> PieceDeletionHolderCapture = ArgumentCaptor.forClass(PieceDeletionHolder.class);
doAnswer((Answer<CompletableFuture<Void>>) invocation -> {
PieceDeletionHolder answerHolder = invocation.getArgument(0);
answerHolder.withOrderInformation(purchaseOrder, poLine);
return completedFuture(null);
}).when(basePieceFlowHolderBuilder).updateHolderWithOrderInformation(PieceDeletionHolderCapture.capture(), eq(requestContext));
final ArgumentCaptor<PieceDeletionHolder> pieceDeletionHolderCapture = ArgumentCaptor.forClass(PieceDeletionHolder.class);
doReturn(completedFuture(null)).when(pieceDeleteFlowPoLineService).updatePoLine(pieceDeletionHolderCapture.capture(), eq(requestContext));
// When
pieceDeleteFlowManager.deletePiece(piece.getId(), true, requestContext).get();
// Then
PieceDeletionHolder holder = PieceDeletionHolderCapture.getValue();
verify(pieceStorageService).deletePiece(eq(piece.getId()), eq(true), eq(requestContext));
verify(inventoryManager, times(0)).deleteItem(itemId, true, requestContext);
verify(pieceUpdateInventoryService).deleteHoldingConnectedToPiece(piece, requestContext);
verify(pieceStorageService, times(1)).deletePiece(eq(piece.getId()), eq(true), eq(requestContext));
verify(pieceDeleteFlowPoLineService).updatePoLine(pieceDeletionHolderCapture.capture(), eq(requestContext));
verify(basePieceFlowHolderBuilder).updateHolderWithOrderInformation(holder, requestContext);
}
use of org.folio.TestConstants.ID in project mod-orders by folio-org.
the class PieceDeleteFlowManagerTest method shouldNotUpdateLineQuantityIfPoLineIsPackageAndShouldDeleteHoldingAndItemAndPiece.
@Test
void shouldNotUpdateLineQuantityIfPoLineIsPackageAndShouldDeleteHoldingAndItemAndPiece() throws ExecutionException, InterruptedException {
String orderId = UUID.randomUUID().toString();
String holdingId = UUID.randomUUID().toString();
String lineId = UUID.randomUUID().toString();
String titleId = UUID.randomUUID().toString();
String itemId = UUID.randomUUID().toString();
String locationId = UUID.randomUUID().toString();
JsonObject item = new JsonObject().put(ID, itemId);
item.put(ITEM_STATUS, new JsonObject().put(ITEM_STATUS_NAME, ItemStatus.ON_ORDER.value()));
JsonObject holding = new JsonObject().put(ID, holdingId);
holding.put(HOLDING_PERMANENT_LOCATION_ID, locationId);
Piece piece = new Piece().withId(UUID.randomUUID().toString()).withPoLineId(lineId).withItemId(itemId).withTitleId(titleId).withHoldingId(holdingId).withFormat(Piece.Format.ELECTRONIC);
Cost cost = new Cost().withQuantityElectronic(1).withListUnitPriceElectronic(1d).withExchangeRate(1d).withCurrency("USD").withPoLineEstimatedPrice(1d);
Location loc = new Location().withHoldingId(holdingId).withQuantityElectronic(1).withQuantity(1);
PoLine poLine = new PoLine().withIsPackage(true).withPurchaseOrderId(orderId).withId(lineId).withLocations(List.of(loc)).withCost(cost);
PurchaseOrder purchaseOrder = new PurchaseOrder().withId(orderId).withWorkflowStatus(PurchaseOrder.WorkflowStatus.OPEN);
doReturn(completedFuture(piece)).when(pieceStorageService).getPieceById(piece.getId(), requestContext);
doReturn(completedFuture(null)).when(protectionService).isOperationRestricted(any(List.class), any(ProtectedOperationType.class), eq(requestContext));
doReturn(completedFuture(null)).when(pieceStorageService).deletePiece(eq(piece.getId()), eq(true), eq(requestContext));
doReturn(completedFuture(null)).when(inventoryManager).getNumberOfRequestsByItemId(eq(piece.getItemId()), eq(requestContext));
doReturn(completedFuture(item)).when(inventoryManager).getItemRecordById(itemId, true, requestContext);
doReturn(completedFuture(null)).when(inventoryManager).deleteItem(itemId, true, requestContext);
final ArgumentCaptor<PieceDeletionHolder> PieceDeletionHolderCapture = ArgumentCaptor.forClass(PieceDeletionHolder.class);
doAnswer((Answer<CompletableFuture<Void>>) invocation -> {
PieceDeletionHolder answerHolder = invocation.getArgument(0);
answerHolder.withOrderInformation(purchaseOrder, poLine);
return completedFuture(null);
}).when(basePieceFlowHolderBuilder).updateHolderWithOrderInformation(PieceDeletionHolderCapture.capture(), eq(requestContext));
doReturn(completedFuture(holding)).when(inventoryManager).getHoldingById(holdingId, true, requestContext);
doReturn(completedFuture(null)).when(pieceUpdateInventoryService).deleteHoldingConnectedToPiece(piece, requestContext);
doReturn(completedFuture(new ArrayList())).when(inventoryManager).getItemsByHoldingId(holdingId, requestContext);
final ArgumentCaptor<PieceDeletionHolder> pieceDeletionHolderCapture = ArgumentCaptor.forClass(PieceDeletionHolder.class);
doReturn(completedFuture(null)).when(pieceDeleteFlowPoLineService).updatePoLine(pieceDeletionHolderCapture.capture(), eq(requestContext));
// When
pieceDeleteFlowManager.deletePiece(piece.getId(), true, requestContext).get();
// Then
PieceDeletionHolder holder = PieceDeletionHolderCapture.getValue();
assertNull(poLine.getLocations().get(0).getLocationId());
assertEquals(holdingId, poLine.getLocations().get(0).getHoldingId());
verify(pieceStorageService).deletePiece(eq(piece.getId()), eq(true), eq(requestContext));
verify(pieceUpdateInventoryService).deleteHoldingConnectedToPiece(piece, requestContext);
// Then
assertNull(poLine.getLocations().get(0).getLocationId());
assertEquals(holdingId, poLine.getLocations().get(0).getHoldingId());
verify(pieceDeleteFlowPoLineService, times(0)).updatePoLine(pieceDeletionHolderCapture.capture(), eq(requestContext));
verify(basePieceFlowHolderBuilder).updateHolderWithOrderInformation(holder, requestContext);
}
Aggregations