Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ jobs:
java-version: 13

- name: Build with Maven
run: mvn -B flyway:migrate install --file pom.xml --settings settings.xml
run: mvn validate -B flyway:migrate clean install --file pom.xml --settings settings.xml
env:
DB_USER: postgres
DB_PASSWORD: postgres
Expand Down
2 changes: 1 addition & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ services:
aliases:
- dbserver
brapi-server:
image: breedinginsight/brapi-java-server
image: breedinginsight/brapi-java-server:v2.0-1
container_name: brapi-server
depends_on:
- bidb
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ protected HttpResponse loginSuccessWithCookies(List<Cookie> cookies) {
try {
String locationUrl = this.jwtCookieConfiguration.getLoginSuccessTargetUrl();

Optional<HttpRequest<Object>> requestOptional = ServerRequestContext.currentRequest();
Optional<HttpRequest<Object>> requestOptional = this.getCurrentRequest();
if (requestOptional.isPresent()){
HttpRequest<Object> request = requestOptional.get();
if (request.getCookies().contains(loginSuccessUrlCookieName)){
Expand Down Expand Up @@ -142,4 +142,9 @@ private Boolean isValidURL(String urlString) {
return false;
}
}

public Optional<HttpRequest<Object>> getCurrentRequest() {
return ServerRequestContext.currentRequest();
}

}
13 changes: 10 additions & 3 deletions src/main/java/org/breedinginsight/daos/TraitDAO.java
Original file line number Diff line number Diff line change
Expand Up @@ -356,7 +356,7 @@ private SelectOnConditionStep<Record> getTraitSql(BiUserTable createdByTableAlia
.join(updatedByTableAlias).on(TRAIT.UPDATED_BY.eq(updatedByTableAlias.ID));
}

public List<Trait> getTraitsByTraitMethodScaleName(List<Trait> traits){
public List<Trait> getTraitsByTraitMethodScaleName(UUID programId, List<Trait> traits){

//TODO: Get these from the query as well
BiUserTable createdByUser = BI_USER.as("createdByUser");
Expand All @@ -375,8 +375,11 @@ public List<Trait> getTraitsByTraitMethodScaleName(List<Trait> traits){
Result<Record> records = dsl.select()
.from(newTraits)
.join(TRAIT).on(TRAIT.TRAIT_NAME.like(newTraits.field("new_trait_name")))
.join(PROGRAM_ONTOLOGY).on(TRAIT.PROGRAM_ONTOLOGY_ID.eq(PROGRAM_ONTOLOGY.ID))
.join(PROGRAM).on(PROGRAM_ONTOLOGY.PROGRAM_ID.eq(PROGRAM.ID))
.join(METHOD).on(TRAIT.METHOD_ID.eq(METHOD.ID)).and(METHOD.METHOD_NAME.like(newTraits.field("new_method_name")))
.join(SCALE).on(TRAIT.SCALE_ID.eq(SCALE.ID)).and(SCALE.SCALE_NAME.like(newTraits.field("new_scale_name")))
.where(PROGRAM.ID.eq(programId))
.fetch();


Expand All @@ -393,10 +396,14 @@ public List<Trait> getTraitsByTraitMethodScaleName(List<Trait> traits){
return traitResults;
}

public List<Trait> getTraitsByAbbreviation(List<String> abbreviations) {
public List<Trait> getTraitsByAbbreviation(UUID programId, List<String> abbreviations) {

Result<Record> records = dsl.select()
.from(TRAIT).where(TRAIT.ABBREVIATIONS.cast(String[].class).contains(abbreviations.toArray(String[]::new)))
.from(TRAIT)
.join(PROGRAM_ONTOLOGY).on(TRAIT.PROGRAM_ONTOLOGY_ID.eq(PROGRAM_ONTOLOGY.ID))
.join(PROGRAM).on(PROGRAM_ONTOLOGY.PROGRAM_ID.eq(PROGRAM.ID))
.where(TRAIT.ABBREVIATIONS.cast(String[].class).contains(abbreviations.toArray(String[]::new)))
.and(PROGRAM.ID.eq(programId))
.fetch();

List<Trait> traitResults = new ArrayList<>();
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/org/breedinginsight/services/TraitService.java
Original file line number Diff line number Diff line change
Expand Up @@ -127,8 +127,8 @@ public List<Trait> createTraits(UUID programId, List<Trait> traits, Authenticate

// Ignore duplicate traits
ValidationErrors duplicateErrors = new ValidationErrors();
List<Trait> duplicateTraits = traitValidator.checkDuplicateTraitsExistingByName(traits);
List<Trait> duplicateTraitsByAbbrev = traitValidator.checkDuplicateTraitsExistingByAbbreviation(traits);
List<Trait> duplicateTraits = traitValidator.checkDuplicateTraitsExistingByName(programId, traits);
List<Trait> duplicateTraitsByAbbrev = traitValidator.checkDuplicateTraitsExistingByAbbreviation(programId, traits);
List<Integer> traitIndexToRemove = new ArrayList<>();
for (Trait duplicateTrait: duplicateTraits){

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,12 +127,12 @@ public ValidationErrors checkTraitDataConsistency(List<Trait> traits, TraitValid
return errors;
}

public List<Trait> checkDuplicateTraitsExistingByName(List<Trait> traits){
public List<Trait> checkDuplicateTraitsExistingByName(UUID programId, List<Trait> traits){

List<Trait> duplicates = new ArrayList<>();

// Check for existing trait name
List<Trait> duplicateNameTraits = checkForDuplicateTraitsByNames(traits);
List<Trait> duplicateNameTraits = checkForDuplicateTraitsByNames(programId, traits);

for (int i = 0; i < traits.size(); i++) {
Trait trait = traits.get(i);
Expand All @@ -150,12 +150,12 @@ public List<Trait> checkDuplicateTraitsExistingByName(List<Trait> traits){
return duplicates;
}

public List<Trait> checkDuplicateTraitsExistingByAbbreviation(List<Trait> traits){
public List<Trait> checkDuplicateTraitsExistingByAbbreviation(UUID programId, List<Trait> traits){

List<Trait> duplicates = new ArrayList<>();

// Check for existing trait abbreviations
List<Trait> duplicateAbbreviationTraits = checkForDuplicatesTraitsByAbbreviation(traits);
List<Trait> duplicateAbbreviationTraits = checkForDuplicatesTraitsByAbbreviation(programId, traits);

for (int i = 0; i < traits.size(); i++){
Trait trait = traits.get(i);
Expand Down Expand Up @@ -249,11 +249,11 @@ public ValidationErrors checkDuplicateTraitsInFile(List<Trait> traits, TraitVali
return errors;
}

private List<Trait> checkForDuplicateTraitsByNames(List<Trait> traits) {
return traitDAO.getTraitsByTraitMethodScaleName(traits);
private List<Trait> checkForDuplicateTraitsByNames(UUID programId, List<Trait> traits) {
return traitDAO.getTraitsByTraitMethodScaleName(programId, traits);
}

private List<Trait> checkForDuplicatesTraitsByAbbreviation(List<Trait> traits) {
private List<Trait> checkForDuplicatesTraitsByAbbreviation(UUID programId, List<Trait> traits) {

Set<String> abbreviationSet = new HashSet<>();
for (Trait trait: traits) {
Expand All @@ -264,7 +264,7 @@ private List<Trait> checkForDuplicatesTraitsByAbbreviation(List<Trait> traits) {

List<Trait> matchingTraits = new ArrayList<>();
if (abbreviationSet.size() > 0){
matchingTraits = traitDAO.getTraitsByAbbreviation(List.of(abbreviationSet.toArray(String[]::new)));
matchingTraits = traitDAO.getTraitsByAbbreviation(programId, List.of(abbreviationSet.toArray(String[]::new)));
}

return matchingTraits;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import io.micronaut.http.cookie.Cookie;
import io.micronaut.http.simple.cookies.SimpleCookies;
import io.micronaut.test.annotation.MicronautTest;
import io.micronaut.test.annotation.MockBean;
import org.breedinginsight.DatabaseTest;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
Expand All @@ -33,6 +34,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
Expand All @@ -58,14 +60,16 @@ public void returnsDefaultBadUrl() {
SimpleCookies cookies = new SimpleCookies(ConversionService.SHARED);
cookies.put("redirect-login", returnUrlCookie);
doReturn(cookies).when(request).getCookies();
ServerRequestContext.set(request);
AuthServiceLoginHandler authServiceSpy = spy(authServiceLoginHandler);
when(authServiceSpy.getCurrentRequest()).thenReturn(Optional.of(request));

Cookie jwtToken = Cookie.of("phylo-token", "test");
List<Cookie> securityCookies = List.of(jwtToken);

HttpResponse response = authServiceLoginHandler.loginSuccessWithCookies(securityCookies);
HttpResponse response = authServiceSpy.loginSuccessWithCookies(securityCookies);

checkAssertions(response, jwtToken, defaultUrl);

}

@Test
Expand All @@ -77,13 +81,15 @@ public void returnsPassedUrlGoodHttpUrl() {
SimpleCookies cookies = new SimpleCookies(ConversionService.SHARED);
cookies.put("redirect-login", returnUrlCookie);
doReturn(cookies).when(request).getCookies();
ServerRequestContext.set(request);
AuthServiceLoginHandler authServiceSpy = spy(authServiceLoginHandler);
when(authServiceSpy.getCurrentRequest()).thenReturn(Optional.of(request));

Cookie jwtToken = Cookie.of("phylo-token", "test");
List<Cookie> securityCookies = List.of(jwtToken);

HttpResponse response = authServiceLoginHandler.loginSuccessWithCookies(securityCookies);
HttpResponse response = authServiceSpy.loginSuccessWithCookies(securityCookies);

reset(request);
checkAssertions(response, jwtToken, expectedUrl);
}

Expand All @@ -96,13 +102,15 @@ public void returnsPassedUrlGoodHttpsUrl() {
SimpleCookies cookies = new SimpleCookies(ConversionService.SHARED);
cookies.put("redirect-login", returnUrlCookie);
doReturn(cookies).when(request).getCookies();
ServerRequestContext.set(request);
AuthServiceLoginHandler authServiceSpy = spy(authServiceLoginHandler);
when(authServiceSpy.getCurrentRequest()).thenReturn(Optional.of(request));

Cookie jwtToken = Cookie.of("phylo-token", "test");
List<Cookie> securityCookies = List.of(jwtToken);

HttpResponse response = authServiceLoginHandler.loginSuccessWithCookies(securityCookies);
HttpResponse response = authServiceSpy.loginSuccessWithCookies(securityCookies);

reset(request);
checkAssertions(response, jwtToken, expectedUrl);
}

Expand All @@ -112,13 +120,15 @@ public void returnsDefaultUrlCookieNotExist() {
HttpRequest request = mock(HttpRequest.class, CALLS_REAL_METHODS);
SimpleCookies cookies = new SimpleCookies(ConversionService.SHARED);
doReturn(cookies).when(request).getCookies();
ServerRequestContext.set(request);
AuthServiceLoginHandler authServiceSpy = spy(authServiceLoginHandler);
when(authServiceSpy.getCurrentRequest()).thenReturn(Optional.of(request));

Cookie jwtToken = Cookie.of("phylo-token", "test");
List<Cookie> securityCookies = List.of(jwtToken);

HttpResponse response = authServiceLoginHandler.loginSuccessWithCookies(securityCookies);
HttpResponse response = authServiceSpy.loginSuccessWithCookies(securityCookies);

reset(request);
checkAssertions(response, jwtToken, defaultUrl);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ public class TraitControllerIntegrationTest extends BrAPITest {

private List<Trait> validTraits;
private ProgramEntity validProgram;
private ProgramEntity otherValidProgram;
private String invalidUUID = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa";

@Inject
Expand Down Expand Up @@ -97,6 +98,14 @@ public void setup() {

// Retrieve our valid trait
validTrait = traitDao.findAll().get(0);

// Insert other program
dsl.execute(fp.get("InsertOtherProgram"));
dsl.execute(fp.get("InsertOtherProgramObservationLevel"));
dsl.execute(fp.get("InsertOtherProgramOntology"));

otherValidProgram = programDao.fetchByName("Other Test Program").get(0);

}

@Test
Expand Down Expand Up @@ -264,6 +273,30 @@ public void postTraitsMultipleExistInDb() {
assertEquals(0, data.size(), "Duplicate traits were not ignored");
}

@Test
@Order(4)
public void postTraitsNotSharedBetweenPrograms() {

// No traits should be ignored because duplicate traits are not shared between programs

// Call endpoint
Flowable<HttpResponse<String>> call = client.exchange(
POST("/programs/" + otherValidProgram.getId() + "/traits", validTraits)
.contentType(MediaType.APPLICATION_JSON)
.cookie(new NettyCookie("phylo-token", "test-registered-user")), String.class
);
HttpResponse<String> response = call.blockingFirst();
assertEquals(HttpStatus.OK, response.getStatus());

// Check return
JsonObject result = JsonParser.parseString(response.getBody().get()).getAsJsonObject().getAsJsonObject("result");

JsonArray data = result.getAsJsonArray("data");

assertEquals(validTraits.size(), data.size(), "Traits were ignored, but should not be");

}

@Test
@Order(4)
public void createTraitsDuplicateInRequest() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,8 @@ public void duplicateTrait() {
trait1.setScale(scale1);
trait1.setMethod(method1);

List<Trait> duplicateTraits = traitValidator.checkDuplicateTraitsExistingByName(List.of(trait1));
List<Trait> duplicateTraitsByAbbrev = traitValidator.checkDuplicateTraitsExistingByAbbreviation(List.of(trait1));
List<Trait> duplicateTraits = traitValidator.checkDuplicateTraitsExistingByName(validProgram.getId(), List.of(trait1));
List<Trait> duplicateTraitsByAbbrev = traitValidator.checkDuplicateTraitsExistingByAbbreviation(validProgram.getId(), List.of(trait1));

assertEquals(1, duplicateTraits.size(), "Wrong number of duplicate traits by name returned");
assertEquals(1, duplicateTraitsByAbbrev.size(), "Wrong number of duplicate traits by abbreviation returned");
Expand All @@ -113,8 +113,8 @@ public void uniqueTraitSuccess() {
trait1.setScale(scale1);
trait1.setMethod(method1);

List<Trait> duplicateTraits = traitValidator.checkDuplicateTraitsExistingByName(List.of(trait1));
List<Trait> duplicateTraitsByAbbrev = traitValidator.checkDuplicateTraitsExistingByAbbreviation(List.of(trait1));
List<Trait> duplicateTraits = traitValidator.checkDuplicateTraitsExistingByName(validProgram.getId(), List.of(trait1));
List<Trait> duplicateTraitsByAbbrev = traitValidator.checkDuplicateTraitsExistingByAbbreviation(validProgram.getId(), List.of(trait1));

assertEquals(0, duplicateTraits.size(), "Wrong number of duplicate traits by name returned");
assertEquals(0, duplicateTraitsByAbbrev.size(), "Wrong number of duplicate traits by abbreviation returned");
Expand Down
15 changes: 15 additions & 0 deletions src/test/resources/sql/TraitControllerIntegrationTest.sql
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,18 @@ join bi_user on bi_user.name = 'system' limit 1
delete from trait;
delete from method;
delete from scale;

-- name: InsertOtherProgram
insert into program (species_id, name, created_by, updated_by)
select species.id, 'Other Test Program', bi_user.id, bi_user.id from species
join bi_user on bi_user.name = 'system' limit 1

-- name: InsertOtherProgramObservationLevel
insert into program_observation_level(program_id, name, created_by, updated_by)
select program.id, 'Plant', bi_user.id, bi_user.id from program
join bi_user on bi_user.name = 'system' and program.name = 'Other Test Program' limit 1

-- name: InsertOtherProgramOntology
insert into program_ontology (program_id, created_by, updated_by)
select program.id, bi_user.id, bi_user.id from program
join bi_user on bi_user.name = 'system' and program.name = 'Other Test Program' limit 1