From abe26d12ba5ef9141dbceeb794f96ef1b90f02a1 Mon Sep 17 00:00:00 2001 From: Adesegun Adedeji <135996693+aadedejifearless@users.noreply.github.com> Date: Thu, 7 Dec 2023 15:09:11 -0500 Subject: [PATCH] BFD-3064: Updated test and PatientProviderResource classes IRT 404 err. (#2081) --- .../providers/R4PatientResourceProvider.java | 27 ++++++----- .../providers/PatientResourceProvider.java | 27 ++++++----- .../cms/bfd/server/war/PatientE2EBase.java | 46 +++++++++++++++++-- .../server/war/stu3/providers/PatientE2E.java | 38 ++++++++++++++- 4 files changed, 110 insertions(+), 28 deletions(-) diff --git a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/R4PatientResourceProvider.java b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/R4PatientResourceProvider.java index de0cd9c83e..1fe77a4aa4 100644 --- a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/R4PatientResourceProvider.java +++ b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/r4/providers/R4PatientResourceProvider.java @@ -19,6 +19,7 @@ import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.Timer; import com.google.common.base.Strings; +import com.google.common.collect.ImmutableList; import com.newrelic.api.agent.Trace; import gov.cms.bfd.model.codebook.data.CcwCodebookVariable; import gov.cms.bfd.model.rif.entities.Beneficiary; @@ -50,7 +51,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; import javax.persistence.EntityManager; @@ -907,24 +907,27 @@ private Patient queryDatabaseByHash( matchingBenes.size()); } - // Then, if we found more than one distinct BENE_ID, or none, throw an error. - long distinctBeneIds = + List distinctBeneIds = matchingBenes.stream() .map(Beneficiary::getBeneficiaryId) - .filter(Objects::nonNull) .distinct() - .count(); - Beneficiary beneficiary = null; - if (distinctBeneIds <= 0) { + .sorted() + .collect(ImmutableList.toImmutableList()); + + Beneficiary beneficiary; + if (distinctBeneIds.size() == 0) { throw new NoResultException(); - } else if (distinctBeneIds > 1) { + } else if (distinctBeneIds.size() > 1) { BfdMDC.put( - "database_query_by_hash_collision_distinct_bene_ids", Long.toString(distinctBeneIds)); + "database_query_by_hash_collision_distinct_bene_ids", + Long.toString(distinctBeneIds.size())); throw new ResourceNotFoundException( - "By hash query found more than one distinct BENE_ID: " + Long.toString(distinctBeneIds)); - } else if (distinctBeneIds == 1) { - beneficiary = matchingBenes.get(0); + "By hash query found more than one distinct BENE_ID: " + + distinctBeneIds.size() + + ", DistinctBeneIdsList: " + + distinctBeneIds); } + beneficiary = matchingBenes.get(0); // Null out the unhashed HICNs; in v2 we are ignoring HICNs beneficiary.setHicnUnhashed(Optional.empty()); diff --git a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/PatientResourceProvider.java b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/PatientResourceProvider.java index 25501285f8..5051fea938 100644 --- a/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/PatientResourceProvider.java +++ b/apps/bfd-server/bfd-server-war/src/main/java/gov/cms/bfd/server/war/stu3/providers/PatientResourceProvider.java @@ -19,6 +19,7 @@ import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.Timer; import com.google.common.base.Strings; +import com.google.common.collect.ImmutableList; import com.newrelic.api.agent.Trace; import gov.cms.bfd.model.codebook.data.CcwCodebookVariable; import gov.cms.bfd.model.rif.entities.Beneficiary; @@ -50,7 +51,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; import javax.persistence.EntityManager; @@ -932,24 +932,29 @@ private Patient queryDatabaseByHash( } // Then, if we found more than one distinct BENE_ID, or none, throw an error. - long distinctBeneIds = + List distinctBeneIds = matchingBenes.stream() .map(Beneficiary::getBeneficiaryId) - .filter(Objects::nonNull) .distinct() - .count(); - Beneficiary beneficiary = null; - if (distinctBeneIds <= 0) { + .sorted() + .collect(ImmutableList.toImmutableList()); + + Beneficiary beneficiary; + if (distinctBeneIds.size() == 0) { throw new NoResultException(); - } else if (distinctBeneIds > 1) { + } else if (distinctBeneIds.size() > 1) { BfdMDC.put( - "database_query_by_hash_collision_distinct_bene_ids", Long.toString(distinctBeneIds)); + "database_query_by_hash_collision_distinct_bene_ids", + Long.toString(distinctBeneIds.size())); throw new ResourceNotFoundException( - "By hash query found more than one distinct BENE_ID: " + Long.toString(distinctBeneIds)); - } else if (distinctBeneIds == 1) { - beneficiary = matchingBenes.get(0); + "By hash query found more than one distinct BENE_ID: " + + distinctBeneIds.size() + + ", DistinctBeneIdsList: " + + distinctBeneIds); } + beneficiary = matchingBenes.get(0); + // Null out the unhashed HICNs if we're not supposed to be returning them if (!requestHeader.isHICNinIncludeIdentifiers()) { beneficiary.setHicnUnhashed(Optional.empty()); diff --git a/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/PatientE2EBase.java b/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/PatientE2EBase.java index 27491414be..22b2b9a0c8 100644 --- a/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/PatientE2EBase.java +++ b/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/PatientE2EBase.java @@ -27,6 +27,8 @@ import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; import java.util.stream.Stream; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; @@ -160,9 +162,22 @@ public void testPatientByIdentifierWhenMbiHashWithBeneDupesExpect404() { // bene ids List loadedRecords = loadDataWithAdditionalBeneHistory(); // history has the same mbi, so returns the same hash; - // basically second param doesnt matter for this test + // basically second param doesn't matter for this test String mbiHash = getMbiHash(currentMbi, false, loadedRecords); + Map, List> beneficiaryMap = + loadedRecords.stream() + .filter(Beneficiary.class::isInstance) + .map(Beneficiary.class::cast) + .collect(Collectors.groupingBy(Beneficiary::getMbiHash)); + + List distinctBeneIdList = + beneficiaryMap.get(Optional.of(mbiHash)).stream() + .map(Beneficiary::getBeneficiaryId) + .distinct() + .sorted() + .toList(); + String requestString = patientEndpoint + "?identifier=" @@ -177,7 +192,13 @@ public void testPatientByIdentifierWhenMbiHashWithBeneDupesExpect404() { .expect() .statusCode(404) .body("issue.severity", hasItem("error")) - .body("issue.diagnostics", hasItem("By hash query found more than one distinct BENE_ID: 5")) + .body( + "issue.diagnostics", + hasItem( + "By hash query found more than one distinct BENE_ID: " + + distinctBeneIdList.size() + + ", DistinctBeneIdsList: " + + distinctBeneIdList)) .when() .get(requestString); } @@ -193,6 +214,19 @@ public void testPatientByIdentifierWhenMbiHashWithHistoryBeneDupesExpect404() { List loadedRecords = loadDataWithAdditionalBeneHistory(); String mbiHash = getMbiHash("DUPHISTMBI", true, loadedRecords); + Map, List> beneficiaryMap = + loadedRecords.stream() + .filter(BeneficiaryHistory.class::isInstance) + .map(BeneficiaryHistory.class::cast) + .distinct() + .collect(Collectors.groupingBy(BeneficiaryHistory::getMbiHash)); + + List distinctBeneIdList = + beneficiaryMap.get(Optional.of(mbiHash)).stream() + .map(BeneficiaryHistory::getBeneficiaryId) + .sorted() + .toList(); + String requestString = patientEndpoint + "?identifier=" @@ -207,7 +241,13 @@ public void testPatientByIdentifierWhenMbiHashWithHistoryBeneDupesExpect404() { .expect() .statusCode(404) .body("issue.severity", hasItem("error")) - .body("issue.diagnostics", hasItem("By hash query found more than one distinct BENE_ID: 2")) + .body( + "issue.diagnostics", + hasItem( + "By hash query found more than one distinct BENE_ID: " + + distinctBeneIdList.size() + + ", DistinctBeneIdsList: " + + distinctBeneIdList)) .when() .get(requestString); } diff --git a/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/stu3/providers/PatientE2E.java b/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/stu3/providers/PatientE2E.java index ed154d08d6..60ad485117 100644 --- a/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/stu3/providers/PatientE2E.java +++ b/apps/bfd-server/bfd-server-war/src/test/java/gov/cms/bfd/server/war/stu3/providers/PatientE2E.java @@ -22,6 +22,7 @@ import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import java.util.stream.Stream; import org.hamcrest.Matcher; import org.hl7.fhir.dstu3.model.Patient; @@ -435,6 +436,15 @@ public void testPatientByIdentifierWhenMbiHashWithBeneDupesExpect404() { // basically second param doesnt matter for this test String hicnHash = getHicnHash("543217066U", false, loadedRecords); + Map> beneficiaryMap = + loadedRecords.stream() + .filter(Beneficiary.class::isInstance) + .map(Beneficiary.class::cast) + .collect(Collectors.groupingBy(Beneficiary::getHicn)); + + List distinctBeneIdList = + beneficiaryMap.get(hicnHash).stream().map(Beneficiary::getBeneficiaryId).sorted().toList(); + String requestString = patientEndpoint + "?identifier=" @@ -449,7 +459,13 @@ public void testPatientByIdentifierWhenMbiHashWithBeneDupesExpect404() { .expect() .statusCode(404) .body("issue.severity", hasItem("error")) - .body("issue.diagnostics", hasItem("By hash query found more than one distinct BENE_ID: 5")) + .body( + "issue.diagnostics", + hasItem( + "By hash query found more than one distinct BENE_ID: " + + distinctBeneIdList.size() + + ", DistinctBeneIdsList: " + + distinctBeneIdList)) .when() .get(requestString); } @@ -466,6 +482,18 @@ public void testPatientByIdentifierWhenHicnHashWithHistoryBeneDupesExpect404() { List loadedRecords = loadDataWithAdditionalBeneHistory(); String hicnHash = getHicnHash("DUPHISTHIC", true, loadedRecords); + Map> beneficiaryMap = + loadedRecords.stream() + .filter(BeneficiaryHistory.class::isInstance) + .map(BeneficiaryHistory.class::cast) + .collect(Collectors.groupingBy(BeneficiaryHistory::getHicn)); + + List distinctBeneIdList = + beneficiaryMap.get(hicnHash).stream() + .map(BeneficiaryHistory::getBeneficiaryId) + .sorted() + .toList(); + String requestString = patientEndpoint + "?identifier=" @@ -480,7 +508,13 @@ public void testPatientByIdentifierWhenHicnHashWithHistoryBeneDupesExpect404() { .expect() .statusCode(404) .body("issue.severity", hasItem("error")) - .body("issue.diagnostics", hasItem("By hash query found more than one distinct BENE_ID: 2")) + .body( + "issue.diagnostics", + hasItem( + "By hash query found more than one distinct BENE_ID: " + + distinctBeneIdList.size() + + ", DistinctBeneIdsList: " + + distinctBeneIdList)) .when() .get(requestString); }