diff --git a/src/main/java/org/breedinginsight/brapi/v2/ListController.java b/src/main/java/org/breedinginsight/brapi/v2/ListController.java index 59caa8a47..7b33629ef 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/ListController.java +++ b/src/main/java/org/breedinginsight/brapi/v2/ListController.java @@ -79,9 +79,6 @@ public HttpResponse>> getLists( // get germplasm lists by default BrAPIListTypes type = BrAPIListTypes.fromValue(queryParams.getListType()); - if (type == null) { - type = BrAPIListTypes.GERMPLASM; - } String source = null; String id = null; if (queryParams.getExternalReferenceSource() != null && !queryParams.getExternalReferenceSource().isEmpty()) { diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java index 7d69e831a..8ae42f92c 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIListService.java @@ -72,19 +72,20 @@ public List getListSummariesByTypeAndXref( // set the owner of the list items as the list owner BrAPIListsSingleResponse listDetails = listDAO.getListById(list.getListDbId(), program.getId()); List listItemNames = listDetails.getResult().getData(); - switch (type) { - case OBSERVATIONVARIABLES: - break; - case GERMPLASM: - default: - String createdBy = germplasmDAO.getGermplasmByRawName(listItemNames, program.getId()).get(0) - .getAdditionalInfo() - .getAsJsonObject("createdBy") - .get("userName") - .getAsString(); - list.setListOwnerName(createdBy); + if (type != null) { + switch (type) { + case GERMPLASM: + String createdBy = germplasmDAO.getGermplasmByRawName(listItemNames, program.getId()).get(0) + .getAdditionalInfo() + .getAsJsonObject("createdBy") + .get("userName") + .getAsString(); + list.setListOwnerName(createdBy); + case OBSERVATIONVARIABLES: + default: + break; + } } - } return programLists; diff --git a/src/test/java/org/breedinginsight/brapi/v2/GermplasmControllerIntegrationTest.java b/src/test/java/org/breedinginsight/brapi/v2/GermplasmControllerIntegrationTest.java index 834e225ee..0c52536fc 100644 --- a/src/test/java/org/breedinginsight/brapi/v2/GermplasmControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/brapi/v2/GermplasmControllerIntegrationTest.java @@ -210,7 +210,7 @@ public void getPaginatedSuccess() { @SneakyThrows public void getAllGermplasmListsSuccess() { Flowable> call = client.exchange( - GET(String.format("/programs/%s/brapi/v2/lists",validProgram.getId().toString())) + GET(String.format("/programs/%s/brapi/v2/lists?listType=germplasm",validProgram.getId().toString())) .cookie(new NettyCookie("phylo-token", "test-registered-user")), String.class ); diff --git a/src/test/java/org/breedinginsight/brapi/v2/ListControllerIntegrationTest.java b/src/test/java/org/breedinginsight/brapi/v2/ListControllerIntegrationTest.java new file mode 100644 index 000000000..ccdf04e19 --- /dev/null +++ b/src/test/java/org/breedinginsight/brapi/v2/ListControllerIntegrationTest.java @@ -0,0 +1,190 @@ +/* + * See the NOTICE file distributed with this work for additional information + * regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.breedinginsight.brapi.v2; + +import com.google.gson.*; +import io.kowalski.fannypack.FannyPack; +import io.micronaut.http.HttpResponse; +import io.micronaut.http.HttpStatus; +import io.micronaut.http.client.RxHttpClient; +import io.micronaut.http.client.annotation.Client; +import io.micronaut.http.netty.cookies.NettyCookie; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; +import io.reactivex.Flowable; +import junit.framework.AssertionFailedError; +import lombok.SneakyThrows; +import org.breedinginsight.BrAPITest; +import org.breedinginsight.TestUtils; +import org.breedinginsight.api.auth.AuthenticatedUser; +import org.breedinginsight.brapps.importer.ImportTestUtils; +import org.breedinginsight.brapps.importer.model.imports.experimentObservation.ExperimentObservation; +import org.breedinginsight.model.Trait; +import org.breedinginsight.services.OntologyService; +import org.breedinginsight.services.exceptions.ValidatorException; +import org.breedinginsight.dao.db.tables.pojos.BiUserEntity; +import org.breedinginsight.daos.UserDAO; +import org.breedinginsight.model.Program; +import org.breedinginsight.services.SpeciesService; +import org.jooq.DSLContext; +import org.junit.jupiter.api.*; + +import javax.inject.Inject; + +import java.io.File; +import java.time.OffsetDateTime; +import java.util.*; + +import static io.micronaut.http.HttpRequest.GET; +import static org.junit.jupiter.api.Assertions.*; + +@MicronautTest +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class ListControllerIntegrationTest extends BrAPITest { + + private Program program; + private String germplasmImportId; + private ImportTestUtils importTestUtils; + private String mappingId; + private BiUserEntity testUser; + + + @Inject + private SpeciesService speciesService; + @Inject + @Client("/${micronaut.bi.api.version}") + RxHttpClient client; + @Inject + private UserDAO userDAO; + @Inject + private DSLContext dsl; + + private Gson gson = new GsonBuilder().registerTypeAdapter(OffsetDateTime.class, (JsonDeserializer) + (json, type, context) -> OffsetDateTime.parse(json.getAsString())) + .create(); + + private final String germplasmListName = "Program List"; + private final String germplasmListDesc = "Program List"; + + @Inject + private OntologyService ontologyService; + + @BeforeAll + @SneakyThrows + public void setup() { + importTestUtils = new ImportTestUtils(); + Map setupObjects = importTestUtils.setup(client, gson, dsl, speciesService, userDAO, super.getBrapiDsl(), "ExperimentsTemplateMap"); + mappingId = (String) setupObjects.get("mappingId"); + program = (Program) setupObjects.get("program"); + testUser = (BiUserEntity) setupObjects.get("testUser"); + FannyPack securityFp = (FannyPack) setupObjects.get("securityFp"); + + dsl.execute(securityFp.get("InsertSystemRoleAdmin"), testUser.getId().toString()); + + // Generate traits and persist them. + List traits = importTestUtils.createTraits(1); + AuthenticatedUser user = new AuthenticatedUser(testUser.getName(), new ArrayList<>(), testUser.getId(), new ArrayList<>()); + try { + ontologyService.createTraits(program.getId(), traits, user, false); + } catch (ValidatorException e) { + System.err.println(e.getErrors()); + throw e; + } + + // Get germplasm system import. + Flowable> call = client.exchange( + GET("/import/mappings?importName=germplasmtemplatemap").cookie(new NettyCookie("phylo-token", "test-registered-user")), String.class + ); + HttpResponse response = call.blockingFirst(); + germplasmImportId = JsonParser.parseString(response.body()).getAsJsonObject() + .getAsJsonObject("result") + .getAsJsonArray("data") + .get(0).getAsJsonObject().get("id").getAsString(); + + // Insert program germplasm. + File file = new File("src/test/resources/files/germplasm_import/minimal_germplasm_import.csv"); + Map germplasmListInfo = Map.ofEntries( + Map.entry("germplasmListName", germplasmListName), + Map.entry("germplasmListDescription", germplasmListDesc) + ); + TestUtils.uploadDataFile(client, program.getId(), germplasmImportId, germplasmListInfo, file); + + // Make test experiment import. + Map newExp = new HashMap<>(); + newExp.put(ExperimentObservation.Columns.GERMPLASM_GID, "1"); + newExp.put(ExperimentObservation.Columns.TEST_CHECK, "T"); + newExp.put(ExperimentObservation.Columns.EXP_TITLE, "Test Exp"); + newExp.put(ExperimentObservation.Columns.EXP_UNIT, "Plot"); + newExp.put(ExperimentObservation.Columns.EXP_TYPE, "Phenotyping"); + newExp.put(ExperimentObservation.Columns.ENV, "New Env"); + newExp.put(ExperimentObservation.Columns.ENV_LOCATION, "Location A"); + newExp.put(ExperimentObservation.Columns.ENV_YEAR, "2023"); + newExp.put(ExperimentObservation.Columns.EXP_UNIT_ID, "a-1"); + newExp.put(ExperimentObservation.Columns.REP_NUM, "1"); + newExp.put(ExperimentObservation.Columns.BLOCK_NUM, "1"); + newExp.put(ExperimentObservation.Columns.ROW, "1"); + newExp.put(ExperimentObservation.Columns.COLUMN, "1"); + newExp.put(traits.get(0).getObservationVariableName(), "1"); + + JsonObject result = importTestUtils.uploadAndFetch( + importTestUtils.writeDataToFile(List.of(newExp), traits), null, true, client, program, mappingId + ); + + } + + @Test + @SneakyThrows + public void getAllListsSuccess() { + // A GET request to the brapi/v2/lists endpoint with no query params should return all lists. + Flowable> call = client.exchange( + GET(String.format("/programs/%s/brapi/v2/lists", program.getId().toString())) + .cookie(new NettyCookie("phylo-token", "test-registered-user")), String.class + ); + + // Ensure 200 OK response. + HttpResponse response = call.blockingFirst(); + assertEquals(HttpStatus.OK, response.getStatus()); + + // Parse result. + JsonObject result = JsonParser.parseString(response.body()).getAsJsonObject().getAsJsonObject("result"); + JsonArray data = result.getAsJsonArray("data"); + + // Ensure all lists are returned. + assertEquals(2, data.size(), "Wrong number of lists were returned"); + + // Ensure the list names and types are as expected. + List listNames = List.of(germplasmListName, "Observation Dataset"); + List listTypes = List.of("germplasm", "observationVariables"); + for (JsonElement element: data) { + JsonObject list = element.getAsJsonObject(); + if (listNames.contains(list.get("listName").getAsString())) { + int index = listNames.indexOf(list.get("listName").getAsString()); + assertEquals(list.get("listName").getAsString(), listNames.get(index), "List name incorrect"); + } else { + throw new AssertionFailedError("List name not found"); + } + if (listTypes.contains(list.get("listType").getAsString())) { + int index = listTypes.indexOf(list.get("listType").getAsString()); + assertEquals(list.get("listType").getAsString(), listTypes.get(index), "List type incorrect"); + } else { + throw new AssertionFailedError("List type not found"); + } + } + } + +} diff --git a/src/test/java/org/breedinginsight/brapps/importer/ExperimentFileImportTest.java b/src/test/java/org/breedinginsight/brapps/importer/ExperimentFileImportTest.java index 8cdadeb63..ac8520a68 100644 --- a/src/test/java/org/breedinginsight/brapps/importer/ExperimentFileImportTest.java +++ b/src/test/java/org/breedinginsight/brapps/importer/ExperimentFileImportTest.java @@ -199,7 +199,7 @@ public void importNewExpNewLocNoObsSuccess() { validRow.put(Columns.COLUMN, "1"); validRow.put(Columns.TREATMENT_FACTORS, "Test treatment factors"); - Flowable> call = importTestUtils.uploadDataFile(writeDataToFile(List.of(validRow), null), null, true, client, program, mappingId); + Flowable> call = importTestUtils.uploadDataFile(importTestUtils.writeDataToFile(List.of(validRow), null), null, true, client, program, mappingId); HttpResponse response = call.blockingFirst(); assertEquals(HttpStatus.ACCEPTED, response.getStatus()); String importId = JsonParser.parseString(response.body()).getAsJsonObject().getAsJsonObject("result").get("importId").getAsString(); @@ -257,7 +257,7 @@ public void importNewExpMultiNewEnvNoObsSuccess() { secondEnv.put(Columns.COLUMN, "1"); secondEnv.put(Columns.TREATMENT_FACTORS, "Test treatment factors"); - Flowable> call = importTestUtils.uploadDataFile(writeDataToFile(List.of(firstEnv, secondEnv), null), null, true, client, program, mappingId); + Flowable> call = importTestUtils.uploadDataFile(importTestUtils.writeDataToFile(List.of(firstEnv, secondEnv), null), null, true, client, program, mappingId); HttpResponse response = call.blockingFirst(); assertEquals(HttpStatus.ACCEPTED, response.getStatus()); String importId = JsonParser.parseString(response.body()).getAsJsonObject().getAsJsonObject("result").get("importId").getAsString(); @@ -304,7 +304,7 @@ public void importNewEnvExistingExpNoObsSuccess() { newExp.put(Columns.ROW, "1"); newExp.put(Columns.COLUMN, "1"); - JsonObject expResult = importTestUtils.uploadAndFetch(writeDataToFile(List.of(newExp), null), null, true, client, program, mappingId); + JsonObject expResult = importTestUtils.uploadAndFetch(importTestUtils.writeDataToFile(List.of(newExp), null), null, true, client, program, mappingId); Map newEnv = new HashMap<>(); newEnv.put(Columns.GERMPLASM_GID, "1"); @@ -321,7 +321,7 @@ public void importNewEnvExistingExpNoObsSuccess() { newEnv.put(Columns.ROW, "1"); newEnv.put(Columns.COLUMN, "1"); - JsonObject result = importTestUtils.uploadAndFetch(writeDataToFile(List.of(newEnv), null), null, true, client, program, mappingId); + JsonObject result = importTestUtils.uploadAndFetch(importTestUtils.writeDataToFile(List.of(newEnv), null), null, true, client, program, mappingId); JsonArray previewRows = result.get("preview").getAsJsonObject().get("rows").getAsJsonArray(); assertEquals(1, previewRows.size()); @@ -355,49 +355,49 @@ public void verifyMissingDataThrowsError(boolean commit) { Map noGID = new HashMap<>(base); noGID.remove(Columns.GERMPLASM_GID); - uploadAndVerifyFailure(program, writeDataToFile(List.of(noGID), null), Columns.GERMPLASM_GID, commit); + uploadAndVerifyFailure(program, importTestUtils.writeDataToFile(List.of(noGID), null), Columns.GERMPLASM_GID, commit); Map noExpTitle = new HashMap<>(base); noExpTitle.remove(Columns.EXP_TITLE); - uploadAndVerifyFailure(program, writeDataToFile(List.of(noExpTitle), null), Columns.EXP_TITLE, commit); + uploadAndVerifyFailure(program, importTestUtils.writeDataToFile(List.of(noExpTitle), null), Columns.EXP_TITLE, commit); Map noExpUnit = new HashMap<>(base); noExpUnit.remove(Columns.EXP_UNIT); - uploadAndVerifyFailure(program, writeDataToFile(List.of(noExpUnit), null), Columns.EXP_UNIT, commit); + uploadAndVerifyFailure(program, importTestUtils.writeDataToFile(List.of(noExpUnit), null), Columns.EXP_UNIT, commit); Map noExpType = new HashMap<>(base); noExpType.remove(Columns.EXP_TYPE); - uploadAndVerifyFailure(program, writeDataToFile(List.of(noExpType), null), Columns.EXP_TYPE, commit); + uploadAndVerifyFailure(program, importTestUtils.writeDataToFile(List.of(noExpType), null), Columns.EXP_TYPE, commit); Map noEnv = new HashMap<>(base); noEnv.remove(Columns.ENV); - uploadAndVerifyFailure(program, writeDataToFile(List.of(noEnv), null), Columns.ENV, commit); + uploadAndVerifyFailure(program, importTestUtils.writeDataToFile(List.of(noEnv), null), Columns.ENV, commit); Map noEnvLoc = new HashMap<>(base); noEnvLoc.remove(Columns.ENV_LOCATION); - uploadAndVerifyFailure(program, writeDataToFile(List.of(noEnvLoc), null), Columns.ENV_LOCATION, commit); + uploadAndVerifyFailure(program, importTestUtils.writeDataToFile(List.of(noEnvLoc), null), Columns.ENV_LOCATION, commit); Map noExpUnitId = new HashMap<>(base); noExpUnitId.remove(Columns.EXP_UNIT_ID); - uploadAndVerifyFailure(program, writeDataToFile(List.of(noExpUnitId), null), Columns.EXP_UNIT_ID, commit); + uploadAndVerifyFailure(program, importTestUtils.writeDataToFile(List.of(noExpUnitId), null), Columns.EXP_UNIT_ID, commit); Map noExpRep = new HashMap<>(base); noExpRep.remove(Columns.REP_NUM); - uploadAndVerifyFailure(program, writeDataToFile(List.of(noExpRep), null), Columns.REP_NUM, commit); + uploadAndVerifyFailure(program, importTestUtils.writeDataToFile(List.of(noExpRep), null), Columns.REP_NUM, commit); Map noExpBlock = new HashMap<>(base); noExpBlock.remove(Columns.BLOCK_NUM); - uploadAndVerifyFailure(program, writeDataToFile(List.of(noExpBlock), null), Columns.BLOCK_NUM, commit); + uploadAndVerifyFailure(program, importTestUtils.writeDataToFile(List.of(noExpBlock), null), Columns.BLOCK_NUM, commit); Map noEnvYear = new HashMap<>(base); noEnvYear.remove(Columns.ENV_YEAR); - uploadAndVerifyFailure(program, writeDataToFile(List.of(noEnvYear), null), Columns.ENV_YEAR, commit); + uploadAndVerifyFailure(program, importTestUtils.writeDataToFile(List.of(noEnvYear), null), Columns.ENV_YEAR, commit); } @Test @SneakyThrows public void importNewExpWithObsVar() { - List traits = createTraits(1); + List traits = importTestUtils.createTraits(1); Program program = createProgram("New Exp with Observations Vars", "EXPVRR", "EXPVRR", BRAPI_REFERENCE_SOURCE, createGermplasm(1), traits); Map newExp = new HashMap<>(); newExp.put(Columns.GERMPLASM_GID, "1"); @@ -415,7 +415,7 @@ public void importNewExpWithObsVar() { newExp.put(Columns.COLUMN, "1"); newExp.put(traits.get(0).getObservationVariableName(), null); - JsonObject result = importTestUtils.uploadAndFetch(writeDataToFile(List.of(newExp), traits), null, true, client, program, mappingId); + JsonObject result = importTestUtils.uploadAndFetch(importTestUtils.writeDataToFile(List.of(newExp), traits), null, true, client, program, mappingId); JsonArray previewRows = result.get("preview").getAsJsonObject().get("rows").getAsJsonArray(); assertEquals(1, previewRows.size()); @@ -465,7 +465,7 @@ public void verifyDiffYearSameEnvThrowsError(boolean commit) { row.put(Columns.BLOCK_NUM, "2"); rows.add(row); - uploadAndVerifyFailure(program, writeDataToFile(rows, null), Columns.ENV_YEAR, commit); + uploadAndVerifyFailure(program, importTestUtils.writeDataToFile(rows, null), Columns.ENV_YEAR, commit); } @ParameterizedTest @@ -503,14 +503,14 @@ public void verifyDiffLocSameEnvThrowsError(boolean commit) { row.put(Columns.BLOCK_NUM, "2"); rows.add(row); - uploadAndVerifyFailure(program, writeDataToFile(rows, null), Columns.ENV_LOCATION, commit); + uploadAndVerifyFailure(program, importTestUtils.writeDataToFile(rows, null), Columns.ENV_LOCATION, commit); } @ParameterizedTest @ValueSource(booleans = {true, false}) @SneakyThrows public void importNewExpWithObs(boolean commit) { - List traits = createTraits(1); + List traits = importTestUtils.createTraits(1); Program program = createProgram("New Exp with Observations "+(commit ? "C" : "P"), "NEXOB"+(commit ? "C" : "P"), "NEXOB"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, createGermplasm(1), traits); Map newExp = new HashMap<>(); newExp.put(Columns.GERMPLASM_GID, "1"); @@ -528,7 +528,7 @@ public void importNewExpWithObs(boolean commit) { newExp.put(Columns.COLUMN, "1"); newExp.put(traits.get(0).getObservationVariableName(), "1"); - JsonObject result = importTestUtils.uploadAndFetch(writeDataToFile(List.of(newExp), traits), null, commit, client, program, mappingId); + JsonObject result = importTestUtils.uploadAndFetch(importTestUtils.writeDataToFile(List.of(newExp), traits), null, commit, client, program, mappingId); JsonArray previewRows = result.get("preview").getAsJsonObject().get("rows").getAsJsonArray(); assertEquals(1, previewRows.size()); @@ -550,7 +550,7 @@ public void importNewExpWithObs(boolean commit) { @ValueSource(booleans = {true, false}) @SneakyThrows public void verifyFailureImportNewExpWithInvalidObs(boolean commit) { - List traits = createTraits(1); + List traits = importTestUtils.createTraits(1); Program program = createProgram("Invalid Observations "+(commit ? "C" : "P"), "INVOB"+(commit ? "C" : "P"), "INVOB"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, createGermplasm(1), traits); Map newExp = new HashMap<>(); newExp.put(Columns.GERMPLASM_GID, "1"); @@ -568,7 +568,7 @@ public void verifyFailureImportNewExpWithInvalidObs(boolean commit) { newExp.put(Columns.COLUMN, "1"); newExp.put(traits.get(0).getObservationVariableName(), "Red"); - uploadAndVerifyFailure(program, writeDataToFile(List.of(newExp), traits), traits.get(0).getObservationVariableName(), commit); + uploadAndVerifyFailure(program, importTestUtils.writeDataToFile(List.of(newExp), traits), traits.get(0).getObservationVariableName(), commit); } @ParameterizedTest @@ -591,14 +591,14 @@ public void verifyFailureNewOuExistingEnv(boolean commit) { newExp.put(Columns.ROW, "1"); newExp.put(Columns.COLUMN, "1"); - importTestUtils.uploadAndFetch(writeDataToFile(List.of(newExp), null), null, true, client, program, mappingId); + importTestUtils.uploadAndFetch(importTestUtils.writeDataToFile(List.of(newExp), null), null, true, client, program, mappingId); Map newOU = new HashMap<>(newExp); newOU.put(Columns.EXP_UNIT_ID, "a-2"); newOU.put(Columns.ROW, "1"); newOU.put(Columns.COLUMN, "2"); - Flowable> call = importTestUtils.uploadDataFile(writeDataToFile(List.of(newOU), null), null, commit, client, program, mappingId); + Flowable> call = importTestUtils.uploadDataFile(importTestUtils.writeDataToFile(List.of(newOU), null), null, commit, client, program, mappingId); HttpResponse response = call.blockingFirst(); assertEquals(HttpStatus.ACCEPTED, response.getStatus()); @@ -614,7 +614,7 @@ public void verifyFailureNewOuExistingEnv(boolean commit) { @Test @SneakyThrows public void importNewObsVarExisingOu() { - List traits = createTraits(2); + List traits = importTestUtils.createTraits(2); Program program = createProgram("New ObsVar Existing OU", "OUVAR", "OUVAR", BRAPI_REFERENCE_SOURCE, createGermplasm(1), traits); Map newExp = new HashMap<>(); newExp.put(Columns.GERMPLASM_GID, "1"); @@ -632,7 +632,7 @@ public void importNewObsVarExisingOu() { newExp.put(Columns.COLUMN, "1"); newExp.put(traits.get(0).getObservationVariableName(), null); - importTestUtils.uploadAndFetch(writeDataToFile(List.of(newExp), null), null, true, client, program, mappingId); + importTestUtils.uploadAndFetch(importTestUtils.writeDataToFile(List.of(newExp), null), null, true, client, program, mappingId); BrAPITrial brAPITrial = brAPITrialDAO.getTrialsByName(List.of((String)newExp.get(Columns.EXP_TITLE)), program).get(0); Optional trialIdXref = Utilities.getExternalReference(brAPITrial.getExternalReferences(), String.format("%s/%s", BRAPI_REFERENCE_SOURCE, ExternalReferenceSource.TRIALS.getName())); @@ -660,7 +660,7 @@ public void importNewObsVarExisingOu() { newObsVar.put(Columns.OBS_UNIT_ID, ouIdXref.get().getReferenceID()); newObsVar.put(traits.get(1).getObservationVariableName(), null); - JsonObject result = importTestUtils.uploadAndFetch(writeDataToFile(List.of(newObsVar), traits), null, true, client, program, mappingId); + JsonObject result = importTestUtils.uploadAndFetch(importTestUtils.writeDataToFile(List.of(newObsVar), traits), null, true, client, program, mappingId); JsonArray previewRows = result.get("preview").getAsJsonObject().get("rows").getAsJsonArray(); assertEquals(1, previewRows.size()); @@ -680,7 +680,7 @@ public void importNewObsVarExisingOu() { @ValueSource(booleans = {true, false}) @SneakyThrows public void importNewObsExisingOu(boolean commit) { - List traits = createTraits(1); + List traits = importTestUtils.createTraits(1); Program program = createProgram("New Obs Existing OU "+(commit ? "C" : "P"), "OUOBS"+(commit ? "C" : "P"), "OUOBS"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, createGermplasm(1), traits); Map newExp = new HashMap<>(); newExp.put(Columns.GERMPLASM_GID, "1"); @@ -697,7 +697,7 @@ public void importNewObsExisingOu(boolean commit) { newExp.put(Columns.ROW, "1"); newExp.put(Columns.COLUMN, "1"); - importTestUtils.uploadAndFetch(writeDataToFile(List.of(newExp), null), null, true, client, program, mappingId); + importTestUtils.uploadAndFetch(importTestUtils.writeDataToFile(List.of(newExp), null), null, true, client, program, mappingId); BrAPITrial brAPITrial = brAPITrialDAO.getTrialsByName(List.of((String)newExp.get(Columns.EXP_TITLE)), program).get(0); Optional trialIdXref = Utilities.getExternalReference(brAPITrial.getExternalReferences(), String.format("%s/%s", BRAPI_REFERENCE_SOURCE, ExternalReferenceSource.TRIALS.getName())); @@ -725,7 +725,7 @@ public void importNewObsExisingOu(boolean commit) { newObservation.put(Columns.OBS_UNIT_ID, ouIdXref.get().getReferenceID()); newObservation.put(traits.get(0).getObservationVariableName(), "1"); - JsonObject result = importTestUtils.uploadAndFetch(writeDataToFile(List.of(newObservation), traits), null, commit, client, program, mappingId); + JsonObject result = importTestUtils.uploadAndFetch(importTestUtils.writeDataToFile(List.of(newObservation), traits), null, commit, client, program, mappingId); JsonArray previewRows = result.get("preview").getAsJsonObject().get("rows").getAsJsonArray(); assertEquals(1, previewRows.size()); @@ -746,7 +746,7 @@ public void importNewObsExisingOu(boolean commit) { @ValueSource(booleans = {true, false}) @SneakyThrows public void verifyFailureImportNewObsExisingOuWithExistingObs(boolean commit) { - List traits = createTraits(1); + List traits = importTestUtils.createTraits(1); Program program = createProgram("New Obs Existing Obs "+(commit ? "C" : "P"), "FEXOB"+(commit ? "C" : "P"), "FEXOB"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, createGermplasm(1), traits); Map newExp = new HashMap<>(); newExp.put(Columns.GERMPLASM_GID, "1"); @@ -764,7 +764,7 @@ public void verifyFailureImportNewObsExisingOuWithExistingObs(boolean commit) { newExp.put(Columns.COLUMN, "1"); newExp.put(traits.get(0).getObservationVariableName(), "1"); - importTestUtils.uploadAndFetch(writeDataToFile(List.of(newExp), traits), null, true, client, program, mappingId); + importTestUtils.uploadAndFetch(importTestUtils.writeDataToFile(List.of(newExp), traits), null, true, client, program, mappingId); BrAPITrial brAPITrial = brAPITrialDAO.getTrialsByName(List.of((String)newExp.get(Columns.EXP_TITLE)), program).get(0); Optional trialIdXref = Utilities.getExternalReference(brAPITrial.getExternalReferences(), String.format("%s/%s", BRAPI_REFERENCE_SOURCE, ExternalReferenceSource.TRIALS.getName())); @@ -792,7 +792,7 @@ public void verifyFailureImportNewObsExisingOuWithExistingObs(boolean commit) { newObservation.put(Columns.OBS_UNIT_ID, ouIdXref.get().getReferenceID()); newObservation.put(traits.get(0).getObservationVariableName(), "2"); - uploadAndVerifyFailure(program, writeDataToFile(List.of(newObservation), traits), traits.get(0).getObservationVariableName(), commit); + uploadAndVerifyFailure(program, importTestUtils.writeDataToFile(List.of(newObservation), traits), traits.get(0).getObservationVariableName(), commit); } /* @@ -804,7 +804,7 @@ public void verifyFailureImportNewObsExisingOuWithExistingObs(boolean commit) { @Test @SneakyThrows public void importSecondExpAfterFirstExpWithObs() { - List traits = createTraits(1); + List traits = importTestUtils.createTraits(1); Program program = createProgram("New Exp After First", "NEAF", "NEAF", BRAPI_REFERENCE_SOURCE, createGermplasm(1), traits); Map newExpA = new HashMap<>(); newExpA.put(Columns.GERMPLASM_GID, "1"); @@ -822,7 +822,7 @@ public void importSecondExpAfterFirstExpWithObs() { newExpA.put(Columns.COLUMN, "1"); newExpA.put(traits.get(0).getObservationVariableName(), "1"); - JsonObject resultA = importTestUtils.uploadAndFetch(writeDataToFile(List.of(newExpA), traits), null, true, client, program, mappingId); + JsonObject resultA = importTestUtils.uploadAndFetch(importTestUtils.writeDataToFile(List.of(newExpA), traits), null, true, client, program, mappingId); JsonArray previewRowsA = resultA.get("preview").getAsJsonObject().get("rows").getAsJsonArray(); assertEquals(1, previewRowsA.size()); @@ -850,7 +850,7 @@ public void importSecondExpAfterFirstExpWithObs() { newExpB.put(Columns.COLUMN, "1"); newExpB.put(traits.get(0).getObservationVariableName(), "1"); - JsonObject resultB = importTestUtils.uploadAndFetch(writeDataToFile(List.of(newExpB), traits), null, true, client, program, mappingId); + JsonObject resultB = importTestUtils.uploadAndFetch(importTestUtils.writeDataToFile(List.of(newExpB), traits), null, true, client, program, mappingId); JsonArray previewRowsB = resultB.get("preview").getAsJsonObject().get("rows").getAsJsonArray(); assertEquals(1, previewRowsB.size()); @@ -873,7 +873,7 @@ public void importSecondExpAfterFirstExpWithObs() { @ValueSource(booleans = {true, false}) @SneakyThrows public void importNewObsAfterFirstExpWithObs(boolean commit) { - List traits = createTraits(2); + List traits = importTestUtils.createTraits(2); Program program = createProgram("Exp with additional Uploads "+(commit ? "C" : "P"), "EXAU"+(commit ? "C" : "P"), "EXAU"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, createGermplasm(1), traits); Map newExp = new HashMap<>(); newExp.put(Columns.GERMPLASM_GID, "1"); @@ -891,7 +891,7 @@ public void importNewObsAfterFirstExpWithObs(boolean commit) { newExp.put(Columns.COLUMN, "1"); newExp.put(traits.get(0).getObservationVariableName(), "1"); - importTestUtils.uploadAndFetch(writeDataToFile(List.of(newExp), traits), null, true, client, program, mappingId); + importTestUtils.uploadAndFetch(importTestUtils.writeDataToFile(List.of(newExp), traits), null, true, client, program, mappingId); BrAPITrial brAPITrial = brAPITrialDAO.getTrialsByName(List.of((String)newExp.get(Columns.EXP_TITLE)), program).get(0); Optional trialIdXref = Utilities.getExternalReference(brAPITrial.getExternalReferences(), String.format("%s/%s", BRAPI_REFERENCE_SOURCE, ExternalReferenceSource.TRIALS.getName())); @@ -920,7 +920,7 @@ public void importNewObsAfterFirstExpWithObs(boolean commit) { newObservation.put(traits.get(0).getObservationVariableName(), "1"); newObservation.put(traits.get(1).getObservationVariableName(), "2"); - JsonObject result = importTestUtils.uploadAndFetch(writeDataToFile(List.of(newObservation), traits), null, commit, client, program, mappingId); + JsonObject result = importTestUtils.uploadAndFetch(importTestUtils.writeDataToFile(List.of(newObservation), traits), null, commit, client, program, mappingId); JsonArray previewRows = result.get("preview").getAsJsonObject().get("rows").getAsJsonArray(); assertEquals(1, previewRows.size()); @@ -947,7 +947,7 @@ public void importNewObsAfterFirstExpWithObs(boolean commit) { @ValueSource(booleans = {true, false}) @SneakyThrows public void importNewObsAfterFirstExpWithObs_blank(boolean commit) { - List traits = createTraits(2); + List traits = importTestUtils.createTraits(2); Program program = createProgram("Exp with additional Uploads (blank) "+(commit ? "C" : "P"), "EXAUB"+(commit ? "C" : "P"), "EXAUB"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, createGermplasm(1), traits); Map newExp = new HashMap<>(); newExp.put(Columns.GERMPLASM_GID, "1"); @@ -965,7 +965,7 @@ public void importNewObsAfterFirstExpWithObs_blank(boolean commit) { newExp.put(Columns.COLUMN, "1"); newExp.put(traits.get(0).getObservationVariableName(), "1"); - importTestUtils.uploadAndFetch(writeDataToFile(List.of(newExp), traits), null, true, client, program, mappingId); + importTestUtils.uploadAndFetch(importTestUtils.writeDataToFile(List.of(newExp), traits), null, true, client, program, mappingId); BrAPITrial brAPITrial = brAPITrialDAO.getTrialsByName(List.of((String)newExp.get(Columns.EXP_TITLE)), program).get(0); Optional trialIdXref = Utilities.getExternalReference(brAPITrial.getExternalReferences(), String.format("%s/%s", BRAPI_REFERENCE_SOURCE, ExternalReferenceSource.TRIALS.getName())); @@ -996,7 +996,7 @@ public void importNewObsAfterFirstExpWithObs_blank(boolean commit) { newObservation.put(traits.get(0).getObservationVariableName(), ""); newObservation.put(traits.get(1).getObservationVariableName(), "2"); - JsonObject result = importTestUtils.uploadAndFetch(writeDataToFile(List.of(newObservation), traits), null, commit, client, program, mappingId); + JsonObject result = importTestUtils.uploadAndFetch(importTestUtils.writeDataToFile(List.of(newObservation), traits), null, commit, client, program, mappingId); JsonArray previewRows = result.get("preview").getAsJsonObject().get("rows").getAsJsonArray(); assertEquals(1, previewRows.size()); @@ -1326,32 +1326,6 @@ private List createGermplasm(int numToCreate) { return germplasm; } - private List createTraits(int numToCreate) { - List traits = new ArrayList<>(); - for (int i = 0; i < numToCreate; i++) { - String varName = "tt_test_" + (i + 1); - traits.add(Trait.builder() - .observationVariableName(varName) - .entity("Plant " + i) - .attribute("height " + i) - .traitDescription("test") - .programObservationLevel(ProgramObservationLevel.builder().name("Plot").build()) - .scale(Scale.builder() - .scaleName("test scale") - .dataType(DataType.NUMERICAL) - .validValueMin(0) - .validValueMax(100) - .build()) - .method(Method.builder() - .description("test method") - .methodClass("test method") - .build()) - .build()); - } - - return traits; - } - private JsonObject uploadAndVerifyFailure(Program program, File file, String expectedColumnError, boolean commit) throws InterruptedException, IOException { Flowable> call = importTestUtils.uploadDataFile(file, null, true, client, program, mappingId); HttpResponse response = call.blockingFirst(); @@ -1374,39 +1348,4 @@ private JsonObject uploadAndVerifyFailure(Program program, File file, String exp return result; } - private File writeDataToFile(List> data, List traits) throws IOException { - File file = File.createTempFile("test", ".csv"); - - List columns = new ArrayList<>(); - columns.add(Column.builder().value(Columns.GERMPLASM_NAME).dataType(Column.ColumnDataType.STRING).build()); - columns.add(Column.builder().value(Columns.GERMPLASM_GID).dataType(Column.ColumnDataType.INTEGER).build()); - columns.add(Column.builder().value(Columns.TEST_CHECK).dataType(Column.ColumnDataType.STRING).build()); - columns.add(Column.builder().value(Columns.EXP_TITLE).dataType(Column.ColumnDataType.STRING).build()); - columns.add(Column.builder().value(Columns.EXP_DESCRIPTION).dataType(Column.ColumnDataType.STRING).build()); - columns.add(Column.builder().value(Columns.EXP_UNIT).dataType(Column.ColumnDataType.STRING).build()); - columns.add(Column.builder().value(Columns.EXP_TYPE).dataType(Column.ColumnDataType.STRING).build()); - columns.add(Column.builder().value(Columns.ENV).dataType(Column.ColumnDataType.STRING).build()); - columns.add(Column.builder().value(Columns.ENV_LOCATION).dataType(Column.ColumnDataType.STRING).build()); - columns.add(Column.builder().value(Columns.ENV_YEAR).dataType(Column.ColumnDataType.INTEGER).build()); - columns.add(Column.builder().value(Columns.EXP_UNIT_ID).dataType(Column.ColumnDataType.STRING).build()); - columns.add(Column.builder().value(Columns.REP_NUM).dataType(Column.ColumnDataType.INTEGER).build()); - columns.add(Column.builder().value(Columns.BLOCK_NUM).dataType(Column.ColumnDataType.INTEGER).build()); - columns.add(Column.builder().value(Columns.ROW).dataType(Column.ColumnDataType.INTEGER).build()); - columns.add(Column.builder().value(Columns.COLUMN).dataType(Column.ColumnDataType.INTEGER).build()); - columns.add(Column.builder().value(Columns.TREATMENT_FACTORS).dataType(Column.ColumnDataType.STRING).build()); - columns.add(Column.builder().value(Columns.OBS_UNIT_ID).dataType(Column.ColumnDataType.STRING).build()); - - if(traits != null) { - traits.forEach(trait -> { - columns.add(Column.builder().value(trait.getObservationVariableName()).dataType(Column.ColumnDataType.STRING).build()); - }); - } - - ByteArrayOutputStream byteArrayOutputStream = CSVWriter.writeToCSV(columns, data); - FileOutputStream fos = new FileOutputStream(file); - fos.write(byteArrayOutputStream.toByteArray()); - - return file; - } - } diff --git a/src/test/java/org/breedinginsight/brapps/importer/GermplasmFileImportTest.java b/src/test/java/org/breedinginsight/brapps/importer/GermplasmFileImportTest.java index b52dbde0a..8a38da303 100644 --- a/src/test/java/org/breedinginsight/brapps/importer/GermplasmFileImportTest.java +++ b/src/test/java/org/breedinginsight/brapps/importer/GermplasmFileImportTest.java @@ -684,7 +684,7 @@ public void checkBasicResponse(JsonObject germplasm, Table fileData, Integer i) } public void checkGermplasmList(String listName, String listDescription, List germplasmNames) { - String url = String.format("%sbrapi/v2/lists", BRAPI_URL); + String url = String.format("%sbrapi/v2/lists?listType=germplasm", BRAPI_URL); Flowable> call = client.exchange( GET(url) .contentType(MediaType.APPLICATION_JSON) diff --git a/src/test/java/org/breedinginsight/brapps/importer/ImportTestUtils.java b/src/test/java/org/breedinginsight/brapps/importer/ImportTestUtils.java index d9ae3eecf..b8b00374d 100644 --- a/src/test/java/org/breedinginsight/brapps/importer/ImportTestUtils.java +++ b/src/test/java/org/breedinginsight/brapps/importer/ImportTestUtils.java @@ -31,14 +31,21 @@ import org.breedinginsight.api.model.v1.request.ProgramRequest; import org.breedinginsight.api.model.v1.request.SpeciesRequest; import org.breedinginsight.api.v1.controller.TestTokenValidator; +import org.breedinginsight.brapps.importer.model.imports.experimentObservation.ExperimentObservation; +import org.breedinginsight.dao.db.enums.DataType; import org.breedinginsight.dao.db.tables.pojos.BiUserEntity; import org.breedinginsight.daos.UserDAO; -import org.breedinginsight.model.Program; -import org.breedinginsight.model.Species; +import org.breedinginsight.model.*; import org.breedinginsight.services.SpeciesService; +import org.breedinginsight.services.writers.CSVWriter; import org.jooq.DSLContext; +import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.regex.Pattern; @@ -162,4 +169,65 @@ public JsonObject uploadAndFetch(File file, Map userData, Boolea assertEquals(200, result.getAsJsonObject("progress").get("statuscode").getAsInt(), "Returned data: " + result); return result; } + + public List createTraits(int numToCreate) { + List traits = new ArrayList<>(); + for (int i = 0; i < numToCreate; i++) { + String varName = "tt_test_" + (i + 1); + traits.add(Trait.builder() + .observationVariableName(varName) + .entity("Plant " + i) + .attribute("height " + i) + .traitDescription("test") + .programObservationLevel(ProgramObservationLevel.builder().name("Plot").build()) + .scale(Scale.builder() + .scaleName("test scale") + .dataType(DataType.NUMERICAL) + .validValueMin(0) + .validValueMax(100) + .build()) + .method(Method.builder() + .description("test method") + .methodClass("test method") + .build()) + .build()); + } + + return traits; + } + + public File writeDataToFile(List> data, List traits) throws IOException { + File file = File.createTempFile("test", ".csv"); + + List columns = new ArrayList<>(); + columns.add(Column.builder().value(ExperimentObservation.Columns.GERMPLASM_NAME).dataType(Column.ColumnDataType.STRING).build()); + columns.add(Column.builder().value(ExperimentObservation.Columns.GERMPLASM_GID).dataType(Column.ColumnDataType.INTEGER).build()); + columns.add(Column.builder().value(ExperimentObservation.Columns.TEST_CHECK).dataType(Column.ColumnDataType.STRING).build()); + columns.add(Column.builder().value(ExperimentObservation.Columns.EXP_TITLE).dataType(Column.ColumnDataType.STRING).build()); + columns.add(Column.builder().value(ExperimentObservation.Columns.EXP_DESCRIPTION).dataType(Column.ColumnDataType.STRING).build()); + columns.add(Column.builder().value(ExperimentObservation.Columns.EXP_UNIT).dataType(Column.ColumnDataType.STRING).build()); + columns.add(Column.builder().value(ExperimentObservation.Columns.EXP_TYPE).dataType(Column.ColumnDataType.STRING).build()); + columns.add(Column.builder().value(ExperimentObservation.Columns.ENV).dataType(Column.ColumnDataType.STRING).build()); + columns.add(Column.builder().value(ExperimentObservation.Columns.ENV_LOCATION).dataType(Column.ColumnDataType.STRING).build()); + columns.add(Column.builder().value(ExperimentObservation.Columns.ENV_YEAR).dataType(Column.ColumnDataType.INTEGER).build()); + columns.add(Column.builder().value(ExperimentObservation.Columns.EXP_UNIT_ID).dataType(Column.ColumnDataType.STRING).build()); + columns.add(Column.builder().value(ExperimentObservation.Columns.REP_NUM).dataType(Column.ColumnDataType.INTEGER).build()); + columns.add(Column.builder().value(ExperimentObservation.Columns.BLOCK_NUM).dataType(Column.ColumnDataType.INTEGER).build()); + columns.add(Column.builder().value(ExperimentObservation.Columns.ROW).dataType(Column.ColumnDataType.INTEGER).build()); + columns.add(Column.builder().value(ExperimentObservation.Columns.COLUMN).dataType(Column.ColumnDataType.INTEGER).build()); + columns.add(Column.builder().value(ExperimentObservation.Columns.TREATMENT_FACTORS).dataType(Column.ColumnDataType.STRING).build()); + columns.add(Column.builder().value(ExperimentObservation.Columns.OBS_UNIT_ID).dataType(Column.ColumnDataType.STRING).build()); + + if(traits != null) { + traits.forEach(trait -> { + columns.add(Column.builder().value(trait.getObservationVariableName()).dataType(Column.ColumnDataType.STRING).build()); + }); + } + + ByteArrayOutputStream byteArrayOutputStream = CSVWriter.writeToCSV(columns, data); + FileOutputStream fos = new FileOutputStream(file); + fos.write(byteArrayOutputStream.toByteArray()); + + return file; + } }