From 9bf4e598b825f8d7d97fa099fcfc4779fd1ee9d0 Mon Sep 17 00:00:00 2001 From: Matt Bemis Date: Fri, 28 Feb 2025 11:33:06 -0500 Subject: [PATCH] [JN-1636] Don't sync deactivated kits (#1513) --- .../core/service/kit/KitRequestService.java | 16 ++++++++++++ .../service/kit/KitRequestServiceTest.java | 25 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/core/src/main/java/bio/terra/pearl/core/service/kit/KitRequestService.java b/core/src/main/java/bio/terra/pearl/core/service/kit/KitRequestService.java index 9ce3c4a454..3289d4df75 100644 --- a/core/src/main/java/bio/terra/pearl/core/service/kit/KitRequestService.java +++ b/core/src/main/java/bio/terra/pearl/core/service/kit/KitRequestService.java @@ -402,6 +402,22 @@ protected String stringifyPepperAddress(PepperKitAddress kitAddress) { */ private void saveKitStatus(KitRequest kitRequest, PepperKit pepperKit, Instant pepperStatusFetchedAt) { KitRequestStatus priorStatus = kitRequest.getStatus(); + + if(priorStatus.equals(KitRequestStatus.DEACTIVATED)) { + // if the kit has been deactivated in Juniper, we no longer need to update the status + // based on what DSM thinks. this allows us to independently deactivate kits in Juniper + // without having to worry about DSM status updates. + if(!PepperKitStatus.mapToKitRequestStatus(pepperKit.getCurrentStatus()).equals(priorStatus)) { + // if the statuses don't match, log a warning so we know about the inconsistency + // this case is expected if a kit has been deactivated in Juniper but not DSM + log.warn(( + "Skipped status update for deactivated kit request %s, " + + "and statuses did not match. Juniper status: %s, DSM status: %s" + ).formatted(kitRequest.getId(), priorStatus, pepperKit.getCurrentStatus())); + } + return; + } + try { kitRequest.setExternalKit(objectMapper.writeValueAsString(pepperKit)); kitRequest.setExternalKitFetchedAt(pepperStatusFetchedAt); diff --git a/core/src/test/java/bio/terra/pearl/core/service/kit/KitRequestServiceTest.java b/core/src/test/java/bio/terra/pearl/core/service/kit/KitRequestServiceTest.java index ae2ef9f45c..42e6c0ea5f 100644 --- a/core/src/test/java/bio/terra/pearl/core/service/kit/KitRequestServiceTest.java +++ b/core/src/test/java/bio/terra/pearl/core/service/kit/KitRequestServiceTest.java @@ -206,6 +206,31 @@ void testUpdateKitStatus(TestInfo testInfo) throws Exception { assertThat(savedKit.getSentAt(), equalTo(Instant.parse(sentDate))); } + @Transactional + @Test + public void testSkipStatusUpdateForDeactivatedKit(TestInfo testInfo) throws Exception { + String testName = getTestName(testInfo); + AdminUser adminUser = adminUserFactory.buildPersisted(testName); + EnrolleeBundle enrolleeBundle = enrolleeFactory.buildWithPortalUser(testName); + Enrollee enrollee = enrolleeBundle.enrollee(); + KitType kitType = kitTypeFactory.buildPersisted(testName); + KitRequest kitRequest = kitRequestFactory.buildPersisted(testName, + enrollee, PepperKitStatus.DEACTIVATED, kitType.getId(), adminUser.getId()); + + PepperKit pepperKit = PepperKit.builder() + .juniperKitId(kitRequest.getId().toString()) + .currentStatus(PepperKitStatus.SENT.pepperString) + .build(); + when(mockPepperDSMClient.fetchKitStatus(any(), eq(kitRequest.getId()))).thenReturn(pepperKit); + + kitRequestService.syncKitStatusFromPepper(kitRequest.getId()); + + // Verify that the status was not updated + KitRequest savedKit = kitRequestDao.find(kitRequest.getId()).get(); + assertThat(savedKit.getStatus(), equalTo(KitRequestStatus.DEACTIVATED)); + verify(mockPepperDSMClient).fetchKitStatus(any(), eq(kitRequest.getId())); + } + @Transactional @Test public void testGetKitsByStudyEnvironment(TestInfo testInfo) throws Exception {