diff --git a/descriptors/ModuleDescriptor-template.json b/descriptors/ModuleDescriptor-template.json index b97e481a6..6ec2c222a 100644 --- a/descriptors/ModuleDescriptor-template.json +++ b/descriptors/ModuleDescriptor-template.json @@ -326,6 +326,7 @@ "orders-storage.po-lines.item.get", "orders-storage.po-lines.item.put", "orders-storage.pieces.collection.get", + "orders-storage.batch-tracking.item.post", "user-tenants.collection.get", "consortia.sharing-instances.item.post", "orders-storage.settings.collection.get", @@ -1484,6 +1485,10 @@ "id": "orders-storage.settings", "version": "1.0" }, + { + "id": "orders-storage.batch-tracking", + "version": "1.0" + }, { "id": "circulation", "version": "10.0 11.0 12.0 13.0 14.0" diff --git a/ramls/acq-models b/ramls/acq-models index 235212c05..71606aaae 160000 --- a/ramls/acq-models +++ b/ramls/acq-models @@ -1 +1 @@ -Subproject commit 235212c0511be95a01b653161f7e0355b3f6147c +Subproject commit 71606aaae02be23bba3d6b6bffb7109a71c91484 diff --git a/src/main/java/org/folio/config/ApplicationConfig.java b/src/main/java/org/folio/config/ApplicationConfig.java index 727806bbf..70046177f 100644 --- a/src/main/java/org/folio/config/ApplicationConfig.java +++ b/src/main/java/org/folio/config/ApplicationConfig.java @@ -27,6 +27,7 @@ import org.folio.service.SuffixService; import org.folio.service.TagService; import org.folio.service.UserService; +import org.folio.service.batch.BatchTrackingService; import org.folio.service.caches.CommonSettingsCache; import org.folio.service.caches.ExportConfigsCache; import org.folio.service.caches.InventoryCache; @@ -849,9 +850,10 @@ OrderLineUpdateInstanceStrategy withHoldingOrderLineUpdateInstanceStrategy(Inven InventoryItemManager inventoryItemManager, InventoryHoldingManager inventoryHoldingManager, PieceStorageService pieceStorageService, - PurchaseOrderLineService purchaseOrderLineService) { + PurchaseOrderLineService purchaseOrderLineService, + BatchTrackingService batchTrackingService) { return new WithHoldingOrderLineUpdateInstanceStrategy(inventoryInstanceManager, inventoryItemManager, - inventoryHoldingManager, pieceStorageService, purchaseOrderLineService); + inventoryHoldingManager, pieceStorageService, purchaseOrderLineService, batchTrackingService); } @Bean @@ -922,4 +924,9 @@ OrderFiscalYearService orderFiscalYearService(TransactionService transactionServ FundService fundService, PurchaseOrderStorageService purchaseOrderStorageService) { return new OrderFiscalYearService(transactionService, fiscalYearService, fundService, purchaseOrderStorageService); } + + @Bean + BatchTrackingService batchTrackingService(RestClient restClient) { + return new BatchTrackingService(restClient); + } } diff --git a/src/main/java/org/folio/orders/utils/ResourcePathResolver.java b/src/main/java/org/folio/orders/utils/ResourcePathResolver.java index e5e316754..4a6e9daac 100644 --- a/src/main/java/org/folio/orders/utils/ResourcePathResolver.java +++ b/src/main/java/org/folio/orders/utils/ResourcePathResolver.java @@ -22,6 +22,7 @@ public class ResourcePathResolver { public static final String ACQUISITIONS_UNITS = "acquisitionsUnits"; public static final String ACQUISITION_METHODS = "acquisitionMethods"; public static final String ACQUISITIONS_MEMBERSHIPS = "acquisitionsMemberships"; + public static final String BATCH_TRACKING = "batchTracking"; public static final String PURCHASE_ORDER_STORAGE = "purchaseOrder"; public static final String PIECES_STORAGE = "pieces"; public static final String PIECES_STORAGE_BATCH = "pieces-batch"; @@ -73,6 +74,7 @@ public class ResourcePathResolver { apis.put(ACQUISITIONS_UNITS, "/acquisitions-units-storage/units"); apis.put(ACQUISITION_METHODS, "/orders-storage/acquisition-methods"); apis.put(ACQUISITIONS_MEMBERSHIPS, "/acquisitions-units-storage/memberships"); + apis.put(BATCH_TRACKING, "/orders-storage/batch-tracking"); apis.put(PO_LINES_STORAGE, "/orders-storage/po-lines"); apis.put(PO_LINES_BATCH_STORAGE, "/orders-storage/po-lines-batch"); apis.put(PO_LINES_BUSINESS, "/orders/order-lines"); diff --git a/src/main/java/org/folio/service/batch/BatchTrackingService.java b/src/main/java/org/folio/service/batch/BatchTrackingService.java new file mode 100644 index 000000000..a046678f2 --- /dev/null +++ b/src/main/java/org/folio/service/batch/BatchTrackingService.java @@ -0,0 +1,33 @@ +package org.folio.service.batch; + +import io.vertx.core.Future; +import lombok.AllArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.folio.rest.acq.model.BatchTracking; +import org.folio.rest.core.RestClient; +import org.folio.rest.core.models.RequestContext; +import org.folio.rest.core.models.RequestEntry; + +import static org.folio.orders.utils.ResourcePathResolver.BATCH_TRACKING; +import static org.folio.orders.utils.ResourcePathResolver.resourcesPath; + +@Log4j2 +@AllArgsConstructor +public class BatchTrackingService { + + private static final String BATCH_TRACKING_HEADER = "X-Batch-Tracking-Id"; + private static final String BATCH_TRACKING_ENDPOINT = resourcesPath(BATCH_TRACKING); + + protected final RestClient restClient; + + public Future createBatchTrackingRecord(String id, int totalRecords, RequestContext requestContext) { + var batchTracking = new BatchTracking().withId(id).withTotalRecords(totalRecords); + var requestEntry = new RequestEntry(BATCH_TRACKING_ENDPOINT); + return restClient.post(requestEntry, batchTracking, BatchTracking.class, requestContext) + .map(tracking -> requestContext.getHeaders().put(BATCH_TRACKING_HEADER, tracking.getId())) // Add the batch tracking ID to the request headers for downstream services to use. + .onFailure(t -> log.error("Failed to create batch tracking record for batchId: {}", batchTracking.getId(), t)) + .recover(t -> Future.succeededFuture()) // In case of failure, we return a succeeded future to avoid failing the entire batch process. + .mapEmpty(); + } + +} diff --git a/src/main/java/org/folio/service/orders/lines/update/instance/WithHoldingOrderLineUpdateInstanceStrategy.java b/src/main/java/org/folio/service/orders/lines/update/instance/WithHoldingOrderLineUpdateInstanceStrategy.java index 4d48a34ac..972e90f0f 100644 --- a/src/main/java/org/folio/service/orders/lines/update/instance/WithHoldingOrderLineUpdateInstanceStrategy.java +++ b/src/main/java/org/folio/service/orders/lines/update/instance/WithHoldingOrderLineUpdateInstanceStrategy.java @@ -20,6 +20,7 @@ import org.folio.rest.jaxrs.model.Piece; import org.folio.rest.jaxrs.model.ReplaceInstanceRef; import org.folio.rest.tools.utils.TenantTool; +import org.folio.service.batch.BatchTrackingService; import org.folio.service.inventory.InventoryHoldingManager; import org.folio.service.inventory.InventoryInstanceManager; import org.folio.service.inventory.InventoryItemManager; @@ -33,6 +34,7 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.UUID; import java.util.function.Function; import java.util.stream.Collectors; @@ -56,15 +58,18 @@ public class WithHoldingOrderLineUpdateInstanceStrategy extends BaseOrderLineUpd private final PieceStorageService pieceStorageService; private final PurchaseOrderLineService purchaseOrderLineService; + private final BatchTrackingService batchTrackingService; public WithHoldingOrderLineUpdateInstanceStrategy(InventoryInstanceManager inventoryInstanceManager, InventoryItemManager inventoryItemManager, InventoryHoldingManager inventoryHoldingManager, PieceStorageService pieceStorageService, - PurchaseOrderLineService purchaseOrderLineService) { + PurchaseOrderLineService purchaseOrderLineService, + BatchTrackingService batchTrackingService) { super(inventoryInstanceManager, inventoryItemManager, inventoryHoldingManager); this.pieceStorageService = pieceStorageService; this.purchaseOrderLineService = purchaseOrderLineService; + this.batchTrackingService = batchTrackingService; } Future processHoldings(OrderLineUpdateInstanceHolder holder, RequestContext requestContext) { @@ -233,6 +238,7 @@ private Future>> retrieveProcessableLocations(OrderLi private Future updateItemsHolding(String holdingId, String newHoldingId, String poLineId, RequestContext requestContext) { return inventoryItemManager.getItemsByHoldingIdAndOrderLineId(holdingId, poLineId, requestContext) + .compose(items -> batchTrackingService.createBatchTrackingRecord(UUID.randomUUID().toString(), items.size(), requestContext).map(items)) .compose(items -> updateItemsInInventory(items, newHoldingId, requestContext)) .onSuccess(v -> log.info("updateItemsHolding:: existing items for holdingId: {} have been updated with new holdingId: {}", holdingId, newHoldingId)) .onFailure(e -> log.error("Failed to update items for holdingId: {} with new holdingId: {}", holdingId, newHoldingId, e)); diff --git a/src/test/java/org/folio/ApiTestSuite.java b/src/test/java/org/folio/ApiTestSuite.java index a2aae86d2..e5a5338dd 100644 --- a/src/test/java/org/folio/ApiTestSuite.java +++ b/src/test/java/org/folio/ApiTestSuite.java @@ -51,6 +51,7 @@ import org.folio.service.SuffixServiceTest; import org.folio.service.TagServiceTest; import org.folio.service.UserServiceTest; +import org.folio.service.batch.BatchTrackingServiceTest; import org.folio.service.consortium.ConsortiumConfigurationServiceTest; import org.folio.service.consortium.SharingInstanceServiceTest; import org.folio.service.exchange.CacheableExchangeRateServiceTest; @@ -595,4 +596,8 @@ class CacheableExchangeRateServiceTestNested extends CacheableExchangeRateServic @Nested class EncumbranceUtilsNestest extends EncumbranceUtilsTest { } + + @Nested + class BatchTrackingServiceTestNested extends BatchTrackingServiceTest { + } } diff --git a/src/test/java/org/folio/rest/impl/MockServer.java b/src/test/java/org/folio/rest/impl/MockServer.java index 56508ed6f..325dc90bb 100644 --- a/src/test/java/org/folio/rest/impl/MockServer.java +++ b/src/test/java/org/folio/rest/impl/MockServer.java @@ -60,6 +60,7 @@ import static org.folio.orders.utils.ResourcePathResolver.ACQUISITIONS_MEMBERSHIPS; import static org.folio.orders.utils.ResourcePathResolver.ACQUISITIONS_UNITS; import static org.folio.orders.utils.ResourcePathResolver.ACQUISITION_METHODS; +import static org.folio.orders.utils.ResourcePathResolver.BATCH_TRACKING; import static org.folio.orders.utils.ResourcePathResolver.BUDGETS; import static org.folio.orders.utils.ResourcePathResolver.CONFIGURATION_ENTRIES; import static org.folio.orders.utils.ResourcePathResolver.CURRENT_BUDGET; @@ -170,6 +171,7 @@ import org.folio.OrganizationCollection; import org.folio.helper.BaseHelper; import org.folio.rest.RestVerticle; +import org.folio.rest.acq.model.BatchTracking; import org.folio.rest.acq.model.OrderInvoiceRelationshipCollection; import org.folio.rest.acq.model.Piece; import org.folio.rest.acq.model.PieceCollection; @@ -626,6 +628,7 @@ private Router defineRoutes() { router.post(resourcesPath(TAGS)).handler(ctx -> handlePostGenericSubObj(ctx, TAGS)); router.post(resourcesPath(DATA_EXPORT_SPRING_CREATE_JOB)).handler(ctx -> handlePostGenericSubObj(ctx, DATA_EXPORT_SPRING_CREATE_JOB)); router.post(resourcesPath(DATA_EXPORT_SPRING_EXECUTE_JOB)).handler(ctx -> handlePostGenericSubObj(ctx, DATA_EXPORT_SPRING_EXECUTE_JOB)); + router.post(resourcesPath(BATCH_TRACKING)).handler(ctx -> handlePostGenericSubObj(ctx, BATCH_TRACKING)); // GET router.get(resourcePath(PURCHASE_ORDER_STORAGE)).handler(this::handleGetPurchaseOrderById); router.get(resourcesPath(PURCHASE_ORDER_STORAGE)).handler(this::handleGetPurchaseOrderByQuery); @@ -2514,6 +2517,7 @@ private Class getSubObjClass(String subObj) { case SUFFIXES -> Suffix.class; case TAGS -> Tag.class; case DATA_EXPORT_SPRING_CREATE_JOB, DATA_EXPORT_SPRING_EXECUTE_JOB -> Object.class; + case BATCH_TRACKING -> BatchTracking.class; default -> { fail("The sub-object is unknown"); yield null; diff --git a/src/test/java/org/folio/service/batch/BatchTrackingServiceTest.java b/src/test/java/org/folio/service/batch/BatchTrackingServiceTest.java new file mode 100644 index 000000000..44c4212c8 --- /dev/null +++ b/src/test/java/org/folio/service/batch/BatchTrackingServiceTest.java @@ -0,0 +1,91 @@ +package org.folio.service.batch; + +import static io.vertx.core.Future.failedFuture; +import static io.vertx.core.Future.succeededFuture; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.when; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import io.vertx.core.Future; +import io.vertx.junit5.VertxExtension; +import io.vertx.junit5.VertxTestContext; +import org.folio.CopilotGenerated; +import org.folio.rest.acq.model.BatchTracking; +import org.folio.rest.core.RestClient; +import org.folio.rest.core.models.RequestContext; +import org.folio.rest.core.models.RequestEntry; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.junit.jupiter.MockitoExtension; + +@CopilotGenerated(model = "Claude Opus 4.5") +@ExtendWith({ VertxExtension.class, MockitoExtension.class }) +public class BatchTrackingServiceTest { + + private static final String BATCH_TRACKING_HEADER = "X-Batch-Tracking-Id"; + + @InjectMocks + private BatchTrackingService batchTrackingService; + @Mock + private RestClient restClient; + @Mock + private RequestContext requestContext; + + @Test + void shouldCreateBatchTrackingRecordAndPopulateHeader(VertxTestContext vertxTestContext) { + // Given + String batchId = UUID.randomUUID().toString(); + int totalRecords = 10; + Map headers = new HashMap<>(); + BatchTracking createdBatchTracking = new BatchTracking().withId(batchId).withTotalRecords(totalRecords); + + when(requestContext.getHeaders()).thenReturn(headers); + doReturn(succeededFuture(createdBatchTracking)) + .when(restClient).post(any(RequestEntry.class), any(BatchTracking.class), eq(BatchTracking.class), eq(requestContext)); + + // When + Future future = batchTrackingService.createBatchTrackingRecord(batchId, totalRecords, requestContext); + + // Then + vertxTestContext.assertComplete(future) + .onComplete(result -> { + assertTrue(result.succeeded()); + assertEquals(batchId, headers.get(BATCH_TRACKING_HEADER)); + vertxTestContext.completeNow(); + }); + } + + @Test + void shouldReturnSucceededFutureWhenRestClientFails(VertxTestContext vertxTestContext) { + // Given + String batchId = UUID.randomUUID().toString(); + int totalRecords = 5; + + doReturn(failedFuture(new RuntimeException("Connection error"))) + .when(restClient).post(any(RequestEntry.class), any(BatchTracking.class), eq(BatchTracking.class), eq(requestContext)); + + // When + Future future = batchTrackingService.createBatchTrackingRecord(batchId, totalRecords, requestContext); + + // Then + vertxTestContext.assertComplete(future) + .onComplete(result -> { + assertTrue(result.succeeded()); + vertxTestContext.completeNow(); + }); + } + +} + diff --git a/src/test/java/org/folio/service/orders/lines/update/OrderLineUpdateInstanceHandlerTest.java b/src/test/java/org/folio/service/orders/lines/update/OrderLineUpdateInstanceHandlerTest.java index 74ee31cbc..bb914578d 100644 --- a/src/test/java/org/folio/service/orders/lines/update/OrderLineUpdateInstanceHandlerTest.java +++ b/src/test/java/org/folio/service/orders/lines/update/OrderLineUpdateInstanceHandlerTest.java @@ -33,6 +33,7 @@ import org.folio.rest.jaxrs.model.ReplaceInstanceRef; import org.folio.service.AcquisitionsUnitsService; import org.folio.service.ProtectionService; +import org.folio.service.batch.BatchTrackingService; import org.folio.service.caches.CommonSettingsCache; import org.folio.service.caches.InventoryCache; import org.folio.service.settings.CommonSettingsRetriever; @@ -313,9 +314,10 @@ OrderLineUpdateInstanceStrategy withHoldingOrderLineUpdateInstanceStrategy(Inven InventoryItemManager inventoryItemManager, InventoryHoldingManager inventoryHoldingManager, PieceStorageService pieceStorageService, - PurchaseOrderLineService purchaseOrderLineService) { + PurchaseOrderLineService purchaseOrderLineService, + BatchTrackingService batchTrackingService) { return new WithHoldingOrderLineUpdateInstanceStrategy(inventoryInstanceManager, inventoryItemManager, - inventoryHoldingManager, pieceStorageService, purchaseOrderLineService); + inventoryHoldingManager, pieceStorageService, purchaseOrderLineService, batchTrackingService); } @Bean @@ -333,5 +335,10 @@ OrderLineUpdateInstanceStrategyResolver updateInstanceStrategyResolver(OrderLine SettingsRetriever settingsRetriever(RestClient restClient) { return new SettingsRetriever(restClient); } + + @Bean + BatchTrackingService batchTrackingService(RestClient restClient) { + return new BatchTrackingService(restClient); + } } } diff --git a/src/test/java/org/folio/service/orders/lines/update/instance/WithHoldingOrderLineUpdateInstanceStrategyTest.java b/src/test/java/org/folio/service/orders/lines/update/instance/WithHoldingOrderLineUpdateInstanceStrategyTest.java index 069532c5c..7c153b719 100644 --- a/src/test/java/org/folio/service/orders/lines/update/instance/WithHoldingOrderLineUpdateInstanceStrategyTest.java +++ b/src/test/java/org/folio/service/orders/lines/update/instance/WithHoldingOrderLineUpdateInstanceStrategyTest.java @@ -10,6 +10,7 @@ import static org.folio.service.inventory.InventoryItemManager.ITEM_STATUS; import static org.folio.service.inventory.InventoryItemManager.ITEM_STATUS_NAME; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; @@ -38,6 +39,7 @@ import org.folio.rest.jaxrs.model.Piece; import org.folio.rest.jaxrs.model.PoLine; import org.folio.rest.jaxrs.model.ReplaceInstanceRef; +import org.folio.service.batch.BatchTrackingService; import org.folio.service.inventory.InventoryHoldingManager; import org.folio.service.inventory.InventoryInstanceManager; import org.folio.service.inventory.InventoryItemManager; @@ -75,6 +77,8 @@ public class WithHoldingOrderLineUpdateInstanceStrategyTest { @Mock private PurchaseOrderLineService purchaseOrderLineService; @Mock + private BatchTrackingService batchTrackingService; + @Mock private RequestContext requestContext; private AutoCloseable mockitoMocks; @@ -239,6 +243,7 @@ public void updateInstanceForFindOrCreateHoldingOperation() throws IOException { doReturn(succeededFuture(List.of(items.get(0)))).when(inventoryItemManager).getItemsByHoldingIdAndOrderLineId(eq(holdingIds.get(0)), eq(orderLineId), eq(requestContext)); doReturn(succeededFuture(List.of(items.get(1)))).when(inventoryItemManager).getItemsByHoldingIdAndOrderLineId(eq(holdingIds.get(1)), eq(orderLineId), eq(requestContext)); doReturn(succeededFuture(null)).when(inventoryItemManager).updateItem(any(JsonObject.class), eq(requestContext)); + doReturn(succeededFuture()).when(batchTrackingService).createBatchTrackingRecord(anyString(), anyInt(), eq(requestContext)); withHoldingOrderLineUpdateInstanceStrategy.updateInstance(orderLineUpdateInstanceHolder, requestContext).result(); @@ -292,6 +297,7 @@ public void updateInstanceAndItemsForFindOrCreateHoldingOperation() throws IOExc doReturn(succeededFuture(UUID.randomUUID().toString())).when(inventoryHoldingManager) .getOrCreateHoldingRecordByInstanceAndLocation(eq(instanceId), eq(locations.getFirst()), eq(requestContext)); doReturn(succeededFuture(List.of(item))).when(inventoryItemManager).getItemsByHoldingIdAndOrderLineId(eq(holdingId), eq(orderLineId), eq(requestContext)); + doReturn(succeededFuture()).when(batchTrackingService).createBatchTrackingRecord(anyString(), anyInt(), eq(requestContext)); doReturn(succeededFuture(null)).when(inventoryItemManager).batchUpdatePartialItems(any(), eq(requestContext)); withHoldingOrderLineUpdateInstanceStrategy.updateInstance(orderLineUpdateInstanceHolder, requestContext).result(); @@ -419,6 +425,7 @@ ITEM_STATUS, new JsonObject().put(ITEM_STATUS_NAME, ItemStatus.ON_ORDER.value()) when(inventoryItemManager.batchUpdatePartialItems(any(), eq(requestContext))).thenReturn(succeededFuture(null)); when(pieceStorageService.getPiecesByHoldingIds(holdingIds, requestContext)).thenReturn(succeededFuture(List.of(new Piece().withHoldingId(usedHoldingId)))); when(purchaseOrderLineService.getPoLinesByHoldingIds(holdingIds, requestContext)).thenReturn(succeededFuture(List.of(new PoLine().withLocations(List.of(new Location().withHoldingId(usedHoldingId)))))); + when(batchTrackingService.createBatchTrackingRecord(anyString(), anyInt(), eq(requestContext))).thenReturn(succeededFuture()); var future = withHoldingOrderLineUpdateInstanceStrategy.updateInstance(orderLineUpdateInstanceHolder, requestContext); @@ -490,6 +497,7 @@ public void updateInstanceForCreateHoldingOperation() throws IOException { .createHolding(eq(instanceId), eq(locations.get(1)), eq(requestContext)); doReturn(succeededFuture(List.of(items.get(0)))).when(inventoryItemManager).getItemsByHoldingIdAndOrderLineId(eq(holdingIds.get(0)), eq(orderLineId), eq(requestContext)); doReturn(succeededFuture(List.of(items.get(1)))).when(inventoryItemManager).getItemsByHoldingIdAndOrderLineId(eq(holdingIds.get(1)), eq(orderLineId), eq(requestContext)); + doReturn(succeededFuture()).when(batchTrackingService).createBatchTrackingRecord(anyString(), anyInt(), eq(requestContext)); doReturn(succeededFuture(null)).when(inventoryItemManager).batchUpdatePartialItems(any(), eq(requestContext)); withHoldingOrderLineUpdateInstanceStrategy.updateInstance(orderLineUpdateInstanceHolder, requestContext).result(); @@ -544,6 +552,7 @@ void updateInstanceAndItemsForCreateHoldingOperation() throws Exception { doReturn(succeededFuture(UUID.randomUUID().toString())).when(inventoryHoldingManager) .createHolding(eq(instanceId), eq(locations.getFirst()), eq(requestContext)); doReturn(succeededFuture(List.of(item))).when(inventoryItemManager).getItemsByHoldingIdAndOrderLineId(eq(holdingId), eq(orderLineId), eq(requestContext)); + doReturn(succeededFuture()).when(batchTrackingService).createBatchTrackingRecord(anyString(), anyInt(), eq(requestContext)); doReturn(succeededFuture(null)).when(inventoryItemManager).batchUpdatePartialItems(any(), eq(requestContext)); withHoldingOrderLineUpdateInstanceStrategy.updateInstance(orderLineUpdateInstanceHolder, requestContext).result(); @@ -597,6 +606,7 @@ public void updateInstanceAndItemsWithItemsNotUpdatesCorrect(VertxTestContext ve doReturn(succeededFuture(UUID.randomUUID().toString())).when(inventoryHoldingManager) .createHolding(eq(instanceId), eq(locations.getFirst()), eq(requestContext)); doReturn(succeededFuture(List.of(item))).when(inventoryItemManager).getItemsByHoldingIdAndOrderLineId(eq(holdingId), eq(orderLineId), eq(requestContext)); + doReturn(succeededFuture()).when(batchTrackingService).createBatchTrackingRecord(anyString(), anyInt(), eq(requestContext)); doReturn(Future.failedFuture(new HttpException(500, ErrorCodes.GENERIC_ERROR_CODE))).when(inventoryItemManager).batchUpdatePartialItems(any(), eq(requestContext)); vertxTestContext.assertFailure(withHoldingOrderLineUpdateInstanceStrategy.updateInstance(orderLineUpdateInstanceHolder, requestContext)) @@ -666,6 +676,7 @@ void testUpdateItemsWithMaterialTypeAndPermanentLoanType() throws IOException { doReturn(succeededFuture(UUID.randomUUID().toString())).when(inventoryHoldingManager) .createHolding(eq(instanceId), eq(locations.getFirst()), eq(requestContext)); doReturn(succeededFuture(List.of(item))).when(inventoryItemManager).getItemsByHoldingIdAndOrderLineId(eq(holdingId), eq(orderLineId), eq(requestContext)); + doReturn(succeededFuture()).when(batchTrackingService).createBatchTrackingRecord(anyString(), anyInt(), eq(requestContext)); doReturn(succeededFuture(null)).when(inventoryItemManager).batchUpdatePartialItems(any(), eq(requestContext)); // when @@ -720,6 +731,7 @@ void testUpdateItemsWithMaterialTypeOnly() throws IOException { doReturn(succeededFuture(UUID.randomUUID().toString())).when(inventoryHoldingManager) .createHolding(eq(instanceId), eq(locations.getFirst()), eq(requestContext)); doReturn(succeededFuture(List.of(item))).when(inventoryItemManager).getItemsByHoldingIdAndOrderLineId(eq(holdingId), eq(orderLineId), eq(requestContext)); + doReturn(succeededFuture()).when(batchTrackingService).createBatchTrackingRecord(anyString(), anyInt(), eq(requestContext)); doReturn(succeededFuture(null)).when(inventoryItemManager).batchUpdatePartialItems(any(), eq(requestContext)); // when @@ -774,6 +786,7 @@ void testUpdateItemsWithPermanentLoanTypeOnly() throws IOException { doReturn(succeededFuture(UUID.randomUUID().toString())).when(inventoryHoldingManager) .createHolding(eq(instanceId), eq(locations.getFirst()), eq(requestContext)); doReturn(succeededFuture(List.of(item))).when(inventoryItemManager).getItemsByHoldingIdAndOrderLineId(eq(holdingId), eq(orderLineId), eq(requestContext)); + doReturn(succeededFuture()).when(batchTrackingService).createBatchTrackingRecord(anyString(), anyInt(), eq(requestContext)); doReturn(succeededFuture(null)).when(inventoryItemManager).batchUpdatePartialItems(any(), eq(requestContext)); // when @@ -826,6 +839,7 @@ void testUpdateItemsWithoutMaterialTypeAndPermanentLoanType() throws IOException doReturn(succeededFuture(UUID.randomUUID().toString())).when(inventoryHoldingManager) .createHolding(eq(instanceId), eq(locations.getFirst()), eq(requestContext)); doReturn(succeededFuture(List.of(item))).when(inventoryItemManager).getItemsByHoldingIdAndOrderLineId(eq(holdingId), eq(orderLineId), eq(requestContext)); + doReturn(succeededFuture()).when(batchTrackingService).createBatchTrackingRecord(anyString(), anyInt(), eq(requestContext)); doReturn(succeededFuture(null)).when(inventoryItemManager).batchUpdatePartialItems(any(), eq(requestContext)); // when @@ -881,6 +895,7 @@ void testUpdateItemsWithBlankMaterialTypeAndPermanentLoanType() throws IOExcepti .createHolding(eq(instanceId), eq(locations.getFirst()), eq(requestContext)); doReturn(succeededFuture(List.of(item))).when(inventoryItemManager).getItemsByHoldingIdAndOrderLineId(eq(holdingId), eq(orderLineId), eq(requestContext)); doReturn(succeededFuture(null)).when(inventoryItemManager).batchUpdatePartialItems(any(), eq(requestContext)); + doReturn(succeededFuture()).when(batchTrackingService).createBatchTrackingRecord(anyString(), anyInt(), eq(requestContext)); // when withHoldingOrderLineUpdateInstanceStrategy.updateInstance(orderLineUpdateInstanceHolder, requestContext).result(); @@ -934,6 +949,7 @@ void testUpdateItemsWithNonJsonObjectMaterialType() throws IOException { doReturn(succeededFuture(UUID.randomUUID().toString())).when(inventoryHoldingManager) .createHolding(eq(instanceId), eq(locations.getFirst()), eq(requestContext)); doReturn(succeededFuture(List.of(item))).when(inventoryItemManager).getItemsByHoldingIdAndOrderLineId(eq(holdingId), eq(orderLineId), eq(requestContext)); + doReturn(succeededFuture()).when(batchTrackingService).createBatchTrackingRecord(anyString(), anyInt(), eq(requestContext)); doReturn(succeededFuture(null)).when(inventoryItemManager).batchUpdatePartialItems(any(), eq(requestContext)); // when