From 8c33336bc4d6dd00b32bda219b7d696568e3fba0 Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Tue, 27 Sep 2022 17:59:50 -0400 Subject: [PATCH 1/4] update brapidaoutil search method to accomodate BB --- .../java/org/breedinginsight/utilities/BrAPIDAOUtil.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/breedinginsight/utilities/BrAPIDAOUtil.java b/src/main/java/org/breedinginsight/utilities/BrAPIDAOUtil.java index dc737c131..d6c535388 100644 --- a/src/main/java/org/breedinginsight/utilities/BrAPIDAOUtil.java +++ b/src/main/java/org/breedinginsight/utilities/BrAPIDAOUtil.java @@ -53,12 +53,18 @@ public List search(Funct try { List listResult = new ArrayList<>(); - searchBody.pageSize(pageSize); + //NOTE: Because of the way Breedbase implements BrAPI searches, the page size is initially set to an + //arbitrary, large value to ensure that in the event that a 202 response is returned, the searchDbId + //stored will refer to all records of the BrAPI variable. + searchBody.pageSize(10000000); ApiResponse, Optional>> response = searchMethod.apply(searchBody); if (response.getBody().getLeft().isPresent()) { BrAPIResponse listResponse = (BrAPIResponse) response.getBody().getLeft().get(); listResult = getListResult(response); + /* NOTE: may want to check for additional pages depending on whether BrAPI standard specifies how + pagination params are handled for POST search endpoints or the corresponding endpoints in Breedbase are + changed or updated if(hasMorePages(listResponse)) { int currentPage = listResponse.getMetadata().getPagination().getCurrentPage() + 1; int totalPages = listResponse.getMetadata().getPagination().getTotalPages(); @@ -73,6 +79,7 @@ public List search(Funct currentPage++; } } + */ } else { // Hit the get endpoint until we get a response Integer accruedWait = 0; From e8c4879348a3c3ff971548a8662bdcbeed505336 Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Tue, 27 Sep 2022 18:01:30 -0400 Subject: [PATCH 2/4] create unit test for BrAPIDAOUtil.search() --- .../daos/BrAPIDAOUtilUnitTest.java | 172 ++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 src/test/java/org/breedinginsight/daos/BrAPIDAOUtilUnitTest.java diff --git a/src/test/java/org/breedinginsight/daos/BrAPIDAOUtilUnitTest.java b/src/test/java/org/breedinginsight/daos/BrAPIDAOUtilUnitTest.java new file mode 100644 index 000000000..0678f432f --- /dev/null +++ b/src/test/java/org/breedinginsight/daos/BrAPIDAOUtilUnitTest.java @@ -0,0 +1,172 @@ +package org.breedinginsight.daos; + +import com.google.gson.JsonObject; +import lombok.SneakyThrows; +import org.apache.commons.lang3.tuple.Pair; +import org.brapi.client.v2.ApiResponse; +import org.brapi.v2.model.BrAPIAcceptedSearchResponse; +import org.brapi.v2.model.BrAPIAcceptedSearchResponseResult; +import org.brapi.v2.model.BrAPIExternalReference; +import org.brapi.v2.model.germ.BrAPIGermplasm; +import org.brapi.v2.model.germ.request.BrAPIGermplasmSearchRequest; +import org.brapi.v2.model.germ.response.BrAPIGermplasmListResponse; +import org.brapi.v2.model.germ.response.BrAPIGermplasmListResponseResult; +import org.breedinginsight.model.Program; +import org.breedinginsight.utilities.BrAPIDAOUtil; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import java.lang.reflect.Field; +import java.util.*; + +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.*; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +public class BrAPIDAOUtilUnitTest { + private String referenceSource; + private BrAPIDAOUtil brAPIDAOUtil; + private List germplasm; + private Program testProgram; + private HashMap germplasmMap; + private List paginatedGermplasm; + private BrAPIGermplasmSearchRequest germplasmSearch; + + public void fetchPaginatedGermplasm(int page, int pageSize) { + paginatedGermplasm = new ArrayList<>(); + int pageStart = page * pageSize; + int pageEnd = pageStart + pageSize; + if (!(pageEnd > germplasm.size())) { + for (int i = pageStart; i < pageEnd; i++) { + paginatedGermplasm.add(germplasm.get(i)); + } + } else { + paginatedGermplasm = germplasm; + } + } + + public ApiResponse, Optional>> getStubbedGermplasm(int page, int pageSize) { + fetchPaginatedGermplasm(page, pageSize); + BrAPIGermplasmListResponse searchPostResponse = new BrAPIGermplasmListResponse(); + searchPostResponse.setResult(new BrAPIGermplasmListResponseResult().data(paginatedGermplasm)); + + Pair, Optional> searchPostResponsePair = + Pair.of(Optional.of(searchPostResponse), Optional.empty()); + return new ApiResponse, Optional>>(200, new HashMap<>(), searchPostResponsePair); + } + + @SneakyThrows + @BeforeEach + void setup() { + //Create instance of DAO + brAPIDAOUtil = new BrAPIDAOUtil(); + + //Set the page size field + Field pageSize = BrAPIDAOUtil.class.getDeclaredField("pageSize"); + pageSize.setAccessible(true); + pageSize.set(brAPIDAOUtil, 1); + + referenceSource = "breedinginsight.org"; + + //Create Program + testProgram = new Program(); + testProgram.setName("Test Program"); + testProgram.setKey("TEST"); + testProgram.setId(UUID.randomUUID()); + testProgram.setBrapiUrl("http://brapiserver:8083"); + + //Create Germplasm + List shortNames = new ArrayList(); + shortNames.add("A"); + shortNames.add("B"); + shortNames.add("C"); + shortNames.add("D"); + shortNames.add("E"); + shortNames.add("F"); + shortNames.add("G"); + shortNames.add("H"); + shortNames.add("I"); + shortNames.add("J"); + + germplasm = new ArrayList(); + germplasmMap = new HashMap<>(); + + for (int i = 0; i < shortNames.size(); i++) { + String entry = String.valueOf(i + 2); + String nameIndex = String.valueOf(i+1); + BrAPIGermplasm testGermplasm = new BrAPIGermplasm(); + testGermplasm.setGermplasmName(String.format("Germplasm %1$s [TEST-%2$s]", + shortNames.get(i), nameIndex)); + testGermplasm.setSeedSource("Wild"); + testGermplasm.setAccessionNumber(nameIndex); + testGermplasm.setDefaultDisplayName(String.format("Germplasm %s", shortNames.get(i))); + if(!shortNames.get(i).equals("A")) { + testGermplasm.setPedigree("Germplasm A [TEST-1]"); + } + JsonObject additionalInfo = new JsonObject(); + additionalInfo.addProperty("importEntryNumber", entry); + additionalInfo.addProperty("breedingMethod", "Allopolyploid"); + testGermplasm.setAdditionalInfo(additionalInfo); + List externalRef = new ArrayList<>(); + BrAPIExternalReference testReference = new BrAPIExternalReference(); + testReference.setReferenceSource(referenceSource); + testReference.setReferenceID(UUID.randomUUID().toString()); + externalRef.add(testReference); + testGermplasm.setExternalReferences(externalRef); + germplasm.add(testGermplasm); + germplasmMap.put(testReference.getReferenceID(), testGermplasm); + } + + // Set query params + germplasmSearch = new BrAPIGermplasmSearchRequest(); + germplasmSearch.externalReferenceIDs(List.of(testProgram.getId().toString())); + germplasmSearch.externalReferenceSources(List.of(String.format("%s/programs", referenceSource))); + } + + @Test + @SneakyThrows + public void searchGermplasmPost() { + // Set query params + germplasmSearch.setPage(0); + + List searchResult = brAPIDAOUtil.search( + searchBody -> { + return getStubbedGermplasm(searchBody.getPage(), searchBody.getPageSize()); + }, + (searchId, page, pageSize) -> { + return null; + }, + germplasmSearch + ); + + //Check if all requested germplasm are returned + for (BrAPIGermplasm germplasm : searchResult) { + assertTrue(germplasmMap.containsKey(germplasm.getExternalReferences().get(0).getReferenceID())); + } + } + + @Test + @SneakyThrows + public void searchGermplasmDbIdGet() { + List searchResult = brAPIDAOUtil.search( + searchBody -> { + BrAPIAcceptedSearchResponse searchPostResponse = new BrAPIAcceptedSearchResponse(); + searchPostResponse.setResult(new BrAPIAcceptedSearchResponseResult().searchResultsDbId(UUID.randomUUID().toString())); + + Pair, Optional> searchPostResponsePair = + Pair.of(Optional.empty(), Optional.of(searchPostResponse)); + return new ApiResponse, Optional>>(200, new HashMap<>(), searchPostResponsePair); + + }, + (searchId, page, pageSize) -> { + return getStubbedGermplasm(page, pageSize); + }, + germplasmSearch + ); + + //Check if all germplasm are returned + for (BrAPIGermplasm germplasm : searchResult) { + assertTrue(germplasmMap.containsKey(germplasm.getExternalReferences().get(0).getReferenceID())); + } + } +} From 53368409a278f0324c9522e3d0233b572dacd20c Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Fri, 7 Oct 2022 17:06:00 -0400 Subject: [PATCH 3/4] fix unit test assertions --- .../daos/BrAPIDAOUtilUnitTest.java | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/test/java/org/breedinginsight/daos/BrAPIDAOUtilUnitTest.java b/src/test/java/org/breedinginsight/daos/BrAPIDAOUtilUnitTest.java index 0678f432f..1d4d50d77 100644 --- a/src/test/java/org/breedinginsight/daos/BrAPIDAOUtilUnitTest.java +++ b/src/test/java/org/breedinginsight/daos/BrAPIDAOUtilUnitTest.java @@ -4,9 +4,7 @@ import lombok.SneakyThrows; import org.apache.commons.lang3.tuple.Pair; import org.brapi.client.v2.ApiResponse; -import org.brapi.v2.model.BrAPIAcceptedSearchResponse; -import org.brapi.v2.model.BrAPIAcceptedSearchResponseResult; -import org.brapi.v2.model.BrAPIExternalReference; +import org.brapi.v2.model.*; import org.brapi.v2.model.germ.BrAPIGermplasm; import org.brapi.v2.model.germ.request.BrAPIGermplasmSearchRequest; import org.brapi.v2.model.germ.response.BrAPIGermplasmListResponse; @@ -32,10 +30,12 @@ public class BrAPIDAOUtilUnitTest { private List paginatedGermplasm; private BrAPIGermplasmSearchRequest germplasmSearch; - public void fetchPaginatedGermplasm(int page, int pageSize) { + public Integer fetchPaginatedGermplasm(int page, int pageSize) { paginatedGermplasm = new ArrayList<>(); int pageStart = page * pageSize; int pageEnd = pageStart + pageSize; + Integer totalPages = (int) Math.ceil(germplasm.size() / pageSize); + //(germplasm.size() - germplasm.size() % pageSize) / pageSize; if (!(pageEnd > germplasm.size())) { for (int i = pageStart; i < pageEnd; i++) { paginatedGermplasm.add(germplasm.get(i)); @@ -43,12 +43,15 @@ public void fetchPaginatedGermplasm(int page, int pageSize) { } else { paginatedGermplasm = germplasm; } + return totalPages; } public ApiResponse, Optional>> getStubbedGermplasm(int page, int pageSize) { - fetchPaginatedGermplasm(page, pageSize); + Integer totalPages = fetchPaginatedGermplasm(page, pageSize); BrAPIGermplasmListResponse searchPostResponse = new BrAPIGermplasmListResponse(); searchPostResponse.setResult(new BrAPIGermplasmListResponseResult().data(paginatedGermplasm)); + searchPostResponse.setMetadata(new BrAPIMetadata().pagination( + (BrAPIIndexPagination) new BrAPIIndexPagination().currentPage(page).pageSize(pageSize).totalPages(totalPages))); Pair, Optional> searchPostResponsePair = Pair.of(Optional.of(searchPostResponse), Optional.empty()); @@ -140,8 +143,11 @@ public void searchGermplasmPost() { ); //Check if all requested germplasm are returned - for (BrAPIGermplasm germplasm : searchResult) { - assertTrue(germplasmMap.containsKey(germplasm.getExternalReferences().get(0).getReferenceID())); + for (BrAPIGermplasm accession : germplasm) { + assert searchResult.stream().anyMatch( + result -> result.getExternalReferences().get(0).getReferenceID().equals( + accession.getExternalReferences().get(0).getReferenceID() + )); } } @@ -155,7 +161,7 @@ public void searchGermplasmDbIdGet() { Pair, Optional> searchPostResponsePair = Pair.of(Optional.empty(), Optional.of(searchPostResponse)); - return new ApiResponse, Optional>>(200, new HashMap<>(), searchPostResponsePair); + return new ApiResponse, Optional>>(202, new HashMap<>(), searchPostResponsePair); }, (searchId, page, pageSize) -> { @@ -165,8 +171,11 @@ public void searchGermplasmDbIdGet() { ); //Check if all germplasm are returned - for (BrAPIGermplasm germplasm : searchResult) { - assertTrue(germplasmMap.containsKey(germplasm.getExternalReferences().get(0).getReferenceID())); + for (BrAPIGermplasm accession : germplasm) { + assert searchResult.stream().anyMatch( + result -> result.getExternalReferences().get(0).getReferenceID().equals( + accession.getExternalReferences().get(0).getReferenceID() + )); } } } From 03945d0957c06a5c307f8ab56557c0bd6ac9712d Mon Sep 17 00:00:00 2001 From: dmeidlin <14339308+dmeidlin@users.noreply.github.com> Date: Fri, 7 Oct 2022 17:10:03 -0400 Subject: [PATCH 4/4] clean up unit test --- .../java/org/breedinginsight/daos/BrAPIDAOUtilUnitTest.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/test/java/org/breedinginsight/daos/BrAPIDAOUtilUnitTest.java b/src/test/java/org/breedinginsight/daos/BrAPIDAOUtilUnitTest.java index 1d4d50d77..7d69ce671 100644 --- a/src/test/java/org/breedinginsight/daos/BrAPIDAOUtilUnitTest.java +++ b/src/test/java/org/breedinginsight/daos/BrAPIDAOUtilUnitTest.java @@ -26,7 +26,6 @@ public class BrAPIDAOUtilUnitTest { private BrAPIDAOUtil brAPIDAOUtil; private List germplasm; private Program testProgram; - private HashMap germplasmMap; private List paginatedGermplasm; private BrAPIGermplasmSearchRequest germplasmSearch; @@ -35,7 +34,6 @@ public Integer fetchPaginatedGermplasm(int page, int pageSize) { int pageStart = page * pageSize; int pageEnd = pageStart + pageSize; Integer totalPages = (int) Math.ceil(germplasm.size() / pageSize); - //(germplasm.size() - germplasm.size() % pageSize) / pageSize; if (!(pageEnd > germplasm.size())) { for (int i = pageStart; i < pageEnd; i++) { paginatedGermplasm.add(germplasm.get(i)); @@ -92,7 +90,6 @@ void setup() { shortNames.add("J"); germplasm = new ArrayList(); - germplasmMap = new HashMap<>(); for (int i = 0; i < shortNames.size(); i++) { String entry = String.valueOf(i + 2); @@ -117,7 +114,6 @@ void setup() { externalRef.add(testReference); testGermplasm.setExternalReferences(externalRef); germplasm.add(testGermplasm); - germplasmMap.put(testReference.getReferenceID(), testGermplasm); } // Set query params