diff --git a/pom.xml b/pom.xml index 45d2a243d..d86b89a1c 100644 --- a/pom.xml +++ b/pom.xml @@ -52,8 +52,7 @@ - 1.3.3 - 1.3.2 + 2.5.13 13 ${jdk.version} ${jdk.version} @@ -64,17 +63,31 @@ 2.19.1 --enable-preview - 3.12.3 - 42.2.6 - 1.2.3 - 1.18.16 - 2.8.6 - 1.1.2 + 3.16.3 + 42.3.2 + 1.2.10 + 1.18.22 + 2.8.9 1.14 - 1.8 + 1.9.0 + 3.12.0 + 1.16.3 + + 7.7.3 + 31.0.1-jre + 4.9.3 + 4.3.1 + 2.0.2 + 2.11.0 + 2.2.1 + 4.1.2 4.1.2 - 3.10 + 1.6.2 + 4.3.1 + 0.42.0 + 1.4.1 + 1.10.3 @@ -164,7 +177,7 @@ compile - io.micronaut.configuration + io.micronaut.sql micronaut-jdbc-hikari runtime @@ -174,29 +187,26 @@ compile - io.micronaut.configuration + io.micronaut.sql micronaut-jooq compile - io.micronaut + io.micronaut.security micronaut-security - ${micronaut.security.version} compile - io.micronaut + io.micronaut.security micronaut-security-jwt - ${micronaut.security.version} compile - io.micronaut.configuration + io.micronaut.security micronaut-security-oauth2 - ${micronaut.security.version} compile @@ -229,14 +239,14 @@ - io.micronaut.configuration + io.micronaut.flyway micronaut-flyway com.google.guava guava - 28.1-jre + ${guava.version} @@ -248,12 +258,12 @@ com.squareup.okhttp3 okhttp - 4.2.2 + ${okhttp.version} ch.qos.logback logback-classic - 1.2.3 + ${logback.version} runtime @@ -276,6 +286,11 @@ micronaut-test-spock test + + org.flywaydb + flyway-core + ${flyway.version} + org.mockito mockito-inline @@ -296,7 +311,7 @@ org.testcontainers testcontainers - 1.15.2 + ${testcontainers.version} test @@ -307,7 +322,7 @@ org.brapi brapi-java-client - 2.0.2 + ${brapi-java-client.version} org.apache.commons @@ -332,48 +347,48 @@ commons-io commons-io - 2.6 + ${commons-io.version} org.apache.tika tika-app - 1.24.1 + ${tika-app.version} com.sun.mail javax.mail - 1.6.2 + ${javaxmail.version} org.antlr ST4 - 4.3 + ${st4.version} compile tech.tablesaw tablesaw-core - 0.38.2 + ${tablesaw.version} tech.tablesaw tablesaw-excel - 0.38.2 + ${tablesaw.version} tech.tablesaw tablesaw-json - 0.38.2 + ${tablesaw.version} se.sawano.java alphanumeric-comparator - 1.4.1 + ${alphanumeric-comparator.version} io.github.kostaskougios cloning - 1.10.3 + ${cloning.version} @@ -523,14 +538,14 @@ org.breedinginsight bi-jooq-codegen - 1.0-SNAPSHOT + ${jooq.version} org.flywaydb flyway-maven-plugin - 6.0.0 + ${flyway.version} jdbc:postgresql://${DB_SERVER}/${DB_NAME} ${DB_USER} @@ -560,7 +575,7 @@ org.junit.jupiter junit-jupiter-engine - 5.1.0 + 5.7.0 diff --git a/src/main/java/org/breedinginsight/api/auth/ApiAccessRefreshTokenGenerator.java b/src/main/java/org/breedinginsight/api/auth/ApiAccessRefreshTokenGenerator.java deleted file mode 100644 index 98a848f39..000000000 --- a/src/main/java/org/breedinginsight/api/auth/ApiAccessRefreshTokenGenerator.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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.api.auth; - -import io.micronaut.context.event.ApplicationEventPublisher; -import io.micronaut.security.token.generator.TokenGenerator; -import io.micronaut.security.token.jwt.generator.AccessRefreshTokenGenerator; -import io.micronaut.security.token.jwt.generator.JwtGeneratorConfiguration; -import io.micronaut.security.token.jwt.generator.claims.ClaimsGenerator; -import io.micronaut.security.token.jwt.render.TokenRenderer; - -import javax.inject.Named; - -public class ApiAccessRefreshTokenGenerator extends AccessRefreshTokenGenerator { - - public ApiAccessRefreshTokenGenerator(@Named("apiTokenConfig") JwtGeneratorConfiguration jwtGeneratorConfiguration, TokenRenderer tokenRenderer, TokenGenerator tokenGenerator, ClaimsGenerator claimsGenerator, ApplicationEventPublisher eventPublisher) { - super(jwtGeneratorConfiguration, tokenRenderer, tokenGenerator, claimsGenerator, eventPublisher); - } - -} diff --git a/src/main/java/org/breedinginsight/api/auth/AuthServiceLoginHandler.java b/src/main/java/org/breedinginsight/api/auth/AuthServiceLoginHandler.java index 5226cfaa1..3a25eae13 100644 --- a/src/main/java/org/breedinginsight/api/auth/AuthServiceLoginHandler.java +++ b/src/main/java/org/breedinginsight/api/auth/AuthServiceLoginHandler.java @@ -21,16 +21,15 @@ import io.micronaut.context.annotation.Replaces; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; +import io.micronaut.http.HttpStatus; import io.micronaut.http.MutableHttpResponse; import io.micronaut.http.context.ServerRequestContext; import io.micronaut.http.cookie.Cookie; -import io.micronaut.security.authentication.AuthenticationException; -import io.micronaut.security.authentication.AuthenticationFailed; -import io.micronaut.security.authentication.AuthenticationFailureReason; -import io.micronaut.security.authentication.UserDetails; +import io.micronaut.security.authentication.*; import io.micronaut.security.token.jwt.cookie.JwtCookieConfiguration; import io.micronaut.security.token.jwt.cookie.JwtCookieLoginHandler; import io.micronaut.security.token.jwt.generator.AccessRefreshTokenGenerator; +import io.micronaut.security.token.jwt.generator.AccessTokenConfiguration; import io.micronaut.security.token.jwt.generator.JwtGeneratorConfiguration; import lombok.extern.slf4j.Slf4j; import org.breedinginsight.api.model.v1.auth.SignUpJWT; @@ -68,6 +67,8 @@ public class AuthServiceLoginHandler extends JwtCookieLoginHandler { private String newAccountSuccessUrl; @Property(name = "web.signup.error.url") private String newAccountErrorUrl; + @Property(name = "web.login.failure.url") + private String loginFailureUrl; @Inject private UserService userService; @@ -75,13 +76,13 @@ public class AuthServiceLoginHandler extends JwtCookieLoginHandler { private SignUpJwtService signUpJwtService; public AuthServiceLoginHandler(JwtCookieConfiguration jwtCookieConfiguration, - JwtGeneratorConfiguration jwtGeneratorConfiguration, + AccessTokenConfiguration accessTokenConfiguration, AccessRefreshTokenGenerator accessRefreshTokenGenerator) { - super(jwtCookieConfiguration, jwtGeneratorConfiguration, accessRefreshTokenGenerator); + super(jwtCookieConfiguration, accessTokenConfiguration, accessRefreshTokenGenerator); } @Override - public HttpResponse loginSuccess(UserDetails userDetails, HttpRequest request) { + public MutableHttpResponse loginSuccess(UserDetails userDetails, HttpRequest request) { // Called when login to orcid is successful. // Check if our login to our system is successful. if (request.getCookies().contains(accountTokenCookieName)) { @@ -94,10 +95,30 @@ public HttpResponse loginSuccess(UserDetails userDetails, HttpRequest request // Normal login try { AuthenticatedUser authenticatedUser = getUserCredentials(userDetails); - return super.loginSuccess(authenticatedUser, request); + + // Redirect on user login if redirect is present + if (request.getCookies().contains(loginSuccessUrlCookieName)){ + MutableHttpResponse response = HttpResponse.status(HttpStatus.SEE_OTHER); + Cookie loginSuccessCookie = request.getCookies().get(loginSuccessUrlCookieName); + String returnUrl = loginSuccessCookie.getValue(); + try { + returnUrl = URLDecoder.decode(returnUrl, StandardCharsets.UTF_8.name()); + try { + response.getHeaders().location(new URI(returnUrl)); + return super.applyCookies(response, getCookies(authenticatedUser, request)); + } catch (URISyntaxException e) { + log.info("Invalid url: " + returnUrl); + } + } catch (UnsupportedEncodingException e){ + log.info("Error decoding url: " + returnUrl); + } + } + + MutableHttpResponse response = super.loginSuccess(authenticatedUser, request); + return response; } catch (AuthenticationException e) { AuthenticationFailed authenticationFailed = new AuthenticationFailed(AuthenticationFailureReason.USER_NOT_FOUND); - return loginFailed(authenticationFailed); + return loginFailed(authenticationFailed, request); } } @@ -125,58 +146,13 @@ private AuthenticatedUser getUserCredentials(UserDetails userDetails) throws Aut } @Override - protected HttpResponse loginSuccessWithCookies(List cookies) { - try { - String locationUrl = this.jwtCookieConfiguration.getLoginSuccessTargetUrl(); - - Optional> requestOptional = this.getCurrentRequest(); - if (requestOptional.isPresent()){ - HttpRequest request = requestOptional.get(); - if (request.getCookies().contains(loginSuccessUrlCookieName)){ - Cookie loginSuccessCookie = request.getCookies().get(loginSuccessUrlCookieName); - String returnUrl = loginSuccessCookie.getValue(); - try { - returnUrl = URLDecoder.decode(returnUrl, StandardCharsets.UTF_8.name()); - if (isValidURL(returnUrl)){ - locationUrl = returnUrl; - } else { - log.info("Invalid url: " + returnUrl); - } - } catch (UnsupportedEncodingException e){ - log.info("Error decoding url: " + returnUrl); - } - } - } - - URI location = new URI(locationUrl); - - MutableHttpResponse mutableHttpResponse = HttpResponse.seeOther(location); - - Cookie cookie; - for(Iterator cookieIterator = cookies.iterator(); cookieIterator.hasNext(); mutableHttpResponse = mutableHttpResponse.cookie(cookie)) { - cookie = (Cookie)cookieIterator.next(); - } - - return mutableHttpResponse; - } catch (URISyntaxException e) { - log.error(e.getMessage()); - return HttpResponse.serverError(); - } - } - - @Override - public HttpResponse loginFailed(AuthenticationFailed authenticationFailed) { + public MutableHttpResponse loginFailed(AuthenticationResponse authenticationFailed, HttpRequest request) { // If we want to hook code into the login process in the future we can put it here, for now just // passes through to JwtCookieLoginHandler try { URI location; - if (authenticationFailed.getReason().equals(AuthenticationFailureReason.USER_NOT_FOUND)){ - location = new URI(jwtCookieConfiguration.getLoginFailureTargetUrl()); - } else { - location = new URI(loginErrorUrl); - } - + location = new URI(loginFailureUrl); return HttpResponse.seeOther(location); } catch (URISyntaxException e) { return HttpResponse.serverError(); @@ -224,18 +200,11 @@ private MutableHttpResponse newAccountCreationResponse(UserDetails userDetails, // Get logged in JWT and redirect user to account creation success page try { AuthenticatedUser authenticatedUser = getUserCredentials(userDetails); - Optional cookieOptional = super.accessTokenCookie(authenticatedUser, request); - if (!cookieOptional.isPresent()) { - return HttpResponse.seeOther(URI.create(newAccountErrorUrl)); - } - Cookie cookie = cookieOptional.get(); - MutableHttpResponse resp = HttpResponse.seeOther(URI.create(newAccountSuccessUrl)); - resp.cookie(cookie); - return resp; + MutableHttpResponse response = HttpResponse.seeOther(URI.create(newAccountSuccessUrl)); + return super.applyCookies(response, super.getCookies(authenticatedUser, request)); } catch (AuthenticationException e) { return HttpResponse.seeOther(URI.create(newAccountErrorUrl)); } - } else { // JWT ID did not match return HttpResponse.seeOther(URI.create(newAccountErrorUrl)); diff --git a/src/main/java/org/breedinginsight/api/auth/AuthServiceLogoutHandler.java b/src/main/java/org/breedinginsight/api/auth/AuthServiceLogoutHandler.java index f3690648d..6b5a63d58 100644 --- a/src/main/java/org/breedinginsight/api/auth/AuthServiceLogoutHandler.java +++ b/src/main/java/org/breedinginsight/api/auth/AuthServiceLogoutHandler.java @@ -19,7 +19,7 @@ import io.micronaut.context.annotation.Replaces; import io.micronaut.http.HttpRequest; -import io.micronaut.http.HttpResponse; +import io.micronaut.http.MutableHttpResponse; import io.micronaut.security.token.jwt.cookie.JwtCookieClearerLogoutHandler; import io.micronaut.security.token.jwt.cookie.JwtCookieConfiguration; @@ -34,7 +34,7 @@ public AuthServiceLogoutHandler(JwtCookieConfiguration jwtCookieConfiguration) { } @Override - public HttpResponse logout(HttpRequest request) { + public MutableHttpResponse logout(HttpRequest request) { // If we want to hook code into the logout process in the future we can put it here, for now just // passes through to JwtCookieClearerLogoutHandler return super.logout(request); diff --git a/src/main/java/org/breedinginsight/api/auth/SecurityService.java b/src/main/java/org/breedinginsight/api/auth/SecurityService.java index 603139e80..ebcd6b539 100644 --- a/src/main/java/org/breedinginsight/api/auth/SecurityService.java +++ b/src/main/java/org/breedinginsight/api/auth/SecurityService.java @@ -20,6 +20,7 @@ import io.micronaut.http.HttpStatus; import io.micronaut.http.exceptions.HttpStatusException; import io.micronaut.security.authentication.Authentication; +import io.micronaut.security.token.config.TokenConfiguration; import io.micronaut.security.utils.DefaultSecurityService; import org.breedinginsight.dao.db.tables.daos.ProgramDao; import org.breedinginsight.dao.db.tables.pojos.ProgramEntity; @@ -41,7 +42,8 @@ public class SecurityService extends DefaultSecurityService { @Inject public SecurityService(ProgramDao programDao, UserDAO userDAO, - Provider actingUserProvider) { + Provider actingUserProvider, TokenConfiguration tokenConfiguration) { + super(tokenConfiguration); this.programDao = programDao; this.userDAO = userDAO; this.actingUserProvider = actingUserProvider; diff --git a/src/main/java/org/breedinginsight/api/auth/rules/ProgramSecuredAnnotationRule.java b/src/main/java/org/breedinginsight/api/auth/rules/ProgramSecuredAnnotationRule.java index a32c10191..51aeabea7 100644 --- a/src/main/java/org/breedinginsight/api/auth/rules/ProgramSecuredAnnotationRule.java +++ b/src/main/java/org/breedinginsight/api/auth/rules/ProgramSecuredAnnotationRule.java @@ -29,8 +29,8 @@ import org.breedinginsight.api.auth.*; import org.breedinginsight.daos.ProgramDAO; import org.breedinginsight.model.ProgramUser; +import org.jetbrains.annotations.Nullable; -import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Singleton; import java.util.*; @@ -52,7 +52,7 @@ public ProgramSecuredAnnotationRule(RolesFinder rolesFinder) { private ProgramDAO programDAO; @Override - public SecurityRuleResult check(HttpRequest request, @Nullable RouteMatch routeMatch, @Nullable Map claims) { + public SecurityRuleResult check(HttpRequest request, @Nullable RouteMatch routeMatch, @Nullable Map claims) { // Does not approve request so that checks after it can check. Only rejects on fail. if (routeMatch instanceof MethodBasedRouteMatch) { diff --git a/src/main/java/org/breedinginsight/api/model/v1/request/SystemRolesRequest.java b/src/main/java/org/breedinginsight/api/model/v1/request/SystemRolesRequest.java index 57c970fea..2a1520824 100644 --- a/src/main/java/org/breedinginsight/api/model/v1/request/SystemRolesRequest.java +++ b/src/main/java/org/breedinginsight/api/model/v1/request/SystemRolesRequest.java @@ -19,6 +19,7 @@ import io.micronaut.core.annotation.Introspected; import lombok.*; +import lombok.extern.jackson.Jacksonized; import org.breedinginsight.model.SystemRole; import javax.validation.constraints.NotNull; @@ -31,6 +32,7 @@ @AllArgsConstructor @NoArgsConstructor @Introspected +@Jacksonized public class SystemRolesRequest { @NotNull private List systemRoles; diff --git a/src/main/java/org/breedinginsight/api/v1/controller/HttpStatusExceptionHandler.java b/src/main/java/org/breedinginsight/api/v1/controller/HttpStatusExceptionHandler.java deleted file mode 100644 index 0018a1e8d..000000000 --- a/src/main/java/org/breedinginsight/api/v1/controller/HttpStatusExceptionHandler.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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.api.v1.controller; - -import io.micronaut.context.annotation.Requires; -import io.micronaut.http.HttpRequest; -import io.micronaut.http.HttpResponse; -import io.micronaut.http.annotation.Produces; -import io.micronaut.http.exceptions.HttpStatusException; -import io.micronaut.http.server.exceptions.ExceptionHandler; -import lombok.extern.slf4j.Slf4j; - -import javax.inject.Singleton; - -@Produces -@Singleton -@Slf4j -@Requires(classes = {Exception.class, ExceptionHandler.class}) -public class HttpStatusExceptionHandler implements ExceptionHandler { - - @Override - public HttpResponse handle(HttpRequest request, HttpStatusException e) { - log.error(e.getMessage()); - return HttpResponse.status(e.getStatus(), e.getMessage()); - } -} diff --git a/src/main/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilter.java b/src/main/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilter.java index d45257fe8..710a47ea1 100644 --- a/src/main/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilter.java +++ b/src/main/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilter.java @@ -19,10 +19,7 @@ import io.micronaut.context.annotation.Property; import io.micronaut.core.order.Ordered; -import io.micronaut.http.HttpAttributes; -import io.micronaut.http.HttpRequest; -import io.micronaut.http.HttpStatus; -import io.micronaut.http.MutableHttpResponse; +import io.micronaut.http.*; import io.micronaut.http.annotation.Filter; import io.micronaut.http.filter.OncePerRequestHttpServerFilter; import io.micronaut.http.filter.ServerFilterChain; @@ -31,7 +28,6 @@ import io.micronaut.web.router.RouteMatch; import io.reactivex.Flowable; import io.reactivex.schedulers.Schedulers; -import io.micronaut.http.exceptions.HttpStatusException; import org.breedinginsight.services.brapi.BrAPIClientProvider; import org.breedinginsight.model.ProgramBrAPIEndpoints; import org.breedinginsight.services.ProgramService; @@ -72,6 +68,9 @@ public Publisher> doFilterOnce(HttpRequest request, Se .switchMap(aBoolean -> { RouteMatch routeMatch = request.getAttribute(HttpAttributes.ROUTE_MATCH, RouteMatch.class).orElse(null); + if (routeMatch == null) { + return chain.proceed(request); + } Map params = routeMatch.getVariableValues(); if (params.get("programId") != null) { if (routeMatch instanceof MethodBasedRouteMatch) { @@ -80,14 +79,16 @@ public Publisher> doFilterOnce(HttpRequest request, Se try { programId = UUID.fromString(params.get("programId").toString()); } catch (IllegalArgumentException e) { - return Flowable.error(new HttpStatusException(HttpStatus.NOT_FOUND, "Program does not exist")); + MutableHttpResponse response = HttpResponse.status(HttpStatus.NOT_FOUND, "Program does not exist"); + return Flowable.just(response); } ProgramBrAPIEndpoints programBrAPIEndpoints; try { programBrAPIEndpoints = programService.getBrapiEndpoints(programId); } catch (DoesNotExistException e) { - return Flowable.error(new HttpStatusException(HttpStatus.NOT_FOUND, "Program does not exist")); + MutableHttpResponse response = HttpResponse.status(HttpStatus.NOT_FOUND, "Program does not exist"); + return Flowable.just(response); } String coreUrl = getCoreUrl(programBrAPIEndpoints); brAPIClientProvider.setCoreClient(coreUrl); diff --git a/src/main/java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java b/src/main/java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java index f058d1307..6737b5aec 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java +++ b/src/main/java/org/breedinginsight/brapi/v2/BrAPIV2Controller.java @@ -50,7 +50,6 @@ import javax.inject.Inject; import javax.validation.Valid; -import javax.ws.rs.NotFoundException; import java.io.IOException; import java.util.List; import java.util.UUID; diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java b/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java index 588fcf6a3..00866bc1d 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/FileImportService.java @@ -58,7 +58,6 @@ import javax.inject.Inject; import javax.inject.Singleton; -import javax.ws.rs.BadRequestException; import java.io.IOException; import java.util.*; import java.util.concurrent.CompletableFuture; @@ -339,7 +338,7 @@ public ImportResponse updateUpload(UUID programId, UUID uploadId, AuthenticatedU // Check that the program that the user created the import for is the one they are updating for if (!programId.equals(upload.getProgramId())){ - throw new BadRequestException("Unable to update upload for a different program than the upload was created in."); + throw new HttpStatusException(HttpStatus.BAD_REQUEST, "Unable to update upload for a different program than the upload was created in."); } // Get mapping diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/MappingManager.java b/src/main/java/org/breedinginsight/brapps/importer/services/MappingManager.java index 4dd9982e6..90c5af46d 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/MappingManager.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/MappingManager.java @@ -18,6 +18,7 @@ package org.breedinginsight.brapps.importer.services; import io.micronaut.http.HttpStatus; +import io.micronaut.http.exceptions.HttpStatusException; import io.micronaut.http.server.exceptions.InternalServerException; import org.apache.commons.lang3.StringUtils; import org.breedinginsight.api.model.v1.response.ValidationError; @@ -38,7 +39,6 @@ import javax.inject.Inject; import javax.inject.Singleton; -import javax.ws.rs.BadRequestException; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.util.*; @@ -233,7 +233,7 @@ private void mapField(Object parent, Field field, List mappings, T } else if (matchedMapping.getValue().getRelationMap().getReference() == null && matchedMapping.getValue().getRelationMap().getTarget() == null) { - throw new BadRequestException("Relationship field is not properly formatted"); + throw new HttpStatusException(HttpStatus.BAD_REQUEST, "Relationship field is not properly formatted"); } MappingValue value = matchedMapping.getValue(); @@ -266,7 +266,7 @@ private void mapField(Object parent, Field field, List mappings, T return; } else if (matchedMapping.getValue() != null && matchedMapping.getValue().getFileFieldName() == null && matchedMapping.getValue().getConstantValue() == null){ - throw new BadRequestException("Basic mapping field must have file field or constant value specified."); + throw new HttpStatusException(HttpStatus.BAD_REQUEST, "Basic mapping field must have file field or constant value specified."); } // Check if the mapping passed a constant value or a mapped value diff --git a/src/main/java/org/breedinginsight/daos/TraitDAO.java b/src/main/java/org/breedinginsight/daos/TraitDAO.java index 443694d58..e9eb47432 100644 --- a/src/main/java/org/breedinginsight/daos/TraitDAO.java +++ b/src/main/java/org/breedinginsight/daos/TraitDAO.java @@ -45,8 +45,7 @@ import static org.breedinginsight.dao.db.Tables.*; import static org.breedinginsight.services.brapi.BrAPIClientType.PHENO; -import static org.jooq.impl.DSL.row; -import static org.jooq.impl.DSL.values; +import static org.jooq.impl.DSL.*; @Singleton public class TraitDAO extends TraitDao { @@ -521,24 +520,22 @@ private SelectOnConditionStep getTraitSql(BiUserTable createdByTableAlia public List getTraitsByTraitName(UUID programId, List traits){ - RowN[] valueRows = traits.stream() + String[] names = traits.stream() .filter(trait -> trait.getObservationVariableName() != null) - .map(trait -> (RowN) row(trait.getObservationVariableName())) - .collect(Collectors.toList()).toArray(RowN[]::new); + .map(trait -> trait.getObservationVariableName().toLowerCase()) + .collect(Collectors.toList()).toArray(String[]::new); List traitResults = new ArrayList<>(); - if (valueRows.length > 0){ - Table newTraits = dsl.select() - .from(values(valueRows).as("newTraits", "new_trait_name")).asTable("newTraits"); + if (names.length > 0){ Result records = dsl.select() - .from(newTraits) - .join(TRAIT).on(TRAIT.OBSERVATION_VARIABLE_NAME.upper().equalIgnoreCase(newTraits.field("new_trait_name"))) + .from(TRAIT) .join(PROGRAM_ONTOLOGY).on(TRAIT.PROGRAM_ONTOLOGY_ID.eq(PROGRAM_ONTOLOGY.ID)) .join(PROGRAM).on(PROGRAM_ONTOLOGY.PROGRAM_ID.eq(PROGRAM.ID)) .join(SCALE).on(TRAIT.SCALE_ID.eq(SCALE.ID)) .join(METHOD).on(TRAIT.METHOD_ID.eq(METHOD.ID)) .where(PROGRAM.ID.eq(programId)) + .and(lower(TRAIT.OBSERVATION_VARIABLE_NAME).in(names)) .fetch(); for (Record record: records) { diff --git a/src/main/java/org/breedinginsight/model/Method.java b/src/main/java/org/breedinginsight/model/Method.java index 9db01762b..b300e96f5 100644 --- a/src/main/java/org/breedinginsight/model/Method.java +++ b/src/main/java/org/breedinginsight/model/Method.java @@ -18,12 +18,14 @@ package org.breedinginsight.model; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.micronaut.core.annotation.Introspected; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; import lombok.experimental.Accessors; import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; import org.brapi.v2.model.pheno.BrAPIMethod; import org.breedinginsight.dao.db.tables.pojos.MethodEntity; import org.jooq.Record; @@ -36,6 +38,8 @@ @ToString @SuperBuilder @NoArgsConstructor +@Introspected +@Jacksonized @JsonIgnoreProperties(value = { "id", "programOntologyId", "updatedBy", "createdBy", "updatedAt", "createdAt" }) public class Method extends MethodEntity { diff --git a/src/main/java/org/breedinginsight/model/Program.java b/src/main/java/org/breedinginsight/model/Program.java index 35cebadb5..b7c23e108 100644 --- a/src/main/java/org/breedinginsight/model/Program.java +++ b/src/main/java/org/breedinginsight/model/Program.java @@ -19,9 +19,11 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.micronaut.core.annotation.Introspected; import lombok.*; import lombok.experimental.Accessors; import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; import org.brapi.v2.model.core.BrAPIProgram; import org.brapi.v2.model.pheno.BrAPIObservationVariable; import org.breedinginsight.dao.db.tables.ProgramTable; @@ -37,6 +39,8 @@ @ToString @SuperBuilder @NoArgsConstructor +@Introspected +@Jacksonized @JsonIgnoreProperties(value = { "createdBy", "updatedBy", "speciesId" }) public class Program extends ProgramEntity { diff --git a/src/main/java/org/breedinginsight/model/ProgramObservationLevel.java b/src/main/java/org/breedinginsight/model/ProgramObservationLevel.java index 1c4b84067..95f83265d 100644 --- a/src/main/java/org/breedinginsight/model/ProgramObservationLevel.java +++ b/src/main/java/org/breedinginsight/model/ProgramObservationLevel.java @@ -18,12 +18,14 @@ package org.breedinginsight.model; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.micronaut.core.annotation.Introspected; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; import lombok.experimental.Accessors; import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; import org.breedinginsight.dao.db.tables.pojos.ProgramObservationLevelEntity; import org.jooq.Record; @@ -35,6 +37,8 @@ @ToString @SuperBuilder @NoArgsConstructor +@Introspected +@Jacksonized @JsonIgnoreProperties(value = { "updatedBy", "createdBy" }) public class ProgramObservationLevel extends ProgramObservationLevelEntity { diff --git a/src/main/java/org/breedinginsight/model/ProgramOntology.java b/src/main/java/org/breedinginsight/model/ProgramOntology.java index 754b2dbae..d363ba96e 100644 --- a/src/main/java/org/breedinginsight/model/ProgramOntology.java +++ b/src/main/java/org/breedinginsight/model/ProgramOntology.java @@ -18,12 +18,14 @@ package org.breedinginsight.model; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.micronaut.core.annotation.Introspected; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; import lombok.experimental.Accessors; import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; import org.breedinginsight.dao.db.tables.pojos.ProgramOntologyEntity; import org.jooq.Record; @@ -35,6 +37,8 @@ @ToString @SuperBuilder @NoArgsConstructor +@Introspected +@Jacksonized @JsonIgnoreProperties(value = { "updatedBy", "createdBy" }) public class ProgramOntology extends ProgramOntologyEntity { diff --git a/src/main/java/org/breedinginsight/model/Scale.java b/src/main/java/org/breedinginsight/model/Scale.java index 65649e74f..f1c3ebf8f 100644 --- a/src/main/java/org/breedinginsight/model/Scale.java +++ b/src/main/java/org/breedinginsight/model/Scale.java @@ -18,12 +18,14 @@ package org.breedinginsight.model; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.micronaut.core.annotation.Introspected; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; import lombok.experimental.Accessors; import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; import org.brapi.v2.model.pheno.BrAPIScale; import org.brapi.v2.model.pheno.BrAPIScaleValidValues; import org.brapi.v2.model.pheno.BrAPIScaleValidValuesCategories; @@ -40,6 +42,8 @@ @ToString @SuperBuilder @NoArgsConstructor +@Introspected +@Jacksonized @JsonIgnoreProperties(value = { "id", "programOntologyId", "updatedBy", "createdBy", "updatedAt", "createdAt" }) public class Scale extends ScaleEntity { diff --git a/src/main/java/org/breedinginsight/model/Trait.java b/src/main/java/org/breedinginsight/model/Trait.java index a7f17dfea..7ad7cc9e1 100644 --- a/src/main/java/org/breedinginsight/model/Trait.java +++ b/src/main/java/org/breedinginsight/model/Trait.java @@ -20,18 +20,21 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import io.micronaut.core.annotation.Introspected; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; import lombok.experimental.Accessors; import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; import org.brapi.v2.model.pheno.BrAPIObservationVariable; import org.breedinginsight.api.deserializer.ArrayOfStringDeserializer; import org.breedinginsight.api.deserializer.ListOfStringDeserializer; import org.breedinginsight.dao.db.tables.pojos.TraitEntity; import org.jooq.Record; +import javax.validation.Valid; import java.util.List; import static org.breedinginsight.dao.db.Tables.TRAIT; @@ -42,6 +45,8 @@ @ToString @SuperBuilder @NoArgsConstructor +@Introspected +@Jacksonized @JsonIgnoreProperties(value = { "methodId", "scaleId", "programOntologyId", "programObservationLevelId", "createdBy", "updatedBy"}) public class Trait extends TraitEntity { diff --git a/src/main/java/org/breedinginsight/model/User.java b/src/main/java/org/breedinginsight/model/User.java index acbaadbe7..15b38c1be 100644 --- a/src/main/java/org/breedinginsight/model/User.java +++ b/src/main/java/org/breedinginsight/model/User.java @@ -19,9 +19,11 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; +import io.micronaut.core.annotation.Introspected; import lombok.*; import lombok.experimental.Accessors; import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; import org.breedinginsight.dao.db.tables.BiUserTable; import org.breedinginsight.dao.db.tables.pojos.BiUserEntity; import org.jooq.Record; @@ -38,6 +40,8 @@ @Accessors(chain=true) @ToString @SuperBuilder +@Introspected +@Jacksonized @JsonIgnoreProperties(value = {"accountToken"}) public class User extends BiUserEntity{ diff --git a/src/main/java/org/breedinginsight/services/TokenService.java b/src/main/java/org/breedinginsight/services/TokenService.java index 95060ecdc..274056d1f 100644 --- a/src/main/java/org/breedinginsight/services/TokenService.java +++ b/src/main/java/org/breedinginsight/services/TokenService.java @@ -16,9 +16,9 @@ */ package org.breedinginsight.services; +import io.micronaut.security.token.jwt.generator.AccessRefreshTokenGenerator; import io.micronaut.security.token.jwt.render.AccessRefreshToken; import lombok.extern.slf4j.Slf4j; -import org.breedinginsight.api.auth.ApiAccessRefreshTokenGenerator; import org.breedinginsight.api.auth.AuthenticatedUser; import org.breedinginsight.model.ApiToken; import org.breedinginsight.model.User; @@ -31,13 +31,13 @@ @Singleton public class TokenService { - private ApiAccessRefreshTokenGenerator apiAccessRefreshTokenGenerator; private UserService userService; + private AccessRefreshTokenGenerator accessRefreshTokenGenerator; @Inject - public TokenService(ApiAccessRefreshTokenGenerator apiAccessRefreshTokenGenerator, + public TokenService(AccessRefreshTokenGenerator refreshTokenGenerator, UserService userService) { - this.apiAccessRefreshTokenGenerator = apiAccessRefreshTokenGenerator; + this.accessRefreshTokenGenerator = refreshTokenGenerator; this.userService = userService; } @@ -48,7 +48,7 @@ public Optional generateApiToken(AuthenticatedUser user) { return Optional.empty(); } - Optional tokenOptional = this.apiAccessRefreshTokenGenerator.generate(user); + Optional tokenOptional = this.accessRefreshTokenGenerator.generate(user); if (tokenOptional.isPresent()) { return Optional.of(ApiToken.builder().accessToken(tokenOptional.get().getAccessToken()).build()); diff --git a/src/main/java/org/breedinginsight/services/parsers/MimeTypeParser.java b/src/main/java/org/breedinginsight/services/parsers/MimeTypeParser.java index d4fc2d84a..3ebab1fc1 100644 --- a/src/main/java/org/breedinginsight/services/parsers/MimeTypeParser.java +++ b/src/main/java/org/breedinginsight/services/parsers/MimeTypeParser.java @@ -22,6 +22,7 @@ import org.apache.tika.detect.Detector; import org.apache.tika.io.TikaInputStream; import org.apache.tika.metadata.Metadata; +import org.apache.tika.metadata.TikaCoreProperties; import org.apache.tika.mime.MediaType; import javax.inject.Singleton; @@ -39,7 +40,7 @@ public MimeTypeParser() { public MediaType getMimeType(CompletedFileUpload file) throws IOException { Metadata metadata = new Metadata(); - metadata.add(Metadata.RESOURCE_NAME_KEY, file.getFilename()); + metadata.add(TikaCoreProperties.RESOURCE_NAME_KEY, file.getFilename()); TikaInputStream tikaStream = TikaInputStream.get(file.getInputStream()); return detector.detect(tikaStream, metadata); } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 8ccce1871..c1d207a0e 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -24,6 +24,7 @@ micronaut: port: ${API_INTERNAL_PORT:8081} cors: enabled: true + thread-selection: AUTO multipart: enabled: true max-file-size: '100MB' @@ -92,6 +93,7 @@ micronaut: enabled: true get-allowed: true path: /logout + authentication: cookie jackson: date-format: yyyy-MM-dd'T'HH:mm:ssZ mapper: @@ -100,8 +102,8 @@ flyway: datasources: default: locations: - - classpath:org.breedinginsight.db.migration - - classpath:db.migration + - classpath:org/breedinginsight/db/migration + - classpath:db/migration enabled: true placeholders: default-url: ${brapi.server.default-url} diff --git a/src/test/java/org/breedinginsight/api/auth/AuthServiceLoginHandlerUnitTest.java b/src/test/java/org/breedinginsight/api/auth/AuthServiceLoginHandlerUnitTest.java index 9b6cbe9dd..e7b7f1eef 100644 --- a/src/test/java/org/breedinginsight/api/auth/AuthServiceLoginHandlerUnitTest.java +++ b/src/test/java/org/breedinginsight/api/auth/AuthServiceLoginHandlerUnitTest.java @@ -23,17 +23,15 @@ import io.micronaut.http.HttpResponse; import io.micronaut.http.cookie.Cookie; import io.micronaut.http.simple.cookies.SimpleCookies; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.security.authentication.UserDetails; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import org.breedinginsight.DatabaseTest; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; import javax.inject.Inject; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -51,6 +49,8 @@ public class AuthServiceLoginHandlerUnitTest extends DatabaseTest { @Property(name = "web.cookies.login-redirect") private String loginRedirectCookieName; + private String userName = "1111-2222-3333-4444"; + @AfterAll public void finish() { super.stopContainers(); @@ -59,21 +59,21 @@ public void finish() { @Test public void returnsDefaultBadUrl() { + HttpRequest request = mock(HttpRequest.class, CALLS_REAL_METHODS); - Cookie returnUrlCookie = Cookie.of(loginRedirectCookieName, "localhost:8080/test"); + Cookie returnUrlCookie = Cookie.of(loginRedirectCookieName, "cats man..."); SimpleCookies cookies = new SimpleCookies(ConversionService.SHARED); cookies.put("redirect-login", returnUrlCookie); doReturn(cookies).when(request).getCookies(); + doReturn(false).when(request).isSecure(); AuthServiceLoginHandler authServiceSpy = spy(authServiceLoginHandler); when(authServiceSpy.getCurrentRequest()).thenReturn(Optional.of(request)); - Cookie jwtToken = Cookie.of("phylo-token", "test"); - List securityCookies = List.of(jwtToken); - - HttpResponse response = authServiceSpy.loginSuccessWithCookies(securityCookies); + UserDetails user = new UserDetails(userName, new ArrayList<>()); - checkAssertions(response, jwtToken, defaultUrl); + HttpResponse response = authServiceSpy.loginSuccess(user, request); + checkAssertions(response, defaultUrl); } @Test @@ -85,16 +85,16 @@ public void returnsPassedUrlGoodHttpUrl() { SimpleCookies cookies = new SimpleCookies(ConversionService.SHARED); cookies.put("redirect-login", returnUrlCookie); doReturn(cookies).when(request).getCookies(); + doReturn(false).when(request).isSecure(); AuthServiceLoginHandler authServiceSpy = spy(authServiceLoginHandler); when(authServiceSpy.getCurrentRequest()).thenReturn(Optional.of(request)); - Cookie jwtToken = Cookie.of("phylo-token", "test"); - List securityCookies = List.of(jwtToken); + UserDetails user = new UserDetails(userName, new ArrayList<>()); - HttpResponse response = authServiceSpy.loginSuccessWithCookies(securityCookies); + HttpResponse response = authServiceSpy.loginSuccess(user, request); reset(request); - checkAssertions(response, jwtToken, expectedUrl); + checkAssertions(response, expectedUrl); } @Test @@ -106,16 +106,16 @@ public void returnsPassedUrlGoodHttpsUrl() { SimpleCookies cookies = new SimpleCookies(ConversionService.SHARED); cookies.put("redirect-login", returnUrlCookie); doReturn(cookies).when(request).getCookies(); + doReturn(false).when(request).isSecure(); AuthServiceLoginHandler authServiceSpy = spy(authServiceLoginHandler); when(authServiceSpy.getCurrentRequest()).thenReturn(Optional.of(request)); - Cookie jwtToken = Cookie.of("phylo-token", "test"); - List securityCookies = List.of(jwtToken); + UserDetails user = new UserDetails(userName, new ArrayList<>()); - HttpResponse response = authServiceSpy.loginSuccessWithCookies(securityCookies); + HttpResponse response = authServiceSpy.loginSuccess(user, request); reset(request); - checkAssertions(response, jwtToken, expectedUrl); + checkAssertions(response, expectedUrl); } @Test @@ -124,19 +124,19 @@ public void returnsDefaultUrlCookieNotExist() { HttpRequest request = mock(HttpRequest.class, CALLS_REAL_METHODS); SimpleCookies cookies = new SimpleCookies(ConversionService.SHARED); doReturn(cookies).when(request).getCookies(); + doReturn(false).when(request).isSecure(); AuthServiceLoginHandler authServiceSpy = spy(authServiceLoginHandler); when(authServiceSpy.getCurrentRequest()).thenReturn(Optional.of(request)); - Cookie jwtToken = Cookie.of("phylo-token", "test"); - List securityCookies = List.of(jwtToken); + UserDetails user = new UserDetails(userName, new ArrayList<>()); - HttpResponse response = authServiceSpy.loginSuccessWithCookies(securityCookies); + HttpResponse response = authServiceSpy.loginSuccess(user, request); reset(request); - checkAssertions(response, jwtToken, defaultUrl); + checkAssertions(response, defaultUrl); } - public void checkAssertions(HttpResponse response, Cookie jwtToken, String expectedLocation) { + public void checkAssertions(HttpResponse response, String expectedLocation) { // Check location is as expected String redirectLocation = response.getHeaders().get("Location"); @@ -151,15 +151,10 @@ public void checkAssertions(HttpResponse response, Cookie jwtToken, String expec responseCookies.put(splitCookie[i], splitCookie[i+1]); } } - Map requestCookie = new HashMap<>(); - requestCookie.put(jwtToken.getName(), jwtToken.getValue()); - for (String key: responseCookies.keySet()){ - assertTrue(requestCookie.containsKey(key)); - if (requestCookie.containsKey(key)){ - assertEquals(requestCookie.get(key), responseCookies.get(key),"Returned cookie does not equal passed cookie (cookie was modified)"); - } - } + // Check that the jwt cookie was returned + String token = responseCookies.get("phylo-token"); + assertTrue(token.split("\\.").length == 3, "JWT was in wrong format"); } } diff --git a/src/test/java/org/breedinginsight/api/auth/rules/ProgramSecuredAnnotationRuleIntegrationTest.java b/src/test/java/org/breedinginsight/api/auth/rules/ProgramSecuredAnnotationRuleIntegrationTest.java index 807a21e10..5daa38a41 100644 --- a/src/test/java/org/breedinginsight/api/auth/rules/ProgramSecuredAnnotationRuleIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/auth/rules/ProgramSecuredAnnotationRuleIntegrationTest.java @@ -26,7 +26,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import org.breedinginsight.BrAPITest; import org.breedinginsight.api.model.v1.request.ProgramRequest; diff --git a/src/test/java/org/breedinginsight/api/model/v1/request/UserRequestTest.java b/src/test/java/org/breedinginsight/api/model/v1/request/UserRequestTest.java index 8b7d8d111..a2796c869 100644 --- a/src/test/java/org/breedinginsight/api/model/v1/request/UserRequestTest.java +++ b/src/test/java/org/breedinginsight/api/model/v1/request/UserRequestTest.java @@ -17,7 +17,7 @@ package org.breedinginsight.api.model.v1.request; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.micronaut.validation.validator.Validator; import org.breedinginsight.DatabaseTest; import org.junit.jupiter.api.AfterAll; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/AccessibilityControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/AccessibilityControllerIntegrationTest.java index 690c84210..4d31f4561 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/AccessibilityControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/AccessibilityControllerIntegrationTest.java @@ -27,7 +27,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import org.breedinginsight.DatabaseTest; import org.junit.jupiter.api.*; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/CountryControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/CountryControllerIntegrationTest.java index 5664b89aa..c9555c06d 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/CountryControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/CountryControllerIntegrationTest.java @@ -27,7 +27,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import org.breedinginsight.DatabaseTest; import org.junit.jupiter.api.*; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/EnvironmentTypeControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/EnvironmentTypeControllerIntegrationTest.java index a98eff8a1..e01ef6648 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/EnvironmentTypeControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/EnvironmentTypeControllerIntegrationTest.java @@ -27,7 +27,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import org.breedinginsight.DatabaseTest; import org.junit.jupiter.api.*; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/ImportControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/ImportControllerIntegrationTest.java index c5b872c89..47115ce10 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/ImportControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/ImportControllerIntegrationTest.java @@ -27,7 +27,7 @@ import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.client.multipart.MultipartBody; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import lombok.SneakyThrows; import org.breedinginsight.BrAPITest; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/InternalServerErrorHandlerUnitTest.java b/src/test/java/org/breedinginsight/api/v1/controller/InternalServerErrorHandlerUnitTest.java index 4ed02143c..5aed4b3b5 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/InternalServerErrorHandlerUnitTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/InternalServerErrorHandlerUnitTest.java @@ -28,7 +28,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.micronaut.test.annotation.MockBean; import io.reactivex.Flowable; import lombok.SneakyThrows; @@ -58,6 +58,7 @@ @MicronautTest @TestInstance(TestInstance.Lifecycle.PER_CLASS) +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class InternalServerErrorHandlerUnitTest extends DatabaseTest { private ListAppender loggingEventListAppender; @@ -67,41 +68,21 @@ ProgramService programService() { return mock(ProgramService.class); } - @MockBean(CountryController.class) - CountryController countryController() { - return mock(CountryController.class); - } - @MockBean(CountryService.class) CountryService countryService() { return mock(CountryService.class); } - @MockBean(TopographyController.class) - TopographyController topographyController() { - return mock(TopographyController.class); - } - @MockBean(TopographyService.class) TopographyService topographyService() { return mock(TopographyService.class); } - @MockBean(AccessibilityController.class) - AccessibilityController accessibilityController() { - return mock(AccessibilityController.class); - } - @MockBean(AccessibilityService.class) AccessibilityService accessibilityService() { return mock(AccessibilityService.class); } - @MockBean(EnvironmentTypeController.class) - EnvironmentTypeController environmentTypeController() { - return mock(EnvironmentTypeController.class); - } - @MockBean(EnvironmentTypeService.class) EnvironmentTypeService environmentTypeService() { return mock(EnvironmentTypeService.class); @@ -112,20 +93,12 @@ EnvironmentTypeService environmentTypeService() { @Inject private CountryService countryService; @Inject - private CountryController countryController; - @Inject private AccessibilityService accessibilityService; @Inject - private AccessibilityController accessibilityController; - @Inject private TopographyService topographyService; @Inject - private TopographyController topographyController; - @Inject private EnvironmentTypeService environmentTypeService; @Inject - private EnvironmentTypeController environmentTypeController; - @Inject private UserDAO userDAO; @Inject private DSLContext dsl; @@ -178,7 +151,8 @@ public void controllerHandledExceptionIgnored() { @Test public void getCountriesInternalServerError() { - when(countryController.getCountries()).thenThrow(new DataAccessException("Query 123 failed")); + //when(countryController.getCountries()).thenThrow(new DataAccessException("Query 123 failed")); + when(countryService.getAll()).thenThrow(new DataAccessException("Query 123 failed")); Flowable> call = client.exchange( GET("/countries").cookie(new NettyCookie("phylo-token", "test-country")), String.class @@ -219,7 +193,8 @@ public void countryControllerHandledExceptionIgnored() { @Test public void getTopographiesInternalServerError() { - when(topographyController.getTopographies()).thenThrow(new DataAccessException("Query 123 failed")); + //when(topographyController.getTopographies()).thenThrow(new DataAccessException("Query 123 failed")); + when(topographyService.getAll()).thenThrow(new DataAccessException("Query 123 failed")); Flowable> call = client.exchange( GET("/topography-options").cookie(new NettyCookie("phylo-token", "test-topography")), String.class @@ -258,12 +233,14 @@ public void topographyControllerHandledExceptionIgnored() { } @Test + @Order(1) public void getAccessibilitiesInternalServerError() { - when(accessibilityController.getAccessibilities()).thenThrow(new DataAccessException("Query 123 failed")); + //when(accessibilityController.getAccessibilities()).thenThrow(new DataAccessException("Query 123 failed")); + when(accessibilityService.getAll()).thenThrow(new DataAccessException("Query 123 failed")); Flowable> call = client.exchange( - GET("/accessibility-options").cookie(new NettyCookie("phylo-token", "test-accessibility")), String.class + GET("/accessibility-options").cookie(new NettyCookie("phylo-token", "test-registered-user")), String.class ); HttpClientResponseException e = Assertions.assertThrows(HttpClientResponseException.class, () -> { @@ -301,7 +278,8 @@ public void accessibilityControllerHandledExceptionIgnored() { @Test public void getEnvironmentTypesInternalServerError() { - when(environmentTypeController.getEnvironmentTypes()).thenThrow(new DataAccessException("Query 123 failed")); + //when(environmentTypeController.getEnvironmentTypes()).thenThrow(new DataAccessException("Query 123 failed")); + when(environmentTypeService.getAll()).thenThrow(new DataAccessException("Query 123 failed")); Flowable> call = client.exchange( GET("/environment-data-types").cookie(new NettyCookie("phylo-token", "test-environment-type")), String.class diff --git a/src/test/java/org/breedinginsight/api/v1/controller/ProgramControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/ProgramControllerIntegrationTest.java index d6fd0d52a..e67b44fd9 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/ProgramControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/ProgramControllerIntegrationTest.java @@ -31,7 +31,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.micronaut.test.annotation.MockBean; import io.reactivex.Flowable; import junit.framework.AssertionFailedError; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/RoleControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/RoleControllerIntegrationTest.java index 149852601..70307fa7e 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/RoleControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/RoleControllerIntegrationTest.java @@ -27,7 +27,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import org.breedinginsight.DatabaseTest; import org.junit.jupiter.api.*; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/ServerInfoControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/ServerInfoControllerIntegrationTest.java index 673115f9e..9807e14ea 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/ServerInfoControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/ServerInfoControllerIntegrationTest.java @@ -22,7 +22,7 @@ import io.micronaut.http.HttpStatus; import io.micronaut.http.client.RxHttpClient; import io.micronaut.http.client.annotation.Client; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import org.breedinginsight.DatabaseTest; import org.junit.jupiter.api.AfterAll; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/TokenControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/TokenControllerIntegrationTest.java index edf935c2e..43fd5a6d3 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/TokenControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/TokenControllerIntegrationTest.java @@ -22,7 +22,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import org.breedinginsight.DatabaseTest; import org.junit.jupiter.api.*; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/TopographyControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/TopographyControllerIntegrationTest.java index 4b4ad0681..9255d7373 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/TopographyControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/TopographyControllerIntegrationTest.java @@ -27,7 +27,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import org.breedinginsight.DatabaseTest; import org.junit.jupiter.api.*; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/TraitControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/TraitControllerIntegrationTest.java index 300a5eee1..c0a40062e 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/TraitControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/TraitControllerIntegrationTest.java @@ -26,7 +26,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import junit.framework.AssertionFailedError; import lombok.SneakyThrows; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/TraitUploadControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/TraitUploadControllerIntegrationTest.java index d2f369fad..77bfa672d 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/TraitUploadControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/TraitUploadControllerIntegrationTest.java @@ -26,7 +26,7 @@ import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.client.multipart.MultipartBody; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import junit.framework.AssertionFailedError; import org.breedinginsight.BrAPITest; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/UploadControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/UploadControllerIntegrationTest.java index 963fd872f..a2242e47d 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/UploadControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/UploadControllerIntegrationTest.java @@ -27,7 +27,7 @@ import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.client.multipart.MultipartBody; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import lombok.SneakyThrows; import org.breedinginsight.BrAPITest; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/UserControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/UserControllerIntegrationTest.java index d805886e0..6f2705488 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/UserControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/UserControllerIntegrationTest.java @@ -28,7 +28,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.micronaut.test.annotation.MockBean; import io.reactivex.Flowable; import junit.framework.AssertionFailedError; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilterIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilterIntegrationTest.java index 793d38e77..0af3f0172 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilterIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/brapi/BrAPIServiceFilterIntegrationTest.java @@ -26,7 +26,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.micronaut.test.annotation.MockBean; import io.reactivex.Flowable; import junit.framework.AssertionFailedError; diff --git a/src/test/java/org/breedinginsight/api/v1/controller/metadata/MetadataFilterIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/metadata/MetadataFilterIntegrationTest.java index 8298764bd..3ec8d5215 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/metadata/MetadataFilterIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/metadata/MetadataFilterIntegrationTest.java @@ -19,13 +19,14 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; +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.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.micronaut.test.annotation.MockBean; import io.reactivex.Flowable; import org.breedinginsight.DatabaseTest; @@ -34,8 +35,12 @@ import org.breedinginsight.api.model.v1.response.Response; import org.breedinginsight.api.model.v1.response.metadata.Metadata; import org.breedinginsight.api.model.v1.response.metadata.Pagination; +import org.breedinginsight.api.v1.controller.TestTokenValidator; import org.breedinginsight.api.v1.controller.UserController; +import org.breedinginsight.dao.db.tables.daos.BiUserDao; +import org.breedinginsight.dao.db.tables.pojos.BiUserEntity; import org.breedinginsight.model.User; +import org.jooq.DSLContext; import org.junit.jupiter.api.*; import javax.inject.Inject; @@ -54,16 +59,36 @@ @TestInstance(TestInstance.Lifecycle.PER_CLASS) public class MetadataFilterIntegrationTest extends DatabaseTest { - @Inject - private UserController userController; - @Inject @Client("/${micronaut.bi.api.version}") private RxHttpClient client; - @MockBean(UserController.class) - UserController userController() { - return mock(UserController.class); + @Inject + @Client("/") + private RxHttpClient plainClient; + + @Inject + private DSLContext dsl; + @Inject + private BiUserDao biUserDao; + + BiUserEntity testUser; + BiUserEntity otherTestUser; + + private FannyPack fp = FannyPack.fill("src/test/resources/sql/UserControllerIntegrationTest.sql"); + + @BeforeAll + public void setup() { + // Insert our traits into the db + dsl.execute(fp.get("InsertProgram")); + dsl.execute(fp.get("InsertUserProgramAssociations")); + dsl.execute(fp.get("InsertManyUsers")); + + testUser = biUserDao.fetchByOrcid(TestTokenValidator.TEST_USER_ORCID).get(0); + otherTestUser = biUserDao.fetchByOrcid(TestTokenValidator.OTHER_TEST_USER_ORCID).get(0); + + dsl.execute(fp.get("InsertSystemRoleAdmin"), testUser.getId().toString()); + dsl.execute(fp.get("InsertSystemRoleAdmin"), otherTestUser.getId().toString()); } @AfterAll @@ -75,12 +100,9 @@ public void finish() { public void getSingleResponseNoMetadataSuccess() { // Check metadata is successfully populated when none is returned from controller - Response mockedResponse = getResponseMock(); - - when(userController.users(any(UUID.class))).thenReturn(HttpResponse.ok(mockedResponse)); Flowable> call = client.exchange( - GET("/users/74a6ebfe-d114-419b-8bdc-2f7b52d26172").cookie(new NettyCookie("phylo-token", "test-registered-user")), String.class + GET("/users/" + testUser.getId()).cookie(new NettyCookie("phylo-token", "test-registered-user")), String.class ); HttpResponse response = call.blockingFirst(); @@ -98,73 +120,9 @@ public void getSingleResponseNoMetadataSuccess() { assertEquals(1, data.getAsJsonPrimitive("currentPage").getAsInt(), "Default current page is incorrect"); } - @Test - public void getSingleResponseMetadataSuccess() { - - // Check that if a single result response has metadata, an error is not thrown - Response mockedResponse = getResponseMock(); - - Pagination mockedPagination = new Pagination(6,6,6,1); - Metadata mockedMetadata = new Metadata(); - mockedMetadata.setPagination(mockedPagination); - mockedResponse.setMetadata(mockedMetadata); - - when(userController.users(any(UUID.class))).thenReturn(HttpResponse.ok(mockedResponse)); - - Flowable> call = client.exchange( - GET("/users/74a6ebfe-d114-419b-8bdc-2f7b52d26172").cookie(new NettyCookie("phylo-token", "test-registered-user")), String.class - ); - - HttpResponse response = call.blockingFirst(); - assertEquals(HttpStatus.OK, response.getStatus()); - - // Test that our metadata object has been returned - JsonObject data = JsonParser.parseString(response.body()).getAsJsonObject().getAsJsonObject("metadata").getAsJsonObject("pagination"); - - assertTrue(data != null, "Wrong number users"); - - // Check our page numbers weren't altered by the filtered - assertEquals(6, data.getAsJsonPrimitive("totalPages").getAsInt(), "Default total pages is incorrect"); - assertEquals(6, data.getAsJsonPrimitive("totalCount").getAsInt(), "Default total count is incorrect"); - assertEquals(6, data.getAsJsonPrimitive("pageSize").getAsInt(), "Default page size is incorrect"); - assertEquals(1, data.getAsJsonPrimitive("currentPage").getAsInt(), "Default current page is incorrect"); - } - - @Test - public void dataResponseMetadataFilterFailure() { - - // Check we get an exception when a data response is returned without a metadata field and filter annotation on - Response mockedResponse = getDataResponseMock(); - - when(userController.users(any(UUID.class))).thenReturn(HttpResponse.ok(mockedResponse)); - - // This endpoint will never return a data response, but for testing purposes, we will have it return one to test - // if an endpoint with the @FilterMetadata annotation ever did return a data response. - Flowable> call = client.exchange( - GET("/users/74a6ebfe-d114-419b-8bdc-2f7b52d26172").cookie(new NettyCookie("phylo-token", "test-registered-user")), String.class - ); - - HttpClientResponseException e = Assertions.assertThrows(HttpClientResponseException.class, () -> { - HttpResponse response = call.blockingFirst(); - }); - - assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, e.getStatus()); - - } - @Test public void getDataResponseMetadataFilterSuccess() { - // Check we don't get an exception when a data response with proper metadata is returned - Response mockedResponse = getDataResponseMock(); - - Pagination mockedPagination = new Pagination(6,6,6,1); - Metadata mockedMetadata = new Metadata(); - mockedMetadata.setPagination(mockedPagination); - mockedResponse.setMetadata(mockedMetadata); - - when(userController.users(any(QueryParams.class))).thenReturn(HttpResponse.ok(mockedResponse)); - Flowable> call = client.exchange( GET("/users").cookie(new NettyCookie("phylo-token", "test-registered-user")), String.class ); @@ -178,22 +136,17 @@ public void getDataResponseMetadataFilterSuccess() { assertTrue(data != null, "Metadata was not populated"); // Check our page numbers weren't altered by the filtered - assertEquals(6, data.getAsJsonPrimitive("totalPages").getAsInt(), "Default total pages is incorrect"); - assertEquals(6, data.getAsJsonPrimitive("totalCount").getAsInt(), "Default total count is incorrect"); - assertEquals(6, data.getAsJsonPrimitive("pageSize").getAsInt(), "Default page size is incorrect"); + assertEquals(1, data.getAsJsonPrimitive("totalPages").getAsInt(), "Default total pages is incorrect"); + assertEquals(38, data.getAsJsonPrimitive("totalCount").getAsInt(), "Default total count is incorrect"); + assertEquals(50, data.getAsJsonPrimitive("pageSize").getAsInt(), "Default page size is incorrect"); assertEquals(1, data.getAsJsonPrimitive("currentPage").getAsInt(), "Default current page is incorrect"); } @Test public void filterNotCalledNoAnnotation(){ - // Check that the metadata filter does not add metadata when annotation is missing - Response mockedResponse = getResponseMock(); - - when(userController.users(any(QueryParams.class))).thenReturn(HttpResponse.ok(mockedResponse)); - - Flowable> call = client.exchange( - GET("/users").cookie(new NettyCookie("phylo-token", "test-registered-user")), String.class + Flowable> call = plainClient.exchange( + GET("/health").cookie(new NettyCookie("phylo-token", "test-registered-user")), String.class ); HttpResponse response = call.blockingFirst(); @@ -204,33 +157,4 @@ public void filterNotCalledNoAnnotation(){ assertTrue(metadata == null, "Metadata was populated, but shouldn't have been"); } - - public Response getResponseMock() { - - User mockedUser = User.builder() - .name("Test User") - .email("test@user.com") - .id(UUID.randomUUID()) - .orcid("testorcid") - .build(); - - return new Response<>(mockedUser); - } - - public Response> getDataResponseMock() { - - User mockedUser = User.builder() - .name("Test User") - .email("test@user.com") - .id(UUID.randomUUID()) - .orcid("testorcid") - .build(); - List users = new ArrayList<>(); - users.add(mockedUser); - users.add(mockedUser); - DataResponse dataResponse = new DataResponse().setData(users); - Response mockedResponse = new Response().setResult(dataResponse); - - return mockedResponse; - } } diff --git a/src/test/java/org/breedinginsight/brapi/v1/controller/BrapiAuthorizeControllerIntegrationTest.java b/src/test/java/org/breedinginsight/brapi/v1/controller/BrapiAuthorizeControllerIntegrationTest.java index a437b70a7..13add58e0 100644 --- a/src/test/java/org/breedinginsight/brapi/v1/controller/BrapiAuthorizeControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/brapi/v1/controller/BrapiAuthorizeControllerIntegrationTest.java @@ -23,7 +23,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import lombok.SneakyThrows; import org.breedinginsight.DatabaseTest; diff --git a/src/test/java/org/breedinginsight/brapi/v1/controller/BrapiObservationVariablesControllerIntegrationTest.java b/src/test/java/org/breedinginsight/brapi/v1/controller/BrapiObservationVariablesControllerIntegrationTest.java index 668c99f80..56f6d00d6 100644 --- a/src/test/java/org/breedinginsight/brapi/v1/controller/BrapiObservationVariablesControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/brapi/v1/controller/BrapiObservationVariablesControllerIntegrationTest.java @@ -25,7 +25,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import lombok.SneakyThrows; import org.breedinginsight.BrAPITest; diff --git a/src/test/java/org/breedinginsight/brapi/v2/BrAPIV2ControllerIntegrationTest.java b/src/test/java/org/breedinginsight/brapi/v2/BrAPIV2ControllerIntegrationTest.java index 0c1ddd56e..4c423bfb1 100644 --- a/src/test/java/org/breedinginsight/brapi/v2/BrAPIV2ControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/brapi/v2/BrAPIV2ControllerIntegrationTest.java @@ -25,7 +25,7 @@ import io.micronaut.http.MediaType; import io.micronaut.http.client.RxHttpClient; import io.micronaut.http.client.annotation.Client; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import lombok.SneakyThrows; import org.brapi.v2.model.BrAPIExternalReference; diff --git a/src/test/java/org/breedinginsight/brapi/v2/GermplasmControllerIntegrationTest.java b/src/test/java/org/breedinginsight/brapi/v2/GermplasmControllerIntegrationTest.java index 478a095a7..b541fcb59 100644 --- a/src/test/java/org/breedinginsight/brapi/v2/GermplasmControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/brapi/v2/GermplasmControllerIntegrationTest.java @@ -7,7 +7,7 @@ import io.micronaut.http.client.RxHttpClient; import io.micronaut.http.client.annotation.Client; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import junit.framework.AssertionFailedError; import lombok.SneakyThrows; diff --git a/src/test/java/org/breedinginsight/brapps/importer/GermplasmTemplateMap.java b/src/test/java/org/breedinginsight/brapps/importer/GermplasmTemplateMap.java index 0ea12379d..17f0c0049 100644 --- a/src/test/java/org/breedinginsight/brapps/importer/GermplasmTemplateMap.java +++ b/src/test/java/org/breedinginsight/brapps/importer/GermplasmTemplateMap.java @@ -11,7 +11,7 @@ import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.client.multipart.MultipartBody; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import lombok.SneakyThrows; import org.brapi.v2.model.core.BrAPIListTypes; diff --git a/src/test/java/org/breedinginsight/daos/DSLTransactionResultIntegrationTest.java b/src/test/java/org/breedinginsight/daos/DSLTransactionResultIntegrationTest.java index 38b6693d2..c23f8c610 100644 --- a/src/test/java/org/breedinginsight/daos/DSLTransactionResultIntegrationTest.java +++ b/src/test/java/org/breedinginsight/daos/DSLTransactionResultIntegrationTest.java @@ -17,7 +17,7 @@ package org.breedinginsight.daos; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import org.breedinginsight.DatabaseTest; import org.breedinginsight.api.v1.controller.TestTokenValidator; import org.breedinginsight.dao.db.tables.pojos.BiUserEntity; diff --git a/src/test/java/org/breedinginsight/services/validators/TraitValidatorIntegrationTest.java b/src/test/java/org/breedinginsight/services/validators/TraitValidatorIntegrationTest.java index 516fa1183..4b78fb6c3 100644 --- a/src/test/java/org/breedinginsight/services/validators/TraitValidatorIntegrationTest.java +++ b/src/test/java/org/breedinginsight/services/validators/TraitValidatorIntegrationTest.java @@ -18,7 +18,7 @@ package org.breedinginsight.services.validators; import io.kowalski.fannypack.FannyPack; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import lombok.SneakyThrows; import org.breedinginsight.DatabaseTest; import org.breedinginsight.dao.db.tables.daos.ProgramDao; diff --git a/src/test/java/org/breedinginsight/utilities/response/ResponseUtilsIntegrationTest.java b/src/test/java/org/breedinginsight/utilities/response/ResponseUtilsIntegrationTest.java index f5dd3370c..b61270a74 100644 --- a/src/test/java/org/breedinginsight/utilities/response/ResponseUtilsIntegrationTest.java +++ b/src/test/java/org/breedinginsight/utilities/response/ResponseUtilsIntegrationTest.java @@ -27,7 +27,7 @@ import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.exceptions.HttpClientResponseException; import io.micronaut.http.netty.cookies.NettyCookie; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import io.reactivex.Flowable; import lombok.SneakyThrows; import org.breedinginsight.DatabaseTest;