diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dbb1a95a..8ffed7c8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,4 +7,4 @@ on: jobs: build: - uses: valitydev/java-workflow/.github/workflows/maven-service-build.yml@v3 + uses: valitydev/java-workflow/.github/workflows/maven-service-build.yml@v4 diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 9f366b27..93aebc69 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -7,7 +7,7 @@ on: jobs: build-and-deploy: - uses: valitydev/java-workflow/.github/workflows/maven-service-deploy.yml@v3 + uses: valitydev/java-workflow/.github/workflows/maven-service-deploy.yml@v4 secrets: github-token: ${{ secrets.GITHUB_TOKEN }} mm-webhook-url: ${{ secrets.MATTERMOST_WEBHOOK_URL }} diff --git a/pom.xml b/pom.xml index e8ed8868..1aadee48 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ dev.vality service-parent-pom - 3.1.8 + 4.0.0 org-manager @@ -16,20 +16,19 @@ org-manager - 21 - 21 + 25 UTF-8 UTF-8 8022 8080 8023 ${server.port} ${server.rest.port} ${management.port} - 17.0.0 - 4.34.0 + 26.7.2 + 7.7.0 1.38-8c9b968 - 2.32.0 1.685-5c25c2e - 3.0.1 + 5.0.0 + 3.0.0 @@ -37,11 +36,16 @@ dev.vality.woody woody-thrift + ${woody.version} + + + dev.vality.woody + woody-api + ${woody.version} dev.vality shared-resources - ${shared-resources.version} dev.vality @@ -82,7 +86,7 @@ org.springframework.boot - spring-boot-starter-web + spring-boot-starter-webmvc org.springframework.boot @@ -98,7 +102,7 @@ org.springframework.boot - spring-boot-starter-oauth2-resource-server + spring-boot-starter-security-oauth2-resource-server net.javacrumbs.shedlock @@ -118,8 +122,8 @@ org.bouncycastle - bcprov-jdk15on - 1.70 + bcprov-jdk18on + 1.84 @@ -140,14 +144,15 @@ org.projectlombok lombok + provided org.postgresql postgresql - org.flywaydb - flyway-core + org.springframework.boot + spring-boot-starter-flyway org.flywaydb @@ -161,18 +166,11 @@ org.openapitools jackson-databind-nullable - 0.2.2 + 0.2.10 org.yaml snakeyaml - 2.0 - - - - io.opentelemetry - opentelemetry-semconv - 1.29.0-alpha @@ -180,35 +178,21 @@ org.springframework.boot spring-boot-starter-test test - - - org.junit.vintage - junit-vintage-engine - - - - - org.springframework.cloud - spring-cloud-contract-wiremock - 4.1.5 - test - com.github.tomakehurst - wiremock-jre8-standalone - ${wiremock-jre8-standalone.version} + org.springframework.boot + spring-boot-starter-webmvc-test test - io.jsonwebtoken - jjwt - 0.9.1 + org.wiremock.integrations + wiremock-spring-boot + 4.0.9 test org.testcontainers - postgresql - 1.19.1 + testcontainers-postgresql test @@ -219,8 +203,7 @@ org.testcontainers - junit-jupiter - 1.19.1 + testcontainers-junit-jupiter test @@ -240,6 +223,7 @@ true Dockerfile + opentelemetry-javaagent.jar @@ -255,14 +239,7 @@ org.apache.maven.plugins maven-remote-resources-plugin - 1.7.0 - - - org.apache.maven.shared - maven-filtering - 3.2.0 - - + 3.3.0 dev.vality:shared-resources:${shared-resources.version} @@ -281,15 +258,13 @@ org.apache.maven.plugins maven-compiler-plugin - 3.8.1 + 3.15.0 - 21 - 21 org.projectlombok lombok - 1.18.36 + ${lombok.version} diff --git a/src/main/java/dev/vality/orgmanager/OrgManagerApplication.java b/src/main/java/dev/vality/orgmanager/OrgManagerApplication.java index 1338b8b7..e74f6f6c 100644 --- a/src/main/java/dev/vality/orgmanager/OrgManagerApplication.java +++ b/src/main/java/dev/vality/orgmanager/OrgManagerApplication.java @@ -3,7 +3,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.ConfigurationPropertiesScan; -import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.boot.web.server.servlet.context.ServletComponentScan; @ServletComponentScan @ConfigurationPropertiesScan diff --git a/src/main/java/dev/vality/orgmanager/config/AppConfig.java b/src/main/java/dev/vality/orgmanager/config/AppConfig.java index 59e468b3..5a5f0c39 100644 --- a/src/main/java/dev/vality/orgmanager/config/AppConfig.java +++ b/src/main/java/dev/vality/orgmanager/config/AppConfig.java @@ -1,20 +1,23 @@ package dev.vality.orgmanager.config; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.ObjectMapper; import dev.vality.orgmanager.controller.converter.InvitationStatusConverter; -import org.openapitools.jackson.nullable.JsonNullableModule; +import org.openapitools.jackson.nullable.JsonNullableJackson3Module; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.jackson.autoconfigure.JsonMapperBuilderCustomizer; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.format.support.FormattingConversionService; @Configuration public class AppConfig { - @Autowired - public void objectMapper(ObjectMapper mapper) { - mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - mapper.registerModule(new JsonNullableModule()); + @Bean + public JsonMapperBuilderCustomizer jsonMapperCustomizer() { + return builder -> builder + .changeDefaultPropertyInclusion(inclusion -> + inclusion.withValueInclusion(JsonInclude.Include.NON_NULL)) + .addModule(new JsonNullableJackson3Module()); } @Autowired diff --git a/src/main/java/dev/vality/orgmanager/config/ConfigResolverConfig.java b/src/main/java/dev/vality/orgmanager/config/ConfigResolverConfig.java index 7152cfd0..230e17a9 100644 --- a/src/main/java/dev/vality/orgmanager/config/ConfigResolverConfig.java +++ b/src/main/java/dev/vality/orgmanager/config/ConfigResolverConfig.java @@ -13,13 +13,13 @@ import org.springframework.security.oauth2.jwt.NimbusJwtDecoder; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.interfaces.RSAPublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.X509EncodedKeySpec; -import java.nio.file.Files; -import java.nio.file.Paths; import java.util.Base64; import java.util.List; import java.util.stream.Collectors; @@ -65,7 +65,7 @@ private RSAPublicKey readPublicKey(String publicKey) { private String readKeyFromFile(String filePath) { try { - List strings = Files.readAllLines(Paths.get(filePath)); + List strings = Files.readAllLines(Path.of(filePath)); strings.remove(strings.size() - 1); strings.remove(0); diff --git a/src/main/java/dev/vality/orgmanager/config/OtelConfig.java b/src/main/java/dev/vality/orgmanager/config/OtelConfig.java deleted file mode 100644 index 630c3aa8..00000000 --- a/src/main/java/dev/vality/orgmanager/config/OtelConfig.java +++ /dev/null @@ -1,70 +0,0 @@ -package dev.vality.orgmanager.config; - -import dev.vality.orgmanager.config.properties.OtelProperties; -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; -import io.opentelemetry.context.propagation.ContextPropagators; -import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter; -import io.opentelemetry.sdk.OpenTelemetrySdk; -import io.opentelemetry.sdk.resources.Resource; -import io.opentelemetry.sdk.trace.SdkTracerProvider; -import io.opentelemetry.sdk.trace.export.BatchSpanProcessor; -import io.opentelemetry.sdk.trace.samplers.Sampler; -import io.opentelemetry.semconv.resource.attributes.ResourceAttributes; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.time.Duration; - -@Slf4j -@Configuration -@ConditionalOnProperty(value = "otel.enabled", havingValue = "true", matchIfMissing = true) -@RequiredArgsConstructor -public class OtelConfig { - - private final OtelProperties otelProperties; - - @Value("${spring.application.name}") - private String applicationName; - - @Bean - public OpenTelemetry openTelemetryConfig() { - var resource = Resource.getDefault() - .merge(Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, applicationName))); - var sdkTracerProvider = SdkTracerProvider.builder() - .addSpanProcessor(BatchSpanProcessor.builder(OtlpHttpSpanExporter.builder() - .setEndpoint(otelProperties.getResource()) - .setTimeout(Duration.ofMillis(otelProperties.getTimeout())) - .build()) - .build()) - .setSampler(Sampler.alwaysOn()) - .setResource(resource) - .build(); - var openTelemetrySdk = OpenTelemetrySdk.builder() - .setTracerProvider(sdkTracerProvider) - .setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance())) - .build(); - registerGlobalOpenTelemetry(openTelemetrySdk); - return openTelemetrySdk; - } - - private static void registerGlobalOpenTelemetry(OpenTelemetry openTelemetry) { - try { - GlobalOpenTelemetry.set(openTelemetry); - } catch (Throwable ex) { - log.warn("Please initialize the ObservabilitySdk before starting the application", ex); - GlobalOpenTelemetry.resetForTest(); - try { - GlobalOpenTelemetry.set(openTelemetry); - } catch (Throwable ex1) { - log.warn("Unable to set GlobalOpenTelemetry", ex1); - } - } - } -} \ No newline at end of file diff --git a/src/main/java/dev/vality/orgmanager/config/TomcatWebServerCustomizer.java b/src/main/java/dev/vality/orgmanager/config/TomcatWebServerCustomizer.java index 6ecb1fa2..ee654ec9 100644 --- a/src/main/java/dev/vality/orgmanager/config/TomcatWebServerCustomizer.java +++ b/src/main/java/dev/vality/orgmanager/config/TomcatWebServerCustomizer.java @@ -2,7 +2,7 @@ import org.apache.catalina.connector.Connector; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; +import org.springframework.boot.tomcat.servlet.TomcatServletWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; @@ -19,6 +19,6 @@ public void customize(TomcatServletWebServerFactory factory) { Connector connector = new Connector(); connector.setPort(restPort); - factory.addAdditionalTomcatConnectors(connector); + factory.addAdditionalConnectors(connector); } } diff --git a/src/main/java/dev/vality/orgmanager/config/properties/OtelProperties.java b/src/main/java/dev/vality/orgmanager/config/properties/OtelProperties.java deleted file mode 100644 index ff18b2d3..00000000 --- a/src/main/java/dev/vality/orgmanager/config/properties/OtelProperties.java +++ /dev/null @@ -1,17 +0,0 @@ -package dev.vality.orgmanager.config.properties; - -import lombok.Getter; -import lombok.Setter; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Getter -@Setter -@Component -@ConfigurationProperties(prefix = "otel") -public class OtelProperties { - - private String resource; - private Long timeout; - -} diff --git a/src/main/java/dev/vality/orgmanager/converter/InvitationConverter.java b/src/main/java/dev/vality/orgmanager/converter/InvitationConverter.java index b9242262..d91232e0 100644 --- a/src/main/java/dev/vality/orgmanager/converter/InvitationConverter.java +++ b/src/main/java/dev/vality/orgmanager/converter/InvitationConverter.java @@ -2,7 +2,7 @@ import dev.vality.orgmanager.config.properties.InviteTokenProperties; import dev.vality.orgmanager.entity.InvitationEntity; -import dev.vality.orgmanager.util.JsonMapper; +import dev.vality.orgmanager.util.JsonCodec; import dev.vality.swag.organizations.model.*; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -21,7 +21,7 @@ @RequiredArgsConstructor public class InvitationConverter { - private final JsonMapper jsonMapper; + private final JsonCodec jsonCodec; private final MemberRoleConverter memberRoleConverter; private final InviteTokenProperties inviteTokenProperties; @@ -48,7 +48,7 @@ public InvitationEntity toEntity(InvitationRequest invitation, String orgId) { .stream() .map(role -> memberRoleConverter.toEntity(role, orgId)) .collect(toSet())) - .metadata(jsonMapper.toJson(invitation.getMetadata())) + .metadata(jsonCodec.toJson(invitation.getMetadata())) .status(InvitationStatusName.PENDING.getValue()) .acceptToken(UUID.randomUUID().toString()) // TODO [a.romanov]: token .build(); @@ -81,7 +81,7 @@ public Invitation toDomain(InvitationEntity entity) { invitation.id(entity.getId()) .createdAt(OffsetDateTime.of(entity.getCreatedAt(), ZoneOffset.UTC)) .expiresAt(OffsetDateTime.of(entity.getExpiresAt(), ZoneOffset.UTC)) - .metadata(entity.getMetadata() != null ? jsonMapper.toMap(entity.getMetadata()) : null) + .metadata(entity.getMetadata() != null ? jsonCodec.toMap(entity.getMetadata()) : null) .invitee(new Invitee() .contact(new InviteeContact() .type(InviteeContact.TypeEnum.fromValue(entity.getInviteeContactType())) diff --git a/src/main/java/dev/vality/orgmanager/converter/OrganizationConverter.java b/src/main/java/dev/vality/orgmanager/converter/OrganizationConverter.java index 80951cb0..ad504520 100644 --- a/src/main/java/dev/vality/orgmanager/converter/OrganizationConverter.java +++ b/src/main/java/dev/vality/orgmanager/converter/OrganizationConverter.java @@ -1,7 +1,7 @@ package dev.vality.orgmanager.converter; import dev.vality.orgmanager.entity.OrganizationEntity; -import dev.vality.orgmanager.util.JsonMapper; +import dev.vality.orgmanager.util.JsonCodec; import dev.vality.swag.organizations.model.Organization; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -15,7 +15,7 @@ @RequiredArgsConstructor public class OrganizationConverter { - private final JsonMapper jsonMapper; + private final JsonCodec jsonCodec; public OrganizationEntity toEntity(Organization organization, String ownerId) { String orgId = UUID.randomUUID().toString(); @@ -26,7 +26,7 @@ public OrganizationEntity toEntity(Organization organization, String ownerId) { .name(organization.getName()) .owner(ownerId) .party(partyId) - .metadata(jsonMapper.toJson(organization.getMetadata())) + .metadata(jsonCodec.toJson(organization.getMetadata())) .build(); } @@ -37,7 +37,7 @@ public Organization toDomain(OrganizationEntity entity) { .name(entity.getName()) .owner(entity.getOwner()) .party(entity.getParty()) - .metadata(entity.getMetadata() != null ? jsonMapper.toMap(entity.getMetadata()) : null); + .metadata(entity.getMetadata() != null ? jsonCodec.toMap(entity.getMetadata()) : null); } } diff --git a/src/main/java/dev/vality/orgmanager/pagination/OffsetBasedPageRequest.java b/src/main/java/dev/vality/orgmanager/pagination/OffsetBasedPageRequest.java index 44d8ca62..7482b04c 100644 --- a/src/main/java/dev/vality/orgmanager/pagination/OffsetBasedPageRequest.java +++ b/src/main/java/dev/vality/orgmanager/pagination/OffsetBasedPageRequest.java @@ -4,11 +4,13 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; +import java.io.Serial; import java.io.Serializable; @EqualsAndHashCode public class OffsetBasedPageRequest implements Pageable, Serializable { + @Serial private static final long serialVersionUID = -35826477329623545L; private int limit; diff --git a/src/main/java/dev/vality/orgmanager/repository/MemberRepository.java b/src/main/java/dev/vality/orgmanager/repository/MemberRepository.java index a064e034..7435e685 100644 --- a/src/main/java/dev/vality/orgmanager/repository/MemberRepository.java +++ b/src/main/java/dev/vality/orgmanager/repository/MemberRepository.java @@ -3,7 +3,7 @@ import dev.vality.orgmanager.entity.MemberEntity; import dev.vality.orgmanager.service.dto.MemberWithRoleDto; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; +import org.springframework.data.jpa.repository.NativeQuery; import org.springframework.stereotype.Repository; import java.util.List; @@ -12,7 +12,7 @@ public interface MemberRepository extends JpaRepository { - @Query(value = "SELECT m.id, " + + @NativeQuery("SELECT m.id, " + " m.email, " + " mr.id as memberRoleId, " + " mr.organization_id as organizationId, " + @@ -29,7 +29,7 @@ public interface MemberRepository extends JpaRepository { " AND mr.active = 'true' " + " AND mr.id = mtmr.member_role_id " + " AND mr.organization_id = mto.organization_id " + - " AND m.id = mtmr.member_id ", nativeQuery = true) + " AND m.id = mtmr.member_id ") List getOrgMemberList(String orgId); boolean existsById(String id); diff --git a/src/main/java/dev/vality/orgmanager/repository/OrganizationRepository.java b/src/main/java/dev/vality/orgmanager/repository/OrganizationRepository.java index bf18329d..a5581c2c 100644 --- a/src/main/java/dev/vality/orgmanager/repository/OrganizationRepository.java +++ b/src/main/java/dev/vality/orgmanager/repository/OrganizationRepository.java @@ -2,7 +2,7 @@ import dev.vality.orgmanager.entity.OrganizationEntity; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; +import org.springframework.data.jpa.repository.NativeQuery; import org.springframework.stereotype.Repository; import java.util.List; @@ -11,8 +11,7 @@ @Repository public interface OrganizationRepository extends JpaRepository { - @Query(value = - " SELECT * FROM org_manager.organization AS o " + + @NativeQuery(" SELECT * FROM org_manager.organization AS o " + " WHERE o.id IN " + " ( " + " SELECT mo.organization_id FROM org_manager.member_to_organization AS mo " + @@ -20,12 +19,10 @@ public interface OrganizationRepository extends JpaRepository findAllByMember(String userId); - @Query(value = - " SELECT * FROM org_manager.organization AS o " + + @NativeQuery(" SELECT * FROM org_manager.organization AS o " + " WHERE o.id IN " + " ( " + " SELECT mo.organization_id FROM org_manager.member_to_organization AS mo " + @@ -34,8 +31,7 @@ public interface OrganizationRepository extends JpaRepository findAllByMember(String userId, String continuationId); Set findAllByOwner(String owner); diff --git a/src/main/java/dev/vality/orgmanager/service/KeycloakService.java b/src/main/java/dev/vality/orgmanager/service/KeycloakService.java index 23fdc5b3..218a93da 100644 --- a/src/main/java/dev/vality/orgmanager/service/KeycloakService.java +++ b/src/main/java/dev/vality/orgmanager/service/KeycloakService.java @@ -1,12 +1,12 @@ package dev.vality.orgmanager.service; -import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import org.keycloak.representations.AccessToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.oauth2.jwt.Jwt; import org.springframework.stereotype.Service; +import tools.jackson.databind.json.JsonMapper; import java.time.Instant; import java.util.HashMap; @@ -16,14 +16,14 @@ @RequiredArgsConstructor public class KeycloakService { - private final ObjectMapper objectMapper; + private final JsonMapper jsonMapper; public AccessToken getAccessToken() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication == null || !(authentication.getPrincipal() instanceof Jwt jwt)) { throw new IllegalStateException("Jwt principal is required"); } - return objectMapper.convertValue(normalizedClaims(jwt.getClaims()), AccessToken.class); + return jsonMapper.convertValue(normalizedClaims(jwt.getClaims()), AccessToken.class); } private Map normalizedClaims(Map claims) { diff --git a/src/main/java/dev/vality/orgmanager/util/JsonCodec.java b/src/main/java/dev/vality/orgmanager/util/JsonCodec.java new file mode 100644 index 00000000..b2a6a270 --- /dev/null +++ b/src/main/java/dev/vality/orgmanager/util/JsonCodec.java @@ -0,0 +1,27 @@ +package dev.vality.orgmanager.util; + +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.springframework.stereotype.Service; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.json.JsonMapper; + +import java.util.Map; + +@Service +@RequiredArgsConstructor +public class JsonCodec { + + private final JsonMapper jsonMapper; + + @SneakyThrows(JacksonException.class) + public String toJson(Object data) { + return jsonMapper.writeValueAsString(data); + } + + @SuppressWarnings("rawtypes") + @SneakyThrows(JacksonException.class) + public Map toMap(String json) { + return jsonMapper.readValue(json, Map.class); + } +} diff --git a/src/main/java/dev/vality/orgmanager/util/JsonMapper.java b/src/main/java/dev/vality/orgmanager/util/JsonMapper.java deleted file mode 100644 index 27a3ec67..00000000 --- a/src/main/java/dev/vality/orgmanager/util/JsonMapper.java +++ /dev/null @@ -1,27 +0,0 @@ -package dev.vality.orgmanager.util; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import org.springframework.stereotype.Service; - -import java.util.Map; - -@Service -@RequiredArgsConstructor -public class JsonMapper { - - private final ObjectMapper objectMapper; - - @SneakyThrows(JsonProcessingException.class) - public String toJson(Object data) { - return objectMapper.writeValueAsString(data); - } - - @SuppressWarnings("rawtypes") - @SneakyThrows(JsonProcessingException.class) - public Map toMap(String json) { - return objectMapper.readValue(json, Map.class); - } -} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index a318fdad..c7941c52 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -92,8 +92,3 @@ bouncer: access-check: enabled: false - -otel: - resource: http://localhost:4318/v1/traces - timeout: 60000 - enabled: false diff --git a/src/test/java/dev/vality/orgmanager/controller/AbstractControllerTest.java b/src/test/java/dev/vality/orgmanager/controller/AbstractControllerTest.java index 8a96c7d2..f39fc712 100644 --- a/src/test/java/dev/vality/orgmanager/controller/AbstractControllerTest.java +++ b/src/test/java/dev/vality/orgmanager/controller/AbstractControllerTest.java @@ -1,20 +1,21 @@ package dev.vality.orgmanager.controller; -import com.fasterxml.jackson.databind.ObjectMapper; import dev.vality.orgmanager.repository.AbstractRepositoryTest; import dev.vality.orgmanager.service.ResourceAccessService; import org.junit.jupiter.api.BeforeEach; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock; +import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc; import org.springframework.context.annotation.Import; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean; import org.springframework.test.web.servlet.MockMvc; +import org.wiremock.spring.ConfigureWireMock; +import org.wiremock.spring.EnableWireMock; +import tools.jackson.databind.json.JsonMapper; @Import(KeycloakTestConfig.class) @AutoConfigureMockMvc -@AutoConfigureWireMock(port = 0) +@EnableWireMock(@ConfigureWireMock(port = 0, baseUrlProperties = "wiremock.server.baseUrl")) @TestPropertySource( locations = "classpath:wiremock.properties", properties = "auth.enabled=true" @@ -37,7 +38,7 @@ public void setUp() throws Exception { protected MockMvc mockMvc; @Autowired - protected ObjectMapper objectMapper; + protected JsonMapper objectMapper; protected String generateJwt(long iat, long exp, String... roles) { return keycloakOpenIdStub.generateJwt(iat, exp, roles); diff --git a/src/test/java/dev/vality/orgmanager/converter/InvitationConverterTest.java b/src/test/java/dev/vality/orgmanager/converter/InvitationConverterTest.java index 6f45c357..df6e3ffa 100644 --- a/src/test/java/dev/vality/orgmanager/converter/InvitationConverterTest.java +++ b/src/test/java/dev/vality/orgmanager/converter/InvitationConverterTest.java @@ -1,13 +1,19 @@ package dev.vality.orgmanager.converter; -import com.fasterxml.jackson.databind.ObjectMapper; import dev.vality.orgmanager.config.properties.InviteTokenProperties; import dev.vality.orgmanager.entity.InvitationEntity; import dev.vality.orgmanager.entity.MemberRoleEntity; -import dev.vality.orgmanager.util.JsonMapper; -import dev.vality.swag.organizations.model.*; +import dev.vality.orgmanager.util.JsonCodec; +import dev.vality.swag.organizations.model.Invitation; +import dev.vality.swag.organizations.model.InvitationPending; +import dev.vality.swag.organizations.model.InvitationRequest; +import dev.vality.swag.organizations.model.InvitationStatusName; +import dev.vality.swag.organizations.model.Invitee; +import dev.vality.swag.organizations.model.InviteeContact; +import dev.vality.swag.organizations.model.MemberRole; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import tools.jackson.databind.json.JsonMapper; import java.time.LocalDateTime; import java.time.OffsetDateTime; @@ -36,7 +42,7 @@ public void setUp() { when(inviteTokenProperties.getLifeTimeInDays()).thenReturn(30L); converter = new InvitationConverter( - new JsonMapper(new ObjectMapper()), + new JsonCodec(new JsonMapper()), memberRoleConverter, inviteTokenProperties ); @@ -63,7 +69,9 @@ void shouldConvertToEntity() throws Exception { assertThat(entity.getInviteeContactType()).isEqualTo(invitation.getInvitee().getContact().getType().getValue()); assertThat(entity.getOrganizationId()).isEqualTo(orgId); assertThat(entity.getStatus()).isEqualTo(InvitationStatusName.PENDING.getValue()); - assertThat(entity.getMetadata()).isEqualTo(new ObjectMapper().writeValueAsString(invitation.getMetadata())); + String expectedMetadata = new JsonMapper() + .writeValueAsString(invitation.getMetadata()); + assertThat(entity.getMetadata()).isEqualTo(expectedMetadata); } @Test diff --git a/src/test/java/dev/vality/orgmanager/converter/OrganizationConverterTest.java b/src/test/java/dev/vality/orgmanager/converter/OrganizationConverterTest.java index 4b13be14..b693a468 100644 --- a/src/test/java/dev/vality/orgmanager/converter/OrganizationConverterTest.java +++ b/src/test/java/dev/vality/orgmanager/converter/OrganizationConverterTest.java @@ -1,12 +1,12 @@ package dev.vality.orgmanager.converter; -import com.fasterxml.jackson.databind.ObjectMapper; import dev.vality.orgmanager.TestObjectFactory; import dev.vality.orgmanager.entity.OrganizationEntity; -import dev.vality.orgmanager.util.JsonMapper; +import dev.vality.orgmanager.util.JsonCodec; import dev.vality.swag.organizations.model.Organization; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import tools.jackson.databind.json.JsonMapper; import java.util.Map; @@ -20,8 +20,7 @@ class OrganizationConverterTest { @BeforeEach public void setUp() { converter = new OrganizationConverter( - new JsonMapper( - new ObjectMapper())); + new JsonCodec(new JsonMapper())); } @Test diff --git a/src/test/java/dev/vality/orgmanager/repository/AbstractRepositoryTest.java b/src/test/java/dev/vality/orgmanager/repository/AbstractRepositoryTest.java index 8e8ea355..c5a3e1c3 100644 --- a/src/test/java/dev/vality/orgmanager/repository/AbstractRepositoryTest.java +++ b/src/test/java/dev/vality/orgmanager/repository/AbstractRepositoryTest.java @@ -11,7 +11,7 @@ import org.springframework.test.context.DynamicPropertySource; import org.springframework.test.context.TestPropertySource; import org.springframework.transaction.annotation.Transactional; -import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; @ActiveProfiles("test") @@ -69,7 +69,7 @@ static void beforeAll() { } @SuppressWarnings("rawtypes") - static PostgreSQLContainer postgres = new PostgreSQLContainer<>(DockerImageName + static PostgreSQLContainer postgres = new PostgreSQLContainer(DockerImageName .parse(POSTGRESQL_IMAGE_NAME) .withTag(POSTGRESQL_VERSION)); diff --git a/src/test/java/dev/vality/orgmanager/service/BouncerServiceImplTest.java b/src/test/java/dev/vality/orgmanager/service/BouncerServiceImplTest.java index 4a89c489..3ca63a8a 100644 --- a/src/test/java/dev/vality/orgmanager/service/BouncerServiceImplTest.java +++ b/src/test/java/dev/vality/orgmanager/service/BouncerServiceImplTest.java @@ -1,6 +1,12 @@ package dev.vality.orgmanager.service; -import dev.vality.bouncer.decisions.*; +import dev.vality.bouncer.decisions.ArbiterSrv; +import dev.vality.bouncer.decisions.Context; +import dev.vality.bouncer.decisions.Judgement; +import dev.vality.bouncer.decisions.Resolution; +import dev.vality.bouncer.decisions.ResolutionAllowed; +import dev.vality.bouncer.decisions.ResolutionRestricted; +import dev.vality.bouncer.decisions.RulesetNotFound; import dev.vality.orgmanagement.UserNotFound; import dev.vality.orgmanager.TestObjectFactory; import dev.vality.orgmanager.config.properties.BouncerProperties; @@ -11,16 +17,18 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.mockito.junit.jupiter.MockitoExtension; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; -@ExtendWith(SpringExtension.class) +@ExtendWith(MockitoExtension.class) class BouncerServiceImplTest { @Mock @@ -89,4 +97,4 @@ void havePrivilegesWithAllowedResolution() throws TException { assertTrue(result); } -} \ No newline at end of file +} diff --git a/src/test/java/dev/vality/orgmanager/service/ResourceAccessServiceImplTest.java b/src/test/java/dev/vality/orgmanager/service/ResourceAccessServiceImplTest.java index 28a09f66..3f5418ba 100644 --- a/src/test/java/dev/vality/orgmanager/service/ResourceAccessServiceImplTest.java +++ b/src/test/java/dev/vality/orgmanager/service/ResourceAccessServiceImplTest.java @@ -12,7 +12,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.mockito.junit.jupiter.MockitoExtension; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; @@ -21,7 +21,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; -@ExtendWith(SpringExtension.class) +@ExtendWith(MockitoExtension.class) class ResourceAccessServiceImplTest { private AccessProperties accessProperties; @@ -75,7 +75,6 @@ void checkJoinOrgRightsWithNotExistOrg() { ResourceDto resource = ResourceDto.builder() .invitationToken(TestObjectFactory.randomString()) .build(); - when(bouncerService.havePrivileges(any(BouncerContextDto.class))).thenReturn(true); when(organizationService.getOrgIdByInvitationToken(resource.getInvitationToken())) .thenThrow(new ResourceNotFoundException()); @@ -120,7 +119,6 @@ void checkMemberRoleRightsWithNotExistRole() { ResourceDto resource = ResourceDto.builder() .memberRoleId(TestObjectFactory.randomString()) .build(); - when(bouncerService.havePrivileges(any(BouncerContextDto.class))).thenReturn(true); when(memberRoleService.findById(resource.getMemberRoleId())) .thenThrow(new ResourceNotFoundException()); @@ -154,4 +152,4 @@ void checkInvitationRights() { assertDoesNotThrow(() -> resourceAccessService.checkRights(resource)); } -} \ No newline at end of file +} diff --git a/src/test/resources/wiremock.properties b/src/test/resources/wiremock.properties index d56ce677..83d00cf4 100644 --- a/src/test/resources/wiremock.properties +++ b/src/test/resources/wiremock.properties @@ -1,2 +1 @@ -wiremock.server.baseUrl=http://localhost:${wiremock.server.port} keycloak.auth-server-url=${wiremock.server.baseUrl}/auth