From 0c47799b33ef52ec8e7dbe731c94a55eaab56607 Mon Sep 17 00:00:00 2001 From: Marcos Lopez Gonzalez Date: Mon, 3 May 2021 12:12:24 +0200 Subject: [PATCH] split ITs into service and resource (WIP) --- ...RegistryIntegrationTestsConfiguration.java | 10 +- ...ava => BaseCollectionEntityServiceIT.java} | 184 ++++------- .../ws/it/collections/BaseServiceTest.java | 176 +++++++++++ ...ectionIT.java => CollectionServiceIT.java} | 293 ++++++++---------- ...utionIT.java => InstitutionServiceIT.java} | 225 +++++++------- .../{PersonIT.java => PersonServiceIT.java} | 252 ++++++--------- ... => PrimaryCollectionEntityServiceIT.java} | 165 +++++----- .../resource/BaseResourceTest.java | 143 +++++++++ .../resource/CollectionResourceIT.java | 47 +++ .../duplicates/BaseDuplicatesService.java | 180 +++++++++++ .../CollectionDuplicatesService.java | 27 ++ .../duplicates/DuplicatesService.java | 189 +---------- .../InstitutionDuplicatesService.java | 27 ++ .../BaseChangeSuggestionService.java | 14 +- .../CollectionChangeSuggestionService.java | 4 +- .../InstitutionChangeSuggestionService.java | 7 +- .../client/collections/CollectionClient.java | 2 +- .../client/collections/InstitutionClient.java | 2 +- ...ava => PrimaryCollectionEntityClient.java} | 2 +- .../registry/ws/RegistryWsApplication.java | 2 + .../BaseCollectionEntityResource.java | 55 ++-- .../collections/CollectionResource.java | 19 +- .../collections/InstitutionResource.java | 19 +- .../resources/collections/PersonResource.java | 9 +- .../PrimaryCollectionEntityResource.java | 43 ++- 25 files changed, 1193 insertions(+), 903 deletions(-) rename registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/{BaseCollectionEntityIT.java => BaseCollectionEntityServiceIT.java} (59%) create mode 100644 registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/BaseServiceTest.java rename registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/{CollectionIT.java => CollectionServiceIT.java} (69%) rename registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/{InstitutionIT.java => InstitutionServiceIT.java} (68%) rename registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/{PersonIT.java => PersonServiceIT.java} (58%) rename registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/{ExtendedCollectionEntityIT.java => PrimaryCollectionEntityServiceIT.java} (71%) create mode 100644 registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/resource/BaseResourceTest.java create mode 100644 registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/resource/CollectionResourceIT.java create mode 100644 registry-service/src/main/java/org/gbif/registry/service/collections/duplicates/BaseDuplicatesService.java create mode 100644 registry-service/src/main/java/org/gbif/registry/service/collections/duplicates/CollectionDuplicatesService.java create mode 100644 registry-service/src/main/java/org/gbif/registry/service/collections/duplicates/InstitutionDuplicatesService.java rename registry-ws-client/src/main/java/org/gbif/registry/ws/client/collections/{ExtendedBaseCollectionEntityClient.java => PrimaryCollectionEntityClient.java} (98%) diff --git a/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/RegistryIntegrationTestsConfiguration.java b/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/RegistryIntegrationTestsConfiguration.java index e10a725454..be858e114d 100644 --- a/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/RegistryIntegrationTestsConfiguration.java +++ b/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/RegistryIntegrationTestsConfiguration.java @@ -50,6 +50,7 @@ import org.springframework.cloud.openfeign.FeignAutoConfiguration; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.ribbon.FeignRibbonClientAutoConfiguration; +import org.springframework.cloud.sleuth.zipkin2.ZipkinAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.FilterType; @@ -65,9 +66,14 @@ import com.zaxxer.hikari.HikariDataSource; +// TODO: remove zipkin auto config + @TestConfiguration -@SpringBootApplication(exclude = {RabbitAutoConfiguration.class, - ElasticSearchRestHealthContributorAutoConfiguration.class}) +@SpringBootApplication( + exclude = { + RabbitAutoConfiguration.class, + ElasticSearchRestHealthContributorAutoConfiguration.class + }) @MapperScan("org.gbif.registry.persistence.mapper") @ComponentScan( basePackages = { diff --git a/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/BaseCollectionEntityIT.java b/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/BaseCollectionEntityServiceIT.java similarity index 59% rename from registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/BaseCollectionEntityIT.java rename to registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/BaseCollectionEntityServiceIT.java index a862d05622..849ab6b3d1 100644 --- a/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/BaseCollectionEntityIT.java +++ b/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/BaseCollectionEntityServiceIT.java @@ -35,11 +35,8 @@ import org.gbif.registry.database.TestCaseDatabaseInitializer; import org.gbif.registry.identity.service.IdentityService; import org.gbif.registry.search.test.EsManageServer; -import org.gbif.registry.ws.client.collections.CrudClient; -import org.gbif.registry.ws.it.BaseItTest; import org.gbif.ws.NotFoundException; import org.gbif.ws.client.filter.SimplePrincipalProvider; -import org.gbif.ws.security.KeyStore; import java.util.Collections; import java.util.List; @@ -49,8 +46,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -58,12 +53,11 @@ import static org.junit.jupiter.api.Assertions.assertThrows; /** Base class to test the CRUD operations of {@link CollectionEntity}. */ -public abstract class BaseCollectionEntityIT< +public abstract class BaseCollectionEntityServiceIT< T extends CollectionEntity & Identifiable & Taggable & MachineTaggable & Commentable> - extends BaseItTest { + extends BaseServiceTest { - protected final CrudService entityService; - protected final CrudService client; + protected final CrudService crudService; public static final Pageable DEFAULT_PAGE = new PagingRequest(0L, 5); @@ -72,17 +66,13 @@ public abstract class BaseCollectionEntityIT< @RegisterExtension protected TestCaseDatabaseInitializer databaseRule = new TestCaseDatabaseInitializer(); - public BaseCollectionEntityIT( - CrudService entityService, - Class> cls, + public BaseCollectionEntityServiceIT( + CrudService crudService, SimplePrincipalProvider principalProvider, EsManageServer esServer, - IdentityService identityService, - int localServerPort, - KeyStore keyStore) { + IdentityService identityService) { super(principalProvider, esServer); - this.entityService = entityService; - this.client = prepareClient(localServerPort, keyStore, cls); + this.crudService = crudService; collectionsDatabaseInitializer = new CollectionsDatabaseInitializer(identityService); } @@ -96,18 +86,15 @@ public BaseCollectionEntityIT( protected abstract T newInvalidEntity(); - @ParameterizedTest - @EnumSource(ServiceType.class) - public void crudTest(ServiceType serviceType) { - CrudService service = getService(serviceType, entityService, client); - + @Test + public void crudTest() { // create T entity = newEntity(); - UUID key = service.create(entity); + UUID key = crudService.create(entity); assertNotNull(key); - T entitySaved = service.get(key); + T entitySaved = crudService.get(key); assertEquals(key, entitySaved.getKey()); assertNewEntity(entitySaved); assertNotNull(entitySaved.getCreatedBy()); @@ -117,109 +104,77 @@ public void crudTest(ServiceType serviceType) { // update entity = updateEntity(entitySaved); - service.update(entity); + crudService.update(entity); - entitySaved = service.get(key); + entitySaved = crudService.get(key); assertUpdatedEntity(entitySaved); // delete - service.delete(key); - entitySaved = service.get(key); + crudService.delete(key); + entitySaved = crudService.get(key); assertNotNull(entitySaved.getDeleted()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void createInvalidEntityTest(ServiceType serviceType) { - CrudService service = getService(serviceType, entityService, client); - assertThrows(ValidationException.class, () -> service.create(newInvalidEntity())); + @Test + public void createInvalidEntityTest() { + assertThrows(ValidationException.class, () -> crudService.create(newInvalidEntity())); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void deleteMissingEntityTest(ServiceType serviceType) { - CrudService service = getService(serviceType, entityService, client); - assertThrows(IllegalArgumentException.class, () -> service.delete(UUID.randomUUID())); + @Test + public void deleteMissingEntityTest() { + assertThrows(IllegalArgumentException.class, () -> crudService.delete(UUID.randomUUID())); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void updateDeletedEntityTest(ServiceType serviceType) { - CrudService service = getService(serviceType, entityService, client); - + @Test + public void updateDeletedEntityTest() { T entity = newEntity(); - UUID key = service.create(entity); + UUID key = crudService.create(entity); entity.setKey(key); - service.delete(key); + crudService.delete(key); - T entity2 = service.get(key); + T entity2 = crudService.get(key); assertNotNull(entity2.getDeleted()); - assertThrows(IllegalArgumentException.class, () -> service.update(entity2)); + assertThrows(IllegalArgumentException.class, () -> crudService.update(entity2)); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void restoreDeletedEntityTest(ServiceType serviceType) { - CrudService service = getService(serviceType, entityService, client); - + @Test + public void restoreDeletedEntityTest() { T entity = newEntity(); - UUID key = service.create(entity); + UUID key = crudService.create(entity); entity.setKey(key); - service.delete(key); - entity = service.get(key); + crudService.delete(key); + entity = crudService.get(key); assertNotNull(entity.getDeleted()); // restore it entity.setDeleted(null); - service.update(entity); - entity = service.get(key); + crudService.update(entity); + entity = crudService.get(key); assertNull(entity.getDeleted()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void updateInvalidEntityTest(ServiceType serviceType) { - CrudService service = getService(serviceType, entityService, client); - + @Test + public void updateInvalidEntityTest() { T entity = newEntity(); - UUID key = service.create(entity); + UUID key = crudService.create(entity); T newEntity = newInvalidEntity(); newEntity.setKey(key); - assertThrows(ValidationException.class, () -> service.update(newEntity)); + assertThrows(ValidationException.class, () -> crudService.update(newEntity)); } @Test - public void updateEntityKeyMismatchTest() { - CrudClient crudClient = (CrudClient) client; - - T entity = newEntity(); - UUID key = crudClient.create(entity); - T entityCreated = crudClient.get(key); - - assertThrows( - IllegalArgumentException.class, - () -> crudClient.updateResource(UUID.randomUUID(), entityCreated)); - } - - @ParameterizedTest - @EnumSource(ServiceType.class) - public void getMissingEntity(ServiceType serviceType) { - CrudService service = getService(serviceType, entityService, client); - + public void getMissingEntity() { try { - T entity = service.get(UUID.randomUUID()); + T entity = crudService.get(UUID.randomUUID()); assertNull(entity); } catch (Exception ex) { assertEquals(NotFoundException.class, ex.getClass()); } } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void createFullEntityTest(ServiceType serviceType) { - CrudService service = getService(serviceType, entityService, client); - + @Test + public void createFullEntityTest() { T entity = newEntity(); MachineTag machineTag = new MachineTag("ns", "name", "value"); @@ -234,8 +189,8 @@ public void createFullEntityTest(ServiceType serviceType) { identifier.setType(IdentifierType.LSID); entity.setIdentifiers(Collections.singletonList(identifier)); - UUID key = service.create(entity); - T entitySaved = service.get(key); + UUID key = crudService.create(entity); + T entitySaved = crudService.get(key); assertEquals(1, entitySaved.getMachineTags().size()); assertEquals("value", entitySaved.getMachineTags().get(0).getValue()); @@ -246,13 +201,11 @@ public void createFullEntityTest(ServiceType serviceType) { assertEquals(IdentifierType.LSID, entitySaved.getIdentifiers().get(0).getType()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void tagsTest(ServiceType serviceType) { - CrudService service = getService(serviceType, entityService, client); - TagService tagService = (TagService) service; + @Test + public void tagsTest() { + TagService tagService = (TagService) crudService; - UUID key = service.create(newEntity()); + UUID key = crudService.create(newEntity()); Tag tag = new Tag(); tag.setValue("value"); @@ -267,14 +220,12 @@ public void tagsTest(ServiceType serviceType) { assertEquals(0, tagService.listTags(key, null).size()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void machineTagsTest(ServiceType serviceType) { - CrudService service = getService(serviceType, entityService, client); - MachineTagService machineTagService = (MachineTagService) service; + @Test + public void machineTagsTest() { + MachineTagService machineTagService = (MachineTagService) crudService; T entity = newEntity(); - UUID key = service.create(entity); + UUID key = crudService.create(entity); MachineTag machineTag = new MachineTag("ns", "name", "value"); int machineTagKey = machineTagService.addMachineTag(key, machineTag); @@ -288,14 +239,12 @@ public void machineTagsTest(ServiceType serviceType) { assertEquals(0, machineTagService.listMachineTags(key).size()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void identifiersTest(ServiceType serviceType) { - CrudService service = getService(serviceType, entityService, client); - IdentifierService identifierService = (IdentifierService) service; + @Test + public void identifiersTest() { + IdentifierService identifierService = (IdentifierService) crudService; T entity = newEntity(); - UUID key = service.create(entity); + UUID key = crudService.create(entity); Identifier identifier = new Identifier(); identifier.setIdentifier("identifier"); @@ -313,14 +262,12 @@ public void identifiersTest(ServiceType serviceType) { assertEquals(0, identifierService.listIdentifiers(key).size()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void commentsTest(ServiceType serviceType) { - CrudService service = getService(serviceType, entityService, client); - CommentService commentService = (CommentService) service; + @Test + public void commentsTest() { + CommentService commentService = (CommentService) crudService; T entity = newEntity(); - UUID key = service.create(entity); + UUID key = crudService.create(entity); Comment comment = new Comment(); comment.setContent("test comment"); @@ -335,15 +282,4 @@ public void commentsTest(ServiceType serviceType) { commentService.deleteComment(key, commentKey); assertEquals(0, commentService.listComments(key).size()); } - - protected CrudService getService(ServiceType param) { - switch (param) { - case CLIENT: - return client; - case RESOURCE: - return entityService; - default: - throw new IllegalStateException("Must be resource or client"); - } - } } diff --git a/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/BaseServiceTest.java b/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/BaseServiceTest.java new file mode 100644 index 0000000000..61d719e4d4 --- /dev/null +++ b/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/BaseServiceTest.java @@ -0,0 +1,176 @@ +/* + * Copyright 2020 Global Biodiversity Information Facility (GBIF) + * + * 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.gbif.registry.ws.it.collections; + +import org.gbif.api.vocabulary.UserRole; +import org.gbif.registry.database.RegistryDatabaseInitializer; +import org.gbif.registry.search.test.EsManageServer; +import org.gbif.registry.ws.it.RegistryIntegrationTestsConfiguration; +import org.gbif.registry.ws.it.fixtures.TestConstants; +import org.gbif.ws.client.filter.SimplePrincipalProvider; + +import java.sql.SQLException; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.function.Consumer; +import java.util.stream.Stream; + +import javax.sql.DataSource; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.util.TestPropertyValues; +import org.springframework.context.ApplicationContextInitializer; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import io.zonky.test.db.postgres.embedded.ConnectionInfo; +import io.zonky.test.db.postgres.embedded.DatabasePreparer; +import io.zonky.test.db.postgres.embedded.EmbeddedPostgres; +import io.zonky.test.db.postgres.embedded.LiquibasePreparer; +import io.zonky.test.db.postgres.embedded.PreparedDbProvider; + +/** Base class for IT tests that initializes data sources and basic security settings. */ +@ExtendWith(SpringExtension.class) +@SpringBootTest(classes = RegistryIntegrationTestsConfiguration.class) +@ContextConfiguration(initializers = {BaseServiceTest.ContextInitializer.class}) +@ActiveProfiles("test") +@AutoConfigureMockMvc +@DirtiesContext +public class BaseServiceTest { + + public static class EsContainerContextInitializer + implements ApplicationContextInitializer { + + @Override + public void initialize(ConfigurableApplicationContext configurableApplicationContext) { + TestPropertyValues.of("elasticsearch.mock=true") + .applyTo(configurableApplicationContext.getEnvironment()); + } + } + + /** Prepares a Tests database using an embedded Postgres instance. */ + public static class EmbeddedDataBaseInitializer { + private final DataSource dataSource; + private final PreparedDbProvider provider; + private final ConnectionInfo connectionInfo; + private final List> builderCustomizers = + new CopyOnWriteArrayList(); + + public EmbeddedDataBaseInitializer(DatabasePreparer preparer) { + try { + this.provider = PreparedDbProvider.forPreparer(preparer, this.builderCustomizers); + this.connectionInfo = provider.createNewDatabase(); + this.dataSource = provider.createDataSourceFromConnectionInfo(this.connectionInfo); + } catch (SQLException ex) { + throw new RuntimeException(ex); + } + } + + public DataSource getDataSource() { + return dataSource; + } + + public ConnectionInfo getConnectionInfo() { + return connectionInfo; + } + } + + /** Custom ContextInitializer to expose the registry DB data source and search flags. */ + public static class ContextInitializer + implements ApplicationContextInitializer { + + @Override + public void initialize(ConfigurableApplicationContext configurableApplicationContext) { + + EmbeddedDataBaseInitializer database = + new EmbeddedDataBaseInitializer( + LiquibasePreparer.forClasspathLocation(TestConstants.LIQUIBASE_MASTER_FILE)); + + RegistryDatabaseInitializer.init(database.getDataSource()); + + TestPropertyValues.of( + Stream.of(dbTestPropertyPairs(database)).flatMap(Stream::of).toArray(String[]::new)) + .applyTo(configurableApplicationContext.getEnvironment()); + + TestPropertyValues.of("elasticsearch.mock=true") + .applyTo(configurableApplicationContext.getEnvironment()); + } + + /** Creates the registry datasource settings from the embedded database. */ + String[] dbTestPropertyPairs(EmbeddedDataBaseInitializer database) { + return new String[] { + "registry.datasource.url=jdbc:postgresql://localhost:" + + database.getConnectionInfo().getPort() + + "/" + + database.getConnectionInfo().getDbName(), + "registry.datasource.username=" + database.getConnectionInfo().getUser(), + "registry.datasource.password=" + }; + } + } + + private final SimplePrincipalProvider simplePrincipalProvider; + protected static EsManageServer esServer; + + public BaseServiceTest(SimplePrincipalProvider simplePrincipalProvider, EsManageServer esServer) { + this.simplePrincipalProvider = simplePrincipalProvider; + BaseServiceTest.esServer = esServer; + } + + @BeforeEach + public void setup() { + // reset SimplePrincipleProvider, configured for web resources tests only + if (simplePrincipalProvider != null) { + simplePrincipalProvider.setPrincipal(TestConstants.TEST_ADMIN); + SecurityContext ctx = SecurityContextHolder.createEmptyContext(); + SecurityContextHolder.setContext(ctx); + ctx.setAuthentication( + new UsernamePasswordAuthenticationToken( + simplePrincipalProvider.get().getName(), + "", + Arrays.asList( + new SimpleGrantedAuthority(UserRole.REGISTRY_ADMIN.name()), + new SimpleGrantedAuthority(UserRole.GRSCICOLL_ADMIN.name())))); + } + } + + protected void resetSecurityContext(String principal, UserRole role) { + simplePrincipalProvider.setPrincipal(principal); + SecurityContext ctx = SecurityContextHolder.createEmptyContext(); + SecurityContextHolder.setContext(ctx); + ctx.setAuthentication( + new UsernamePasswordAuthenticationToken( + simplePrincipalProvider.get().getName(), + "", + Collections.singleton(new SimpleGrantedAuthority(role.name())))); + } + + public SimplePrincipalProvider getSimplePrincipalProvider() { + return simplePrincipalProvider; + } +} diff --git a/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/CollectionIT.java b/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/CollectionServiceIT.java similarity index 69% rename from registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/CollectionIT.java rename to registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/CollectionServiceIT.java index 7f21b1c39c..eccde365c4 100644 --- a/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/CollectionIT.java +++ b/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/CollectionServiceIT.java @@ -21,7 +21,6 @@ import org.gbif.api.model.collections.Institution; import org.gbif.api.model.collections.Person; import org.gbif.api.model.collections.duplicates.Duplicate; -import org.gbif.api.model.collections.duplicates.DuplicatesRequest; import org.gbif.api.model.collections.duplicates.DuplicatesResult; import org.gbif.api.model.collections.request.CollectionSearchRequest; import org.gbif.api.model.collections.view.CollectionView; @@ -37,12 +36,11 @@ import org.gbif.api.vocabulary.Country; import org.gbif.api.vocabulary.collections.AccessionStatus; import org.gbif.registry.identity.service.IdentityService; +import org.gbif.registry.persistence.mapper.collections.params.DuplicatesSearchParams; import org.gbif.registry.search.test.EsManageServer; -import org.gbif.registry.ws.client.collections.CollectionClient; -import org.gbif.registry.ws.client.collections.InstitutionClient; +import org.gbif.registry.service.collections.duplicates.CollectionDuplicatesService; import org.gbif.registry.ws.resources.collections.CollectionResource; import org.gbif.ws.client.filter.SimplePrincipalProvider; -import org.gbif.ws.security.KeyStore; import java.util.ArrayList; import java.util.Collections; @@ -54,10 +52,7 @@ import javax.validation.ValidationException; import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.web.server.LocalServerPort; import static org.junit.Assert.assertNotNull; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -66,10 +61,11 @@ import static org.junit.jupiter.api.Assertions.assertTrue; /** Tests the {@link CollectionResource}. */ -public class CollectionIT extends ExtendedCollectionEntityIT { +public class CollectionServiceIT extends PrimaryCollectionEntityServiceIT { - private final InstitutionService institutionResource; - private final InstitutionService institutionClient; + private final CollectionService collectionService; + private final CollectionDuplicatesService duplicatesService; + private final InstitutionService institutionService; private static final String NAME = "name"; private static final String DESCRIPTION = "dummy description"; @@ -80,9 +76,9 @@ public class CollectionIT extends ExtendedCollectionEntityIT { private static final AccessionStatus ACCESSION_STATUS_UPDATED = AccessionStatus.PROJECT; @Autowired - public CollectionIT( - InstitutionService institutionResource, - CollectionService collectionResource, + public CollectionServiceIT( + InstitutionService institutionService, + CollectionService collectionService, PersonService personResource, DatasetService datasetService, NodeService nodeService, @@ -91,11 +87,9 @@ public CollectionIT( SimplePrincipalProvider principalProvider, EsManageServer esServer, IdentityService identityService, - @LocalServerPort int localServerPort, - KeyStore keyStore) { + CollectionDuplicatesService duplicatesService) { super( - collectionResource, - CollectionClient.class, + collectionService, personResource, datasetService, nodeService, @@ -104,17 +98,16 @@ public CollectionIT( principalProvider, esServer, identityService, - localServerPort, - keyStore); - this.institutionResource = institutionResource; - this.institutionClient = prepareClient(localServerPort, keyStore, InstitutionClient.class); + collectionService, + collectionService, + duplicatesService); + this.collectionService = collectionService; + this.duplicatesService = duplicatesService; + this.institutionService = institutionService; } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void listTest(ServiceType serviceType) { - CollectionService service = ((CollectionService) getService(serviceType)); - + @Test + public void listTest() { Collection collection1 = newEntity(); collection1.setCode("c1"); collection1.setName("n1"); @@ -124,7 +117,7 @@ public void listTest(ServiceType serviceType) { address.setCountry(Country.DENMARK); collection1.setAddress(address); collection1.setAlternativeCodes(Collections.singletonList(new AlternativeCode("alt", "test"))); - UUID key1 = service.create(collection1); + UUID key1 = collectionService.create(collection1); Collection collection2 = newEntity(); collection2.setCode("c2"); @@ -134,60 +127,65 @@ public void listTest(ServiceType serviceType) { address2.setCity("city2"); address2.setCountry(Country.SPAIN); collection2.setAddress(address2); - UUID key2 = service.create(collection2); + UUID key2 = collectionService.create(collection2); // query param PagingResponse response = - service.list(CollectionSearchRequest.builder().query("dummy").page(DEFAULT_PAGE).build()); + collectionService.list( + CollectionSearchRequest.builder().query("dummy").page(DEFAULT_PAGE).build()); assertEquals(2, response.getResults().size()); // empty queries are ignored and return all elements - response = service.list(CollectionSearchRequest.builder().query("").page(DEFAULT_PAGE).build()); + response = + collectionService.list( + CollectionSearchRequest.builder().query("").page(DEFAULT_PAGE).build()); assertEquals(2, response.getResults().size()); response = - service.list(CollectionSearchRequest.builder().query("city").page(DEFAULT_PAGE).build()); + collectionService.list( + CollectionSearchRequest.builder().query("city").page(DEFAULT_PAGE).build()); assertEquals(1, response.getResults().size()); assertEquals(key1, response.getResults().get(0).getCollection().getKey()); response = - service.list(CollectionSearchRequest.builder().query("city2").page(DEFAULT_PAGE).build()); + collectionService.list( + CollectionSearchRequest.builder().query("city2").page(DEFAULT_PAGE).build()); assertEquals(1, response.getResults().size()); assertEquals(key2, response.getResults().get(0).getCollection().getKey()); assertEquals( 2, - service + collectionService .list(CollectionSearchRequest.builder().query("c").page(DEFAULT_PAGE).build()) .getResults() .size()); assertEquals( 2, - service + collectionService .list(CollectionSearchRequest.builder().query("dum add").page(DEFAULT_PAGE).build()) .getResults() .size()); assertEquals( 0, - service + collectionService .list(CollectionSearchRequest.builder().query("<").page(DEFAULT_PAGE).build()) .getResults() .size()); assertEquals( 0, - service + collectionService .list(CollectionSearchRequest.builder().query("\"<\"").page(DEFAULT_PAGE).build()) .getResults() .size()); assertEquals( 2, - service + collectionService .list(CollectionSearchRequest.builder().page(DEFAULT_PAGE).build()) .getResults() .size()); assertEquals( 2, - service + collectionService .list(CollectionSearchRequest.builder().query(" ").page(DEFAULT_PAGE).build()) .getResults() .size()); @@ -195,26 +193,26 @@ public void listTest(ServiceType serviceType) { // code and name params assertEquals( 1, - service + collectionService .list(CollectionSearchRequest.builder().code("c1").page(DEFAULT_PAGE).build()) .getResults() .size()); assertEquals( 1, - service + collectionService .list(CollectionSearchRequest.builder().name("n2").page(DEFAULT_PAGE).build()) .getResults() .size()); assertEquals( 1, - service + collectionService .list( CollectionSearchRequest.builder().code("c1").name("n1").page(DEFAULT_PAGE).build()) .getResults() .size()); assertEquals( 0, - service + collectionService .list( CollectionSearchRequest.builder().code("c2").name("n1").page(DEFAULT_PAGE).build()) .getResults() @@ -223,14 +221,14 @@ public void listTest(ServiceType serviceType) { // alternative code assertEquals( 1, - service + collectionService .list( CollectionSearchRequest.builder().alternativeCode("alt").page(DEFAULT_PAGE).build()) .getResults() .size()); assertEquals( 0, - service + collectionService .list( CollectionSearchRequest.builder().alternativeCode("foo").page(DEFAULT_PAGE).build()) .getResults() @@ -238,7 +236,7 @@ public void listTest(ServiceType serviceType) { // country List results = - service + collectionService .list( CollectionSearchRequest.builder().country(Country.SPAIN).page(DEFAULT_PAGE).build()) .getResults(); @@ -246,7 +244,7 @@ public void listTest(ServiceType serviceType) { assertEquals(key2, results.get(0).getCollection().getKey()); assertEquals( 0, - service + collectionService .list( CollectionSearchRequest.builder() .country(Country.AFGHANISTAN) @@ -257,46 +255,41 @@ public void listTest(ServiceType serviceType) { // city results = - service + collectionService .list(CollectionSearchRequest.builder().city("city2").page(DEFAULT_PAGE).build()) .getResults(); assertEquals(1, results.size()); assertEquals(key2, results.get(0).getCollection().getKey()); assertEquals( 0, - service + collectionService .list(CollectionSearchRequest.builder().city("foo").page(DEFAULT_PAGE).build()) .getResults() .size()); // update address - collection2 = service.get(key2); + collection2 = collectionService.get(key2); assertNotNull(collection2.getAddress()); collection2.getAddress().setCity("city3"); - service.update(collection2); + collectionService.update(collection2); assertEquals( 1, - service + collectionService .list(CollectionSearchRequest.builder().query("city3").page(DEFAULT_PAGE).build()) .getResults() .size()); - service.delete(key2); + collectionService.delete(key2); assertEquals( 0, - service + collectionService .list(CollectionSearchRequest.builder().query("city3").page(DEFAULT_PAGE).build()) .getResults() .size()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void listByInstitutionTest(ServiceType serviceType) { - CollectionService service = ((CollectionService) getService(serviceType)); - InstitutionService institutionService = - getService(serviceType, institutionResource, institutionClient); - + @Test + public void listByInstitutionTest() { // institutions Institution institution1 = new Institution(); institution1.setCode("code1"); @@ -310,18 +303,18 @@ public void listByInstitutionTest(ServiceType serviceType) { Collection collection1 = newEntity(); collection1.setInstitutionKey(institutionKey1); - service.create(collection1); + collectionService.create(collection1); Collection collection2 = newEntity(); collection2.setInstitutionKey(institutionKey1); - service.create(collection2); + collectionService.create(collection2); Collection collection3 = newEntity(); collection3.setInstitutionKey(institutionKey2); - service.create(collection3); + collectionService.create(collection3); PagingResponse response = - service.list( + collectionService.list( CollectionSearchRequest.builder() .institution(institutionKey1) .page(DEFAULT_PAGE) @@ -329,7 +322,7 @@ public void listByInstitutionTest(ServiceType serviceType) { assertEquals(2, response.getResults().size()); response = - service.list( + collectionService.list( CollectionSearchRequest.builder() .institution(institutionKey2) .page(DEFAULT_PAGE) @@ -337,7 +330,7 @@ public void listByInstitutionTest(ServiceType serviceType) { assertEquals(1, response.getResults().size()); response = - service.list( + collectionService.list( CollectionSearchRequest.builder() .institution(UUID.randomUUID()) .page(DEFAULT_PAGE) @@ -345,13 +338,8 @@ public void listByInstitutionTest(ServiceType serviceType) { assertEquals(0, response.getResults().size()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void listMultipleParamsTest(ServiceType serviceType) { - CollectionService service = ((CollectionService) getService(serviceType)); - InstitutionService institutionService = - getService(serviceType, institutionResource, institutionClient); - + @Test + public void listMultipleParamsTest() { // institutions Institution institution1 = new Institution(); institution1.setCode("code1"); @@ -366,19 +354,19 @@ public void listMultipleParamsTest(ServiceType serviceType) { Collection collection1 = newEntity(); collection1.setCode("code1"); collection1.setInstitutionKey(institutionKey1); - service.create(collection1); + collectionService.create(collection1); Collection collection2 = newEntity(); collection2.setCode("code2"); collection2.setInstitutionKey(institutionKey1); - service.create(collection2); + collectionService.create(collection2); Collection collection3 = newEntity(); collection3.setInstitutionKey(institutionKey2); - service.create(collection3); + collectionService.create(collection3); PagingResponse response = - service.list( + collectionService.list( CollectionSearchRequest.builder() .query("code1") .institution(institutionKey1) @@ -387,7 +375,7 @@ public void listMultipleParamsTest(ServiceType serviceType) { assertEquals(1, response.getResults().size()); response = - service.list( + collectionService.list( CollectionSearchRequest.builder() .query("foo") .institution(institutionKey1) @@ -396,7 +384,7 @@ public void listMultipleParamsTest(ServiceType serviceType) { assertEquals(0, response.getResults().size()); response = - service.list( + collectionService.list( CollectionSearchRequest.builder() .query("code2") .institution(institutionKey2) @@ -405,7 +393,7 @@ public void listMultipleParamsTest(ServiceType serviceType) { assertEquals(0, response.getResults().size()); response = - service.list( + collectionService.list( CollectionSearchRequest.builder() .query("code2") .institution(institutionKey1) @@ -414,86 +402,75 @@ public void listMultipleParamsTest(ServiceType serviceType) { assertEquals(1, response.getResults().size()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void testSuggest(ServiceType serviceType) { - CollectionService service = ((CollectionService) getService(serviceType)); - + @Test + public void testSuggest() { Collection collection1 = newEntity(); collection1.setCode("CC"); collection1.setName("Collection name"); - service.create(collection1); + collectionService.create(collection1); Collection collection2 = newEntity(); collection2.setCode("CC2"); collection2.setName("Collection name2"); - service.create(collection2); + collectionService.create(collection2); - assertEquals(2, service.suggest("collection").size()); - assertEquals(2, service.suggest("CC").size()); - assertEquals(1, service.suggest("CC2").size()); - assertEquals(1, service.suggest("name2").size()); + assertEquals(2, collectionService.suggest("collection").size()); + assertEquals(2, collectionService.suggest("CC").size()); + assertEquals(1, collectionService.suggest("CC2").size()); + assertEquals(1, collectionService.suggest("name2").size()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void listDeletedTest(ServiceType serviceType) { - CollectionService service = ((CollectionService) getService(serviceType)); - + @Test + public void listDeletedTest() { Collection collection1 = newEntity(); collection1.setCode("code1"); collection1.setName("Collection name"); - UUID key1 = service.create(collection1); + UUID key1 = collectionService.create(collection1); Collection collection2 = newEntity(); collection2.setCode("code2"); collection2.setName("Collection name2"); - UUID key2 = service.create(collection2); + UUID key2 = collectionService.create(collection2); - assertEquals(0, service.listDeleted(DEFAULT_PAGE).getResults().size()); + assertEquals(0, collectionService.listDeleted(DEFAULT_PAGE).getResults().size()); - service.delete(key1); - assertEquals(1, service.listDeleted(DEFAULT_PAGE).getResults().size()); + collectionService.delete(key1); + assertEquals(1, collectionService.listDeleted(DEFAULT_PAGE).getResults().size()); - service.delete(key2); - assertEquals(2, service.listDeleted(DEFAULT_PAGE).getResults().size()); + collectionService.delete(key2); + assertEquals(2, collectionService.listDeleted(DEFAULT_PAGE).getResults().size()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void listWithoutParametersTest(ServiceType serviceType) { - CollectionService service = (CollectionService) getService(serviceType); - - service.create(newEntity()); - service.create(newEntity()); + @Test + public void listWithoutParametersTest() { + collectionService.create(newEntity()); + collectionService.create(newEntity()); Collection collection3 = newEntity(); - UUID key3 = service.create(collection3); + UUID key3 = collectionService.create(collection3); PagingResponse response = - service.list(CollectionSearchRequest.builder().page(DEFAULT_PAGE).build()); + collectionService.list(CollectionSearchRequest.builder().page(DEFAULT_PAGE).build()); assertEquals(3, response.getResults().size()); - service.delete(key3); + collectionService.delete(key3); - response = service.list(CollectionSearchRequest.builder().page(DEFAULT_PAGE).build()); + response = collectionService.list(CollectionSearchRequest.builder().page(DEFAULT_PAGE).build()); assertEquals(2, response.getResults().size()); response = - service.list(CollectionSearchRequest.builder().page(new PagingRequest(0L, 1)).build()); + collectionService.list( + CollectionSearchRequest.builder().page(new PagingRequest(0L, 1)).build()); assertEquals(1, response.getResults().size()); response = - service.list(CollectionSearchRequest.builder().page(new PagingRequest(0L, 0)).build()); + collectionService.list( + CollectionSearchRequest.builder().page(new PagingRequest(0L, 0)).build()); assertEquals(0, response.getResults().size()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void listByContactTest(ServiceType serviceType) { - CollectionService service = (CollectionService) getService(serviceType); - PersonService personService = getService(serviceType, personResource, personClient); - + @Test + public void listByContactTest() { // persons Person person1 = new Person(); person1.setFirstName("first name"); @@ -505,31 +482,31 @@ public void listByContactTest(ServiceType serviceType) { // collections Collection collection1 = newEntity(); - UUID collectionKey1 = service.create(collection1); + UUID collectionKey1 = collectionService.create(collection1); Collection collection2 = newEntity(); - UUID collectionKey2 = service.create(collection2); + UUID collectionKey2 = collectionService.create(collection2); // add contacts - service.addContact(collectionKey1, personKey1); - service.addContact(collectionKey1, personKey2); - service.addContact(collectionKey2, personKey2); + collectionService.addContact(collectionKey1, personKey1); + collectionService.addContact(collectionKey1, personKey2); + collectionService.addContact(collectionKey2, personKey2); assertEquals( 1, - service + collectionService .list(CollectionSearchRequest.builder().contact(personKey1).page(DEFAULT_PAGE).build()) .getResults() .size()); assertEquals( 2, - service + collectionService .list(CollectionSearchRequest.builder().contact(personKey2).page(DEFAULT_PAGE).build()) .getResults() .size()); assertEquals( 0, - service + collectionService .list( CollectionSearchRequest.builder() .contact(UUID.randomUUID()) @@ -538,59 +515,51 @@ public void listByContactTest(ServiceType serviceType) { .getResults() .size()); - service.removeContact(collectionKey1, personKey2); + collectionService.removeContact(collectionKey1, personKey2); assertEquals( 1, - service + collectionService .list(CollectionSearchRequest.builder().contact(personKey1).page(DEFAULT_PAGE).build()) .getResults() .size()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void createCollectionWithoutCodeTest(ServiceType serviceType) { - CollectionService service = (CollectionService) getService(serviceType); + @Test + public void createCollectionWithoutCodeTest() { Collection c = newEntity(); c.setCode(null); - assertThrows(ValidationException.class, () -> service.create(c)); + assertThrows(ValidationException.class, () -> collectionService.create(c)); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void updateCollectionWithoutCodeTest(ServiceType serviceType) { - CollectionService service = (CollectionService) getService(serviceType); + @Test + public void updateCollectionWithoutCodeTest() { Collection c = newEntity(); - UUID key = service.create(c); + UUID key = collectionService.create(c); - Collection created = service.get(key); + Collection created = collectionService.get(key); created.setCode(null); - assertThrows(IllegalArgumentException.class, () -> service.update(created)); + assertThrows(IllegalArgumentException.class, () -> collectionService.update(created)); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void updateAndReplaceTest(ServiceType serviceType) { - CollectionService service = (CollectionService) getService(serviceType); + @Test + public void updateAndReplaceTest() { Collection c = newEntity(); - UUID key = service.create(c); + UUID key = collectionService.create(c); - Collection created = service.get(key); + Collection created = collectionService.get(key); created.setReplacedBy(UUID.randomUUID()); - assertThrows(IllegalArgumentException.class, () -> service.update(created)); + assertThrows(IllegalArgumentException.class, () -> collectionService.update(created)); } @Test public void possibleDuplicatesTest() { testDuplicatesCommonCases(); - CollectionClient collClient = (CollectionClient) client; - - DuplicatesRequest request = new DuplicatesRequest(); - request.setSameInstitution(true); - request.setSameCode(true); + DuplicatesSearchParams params = new DuplicatesSearchParams(); + params.setSameInstitutionKey(true); + params.setSameCode(true); - DuplicatesResult result = collClient.findPossibleDuplicates(request); + DuplicatesResult result = duplicatesService.findPossibleDuplicates(params); assertEquals(1, result.getDuplicates().size()); assertEquals(2, result.getDuplicates().get(0).size()); @@ -598,14 +567,14 @@ public void possibleDuplicatesTest() { result.getDuplicates().get(0).stream() .map(Duplicate::getInstitutionKey) .collect(Collectors.toSet()); - request.setInInstitutions(new ArrayList<>(keysFound)); - result = collClient.findPossibleDuplicates(request); + params.setInInstitutions(new ArrayList<>(keysFound)); + result = duplicatesService.findPossibleDuplicates(params); assertEquals(1, result.getDuplicates().size()); assertEquals(2, result.getDuplicates().get(0).size()); - request.setInInstitutions(null); - request.setNotInInstitutions(new ArrayList<>(keysFound)); - result = collClient.findPossibleDuplicates(request); + params.setInInstitutions(null); + params.setNotInInstitutions(new ArrayList<>(keysFound)); + result = duplicatesService.findPossibleDuplicates(params); assertEquals(0, result.getDuplicates().size()); } diff --git a/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/InstitutionIT.java b/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/InstitutionServiceIT.java similarity index 68% rename from registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/InstitutionIT.java rename to registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/InstitutionServiceIT.java index 112cd2b86a..5ad5f931df 100644 --- a/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/InstitutionIT.java +++ b/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/InstitutionServiceIT.java @@ -31,10 +31,9 @@ import org.gbif.api.vocabulary.Country; import org.gbif.registry.identity.service.IdentityService; import org.gbif.registry.search.test.EsManageServer; -import org.gbif.registry.ws.client.collections.InstitutionClient; +import org.gbif.registry.service.collections.duplicates.InstitutionDuplicatesService; import org.gbif.registry.ws.resources.collections.InstitutionResource; import org.gbif.ws.client.filter.SimplePrincipalProvider; -import org.gbif.ws.security.KeyStore; import java.net.URI; import java.util.Collections; @@ -43,10 +42,7 @@ import javax.validation.ValidationException; import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.web.server.LocalServerPort; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; @@ -55,7 +51,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; /** Tests the {@link InstitutionResource}. */ -public class InstitutionIT extends ExtendedCollectionEntityIT { +public class InstitutionServiceIT extends PrimaryCollectionEntityServiceIT { private static final String NAME = "name"; private static final String DESCRIPTION = "dummy description"; @@ -65,10 +61,12 @@ public class InstitutionIT extends ExtendedCollectionEntityIT { private static final String DESCRIPTION_UPDATED = "dummy description updated"; private static final String ADDITIONAL_NAME = "additional name"; + private final InstitutionService institutionService; + @Autowired - public InstitutionIT( - InstitutionService institutionResource, - PersonService personResource, + public InstitutionServiceIT( + InstitutionService institutionService, + PersonService personService, DatasetService datasetService, NodeService nodeService, OrganizationService organizationService, @@ -76,12 +74,10 @@ public InstitutionIT( SimplePrincipalProvider principalProvider, EsManageServer esServer, IdentityService identityService, - @LocalServerPort int localServerPort, - KeyStore keyStore) { + InstitutionDuplicatesService duplicatesService) { super( - institutionResource, - InstitutionClient.class, - personResource, + institutionService, + personService, datasetService, nodeService, organizationService, @@ -89,15 +85,14 @@ public InstitutionIT( principalProvider, esServer, identityService, - localServerPort, - keyStore); + institutionService, + institutionService, + duplicatesService); + this.institutionService = institutionService; } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void listTest(ServiceType serviceType) { - InstitutionService service = ((InstitutionService) getService(serviceType)); - + @Test + public void listTest() { Institution institution1 = newEntity(); institution1.setCode("c1"); institution1.setName("n1"); @@ -107,7 +102,7 @@ public void listTest(ServiceType serviceType) { address.setCountry(Country.DENMARK); institution1.setAddress(address); institution1.setAlternativeCodes(Collections.singletonList(new AlternativeCode("alt", "test"))); - UUID key1 = service.create(institution1); + UUID key1 = institutionService.create(institution1); Institution institution2 = newEntity(); institution2.setCode("c2"); @@ -117,50 +112,54 @@ public void listTest(ServiceType serviceType) { address2.setCity("city2"); address2.setCountry(Country.SPAIN); institution2.setAddress(address2); - UUID key2 = service.create(institution2); + UUID key2 = institutionService.create(institution2); PagingResponse response = - service.list(InstitutionSearchRequest.builder().query("dummy").page(DEFAULT_PAGE).build()); + institutionService.list( + InstitutionSearchRequest.builder().query("dummy").page(DEFAULT_PAGE).build()); assertEquals(2, response.getResults().size()); // empty queries are ignored and return all elements response = - service.list(InstitutionSearchRequest.builder().query("").page(DEFAULT_PAGE).build()); + institutionService.list( + InstitutionSearchRequest.builder().query("").page(DEFAULT_PAGE).build()); assertEquals(2, response.getResults().size()); response = - service.list(InstitutionSearchRequest.builder().query("city").page(DEFAULT_PAGE).build()); + institutionService.list( + InstitutionSearchRequest.builder().query("city").page(DEFAULT_PAGE).build()); assertEquals(1, response.getResults().size()); assertEquals(key1, response.getResults().get(0).getKey()); response = - service.list(InstitutionSearchRequest.builder().query("city2").page(DEFAULT_PAGE).build()); + institutionService.list( + InstitutionSearchRequest.builder().query("city2").page(DEFAULT_PAGE).build()); assertEquals(1, response.getResults().size()); assertEquals(key2, response.getResults().get(0).getKey()); // code and name params assertEquals( 1, - service + institutionService .list(InstitutionSearchRequest.builder().code("c1").page(DEFAULT_PAGE).build()) .getResults() .size()); assertEquals( 1, - service + institutionService .list(InstitutionSearchRequest.builder().name("n2").page(DEFAULT_PAGE).build()) .getResults() .size()); assertEquals( 1, - service + institutionService .list( InstitutionSearchRequest.builder().code("c1").name("n1").page(DEFAULT_PAGE).build()) .getResults() .size()); assertEquals( 0, - service + institutionService .list( InstitutionSearchRequest.builder().code("c2").name("n1").page(DEFAULT_PAGE).build()) .getResults() @@ -169,59 +168,59 @@ public void listTest(ServiceType serviceType) { // query param assertEquals( 2, - service + institutionService .list(InstitutionSearchRequest.builder().query("c").page(DEFAULT_PAGE).build()) .getResults() .size()); assertEquals( 2, - service + institutionService .list(InstitutionSearchRequest.builder().query("dum add").page(DEFAULT_PAGE).build()) .getResults() .size()); assertEquals( 0, - service + institutionService .list(InstitutionSearchRequest.builder().query("<").page(DEFAULT_PAGE).build()) .getResults() .size()); assertEquals( 0, - service + institutionService .list(InstitutionSearchRequest.builder().query("\"<\"").page(DEFAULT_PAGE).build()) .getResults() .size()); assertEquals( 2, - service + institutionService .list(InstitutionSearchRequest.builder().page(DEFAULT_PAGE).build()) .getResults() .size()); assertEquals( 2, - service + institutionService .list(InstitutionSearchRequest.builder().query(" ").page(DEFAULT_PAGE).build()) .getResults() .size()); // alternative code response = - service.list( + institutionService.list( InstitutionSearchRequest.builder().alternativeCode("alt").page(DEFAULT_PAGE).build()); assertEquals(1, response.getResults().size()); response = - service.list( + institutionService.list( InstitutionSearchRequest.builder().alternativeCode("foo").page(DEFAULT_PAGE).build()); assertEquals(0, response.getResults().size()); response = - service.list( + institutionService.list( InstitutionSearchRequest.builder().country(Country.SPAIN).page(DEFAULT_PAGE).build()); assertEquals(1, response.getResults().size()); assertEquals(key2, response.getResults().get(0).getKey()); response = - service.list( + institutionService.list( InstitutionSearchRequest.builder() .country(Country.AFGHANISTAN) .page(DEFAULT_PAGE) @@ -229,117 +228,109 @@ public void listTest(ServiceType serviceType) { assertEquals(0, response.getResults().size()); response = - service.list(InstitutionSearchRequest.builder().city("city2").page(DEFAULT_PAGE).build()); + institutionService.list( + InstitutionSearchRequest.builder().city("city2").page(DEFAULT_PAGE).build()); assertEquals(1, response.getResults().size()); assertEquals(key2, response.getResults().get(0).getKey()); response = - service.list(InstitutionSearchRequest.builder().city("foo").page(DEFAULT_PAGE).build()); + institutionService.list( + InstitutionSearchRequest.builder().city("foo").page(DEFAULT_PAGE).build()); assertEquals(0, response.getResults().size()); // update address - institution2 = service.get(key2); + institution2 = institutionService.get(key2); assertNotNull(institution2.getAddress()); institution2.getAddress().setCity("city3"); - service.update(institution2); + institutionService.update(institution2); assertEquals( 1, - service + institutionService .list(InstitutionSearchRequest.builder().query("city3").page(DEFAULT_PAGE).build()) .getResults() .size()); - service.delete(key2); + institutionService.delete(key2); assertEquals( 0, - service + institutionService .list(InstitutionSearchRequest.builder().query("city3").page(DEFAULT_PAGE).build()) .getResults() .size()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void testSuggest(ServiceType serviceType) { - InstitutionService service = ((InstitutionService) getService(serviceType)); - + @Test + public void testSuggest() { Institution institution1 = newEntity(); institution1.setCode("II"); institution1.setName("Institution name"); - service.create(institution1); + institutionService.create(institution1); Institution institution2 = newEntity(); institution2.setCode("II2"); institution2.setName("Institution name2"); - service.create(institution2); + institutionService.create(institution2); - assertEquals(2, service.suggest("institution").size()); - assertEquals(2, service.suggest("II").size()); - assertEquals(1, service.suggest("II2").size()); - assertEquals(1, service.suggest("name2").size()); + assertEquals(2, institutionService.suggest("institution").size()); + assertEquals(2, institutionService.suggest("II").size()); + assertEquals(1, institutionService.suggest("II2").size()); + assertEquals(1, institutionService.suggest("name2").size()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void listDeletedTest(ServiceType serviceType) { - InstitutionService service = ((InstitutionService) getService(serviceType)); - + @Test + public void listDeletedTest() { Institution institution1 = newEntity(); institution1.setCode("code1"); institution1.setName("Institution name"); - UUID key1 = service.create(institution1); + UUID key1 = institutionService.create(institution1); Institution institution2 = newEntity(); institution2.setCode("code2"); institution2.setName("Institution name2"); - UUID key2 = service.create(institution2); + UUID key2 = institutionService.create(institution2); - assertEquals(0, service.listDeleted(DEFAULT_PAGE).getResults().size()); + assertEquals(0, institutionService.listDeleted(DEFAULT_PAGE).getResults().size()); - service.delete(key1); - assertEquals(1, service.listDeleted(DEFAULT_PAGE).getResults().size()); + institutionService.delete(key1); + assertEquals(1, institutionService.listDeleted(DEFAULT_PAGE).getResults().size()); - service.delete(key2); - assertEquals(2, service.listDeleted(DEFAULT_PAGE).getResults().size()); + institutionService.delete(key2); + assertEquals(2, institutionService.listDeleted(DEFAULT_PAGE).getResults().size()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void listWithoutParametersTest(ServiceType serviceType) { - InstitutionService service = (InstitutionService) getService(serviceType); - + @Test + public void listWithoutParametersTest() { Institution institution1 = newEntity(); - service.create(institution1); + institutionService.create(institution1); Institution institution2 = newEntity(); - service.create(institution2); + institutionService.create(institution2); Institution institution3 = newEntity(); - UUID key3 = service.create(institution3); + UUID key3 = institutionService.create(institution3); PagingResponse response = - service.list(InstitutionSearchRequest.builder().page(DEFAULT_PAGE).build()); + institutionService.list(InstitutionSearchRequest.builder().page(DEFAULT_PAGE).build()); assertEquals(3, response.getResults().size()); - service.delete(key3); + institutionService.delete(key3); - response = service.list(InstitutionSearchRequest.builder().page(DEFAULT_PAGE).build()); + response = + institutionService.list(InstitutionSearchRequest.builder().page(DEFAULT_PAGE).build()); assertEquals(2, response.getResults().size()); response = - service.list(InstitutionSearchRequest.builder().page(new PagingRequest(0L, 1)).build()); + institutionService.list( + InstitutionSearchRequest.builder().page(new PagingRequest(0L, 1)).build()); assertEquals(1, response.getResults().size()); response = - service.list(InstitutionSearchRequest.builder().page(new PagingRequest(0L, 0)).build()); + institutionService.list( + InstitutionSearchRequest.builder().page(new PagingRequest(0L, 0)).build()); assertEquals(0, response.getResults().size()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void listByContactTest(ServiceType serviceType) { - InstitutionService service = (InstitutionService) getService(serviceType); - PersonService personService = getService(serviceType, personResource, personClient); - + @Test + public void listByContactTest() { // persons Person person1 = new Person(); person1.setFirstName("first name"); @@ -351,31 +342,31 @@ public void listByContactTest(ServiceType serviceType) { // institutions Institution institution1 = newEntity(); - UUID instutionKey1 = service.create(institution1); + UUID instutionKey1 = institutionService.create(institution1); Institution institution2 = newEntity(); - UUID instutionKey2 = service.create(institution2); + UUID instutionKey2 = institutionService.create(institution2); // add contacts - service.addContact(instutionKey1, personKey1); - service.addContact(instutionKey1, personKey2); - service.addContact(instutionKey2, personKey2); + institutionService.addContact(instutionKey1, personKey1); + institutionService.addContact(instutionKey1, personKey2); + institutionService.addContact(instutionKey2, personKey2); assertEquals( 1, - service + institutionService .list(InstitutionSearchRequest.builder().contact(personKey1).page(DEFAULT_PAGE).build()) .getResults() .size()); assertEquals( 2, - service + institutionService .list(InstitutionSearchRequest.builder().contact(personKey2).page(DEFAULT_PAGE).build()) .getResults() .size()); assertEquals( 0, - service + institutionService .list( InstitutionSearchRequest.builder() .contact(UUID.randomUUID()) @@ -384,50 +375,44 @@ public void listByContactTest(ServiceType serviceType) { .getResults() .size()); - service.removeContact(instutionKey1, personKey2); + institutionService.removeContact(instutionKey1, personKey2); assertEquals( 1, - service + institutionService .list(InstitutionSearchRequest.builder().contact(personKey2).page(DEFAULT_PAGE).build()) .getResults() .size()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void createInstitutionWithoutCodeTest(ServiceType serviceType) { - InstitutionService service = (InstitutionService) getService(serviceType); + @Test + public void createInstitutionWithoutCodeTest() { Institution i = newEntity(); i.setCode(null); - assertThrows(ValidationException.class, () -> service.create(i)); + assertThrows(ValidationException.class, () -> institutionService.create(i)); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void updateInstitutionWithoutCodeTest(ServiceType serviceType) { - InstitutionService service = (InstitutionService) getService(serviceType); + @Test + public void updateInstitutionWithoutCodeTest() { Institution i = newEntity(); - UUID key = service.create(i); + UUID key = institutionService.create(i); - Institution created = service.get(key); + Institution created = institutionService.get(key); created.setCode(null); - assertThrows(IllegalArgumentException.class, () -> service.update(created)); + assertThrows(IllegalArgumentException.class, () -> institutionService.update(created)); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void updateAndReplaceTest(ServiceType serviceType) { - InstitutionService service = (InstitutionService) getService(serviceType); + @Test + public void updateAndReplaceTest() { Institution i = newEntity(); - UUID key = service.create(i); + UUID key = institutionService.create(i); - Institution created = service.get(key); + Institution created = institutionService.get(key); created.setReplacedBy(UUID.randomUUID()); - assertThrows(IllegalArgumentException.class, () -> service.update(created)); + assertThrows(IllegalArgumentException.class, () -> institutionService.update(created)); created.setReplacedBy(null); created.setConvertedToCollection(UUID.randomUUID()); - assertThrows(IllegalArgumentException.class, () -> service.update(created)); + assertThrows(IllegalArgumentException.class, () -> institutionService.update(created)); } @Test diff --git a/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/PersonIT.java b/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/PersonServiceIT.java similarity index 58% rename from registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/PersonIT.java rename to registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/PersonServiceIT.java index b443fcfcb9..18ab47c304 100644 --- a/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/PersonIT.java +++ b/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/PersonServiceIT.java @@ -29,34 +29,27 @@ import org.gbif.api.vocabulary.IdentifierType; import org.gbif.registry.identity.service.IdentityService; import org.gbif.registry.search.test.EsManageServer; -import org.gbif.registry.ws.client.collections.CollectionClient; -import org.gbif.registry.ws.client.collections.InstitutionClient; -import org.gbif.registry.ws.client.collections.PersonClient; import org.gbif.ws.client.filter.SimplePrincipalProvider; -import org.gbif.ws.security.KeyStore; import java.util.Collections; import java.util.UUID; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.web.server.LocalServerPort; import static org.gbif.registry.ws.it.fixtures.TestConstants.WS_TEST; -import static org.hamcrest.Matchers.greaterThanOrEqualTo; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.greaterThanOrEqualTo; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -public class PersonIT extends BaseCollectionEntityIT { +public class PersonServiceIT extends BaseCollectionEntityServiceIT { - private final InstitutionService institutionResource; - private final InstitutionService institutionClient; - private final CollectionService collectionResource; - private final CollectionService collectionClient; + private final PersonService personService; + private final InstitutionService institutionService; + private final CollectionService collectionService; private static final String FIRST_NAME = "first name"; private static final String LAST_NAME = "last name"; @@ -69,33 +62,21 @@ public class PersonIT extends BaseCollectionEntityIT { private static final String PHONE_UPDATED = "134235433"; @Autowired - public PersonIT( - PersonService personResource, - InstitutionService institutionResource, - CollectionService collectionResource, + public PersonServiceIT( + PersonService personService, + InstitutionService institutionService, + CollectionService collectionService, SimplePrincipalProvider principalProvider, EsManageServer esServer, - IdentityService identityService, - @LocalServerPort int localServerPort, - KeyStore keyStore) { - super( - personResource, - PersonClient.class, - principalProvider, - esServer, - identityService, - localServerPort, - keyStore); - this.institutionResource = institutionResource; - this.institutionClient = prepareClient(localServerPort, keyStore, InstitutionClient.class); - this.collectionResource = collectionResource; - this.collectionClient = prepareClient(localServerPort, keyStore, CollectionClient.class); + IdentityService identityService) { + super(personService, principalProvider, esServer, identityService); + this.personService = personService; + this.institutionService = institutionService; + this.collectionService = collectionService; } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void createWithAddressTest(ServiceType serviceType) { - PersonService service = ((PersonService) getService(serviceType)); + @Test + public void createWithAddressTest() { Person person = newEntity(); Address mailingAddress = new Address(); @@ -109,8 +90,8 @@ public void createWithAddressTest(ServiceType serviceType) { identifier.setType(IdentifierType.IH_IRN); person.setIdentifiers(Collections.singletonList(identifier)); - UUID key = service.create(person); - Person personSaved = service.get(key); + UUID key = personService.create(person); + Person personSaved = personService.get(key); assertNewEntity(personSaved); assertNotNull(personSaved.getMailingAddress()); @@ -122,95 +103,84 @@ public void createWithAddressTest(ServiceType serviceType) { assertEquals(IdentifierType.IH_IRN, personSaved.getIdentifiers().get(0).getType()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void listWithoutParamsTest(ServiceType serviceType) { - PersonService service = ((PersonService) getService(serviceType)); - + @Test + public void listWithoutParamsTest() { Person person1 = newEntity(); - service.create(person1); + personService.create(person1); Person person2 = newEntity(); - service.create(person2); + personService.create(person2); Person person3 = newEntity(); - UUID key3 = service.create(person3); + UUID key3 = personService.create(person3); - PagingResponse response = service.list(null, null, null, DEFAULT_PAGE); + PagingResponse response = personService.list(null, null, null, DEFAULT_PAGE); assertThat(3, greaterThanOrEqualTo(response.getResults().size())); - service.delete(key3); + personService.delete(key3); - response = service.list(null, null, null, DEFAULT_PAGE); + response = personService.list(null, null, null, DEFAULT_PAGE); assertThat(2, greaterThanOrEqualTo(response.getResults().size())); - response = service.list(null, null, null, new PagingRequest(0L, 1)); + response = personService.list(null, null, null, new PagingRequest(0L, 1)); assertEquals(1, response.getResults().size()); - response = service.list(null, null, null, new PagingRequest(0L, 0)); + response = personService.list(null, null, null, new PagingRequest(0L, 0)); assertEquals(0, response.getResults().size()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void listQueryTest(ServiceType serviceType) { - PersonService service = ((PersonService) getService(serviceType)); - + @Test + public void listQueryTest() { Person person1 = newEntity(); Address address = new Address(); address.setAddress("dummy address"); address.setCity("city"); person1.setMailingAddress(address); - UUID key1 = service.create(person1); + UUID key1 = personService.create(person1); Person person2 = newEntity(); Address address2 = new Address(); address2.setAddress("dummy address2"); address2.setCity("city2"); person2.setMailingAddress(address2); - UUID key2 = service.create(person2); + UUID key2 = personService.create(person2); // query params - PagingResponse response = service.list("dummy", null, null, DEFAULT_PAGE); + PagingResponse response = personService.list("dummy", null, null, DEFAULT_PAGE); assertEquals(2, response.getResults().size()); // empty queries are ignored and return all elements - response = service.list("", null, null, DEFAULT_PAGE); + response = personService.list("", null, null, DEFAULT_PAGE); assertEquals(2, response.getResults().size()); - response = service.list("city", null, null, DEFAULT_PAGE); + response = personService.list("city", null, null, DEFAULT_PAGE); assertEquals(1, response.getResults().size()); assertEquals(key1, response.getResults().get(0).getKey()); - response = service.list("city2", null, null, DEFAULT_PAGE); + response = personService.list("city2", null, null, DEFAULT_PAGE); assertEquals(1, response.getResults().size()); assertEquals(key2, response.getResults().get(0).getKey()); - assertEquals(2, service.list("c", null, null, DEFAULT_PAGE).getResults().size()); - assertEquals(2, service.list("dum add", null, null, DEFAULT_PAGE).getResults().size()); - assertEquals(0, service.list("<", null, null, DEFAULT_PAGE).getResults().size()); - assertEquals(0, service.list("\"<\"", null, null, DEFAULT_PAGE).getResults().size()); - assertEquals(2, service.list(" ", null, null, DEFAULT_PAGE).getResults().size()); + assertEquals(2, personService.list("c", null, null, DEFAULT_PAGE).getResults().size()); + assertEquals(2, personService.list("dum add", null, null, DEFAULT_PAGE).getResults().size()); + assertEquals(0, personService.list("<", null, null, DEFAULT_PAGE).getResults().size()); + assertEquals(0, personService.list("\"<\"", null, null, DEFAULT_PAGE).getResults().size()); + assertEquals(2, personService.list(" ", null, null, DEFAULT_PAGE).getResults().size()); // update address - person2 = service.get(key2); + person2 = personService.get(key2); person2.getMailingAddress().setCity("city3"); - service.update(person2); - response = service.list("city3", null, null, DEFAULT_PAGE); + personService.update(person2); + response = personService.list("city3", null, null, DEFAULT_PAGE); assertEquals(1, response.getResults().size()); - service.delete(key2); - response = service.list("city3", null, null, DEFAULT_PAGE); + personService.delete(key2); + response = personService.list("city3", null, null, DEFAULT_PAGE); assertEquals(0, response.getResults().size()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void listByInstitutionTest(ServiceType serviceType) { - PersonService service = ((PersonService) getService(serviceType)); - InstitutionService institutionService = - getService(serviceType, institutionResource, institutionClient); - + @Test + public void listByInstitutionTest() { // institutions Institution institution1 = new Institution(); institution1.setCode("code1"); @@ -225,33 +195,28 @@ public void listByInstitutionTest(ServiceType serviceType) { // person Person person1 = newEntity(); person1.setPrimaryInstitutionKey(institutionKey1); - service.create(person1); + personService.create(person1); Person person2 = newEntity(); person2.setPrimaryInstitutionKey(institutionKey1); - service.create(person2); + personService.create(person2); Person person3 = newEntity(); person3.setPrimaryInstitutionKey(institutionKey2); - service.create(person3); + personService.create(person3); - PagingResponse response = service.list(null, institutionKey1, null, DEFAULT_PAGE); + PagingResponse response = personService.list(null, institutionKey1, null, DEFAULT_PAGE); assertEquals(2, response.getResults().size()); - response = service.list(null, institutionKey2, null, new PagingRequest(0L, 2)); + response = personService.list(null, institutionKey2, null, new PagingRequest(0L, 2)); assertEquals(1, response.getResults().size()); - response = service.list(null, UUID.randomUUID(), null, new PagingRequest(0L, 2)); + response = personService.list(null, UUID.randomUUID(), null, new PagingRequest(0L, 2)); assertEquals(0, response.getResults().size()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void listByCollectionTest(ServiceType serviceType) { - PersonService service = ((PersonService) getService(serviceType)); - CollectionService collectionService = - getService(serviceType, collectionResource, collectionClient); - + @Test + public void listByCollectionTest() { // collections Collection collection1 = new Collection(); collection1.setCode("code1"); @@ -266,35 +231,28 @@ public void listByCollectionTest(ServiceType serviceType) { // person Person person1 = newEntity(); person1.setPrimaryCollectionKey(collectionKey1); - service.create(person1); + personService.create(person1); Person person2 = newEntity(); person2.setPrimaryCollectionKey(collectionKey1); - service.create(person2); + personService.create(person2); Person person3 = newEntity(); person3.setPrimaryCollectionKey(collectionKey2); - service.create(person3); + personService.create(person3); - PagingResponse response = service.list(null, null, collectionKey1, DEFAULT_PAGE); + PagingResponse response = personService.list(null, null, collectionKey1, DEFAULT_PAGE); assertEquals(2, response.getResults().size()); - response = service.list(null, null, collectionKey2, new PagingRequest(0L, 2)); + response = personService.list(null, null, collectionKey2, new PagingRequest(0L, 2)); assertEquals(1, response.getResults().size()); - response = service.list(null, null, UUID.randomUUID(), new PagingRequest(0L, 2)); + response = personService.list(null, null, UUID.randomUUID(), new PagingRequest(0L, 2)); assertEquals(0, response.getResults().size()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void listMultipleParamsTest(ServiceType serviceType) { - PersonService service = ((PersonService) getService(serviceType)); - InstitutionService institutionService = - getService(serviceType, institutionResource, institutionClient); - CollectionService collectionService = - getService(serviceType, collectionResource, collectionClient); - + @Test + public void listMultipleParamsTest() { // institution Institution institution1 = new Institution(); institution1.setCode("code1"); @@ -311,40 +269,38 @@ public void listMultipleParamsTest(ServiceType serviceType) { Person person1 = newEntity(); person1.setFirstName("person1"); person1.setPrimaryCollectionKey(collectionKey1); - service.create(person1); + personService.create(person1); Person person2 = newEntity(); person2.setFirstName("person2"); person2.setPrimaryCollectionKey(collectionKey1); person2.setPrimaryInstitutionKey(institutionKey1); - service.create(person2); + personService.create(person2); - PagingResponse response = service.list("person1", null, collectionKey1, DEFAULT_PAGE); + PagingResponse response = + personService.list("person1", null, collectionKey1, DEFAULT_PAGE); assertEquals(1, response.getResults().size()); - response = service.list(LAST_NAME, null, collectionKey1, DEFAULT_PAGE); + response = personService.list(LAST_NAME, null, collectionKey1, DEFAULT_PAGE); assertEquals(2, response.getResults().size()); - response = service.list(LAST_NAME, institutionKey1, collectionKey1, DEFAULT_PAGE); + response = personService.list(LAST_NAME, institutionKey1, collectionKey1, DEFAULT_PAGE); assertEquals(1, response.getResults().size()); - response = service.list("person2", institutionKey1, collectionKey1, DEFAULT_PAGE); + response = personService.list("person2", institutionKey1, collectionKey1, DEFAULT_PAGE); assertEquals(1, response.getResults().size()); - response = service.list("person unknown", institutionKey1, collectionKey1, DEFAULT_PAGE); + response = personService.list("person unknown", institutionKey1, collectionKey1, DEFAULT_PAGE); assertEquals(0, response.getResults().size()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void updateAddressesTest(ServiceType serviceType) { - PersonService service = ((PersonService) getService(serviceType)); - + @Test + public void updateAddressesTest() { // entities Person person = newEntity(); - UUID entityKey = service.create(person); + UUID entityKey = personService.create(person); assertNewEntity(person); - person = service.get(entityKey); + person = personService.get(entityKey); // update adding address Address address = new Address(); @@ -353,8 +309,8 @@ public void updateAddressesTest(ServiceType serviceType) { address.setCity("city"); person.setMailingAddress(address); - service.update(person); - person = service.get(entityKey); + personService.update(person); + person = personService.get(entityKey); address = person.getMailingAddress(); assertNotNull(person.getMailingAddress().getKey()); @@ -365,61 +321,55 @@ public void updateAddressesTest(ServiceType serviceType) { // update address address.setAddress("address2"); - service.update(person); - person = service.get(entityKey); + personService.update(person); + person = personService.get(entityKey); assertEquals("address2", person.getMailingAddress().getAddress()); // delete address person.setMailingAddress(null); - service.update(person); - person = service.get(entityKey); + personService.update(person); + person = personService.get(entityKey); assertNull(person.getMailingAddress()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void testSuggest(ServiceType serviceType) { - PersonService service = ((PersonService) getService(serviceType)); - + @Test + public void testSuggest() { Person person1 = newEntity(); person1.setFirstName("first"); person1.setLastName("second"); - service.create(person1); + personService.create(person1); Person person2 = newEntity(); person2.setFirstName("first"); person2.setLastName("second2"); - service.create(person2); + personService.create(person2); - assertEquals(2, service.suggest("first").size()); - assertEquals(2, service.suggest("sec").size()); - assertEquals(1, service.suggest("second2").size()); - assertEquals(2, service.suggest("first second").size()); - assertEquals(1, service.suggest("first second2").size()); + assertEquals(2, personService.suggest("first").size()); + assertEquals(2, personService.suggest("sec").size()); + assertEquals(1, personService.suggest("second2").size()); + assertEquals(2, personService.suggest("first second").size()); + assertEquals(1, personService.suggest("first second2").size()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void listDeletedTest(ServiceType serviceType) { - PersonService service = (PersonService) getService(serviceType); - + @Test + public void listDeletedTest() { Person person1 = newEntity(); person1.setFirstName("first"); person1.setLastName("second"); - UUID key1 = service.create(person1); + UUID key1 = personService.create(person1); Person person2 = newEntity(); person2.setFirstName("first2"); person2.setLastName("second2"); - UUID key2 = service.create(person2); + UUID key2 = personService.create(person2); - assertEquals(0, service.listDeleted(DEFAULT_PAGE).getResults().size()); + assertEquals(0, personService.listDeleted(DEFAULT_PAGE).getResults().size()); - service.delete(key1); - assertEquals(1, service.listDeleted(DEFAULT_PAGE).getResults().size()); + personService.delete(key1); + assertEquals(1, personService.listDeleted(DEFAULT_PAGE).getResults().size()); - service.delete(key2); - assertEquals(2, service.listDeleted(DEFAULT_PAGE).getResults().size()); + personService.delete(key2); + assertEquals(2, personService.listDeleted(DEFAULT_PAGE).getResults().size()); } @Override diff --git a/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/ExtendedCollectionEntityIT.java b/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/PrimaryCollectionEntityServiceIT.java similarity index 71% rename from registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/ExtendedCollectionEntityIT.java rename to registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/PrimaryCollectionEntityServiceIT.java index c9eb9aec97..f7a5e1b1da 100644 --- a/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/ExtendedCollectionEntityIT.java +++ b/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/PrimaryCollectionEntityServiceIT.java @@ -22,7 +22,6 @@ import org.gbif.api.model.collections.OccurrenceMapping; import org.gbif.api.model.collections.Person; import org.gbif.api.model.collections.duplicates.Duplicate; -import org.gbif.api.model.collections.duplicates.DuplicatesRequest; import org.gbif.api.model.collections.duplicates.DuplicatesResult; import org.gbif.api.model.registry.Commentable; import org.gbif.api.model.registry.Dataset; @@ -48,11 +47,10 @@ import org.gbif.api.vocabulary.NodeType; import org.gbif.api.vocabulary.ParticipationStatus; import org.gbif.registry.identity.service.IdentityService; +import org.gbif.registry.persistence.mapper.collections.params.DuplicatesSearchParams; import org.gbif.registry.search.test.EsManageServer; -import org.gbif.registry.ws.client.collections.ExtendedBaseCollectionEntityClient; -import org.gbif.registry.ws.client.collections.PersonClient; +import org.gbif.registry.service.collections.duplicates.DuplicatesService; import org.gbif.ws.client.filter.SimplePrincipalProvider; -import org.gbif.ws.security.KeyStore; import java.sql.Connection; import java.util.ArrayList; @@ -64,11 +62,10 @@ import javax.sql.DataSource; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.BeforeAllCallback; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.api.extension.RegisterExtension; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; import org.springframework.core.io.ClassPathResource; import org.springframework.jdbc.datasource.init.ScriptUtils; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -79,23 +76,24 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -public abstract class ExtendedCollectionEntityIT< +public abstract class PrimaryCollectionEntityServiceIT< T extends CollectionEntity & Taggable & MachineTaggable & Identifiable & Contactable & Commentable & OccurrenceMappeable> - extends BaseCollectionEntityIT { + extends BaseCollectionEntityServiceIT { - protected final PersonService personResource; - protected final PersonService personClient; + protected final PersonService personService; protected final DatasetService datasetService; private final NodeService nodeService; private final OrganizationService organizationService; private final InstallationService installationService; + private final ContactService contactService; + private final OccurrenceMappingService occurrenceMappingService; + private final DuplicatesService duplicatesService; - public ExtendedCollectionEntityIT( - CrudService resource, - Class> cls, - PersonService personResource, + public PrimaryCollectionEntityServiceIT( + CrudService crudService, + PersonService personService, DatasetService datasetService, NodeService nodeService, OrganizationService organizationService, @@ -103,42 +101,45 @@ public ExtendedCollectionEntityIT( SimplePrincipalProvider principalProvider, EsManageServer esServer, IdentityService identityService, - int localServerPort, - KeyStore keyStore) { - super(resource, cls, principalProvider, esServer, identityService, localServerPort, keyStore); - this.personResource = personResource; - this.personClient = prepareClient(localServerPort, keyStore, PersonClient.class); + ContactService contactService, + OccurrenceMappingService occurrenceMappingService, + DuplicatesService duplicatesService) { + super(crudService, principalProvider, esServer, identityService); + this.personService = personService; this.datasetService = datasetService; this.nodeService = nodeService; this.organizationService = organizationService; this.installationService = installationService; + this.contactService = contactService; + this.occurrenceMappingService = occurrenceMappingService; + this.duplicatesService = duplicatesService; } public static class MaterializedViewInitializer implements BeforeAllCallback { @Override public void beforeAll(ExtensionContext extensionContext) throws Exception { - Connection connection = SpringExtension.getApplicationContext(extensionContext).getBean(DataSource.class).getConnection(); + Connection connection = + SpringExtension.getApplicationContext(extensionContext) + .getBean(DataSource.class) + .getConnection(); // create materialized view for testing ScriptUtils.executeSqlScript( - connection, new ClassPathResource("/scripts/create_duplicates_views.sql")); + connection, new ClassPathResource("/scripts/create_duplicates_views.sql")); connection.close(); } } - @RegisterExtension static MaterializedViewInitializer materializedViewInitializer = new MaterializedViewInitializer(); - - @ParameterizedTest - @EnumSource(ServiceType.class) - public void contactsTest(ServiceType serviceType) { - CrudService service = getService(serviceType); - ContactService contactService = (ContactService) service; - PersonService personService = getService(serviceType, personResource, personClient); + @RegisterExtension + static MaterializedViewInitializer materializedViewInitializer = + new MaterializedViewInitializer(); + @Test + public void contactsTest() { // entities - UUID entityKey1 = service.create(newEntity()); - UUID entityKey2 = service.create(newEntity()); - UUID entityKey3 = service.create(newEntity()); + UUID entityKey1 = crudService.create(newEntity()); + UUID entityKey2 = crudService.create(newEntity()); + UUID entityKey3 = crudService.create(newEntity()); // contacts Person person1 = new Person(); @@ -174,15 +175,10 @@ public void contactsTest(ServiceType serviceType) { assertEquals(0, contactService.listContacts(entityKey2).size()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void duplicateContactTest(ServiceType serviceType) { - CrudService service = getService(serviceType); - ContactService contactService = (ContactService) service; - PersonService personService = getService(serviceType, personResource, personClient); - + @Test + public void duplicateContactTest() { // entities - UUID entityKey1 = service.create(newEntity()); + UUID entityKey1 = crudService.create(newEntity()); // contacts Person person1 = new Person(); @@ -194,16 +190,13 @@ public void duplicateContactTest(ServiceType serviceType) { assertThrows(RuntimeException.class, () -> contactService.addContact(entityKey1, personKey1)); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void updateAddressesTest(ServiceType serviceType) { - CrudService service = getService(serviceType); - + @Test + public void updateAddressesTest() { // entities T entity = newEntity(); - UUID entityKey = service.create(entity); + UUID entityKey = crudService.create(entity); assertNewEntity(entity); - entity = service.get(entityKey); + entity = crudService.get(entityKey); // update adding address Address address = new Address(); @@ -218,8 +211,8 @@ public void updateAddressesTest(ServiceType serviceType) { mailingAddress.setCity("city mailing"); entity.setMailingAddress(mailingAddress); - service.update(entity); - entity = service.get(entityKey); + crudService.update(entity); + entity = crudService.get(entityKey); address = entity.getAddress(); mailingAddress = entity.getMailingAddress(); @@ -240,8 +233,8 @@ public void updateAddressesTest(ServiceType serviceType) { address.setAddress("address2"); mailingAddress.setAddress("mailing address2"); - service.update(entity); - entity = service.get(entityKey); + crudService.update(entity); + entity = crudService.get(entityKey); assertNotNull(entity.getAddress()); assertEquals("address2", entity.getAddress().getAddress()); assertNotNull(entity.getMailingAddress()); @@ -250,20 +243,16 @@ public void updateAddressesTest(ServiceType serviceType) { // delete address entity.setAddress(null); entity.setMailingAddress(null); - service.update(entity); - entity = service.get(entityKey); + crudService.update(entity); + entity = crudService.get(entityKey); assertNull(entity.getAddress()); assertNull(entity.getMailingAddress()); } - @ParameterizedTest - @EnumSource(ServiceType.class) - public void occurrenceMappingsTest(ServiceType serviceType) { - CrudService service = getService(serviceType); - OccurrenceMappingService occurrenceMappingService = (OccurrenceMappingService) service; - + @Test + public void occurrenceMappingsTest() { T entity = newEntity(); - UUID entityKey = service.create(entity); + UUID entityKey = crudService.create(entity); Dataset dataset = createDataset(); OccurrenceMapping occurrenceMapping = new OccurrenceMapping(); @@ -313,31 +302,29 @@ private Dataset createDataset() { } protected void testDuplicatesCommonCases() { - ExtendedBaseCollectionEntityClient wsClient = (ExtendedBaseCollectionEntityClient) client; - // same code - DuplicatesRequest request = new DuplicatesRequest(); - request.setSameCode(true); + DuplicatesSearchParams params = new DuplicatesSearchParams(); + params.setSameCode(true); - DuplicatesResult result = wsClient.findPossibleDuplicates(request); + DuplicatesResult result = duplicatesService.findPossibleDuplicates(params); assertEquals(1, result.getDuplicates().size()); assertEquals(4, result.getDuplicates().get(0).size()); // same fuzzy name - request = new DuplicatesRequest(); - request.setSameFuzzyName(true); + params = new DuplicatesSearchParams(); + params.setSameFuzzyName(true); - result = wsClient.findPossibleDuplicates(request); + result = duplicatesService.findPossibleDuplicates(params); assertEquals(2, result.getDuplicates().size()); assertEquals(3, result.getDuplicates().get(0).size()); assertEquals(2, result.getDuplicates().get(1).size()); // same fuzzy name and city - request = new DuplicatesRequest(); - request.setSameFuzzyName(true); - request.setSameCity(true); + params = new DuplicatesSearchParams(); + params.setSameFuzzyName(true); + params.setSameCity(true); - result = wsClient.findPossibleDuplicates(request); + result = duplicatesService.findPossibleDuplicates(params); assertEquals(1, result.getDuplicates().size()); assertEquals(2, result.getDuplicates().get(0).size()); Set keysFound = @@ -345,45 +332,45 @@ protected void testDuplicatesCommonCases() { assertEquals(2, keysFound.size()); // exclude keys - request.setExcludeKeys(new ArrayList<>(keysFound)); - result = wsClient.findPossibleDuplicates(request); + params.setExcludeKeys(new ArrayList<>(keysFound)); + result = duplicatesService.findPossibleDuplicates(params); assertTrue(result.getDuplicates().isEmpty()); // same name and city - request = new DuplicatesRequest(); - request.setSameName(true); - request.setSameCity(true); - result = wsClient.findPossibleDuplicates(request); + params = new DuplicatesSearchParams(); + params.setSameName(true); + params.setSameCity(true); + result = duplicatesService.findPossibleDuplicates(params); assertTrue(result.getDuplicates().isEmpty()); // same name and not same city - request.setSameCity(false); - result = wsClient.findPossibleDuplicates(request); + params.setSameCity(false); + result = duplicatesService.findPossibleDuplicates(params); assertEquals(1, result.getDuplicates().size()); assertEquals(2, result.getDuplicates().get(0).size()); assertEquals( 2, result.getDuplicates().get(0).stream().map(Duplicate::getKey).distinct().count()); // filtering by country - request.setInCountries(Collections.singletonList(Country.DENMARK.getIso2LetterCode())); - result = wsClient.findPossibleDuplicates(request); + params.setInCountries(Collections.singletonList(Country.DENMARK)); + result = duplicatesService.findPossibleDuplicates(params); assertEquals(1, result.getDuplicates().size()); assertEquals(2, result.getDuplicates().get(0).size()); assertEquals( 2, result.getDuplicates().get(0).stream().map(Duplicate::getKey).distinct().count()); - request.setInCountries(Collections.singletonList(Country.SPAIN.getIso2LetterCode())); - result = wsClient.findPossibleDuplicates(request); + params.setInCountries(Collections.singletonList(Country.SPAIN)); + result = duplicatesService.findPossibleDuplicates(params); assertTrue(result.getDuplicates().isEmpty()); // excluding country - request.setInCountries(null); - request.setNotInCountries(Collections.singletonList(Country.DENMARK.getIso2LetterCode())); - result = wsClient.findPossibleDuplicates(request); + params.setInCountries(null); + params.setNotInCountries(Collections.singletonList(Country.DENMARK)); + result = duplicatesService.findPossibleDuplicates(params); assertTrue(result.getDuplicates().isEmpty()); - request.setNotInCountries(Collections.singletonList(Country.SPAIN.getIso2LetterCode())); - result = wsClient.findPossibleDuplicates(request); + params.setNotInCountries(Collections.singletonList(Country.SPAIN)); + result = duplicatesService.findPossibleDuplicates(params); assertEquals(1, result.getDuplicates().size()); assertEquals(2, result.getDuplicates().get(0).size()); } diff --git a/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/resource/BaseResourceTest.java b/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/resource/BaseResourceTest.java new file mode 100644 index 0000000000..9702253125 --- /dev/null +++ b/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/resource/BaseResourceTest.java @@ -0,0 +1,143 @@ +/* + * Copyright 2020 Global Biodiversity Information Facility (GBIF) + * + * 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.gbif.registry.ws.it.collections.resource; + +import org.gbif.api.vocabulary.UserRole; +import org.gbif.registry.search.test.EsManageServer; +import org.gbif.registry.ws.it.RegistryIntegrationTestsConfiguration; +import org.gbif.registry.ws.it.fixtures.TestConstants; +import org.gbif.ws.client.ClientBuilder; +import org.gbif.ws.client.filter.SimplePrincipalProvider; +import org.gbif.ws.security.KeyStore; + +import java.util.Arrays; +import java.util.Collections; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.util.TestPropertyValues; +import org.springframework.context.ApplicationContextInitializer; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import liquibase.pro.packaged.T; + +import static org.gbif.registry.ws.it.fixtures.TestConstants.IT_APP_KEY2; +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** Base class for IT tests that initializes data sources and basic security settings. */ +@ExtendWith(SpringExtension.class) +@SpringBootTest( + classes = RegistryIntegrationTestsConfiguration.class, + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@ContextConfiguration(initializers = {BaseResourceTest.EsContainerContextInitializer.class}) +@ActiveProfiles("test") +@AutoConfigureMockMvc +@DirtiesContext +public class BaseResourceTest { + + public static class EsContainerContextInitializer + implements ApplicationContextInitializer { + + @Override + public void initialize(ConfigurableApplicationContext configurableApplicationContext) { + TestPropertyValues.of("elasticsearch.mock=true") + .applyTo(configurableApplicationContext.getEnvironment()); + } + } + + private final SimplePrincipalProvider simplePrincipalProvider; + protected static EsManageServer esServer; + + public BaseResourceTest(SimplePrincipalProvider simplePrincipalProvider, EsManageServer esServer) { + this.simplePrincipalProvider = simplePrincipalProvider; + BaseResourceTest.esServer = esServer; + } + + // TODO +// @Test +// public void updateEntityKeyMismatchTest() { +// CrudClient crudClient = (CrudClient) client; +// +// T entity = newEntity(); +// UUID key = crudClient.create(entity); +// T entityCreated = crudClient.get(key); +// +// assertThrows( +// IllegalArgumentException.class, +// () -> crudClient.updateResource(UUID.randomUUID(), entityCreated)); +// } + + @BeforeEach + public void setup() { + // reset SimplePrincipleProvider, configured for web resources tests only + if (simplePrincipalProvider != null) { + simplePrincipalProvider.setPrincipal(TestConstants.TEST_ADMIN); + SecurityContext ctx = SecurityContextHolder.createEmptyContext(); + SecurityContextHolder.setContext(ctx); + ctx.setAuthentication( + new UsernamePasswordAuthenticationToken( + simplePrincipalProvider.get().getName(), + "", + Arrays.asList( + new SimpleGrantedAuthority(UserRole.REGISTRY_ADMIN.name()), + new SimpleGrantedAuthority(UserRole.GRSCICOLL_ADMIN.name())))); + } + } + + protected void resetSecurityContext(String principal, UserRole role) { + simplePrincipalProvider.setPrincipal(principal); + SecurityContext ctx = SecurityContextHolder.createEmptyContext(); + SecurityContextHolder.setContext(ctx); + ctx.setAuthentication( + new UsernamePasswordAuthenticationToken( + simplePrincipalProvider.get().getName(), + "", + Collections.singleton(new SimpleGrantedAuthority(role.name())))); + } + + public SimplePrincipalProvider getSimplePrincipalProvider() { + return simplePrincipalProvider; + } + + protected T prepareClient(int localServerPort, KeyStore keyStore, Class cls) { + return prepareClient(IT_APP_KEY2, IT_APP_KEY2, localServerPort, keyStore, cls); + } + + protected T prepareClient( + String username, int localServerPort, KeyStore keyStore, Class cls) { + return prepareClient(username, IT_APP_KEY2, localServerPort, keyStore, cls); + } + + protected T prepareClient( + String username, String appKey, int localServerPort, KeyStore keyStore, Class cls) { + ClientBuilder clientBuilder = new ClientBuilder(); + return clientBuilder + .withUrl("http://localhost:" + localServerPort) + .withAppKeyCredentials(username, appKey, keyStore.getPrivateKey(appKey)) + .build(cls); + } +} diff --git a/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/resource/CollectionResourceIT.java b/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/resource/CollectionResourceIT.java new file mode 100644 index 0000000000..03db55e18a --- /dev/null +++ b/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/collections/resource/CollectionResourceIT.java @@ -0,0 +1,47 @@ +package org.gbif.registry.ws.it.collections.resource; + +import org.gbif.api.model.collections.Collection; +import org.gbif.api.model.collections.view.CollectionView; +import org.gbif.api.service.collections.CollectionService; +import org.gbif.registry.search.test.EsManageServer; +import org.gbif.registry.ws.client.collections.CollectionClient; +import org.gbif.ws.client.filter.SimplePrincipalProvider; +import org.gbif.ws.security.KeyStore; + +import java.util.UUID; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.web.server.LocalServerPort; + +public class CollectionResourceIT extends BaseResourceTest { + + private final CollectionClient collectionClient; + @MockBean private CollectionService collectionService; + + @Autowired + public CollectionResourceIT( + SimplePrincipalProvider simplePrincipalProvider, + EsManageServer esServer, + @LocalServerPort int localServerPort, + KeyStore keyStore) { + super(simplePrincipalProvider, esServer); + this.collectionClient = prepareClient(localServerPort, keyStore, CollectionClient.class); + } + + @Test + public void getTest() { + Collection c1 = new Collection(); + c1.setKey(UUID.randomUUID()); + c1.setCode("c1"); + c1.setName("n1"); + Mockito.when(collectionService.getCollectionView(c1.getKey())) + .thenReturn(new CollectionView(c1)); + + Collection fetched = collectionClient.get(c1.getKey()); + Assertions.assertEquals(c1.getCode(), fetched.getCode()); + } +} diff --git a/registry-service/src/main/java/org/gbif/registry/service/collections/duplicates/BaseDuplicatesService.java b/registry-service/src/main/java/org/gbif/registry/service/collections/duplicates/BaseDuplicatesService.java new file mode 100644 index 0000000000..928c267147 --- /dev/null +++ b/registry-service/src/main/java/org/gbif/registry/service/collections/duplicates/BaseDuplicatesService.java @@ -0,0 +1,180 @@ +/* + * Copyright 2020 Global Biodiversity Information Facility (GBIF) + * + * 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.gbif.registry.service.collections.duplicates; + +import org.gbif.api.model.collections.duplicates.Duplicate; +import org.gbif.api.model.collections.duplicates.DuplicatesResult; +import org.gbif.registry.persistence.mapper.collections.dto.DuplicateDto; +import org.gbif.registry.persistence.mapper.collections.dto.DuplicateMetadataDto; +import org.gbif.registry.persistence.mapper.collections.params.DuplicatesSearchParams; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +@Service +abstract class BaseDuplicatesService implements DuplicatesService { + + private static final Logger LOG = LoggerFactory.getLogger(BaseDuplicatesService.class); + + protected DuplicatesResult processDBResults( + Function> dtosFn, + Function, List> metadataFn, + DuplicatesSearchParams params) { + List dtos = dtosFn.apply(params); + + if (dtos.isEmpty()) { + return new DuplicatesResult(); + } + + boolean transitive = assumeTransitiveClusters(params); + + // group by key1 + Map> duplicatesMap = + dtos.stream().collect(Collectors.groupingBy(DuplicateDto::getKey1)); + + // list to store the groups of duplicates + Map, Set> duplicates = new HashMap<>(); + + // we sort them so the bigger groups are created first and it's easier to find subsets of these + // groups that should be discarded + duplicatesMap.values().stream() + // we sort them so the bigger groups are created first and it's easier to find subsets of + // these groups that should be discarded. Specially useful for non-transitive clusters + .sorted(Comparator.comparing(List::size, Comparator.reverseOrder())) + .forEach( + groupValues -> { + // create a new group of duplicates + Set duplicatesGroup = new HashSet<>(); + // store the keys of the group + Set groupKeys = new HashSet<>(); + + // iterate over the dtos. Each dto will result in 2 duplicates + groupValues.forEach( + v -> { + Duplicate duplicate1 = new Duplicate(); + duplicate1.setKey(v.getKey1()); + duplicate1.setCode(v.getCode1()); + duplicate1.setName(v.getName1()); + duplicate1.setPhysicalCity(v.getPhysicalCity1()); + duplicate1.setPhysicalCountry(v.getPhysicalCountry1()); + duplicate1.setMailingCity(v.getMailingCity1()); + duplicate1.setMailingCountry(v.getMailingCountry1()); + duplicate1.setInstitutionKey(v.getInstitutionKey1()); + duplicatesGroup.add(duplicate1); + groupKeys.add(v.getKey1()); + + Duplicate duplicate2 = new Duplicate(); + duplicate2.setKey(v.getKey2()); + duplicate2.setCode(v.getCode2()); + duplicate2.setName(v.getName2()); + duplicate2.setPhysicalCity(v.getPhysicalCity2()); + duplicate2.setPhysicalCountry(v.getPhysicalCountry2()); + duplicate2.setMailingCity(v.getMailingCity2()); + duplicate2.setMailingCountry(v.getMailingCountry2()); + duplicate2.setInstitutionKey(v.getInstitutionKey2()); + duplicatesGroup.add(duplicate2); + groupKeys.add(v.getKey2()); + }); + + List> groupsFound; + if (transitive) { + // for transitive clusters we check if there is a group that contains at least 1 of + // the keys of this new group + groupsFound = + duplicates.keySet().stream() + .filter(g -> !Collections.disjoint(g, groupKeys)) + .collect(Collectors.toList()); + } else { + // for non-transitive clusters we check if there is a group that already contains + // all the keys of this new group so we merge groups + groupsFound = + duplicates.keySet().stream() + .filter(g -> g.containsAll(groupKeys)) + .collect(Collectors.toList()); + } + + if (groupsFound.isEmpty()) { + // the group doesn't exist so we add it + duplicates.put(groupKeys, duplicatesGroup); + } else { + // the group exists so we only add the missing duplicates + if (groupsFound.size() > 1) { + // this should never happen + LOG.warn("More than 1 duplicates found for dtos with params: {}", params); + } + duplicates.get(groupsFound.get(0)).addAll(duplicatesGroup); + } + }); + + DuplicatesResult result = new DuplicatesResult(); + result.setDuplicates(new ArrayList<>(duplicates.values())); + // all the dtos are supposed to have the same generated date + result.setGenerationDate(dtos.get(0).getGeneratedDate()); + + // decorate the result + Set allKeys = + duplicates.keySet().stream().flatMap(Collection::stream).collect(Collectors.toSet()); + decorateResult(allKeys, result, metadataFn); + + return result; + } + + private void decorateResult( + Set keys, + DuplicatesResult result, + Function, List> metadataFn) { + Map metadataDtos = + metadataFn.apply(keys).stream() + .collect(Collectors.toMap(DuplicateMetadataDto::getKey, v -> v)); + + result + .getDuplicates() + .forEach( + group -> + group.forEach( + duplicate -> { + DuplicateMetadataDto metadata = metadataDtos.get(duplicate.getKey()); + if (metadata != null) { + duplicate.setActive(metadata.isActive()); + duplicate.setIh(metadata.isIh()); + duplicate.setIdigbio(metadata.isIdigbio()); + } + })); + } + + private boolean assumeTransitiveClusters(DuplicatesSearchParams params) { + if (Boolean.TRUE.equals(params.getSameCode()) || Boolean.TRUE.equals(params.getSameName())) { + return true; + } else { + // if uses the fuzzy name it's not transitive + return !Boolean.TRUE.equals(params.getSameFuzzyName()); + } + } +} diff --git a/registry-service/src/main/java/org/gbif/registry/service/collections/duplicates/CollectionDuplicatesService.java b/registry-service/src/main/java/org/gbif/registry/service/collections/duplicates/CollectionDuplicatesService.java new file mode 100644 index 0000000000..d4f94d21e4 --- /dev/null +++ b/registry-service/src/main/java/org/gbif/registry/service/collections/duplicates/CollectionDuplicatesService.java @@ -0,0 +1,27 @@ +package org.gbif.registry.service.collections.duplicates; + +import org.gbif.api.model.collections.duplicates.DuplicatesResult; +import org.gbif.registry.persistence.mapper.collections.DuplicatesMapper; +import org.gbif.registry.persistence.mapper.collections.params.DuplicatesSearchParams; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class CollectionDuplicatesService extends BaseDuplicatesService { + + private final DuplicatesMapper duplicatesMapper; + + @Autowired + public CollectionDuplicatesService(DuplicatesMapper duplicatesMapper) { + this.duplicatesMapper = duplicatesMapper; + } + + @Override + public DuplicatesResult findPossibleDuplicates(DuplicatesSearchParams params) { + return processDBResults( + duplicatesMapper::getCollectionDuplicates, + duplicatesMapper::getCollectionsMetadata, + params); + } +} diff --git a/registry-service/src/main/java/org/gbif/registry/service/collections/duplicates/DuplicatesService.java b/registry-service/src/main/java/org/gbif/registry/service/collections/duplicates/DuplicatesService.java index d829e28f82..642b6f4528 100644 --- a/registry-service/src/main/java/org/gbif/registry/service/collections/duplicates/DuplicatesService.java +++ b/registry-service/src/main/java/org/gbif/registry/service/collections/duplicates/DuplicatesService.java @@ -1,194 +1,9 @@ -/* - * Copyright 2020 Global Biodiversity Information Facility (GBIF) - * - * 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.gbif.registry.service.collections.duplicates; -import org.gbif.api.model.collections.duplicates.Duplicate; import org.gbif.api.model.collections.duplicates.DuplicatesResult; -import org.gbif.registry.persistence.mapper.collections.DuplicatesMapper; -import org.gbif.registry.persistence.mapper.collections.dto.DuplicateDto; -import org.gbif.registry.persistence.mapper.collections.dto.DuplicateMetadataDto; import org.gbif.registry.persistence.mapper.collections.params.DuplicatesSearchParams; -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; +public interface DuplicatesService { -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -public class DuplicatesService { - - private static final Logger LOG = LoggerFactory.getLogger(DuplicatesService.class); - - private final DuplicatesMapper duplicatesMapper; - - @Autowired - public DuplicatesService(DuplicatesMapper duplicatesMapper) { - this.duplicatesMapper = duplicatesMapper; - } - - public DuplicatesResult findPossibleDuplicateInstitutions(DuplicatesSearchParams params) { - return processDBResults( - duplicatesMapper::getInstitutionDuplicates, - duplicatesMapper::getInstitutionsMetadata, - params); - } - - public DuplicatesResult findPossibleDuplicateCollections(DuplicatesSearchParams params) { - return processDBResults( - duplicatesMapper::getCollectionDuplicates, - duplicatesMapper::getCollectionsMetadata, - params); - } - - private DuplicatesResult processDBResults( - Function> dtosFn, - Function, List> metadataFn, - DuplicatesSearchParams params) { - List dtos = dtosFn.apply(params); - - if (dtos.isEmpty()) { - return new DuplicatesResult(); - } - - boolean transitive = assumeTransitiveClusters(params); - - // group by key1 - Map> duplicatesMap = - dtos.stream().collect(Collectors.groupingBy(DuplicateDto::getKey1)); - - // list to store the groups of duplicates - Map, Set> duplicates = new HashMap<>(); - - // we sort them so the bigger groups are created first and it's easier to find subsets of these - // groups that should be discarded - duplicatesMap.values().stream() - // we sort them so the bigger groups are created first and it's easier to find subsets of - // these groups that should be discarded. Specially useful for non-transitive clusters - .sorted(Comparator.comparing(List::size, Comparator.reverseOrder())) - .forEach( - groupValues -> { - // create a new group of duplicates - Set duplicatesGroup = new HashSet<>(); - // store the keys of the group - Set groupKeys = new HashSet<>(); - - // iterate over the dtos. Each dto will result in 2 duplicates - groupValues.forEach( - v -> { - Duplicate duplicate1 = new Duplicate(); - duplicate1.setKey(v.getKey1()); - duplicate1.setCode(v.getCode1()); - duplicate1.setName(v.getName1()); - duplicate1.setPhysicalCity(v.getPhysicalCity1()); - duplicate1.setPhysicalCountry(v.getPhysicalCountry1()); - duplicate1.setMailingCity(v.getMailingCity1()); - duplicate1.setMailingCountry(v.getMailingCountry1()); - duplicate1.setInstitutionKey(v.getInstitutionKey1()); - duplicatesGroup.add(duplicate1); - groupKeys.add(v.getKey1()); - - Duplicate duplicate2 = new Duplicate(); - duplicate2.setKey(v.getKey2()); - duplicate2.setCode(v.getCode2()); - duplicate2.setName(v.getName2()); - duplicate2.setPhysicalCity(v.getPhysicalCity2()); - duplicate2.setPhysicalCountry(v.getPhysicalCountry2()); - duplicate2.setMailingCity(v.getMailingCity2()); - duplicate2.setMailingCountry(v.getMailingCountry2()); - duplicate2.setInstitutionKey(v.getInstitutionKey2()); - duplicatesGroup.add(duplicate2); - groupKeys.add(v.getKey2()); - }); - - List> groupsFound; - if (transitive) { - // for transitive clusters we check if there is a group that contains at least 1 of - // the keys of this new group - groupsFound = - duplicates.keySet().stream() - .filter(g -> !Collections.disjoint(g, groupKeys)) - .collect(Collectors.toList()); - } else { - // for non-transitive clusters we check if there is a group that already contains - // all the keys of this new group so we merge groups - groupsFound = - duplicates.keySet().stream() - .filter(g -> g.containsAll(groupKeys)) - .collect(Collectors.toList()); - } - - if (groupsFound.isEmpty()) { - // the group doesn't exist so we add it - duplicates.put(groupKeys, duplicatesGroup); - } else { - // the group exists so we only add the missing duplicates - if (groupsFound.size() > 1) { - // this should never happen - LOG.warn("More than 1 duplicates found for dtos with params: {}", params); - } - duplicates.get(groupsFound.get(0)).addAll(duplicatesGroup); - } - }); - - DuplicatesResult result = new DuplicatesResult(); - result.setDuplicates(new ArrayList<>(duplicates.values())); - // all the dtos are supposed to have the same generated date - result.setGenerationDate(dtos.get(0).getGeneratedDate()); - - // decorate the result - Set allKeys = - duplicates.keySet().stream().flatMap(Collection::stream).collect(Collectors.toSet()); - decorateResult(allKeys, result, metadataFn); - - return result; - } - - private void decorateResult( - Set keys, - DuplicatesResult result, - Function, List> metadataFn) { - Map metadataDtos = - metadataFn.apply(keys).stream() - .collect(Collectors.toMap(DuplicateMetadataDto::getKey, v -> v)); - - result - .getDuplicates() - .forEach( - group -> - group.forEach( - duplicate -> { - DuplicateMetadataDto metadata = metadataDtos.get(duplicate.getKey()); - if (metadata != null) { - duplicate.setActive(metadata.isActive()); - duplicate.setIh(metadata.isIh()); - duplicate.setIdigbio(metadata.isIdigbio()); - } - })); - } - - private boolean assumeTransitiveClusters(DuplicatesSearchParams params) { - if (Boolean.TRUE.equals(params.getSameCode()) || Boolean.TRUE.equals(params.getSameName())) { - return true; - } else { - // if uses the fuzzy name it's not transitive - return !Boolean.TRUE.equals(params.getSameFuzzyName()); - } - } + DuplicatesResult findPossibleDuplicates(DuplicatesSearchParams params); } diff --git a/registry-service/src/main/java/org/gbif/registry/service/collections/duplicates/InstitutionDuplicatesService.java b/registry-service/src/main/java/org/gbif/registry/service/collections/duplicates/InstitutionDuplicatesService.java new file mode 100644 index 0000000000..b9f3e11c26 --- /dev/null +++ b/registry-service/src/main/java/org/gbif/registry/service/collections/duplicates/InstitutionDuplicatesService.java @@ -0,0 +1,27 @@ +package org.gbif.registry.service.collections.duplicates; + +import org.gbif.api.model.collections.duplicates.DuplicatesResult; +import org.gbif.registry.persistence.mapper.collections.DuplicatesMapper; +import org.gbif.registry.persistence.mapper.collections.params.DuplicatesSearchParams; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class InstitutionDuplicatesService extends BaseDuplicatesService { + + private final DuplicatesMapper duplicatesMapper; + + @Autowired + public InstitutionDuplicatesService(DuplicatesMapper duplicatesMapper) { + this.duplicatesMapper = duplicatesMapper; + } + + @Override + public DuplicatesResult findPossibleDuplicates(DuplicatesSearchParams params) { + return processDBResults( + duplicatesMapper::getInstitutionDuplicates, + duplicatesMapper::getInstitutionsMetadata, + params); + } +} diff --git a/registry-service/src/main/java/org/gbif/registry/service/collections/suggestions/BaseChangeSuggestionService.java b/registry-service/src/main/java/org/gbif/registry/service/collections/suggestions/BaseChangeSuggestionService.java index 6580327ba8..836b0c5a36 100644 --- a/registry-service/src/main/java/org/gbif/registry/service/collections/suggestions/BaseChangeSuggestionService.java +++ b/registry-service/src/main/java/org/gbif/registry/service/collections/suggestions/BaseChangeSuggestionService.java @@ -19,12 +19,12 @@ import org.gbif.api.model.registry.Identifiable; import org.gbif.api.model.registry.MachineTaggable; import org.gbif.api.model.registry.Taggable; +import org.gbif.api.service.collections.CrudService; import org.gbif.api.vocabulary.Country; import org.gbif.registry.persistence.mapper.collections.BaseMapper; import org.gbif.registry.persistence.mapper.collections.ChangeSuggestionMapper; import org.gbif.registry.persistence.mapper.collections.dto.ChangeDto; import org.gbif.registry.persistence.mapper.collections.dto.ChangeSuggestionDto; -import org.gbif.registry.service.collections.PrimaryCollectionEntityService; import org.gbif.registry.service.collections.merge.MergeService; import java.lang.reflect.Field; @@ -81,7 +81,7 @@ public abstract class BaseChangeSuggestionService< private final ChangeSuggestionMapper changeSuggestionMapper; private final BaseMapper baseMapper; private final MergeService mergeService; - private final PrimaryCollectionEntityService primaryCollectionEntityService; + private final CrudService crudService; private final Class clazz; private final ObjectMapper objectMapper; private EntityType entityType; @@ -90,13 +90,13 @@ protected BaseChangeSuggestionService( ChangeSuggestionMapper changeSuggestionMapper, BaseMapper baseMapper, MergeService mergeService, - PrimaryCollectionEntityService primaryCollectionEntityService, + CrudService crudService, Class clazz, ObjectMapper objectMapper) { this.changeSuggestionMapper = changeSuggestionMapper; this.baseMapper = baseMapper; this.mergeService = mergeService; - this.primaryCollectionEntityService = primaryCollectionEntityService; + this.crudService = crudService; this.clazz = clazz; this.objectMapper = objectMapper; @@ -230,12 +230,12 @@ public UUID applyChangeSuggestion(int suggestionKey) { R changeSuggestion = dtoToChangeSuggestion(dto); UUID createdEntity = null; if (dto.getType() == Type.CREATE) { - createdEntity = primaryCollectionEntityService.create(changeSuggestion.getSuggestedEntity()); + createdEntity = crudService.create(changeSuggestion.getSuggestedEntity()); dto.setEntityKey(createdEntity); } else if (dto.getType() == Type.UPDATE) { - primaryCollectionEntityService.update(changeSuggestion.getSuggestedEntity()); + crudService.update(changeSuggestion.getSuggestedEntity()); } else if (dto.getType() == Type.DELETE) { - primaryCollectionEntityService.delete(changeSuggestion.getEntityKey()); + crudService.delete(changeSuggestion.getEntityKey()); } else if (dto.getType() == Type.MERGE) { mergeService.merge(changeSuggestion.getEntityKey(), changeSuggestion.getMergeTargetKey()); } else if (dto.getType() == Type.CONVERSION_TO_COLLECTION) { diff --git a/registry-service/src/main/java/org/gbif/registry/service/collections/suggestions/CollectionChangeSuggestionService.java b/registry-service/src/main/java/org/gbif/registry/service/collections/suggestions/CollectionChangeSuggestionService.java index 3208b08ac5..08e4553cb2 100644 --- a/registry-service/src/main/java/org/gbif/registry/service/collections/suggestions/CollectionChangeSuggestionService.java +++ b/registry-service/src/main/java/org/gbif/registry/service/collections/suggestions/CollectionChangeSuggestionService.java @@ -2,10 +2,10 @@ import org.gbif.api.model.collections.Collection; import org.gbif.api.model.collections.suggestions.CollectionChangeSuggestion; +import org.gbif.api.service.collections.CollectionService; import org.gbif.registry.persistence.mapper.collections.ChangeSuggestionMapper; import org.gbif.registry.persistence.mapper.collections.CollectionMapper; import org.gbif.registry.persistence.mapper.collections.dto.ChangeSuggestionDto; -import org.gbif.registry.service.collections.DefaultCollectionService; import org.gbif.registry.service.collections.merge.CollectionMergeService; import java.util.UUID; @@ -25,7 +25,7 @@ public class CollectionChangeSuggestionService public CollectionChangeSuggestionService( ChangeSuggestionMapper changeSuggestionMapper, CollectionMapper collectionMapper, - DefaultCollectionService collectionService, // TODO: interfaces + CollectionService collectionService, CollectionMergeService collectionMergeService, ObjectMapper objectMapper) { super( diff --git a/registry-service/src/main/java/org/gbif/registry/service/collections/suggestions/InstitutionChangeSuggestionService.java b/registry-service/src/main/java/org/gbif/registry/service/collections/suggestions/InstitutionChangeSuggestionService.java index 8cf182f55b..082928ea69 100644 --- a/registry-service/src/main/java/org/gbif/registry/service/collections/suggestions/InstitutionChangeSuggestionService.java +++ b/registry-service/src/main/java/org/gbif/registry/service/collections/suggestions/InstitutionChangeSuggestionService.java @@ -3,10 +3,10 @@ import org.gbif.api.model.collections.Institution; import org.gbif.api.model.collections.suggestions.InstitutionChangeSuggestion; import org.gbif.api.model.collections.suggestions.Type; +import org.gbif.api.service.collections.InstitutionService; import org.gbif.registry.persistence.mapper.collections.ChangeSuggestionMapper; import org.gbif.registry.persistence.mapper.collections.InstitutionMapper; import org.gbif.registry.persistence.mapper.collections.dto.ChangeSuggestionDto; -import org.gbif.registry.service.collections.DefaultInstitutionService; import org.gbif.registry.service.collections.merge.InstitutionMergeService; import java.util.UUID; @@ -18,8 +18,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; -import org.springframework.transaction.event.TransactionalEventListener; - import static com.google.common.base.Preconditions.checkArgument; @Service @@ -37,7 +35,7 @@ public class InstitutionChangeSuggestionService public InstitutionChangeSuggestionService( ChangeSuggestionMapper changeSuggestionMapper, InstitutionMapper institutionMapper, - DefaultInstitutionService institutionService, // TODO: interfaces + InstitutionService institutionService, InstitutionMergeService institutionMergeService, ObjectMapper objectMapper) { super( @@ -95,5 +93,4 @@ protected UUID applyConversionToCollection(ChangeSuggestionDto dto) { protected InstitutionChangeSuggestion newEmptyChangeSuggestion() { return new InstitutionChangeSuggestion(); } - } diff --git a/registry-ws-client/src/main/java/org/gbif/registry/ws/client/collections/CollectionClient.java b/registry-ws-client/src/main/java/org/gbif/registry/ws/client/collections/CollectionClient.java index 06a9f9bba8..84640256b3 100644 --- a/registry-ws-client/src/main/java/org/gbif/registry/ws/client/collections/CollectionClient.java +++ b/registry-ws-client/src/main/java/org/gbif/registry/ws/client/collections/CollectionClient.java @@ -36,7 +36,7 @@ @RequestMapping("grscicoll/collection") public interface CollectionClient - extends ExtendedBaseCollectionEntityClient, CollectionService { + extends PrimaryCollectionEntityClient, CollectionService { @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody diff --git a/registry-ws-client/src/main/java/org/gbif/registry/ws/client/collections/InstitutionClient.java b/registry-ws-client/src/main/java/org/gbif/registry/ws/client/collections/InstitutionClient.java index ceb790cf01..149bc46f89 100644 --- a/registry-ws-client/src/main/java/org/gbif/registry/ws/client/collections/InstitutionClient.java +++ b/registry-ws-client/src/main/java/org/gbif/registry/ws/client/collections/InstitutionClient.java @@ -33,7 +33,7 @@ @RequestMapping("grscicoll/institution") public interface InstitutionClient - extends ExtendedBaseCollectionEntityClient, InstitutionService { + extends PrimaryCollectionEntityClient, InstitutionService { @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody diff --git a/registry-ws-client/src/main/java/org/gbif/registry/ws/client/collections/ExtendedBaseCollectionEntityClient.java b/registry-ws-client/src/main/java/org/gbif/registry/ws/client/collections/PrimaryCollectionEntityClient.java similarity index 98% rename from registry-ws-client/src/main/java/org/gbif/registry/ws/client/collections/ExtendedBaseCollectionEntityClient.java rename to registry-ws-client/src/main/java/org/gbif/registry/ws/client/collections/PrimaryCollectionEntityClient.java index aa612a2471..1c368802fd 100644 --- a/registry-ws-client/src/main/java/org/gbif/registry/ws/client/collections/ExtendedBaseCollectionEntityClient.java +++ b/registry-ws-client/src/main/java/org/gbif/registry/ws/client/collections/PrimaryCollectionEntityClient.java @@ -38,7 +38,7 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; -public interface ExtendedBaseCollectionEntityClient< +public interface PrimaryCollectionEntityClient< T extends CollectionEntity & Taggable & Identifiable & MachineTaggable & Contactable> extends BaseCollectionEntityClient, ContactService, OccurrenceMappingService { diff --git a/registry-ws/src/main/java/org/gbif/registry/ws/RegistryWsApplication.java b/registry-ws/src/main/java/org/gbif/registry/ws/RegistryWsApplication.java index 1f4ff676c4..26c73ef7e6 100644 --- a/registry-ws/src/main/java/org/gbif/registry/ws/RegistryWsApplication.java +++ b/registry-ws/src/main/java/org/gbif/registry/ws/RegistryWsApplication.java @@ -25,6 +25,8 @@ import org.springframework.context.annotation.FilterType; import org.springframework.scheduling.annotation.EnableScheduling; +// TODO: remove zipkin auto config + @SpringBootApplication(exclude = {ElasticSearchRestHealthContributorAutoConfiguration.class}) @MapperScan("org.gbif.registry.persistence.mapper") @EnableConfigurationProperties diff --git a/registry-ws/src/main/java/org/gbif/registry/ws/resources/collections/BaseCollectionEntityResource.java b/registry-ws/src/main/java/org/gbif/registry/ws/resources/collections/BaseCollectionEntityResource.java index 95c437d0e9..25d2ecb9cd 100644 --- a/registry-ws/src/main/java/org/gbif/registry/ws/resources/collections/BaseCollectionEntityResource.java +++ b/registry-ws/src/main/java/org/gbif/registry/ws/resources/collections/BaseCollectionEntityResource.java @@ -25,7 +25,11 @@ import org.gbif.api.model.registry.MachineTaggable; import org.gbif.api.model.registry.Tag; import org.gbif.api.model.registry.Taggable; -import org.gbif.registry.service.collections.BaseCollectionEntityService; +import org.gbif.api.service.collections.CrudService; +import org.gbif.api.service.registry.CommentService; +import org.gbif.api.service.registry.IdentifierService; +import org.gbif.api.service.registry.MachineTagService; +import org.gbif.api.service.registry.TagService; import java.util.List; import java.util.UUID; @@ -52,49 +56,62 @@ public abstract class BaseCollectionEntityResource< private static final Logger LOG = LoggerFactory.getLogger(BaseCollectionEntityResource.class); protected final Class objectClass; - protected final BaseCollectionEntityService baseCollectionEntityService; + protected final CrudService crudService; + protected final IdentifierService identifierService; + protected final TagService tagService; + protected final MachineTagService machineTagService; + protected final CommentService commentService; protected BaseCollectionEntityResource( - Class objectClass, BaseCollectionEntityService baseCollectionEntityService) { + Class objectClass, + CrudService crudService, + IdentifierService identifierService, + TagService tagService, + MachineTagService machineTagService, + CommentService commentService) { this.objectClass = objectClass; - this.baseCollectionEntityService = baseCollectionEntityService; + this.crudService = crudService; + this.identifierService = identifierService; + this.tagService = tagService; + this.machineTagService = machineTagService; + this.commentService = commentService; } @DeleteMapping("{key}") public void delete(@PathVariable UUID key) { - baseCollectionEntityService.delete(key); + crudService.delete(key); } @PostMapping(value = "{key}/identifier", consumes = MediaType.APPLICATION_JSON_VALUE) @Trim public int addIdentifier( @PathVariable("key") UUID entityKey, @RequestBody @Trim Identifier identifier) { - return baseCollectionEntityService.addIdentifier(entityKey, identifier); + return identifierService.addIdentifier(entityKey, identifier); } @DeleteMapping("{key}/identifier/{identifierKey}") @Transactional public void deleteIdentifier( @PathVariable("key") UUID entityKey, @PathVariable int identifierKey) { - baseCollectionEntityService.deleteIdentifier(entityKey, identifierKey); + identifierService.deleteIdentifier(entityKey, identifierKey); } @GetMapping("{key}/identifier") @Nullable public List listIdentifiers(@PathVariable UUID key) { - return baseCollectionEntityService.listIdentifiers(key); + return identifierService.listIdentifiers(key); } @PostMapping(value = "{key}/tag", consumes = MediaType.APPLICATION_JSON_VALUE) @Trim public int addTag(@PathVariable("key") UUID entityKey, @RequestBody @Trim Tag tag) { - return baseCollectionEntityService.addTag(entityKey, tag); + return tagService.addTag(entityKey, tag); } @DeleteMapping("{key}/tag/{tagKey}") @Transactional public void deleteTag(@PathVariable("key") UUID entityKey, @PathVariable int tagKey) { - baseCollectionEntityService.deleteTag(entityKey, tagKey); + tagService.deleteTag(entityKey, tagKey); } @GetMapping("{key}/tag") @@ -102,26 +119,26 @@ public void deleteTag(@PathVariable("key") UUID entityKey, @PathVariable int tag public List listTags( @PathVariable("key") UUID key, @RequestParam(value = "owner", required = false) String owner) { - return baseCollectionEntityService.listTags(key, owner); + return tagService.listTags(key, owner); } @PostMapping(value = "{key}/machineTag", consumes = MediaType.APPLICATION_JSON_VALUE) @Trim public int addMachineTag( @PathVariable("key") UUID targetEntityKey, @RequestBody @Trim MachineTag machineTag) { - return baseCollectionEntityService.addMachineTag(targetEntityKey, machineTag); + return machineTagService.addMachineTag(targetEntityKey, machineTag); } @DeleteMapping("{key}/machineTag/{machineTagKey:[0-9]+}") public void deleteMachineTagByMachineTagKey( @PathVariable("key") UUID targetEntityKey, @PathVariable("machineTagKey") int machineTagKey) { - baseCollectionEntityService.deleteMachineTag(targetEntityKey, machineTagKey); + machineTagService.deleteMachineTag(targetEntityKey, machineTagKey); } @DeleteMapping("{key}/machineTag/{namespace:.*[^0-9]+.*}") public void deleteMachineTagsByNamespace( @PathVariable("key") UUID targetEntityKey, @PathVariable("namespace") String namespace) { - baseCollectionEntityService.deleteMachineTags(targetEntityKey, namespace); + machineTagService.deleteMachineTags(targetEntityKey, namespace); } @DeleteMapping("{key}/machineTag/{namespace}/{name}") @@ -129,29 +146,29 @@ public void deleteMachineTags( @PathVariable("key") UUID targetEntityKey, @PathVariable("namespace") String namespace, @PathVariable("name") String name) { - baseCollectionEntityService.deleteMachineTags(targetEntityKey, namespace, name); + machineTagService.deleteMachineTags(targetEntityKey, namespace, name); } @GetMapping("{key}/machineTag") public List listMachineTags(@PathVariable("key") UUID targetEntityKey) { - return baseCollectionEntityService.listMachineTags(targetEntityKey); + return machineTagService.listMachineTags(targetEntityKey); } @PostMapping(value = "{key}/comment", consumes = MediaType.APPLICATION_JSON_VALUE) @Trim public int addComment( @PathVariable("key") UUID targetEntityKey, @RequestBody @Trim Comment comment) { - return baseCollectionEntityService.addComment(targetEntityKey, comment); + return commentService.addComment(targetEntityKey, comment); } @DeleteMapping("{key}/comment/{commentKey}") public void deleteComment( @PathVariable("key") UUID targetEntityKey, @PathVariable("commentKey") int commentKey) { - baseCollectionEntityService.deleteComment(targetEntityKey, commentKey); + commentService.deleteComment(targetEntityKey, commentKey); } @GetMapping(value = "{key}/comment") public List listComments(@PathVariable("key") UUID targetEntityKey) { - return baseCollectionEntityService.listComments(targetEntityKey); + return commentService.listComments(targetEntityKey); } } diff --git a/registry-ws/src/main/java/org/gbif/registry/ws/resources/collections/CollectionResource.java b/registry-ws/src/main/java/org/gbif/registry/ws/resources/collections/CollectionResource.java index 9864c2a364..1a94385bb6 100644 --- a/registry-ws/src/main/java/org/gbif/registry/ws/resources/collections/CollectionResource.java +++ b/registry-ws/src/main/java/org/gbif/registry/ws/resources/collections/CollectionResource.java @@ -27,8 +27,7 @@ import org.gbif.api.model.registry.search.collections.KeyCodeNameResult; import org.gbif.api.service.collections.CollectionService; import org.gbif.registry.persistence.mapper.collections.params.DuplicatesSearchParams; -import org.gbif.registry.service.collections.DefaultCollectionService; -import org.gbif.registry.service.collections.duplicates.DuplicatesService; +import org.gbif.registry.service.collections.duplicates.CollectionDuplicatesService; import org.gbif.registry.service.collections.merge.CollectionMergeService; import org.gbif.registry.service.collections.suggestions.CollectionChangeSuggestionService; @@ -53,17 +52,23 @@ public class CollectionResource extends PrimaryCollectionEntityResource { - private final DuplicatesService duplicatesService; - public final DefaultCollectionService collectionService; + private final CollectionDuplicatesService duplicatesService; + public final CollectionService collectionService; public CollectionResource( CollectionMergeService collectionMergeService, - DuplicatesService duplicatesService, - DefaultCollectionService collectionService, + CollectionDuplicatesService duplicatesService, + CollectionService collectionService, CollectionChangeSuggestionService collectionChangeSuggestionService) { super( collectionMergeService, collectionService, + collectionService, + collectionService, + collectionService, + collectionService, + collectionService, + collectionService, collectionChangeSuggestionService, Collection.class); this.duplicatesService = duplicatesService; @@ -96,7 +101,7 @@ public DuplicatesResult findPossibleDuplicates(DuplicatesRequest request) { Preconditions.checkArgument( !request.isEmpty(), "At least one param to check the same field is required"); - return duplicatesService.findPossibleDuplicateCollections( + return duplicatesService.findPossibleDuplicates( DuplicatesSearchParams.builder() .sameFuzzyName(request.getSameFuzzyName()) .sameName(request.getSameName()) diff --git a/registry-ws/src/main/java/org/gbif/registry/ws/resources/collections/InstitutionResource.java b/registry-ws/src/main/java/org/gbif/registry/ws/resources/collections/InstitutionResource.java index 30a392145d..25859002c1 100644 --- a/registry-ws/src/main/java/org/gbif/registry/ws/resources/collections/InstitutionResource.java +++ b/registry-ws/src/main/java/org/gbif/registry/ws/resources/collections/InstitutionResource.java @@ -27,8 +27,7 @@ import org.gbif.api.model.registry.search.collections.KeyCodeNameResult; import org.gbif.api.service.collections.InstitutionService; import org.gbif.registry.persistence.mapper.collections.params.DuplicatesSearchParams; -import org.gbif.registry.service.collections.DefaultInstitutionService; -import org.gbif.registry.service.collections.duplicates.DuplicatesService; +import org.gbif.registry.service.collections.duplicates.InstitutionDuplicatesService; import org.gbif.registry.service.collections.merge.InstitutionMergeService; import org.gbif.registry.service.collections.suggestions.InstitutionChangeSuggestionService; @@ -55,18 +54,24 @@ public class InstitutionResource extends PrimaryCollectionEntityResource { - private final DefaultInstitutionService institutionService; + private final InstitutionService institutionService; private final InstitutionMergeService institutionMergeService; - private final DuplicatesService duplicatesService; + private final InstitutionDuplicatesService duplicatesService; public InstitutionResource( InstitutionMergeService institutionMergeService, - DuplicatesService duplicatesService, - DefaultInstitutionService institutionService, + InstitutionDuplicatesService duplicatesService, + InstitutionService institutionService, InstitutionChangeSuggestionService institutionChangeSuggestionService) { super( institutionMergeService, institutionService, + institutionService, + institutionService, + institutionService, + institutionService, + institutionService, + institutionService, institutionChangeSuggestionService, Institution.class); this.institutionService = institutionService; @@ -107,7 +112,7 @@ public DuplicatesResult findPossibleDuplicates(DuplicatesRequest request) { Preconditions.checkArgument( !request.isEmpty(), "At least one param to check the same field is required"); - return duplicatesService.findPossibleDuplicateInstitutions( + return duplicatesService.findPossibleDuplicates( DuplicatesSearchParams.builder() .sameFuzzyName(request.getSameFuzzyName()) .sameName(request.getSameName()) diff --git a/registry-ws/src/main/java/org/gbif/registry/ws/resources/collections/PersonResource.java b/registry-ws/src/main/java/org/gbif/registry/ws/resources/collections/PersonResource.java index 31413e0a26..a0cb0b0424 100644 --- a/registry-ws/src/main/java/org/gbif/registry/ws/resources/collections/PersonResource.java +++ b/registry-ws/src/main/java/org/gbif/registry/ws/resources/collections/PersonResource.java @@ -21,7 +21,7 @@ import org.gbif.api.model.common.paging.Pageable; import org.gbif.api.model.common.paging.PagingResponse; import org.gbif.api.model.registry.search.collections.PersonSuggestResult; -import org.gbif.registry.service.collections.DefaultPersonService; +import org.gbif.api.service.collections.PersonService; import java.util.List; import java.util.UUID; @@ -30,7 +30,6 @@ import org.springframework.http.MediaType; import org.springframework.security.access.annotation.Secured; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -48,10 +47,10 @@ @RequestMapping(value = "grscicoll/person", produces = MediaType.APPLICATION_JSON_VALUE) public class PersonResource extends BaseCollectionEntityResource { - private final DefaultPersonService personService; + private final PersonService personService; - public PersonResource(DefaultPersonService personService) { - super(Person.class, personService); + public PersonResource(PersonService personService) { + super(Person.class, personService, personService, personService, personService, personService); this.personService = personService; } diff --git a/registry-ws/src/main/java/org/gbif/registry/ws/resources/collections/PrimaryCollectionEntityResource.java b/registry-ws/src/main/java/org/gbif/registry/ws/resources/collections/PrimaryCollectionEntityResource.java index 0552121cf3..287c10572e 100644 --- a/registry-ws/src/main/java/org/gbif/registry/ws/resources/collections/PrimaryCollectionEntityResource.java +++ b/registry-ws/src/main/java/org/gbif/registry/ws/resources/collections/PrimaryCollectionEntityResource.java @@ -32,8 +32,14 @@ import org.gbif.api.model.registry.Identifiable; import org.gbif.api.model.registry.MachineTaggable; import org.gbif.api.model.registry.Taggable; +import org.gbif.api.service.collections.ContactService; +import org.gbif.api.service.collections.CrudService; +import org.gbif.api.service.collections.OccurrenceMappingService; +import org.gbif.api.service.registry.CommentService; +import org.gbif.api.service.registry.IdentifierService; +import org.gbif.api.service.registry.MachineTagService; +import org.gbif.api.service.registry.TagService; import org.gbif.api.vocabulary.Country; -import org.gbif.registry.service.collections.PrimaryCollectionEntityService; import org.gbif.registry.service.collections.merge.MergeService; import java.util.List; @@ -68,68 +74,79 @@ public abstract class PrimaryCollectionEntityResource< extends BaseCollectionEntityResource { private final MergeService mergeService; - private final PrimaryCollectionEntityService primaryCollectionEntityService; + private final CrudService crudService; + private final ContactService contactService; + private final OccurrenceMappingService occurrenceMappingService; private final ChangeSuggestionService changeSuggestionService; protected PrimaryCollectionEntityResource( MergeService mergeService, - PrimaryCollectionEntityService primaryCollectionEntityService, + CrudService crudService, + ContactService contactService, + IdentifierService identifierService, + TagService tagService, + MachineTagService machineTagService, + CommentService commentService, + OccurrenceMappingService occurrenceMappingService, ChangeSuggestionService changeSuggestionService, Class objectClass) { - super(objectClass, primaryCollectionEntityService); + super( + objectClass, crudService, identifierService, tagService, machineTagService, commentService); this.mergeService = mergeService; this.changeSuggestionService = changeSuggestionService; - this.primaryCollectionEntityService = primaryCollectionEntityService; + this.crudService = crudService; + this.contactService = contactService; + this.occurrenceMappingService = occurrenceMappingService; } @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE) @Trim public UUID create(@RequestBody @Trim T entity) { - return primaryCollectionEntityService.create(entity); + return crudService.create(entity); } @PutMapping(value = "{key}", consumes = MediaType.APPLICATION_JSON_VALUE) @Trim public void update(@PathVariable("key") UUID key, @RequestBody @Trim T entity) { checkArgument(key.equals(entity.getKey())); - primaryCollectionEntityService.update(entity); + crudService.update(entity); } @PostMapping( value = "{key}/contact", consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.TEXT_PLAIN_VALUE}) public void addContact(@PathVariable("key") UUID entityKey, @RequestBody UUID personKey) { - primaryCollectionEntityService.addContact(entityKey, personKey); + contactService.addContact(entityKey, personKey); } @DeleteMapping("{key}/contact/{personKey}") public void removeContact(@PathVariable("key") UUID entityKey, @PathVariable UUID personKey) { - primaryCollectionEntityService.removeContact(entityKey, personKey); + contactService.removeContact(entityKey, personKey); } @GetMapping("{key}/contact") @Nullable public List listContacts(@PathVariable UUID key) { - return primaryCollectionEntityService.listContacts(key); + return contactService.listContacts(key); } @PostMapping(value = "{key}/occurrenceMapping", consumes = MediaType.APPLICATION_JSON_VALUE) @Trim public int addOccurrenceMapping( @PathVariable("key") UUID entityKey, @RequestBody @Trim OccurrenceMapping occurrenceMapping) { - return primaryCollectionEntityService.addOccurrenceMapping(entityKey, occurrenceMapping); + return occurrenceMappingService.addOccurrenceMapping(entityKey, occurrenceMapping); } @GetMapping("{key}/occurrenceMapping") @Nullable public List listOccurrenceMappings(@PathVariable("key") UUID uuid) { - return primaryCollectionEntityService.listOccurrenceMappings(uuid); + return occurrenceMappingService.listOccurrenceMappings(uuid); } @DeleteMapping("{key}/occurrenceMapping/{occurrenceMappingKey}") public void deleteOccurrenceMapping( @PathVariable("key") UUID entityKey, @PathVariable int occurrenceMappingKey) { - primaryCollectionEntityService.deleteOccurrenceMapping(entityKey, occurrenceMappingKey); + occurrenceMappingService.deleteOccurrenceMapping(entityKey, occurrenceMappingKey); } @PostMapping(value = "{key}/merge")