diff --git a/morphia/src/it/java/org/seedstack/mongodb/morphia/MorphiaRepositoryIT.java b/morphia/src/it/java/org/seedstack/mongodb/morphia/MorphiaRepositoryIT.java index cec7d40..3656f93 100644 --- a/morphia/src/it/java/org/seedstack/mongodb/morphia/MorphiaRepositoryIT.java +++ b/morphia/src/it/java/org/seedstack/mongodb/morphia/MorphiaRepositoryIT.java @@ -13,8 +13,9 @@ import com.google.inject.ProvisionException; import com.google.inject.TypeLiteral; import com.google.inject.util.Types; -import org.assertj.core.api.Assertions; import org.junit.Test; +import org.mongodb.morphia.mapping.MappingException; +import org.mongodb.morphia.query.UpdateException; import org.seedstack.business.domain.Repository; import org.seedstack.mongodb.morphia.fixtures.dummyobject.Dummy1; import org.seedstack.mongodb.morphia.fixtures.dummyobject.Dummy2; @@ -23,17 +24,25 @@ import org.seedstack.mongodb.morphia.fixtures.dummyobject.Dummy5; import org.seedstack.mongodb.morphia.fixtures.dummyobject.Dummy6; import org.seedstack.mongodb.morphia.fixtures.user.Address; +import org.seedstack.mongodb.morphia.fixtures.user.EntityStringId; import org.seedstack.mongodb.morphia.fixtures.user.User; import org.seedstack.mongodb.morphia.internal.MorphiaErrorCodes; import org.seedstack.seed.SeedException; import org.seedstack.seed.it.AbstractSeedIT; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; + public class MorphiaRepositoryIT extends AbstractSeedIT { @Inject @Morphia private Repository userRepository; + @Inject + @Morphia + private Repository entityStringIdRepository; + @Inject private Injector injector; @@ -45,7 +54,7 @@ public void repository_injection_test_no_client_for_aggregate() { Key.get(TypeLiteral.get(Types.newParameterizedType(Repository.class, Dummy1.class, Long.class)), Morphia.class)); } catch (ProvisionException e) { - Assertions.assertThat(e.getCause().getMessage()) + assertThat(e.getCause().getMessage()) .isEqualTo(SeedException.createNew(MorphiaErrorCodes.UNKNOW_DATASTORE_CLIENT).getMessage()); } } @@ -57,7 +66,7 @@ public void repository_injection_test_no_dbName_for_aggregate() { Key.get(TypeLiteral.get(Types.newParameterizedType(Repository.class, Dummy2.class, Long.class)), Morphia.class)); } catch (ProvisionException e) { - Assertions.assertThat(e.getCause().getMessage()) + assertThat(e.getCause().getMessage()) .isEqualTo(SeedException.createNew(MorphiaErrorCodes.UNKNOW_DATASTORE_DATABASE).getMessage()); } } @@ -69,7 +78,7 @@ public void repository_injection_test_no_mongoDb_client() { Key.get(TypeLiteral.get(Types.newParameterizedType(Repository.class, Dummy3.class, Long.class)), Morphia.class)); } catch (ProvisionException e) { - Assertions.assertThat(e.getCause().getMessage()) + assertThat(e.getCause().getMessage()) .isEqualTo(SeedException.createNew(MorphiaErrorCodes.UNKNOW_DATASTORE_CLIENT).getMessage()); } } @@ -81,7 +90,7 @@ public void repository_injection_test_no_mongoDb_database() { Key.get(TypeLiteral.get(Types.newParameterizedType(Repository.class, Dummy4.class, Long.class)), Morphia.class)); } catch (ProvisionException e) { - Assertions.assertThat(e.getCause().getMessage()) + assertThat(e.getCause().getMessage()) .isEqualTo(SeedException.createNew(MorphiaErrorCodes.UNKNOW_DATABASE_NAME).getMessage()); } } @@ -93,7 +102,7 @@ public void repository_injection_test_no_mongodb_for_aggregate() { Key.get(TypeLiteral.get(Types.newParameterizedType(Repository.class, Dummy5.class, Long.class)), Morphia.class)); } catch (ProvisionException e) { - Assertions.assertThat(e.getCause().getMessage()) + assertThat(e.getCause().getMessage()) .isEqualTo(SeedException.createNew(MorphiaErrorCodes.UNKNOW_DATASTORE_CONFIGURATION).getMessage()); } } @@ -105,7 +114,7 @@ public void repository_injection_async_client() { Key.get(TypeLiteral.get(Types.newParameterizedType(Repository.class, Dummy6.class, Long.class)), Morphia.class)); } catch (ProvisionException e) { - Assertions.assertThat(e.getCause().getMessage()) + assertThat(e.getCause().getMessage()) .isEqualTo(SeedException.createNew(MorphiaErrorCodes.ERROR_ASYNC_CLIENT).getMessage()); } } @@ -113,29 +122,63 @@ public void repository_injection_async_client() { @Test public void mongodb_repository_test() { - Assertions.assertThat(userRepository).isNotNull(); + assertThat(userRepository).isNotNull(); User user1 = getUser(1L, "N°", "1"); userRepository.persist(user1); User user2 = userRepository.load(user1.getEntityId()); - Assertions.assertThat(user1.getId()).isEqualTo(user2.getId()); - Assertions.assertThat(user1.getEntityId()).isEqualTo(user2.getEntityId()); + assertThat(user1.getId()).isEqualTo(user2.getId()); + assertThat(user1.getEntityId()).isEqualTo(user2.getEntityId()); userRepository.delete(user1); User user3 = userRepository.load(user1.getEntityId()); - Assertions.assertThat(user3).isEqualTo(null); + assertThat(user3).isEqualTo(null); User user5 = getUser(2L, "N°", "2"); userRepository.delete(user5); - userRepository.save(user5); + userRepository.persist(user5); User user6 = userRepository.load(user5.getEntityId()); - Assertions.assertThat(user6.getId()).isEqualTo(user5.getId()); + assertThat(user6.getId()).isEqualTo(user5.getId()); userRepository.delete(user5); user6 = userRepository.load(user5.getEntityId()); - Assertions.assertThat(user6).isEqualTo(null); + assertThat(user6).isEqualTo(null); userRepository.persist(user5); - Assertions.assertThat(userRepository.load(2L)).isNotEqualTo(null); + assertThat(userRepository.load(2L)).isNotEqualTo(null); + } + + @Test(expected = MappingException.class) + public void mongodb_repository_save_without_id() { + EntityStringId saved = entityStringIdRepository.save(new EntityStringId(null)); + fail("should not have saved"); + } + + @Test(expected = UpdateException.class) + public void mongodb_repository_save_with_inexistent_id() { + userRepository.save(getUser(100L, "Robert", "SMITH")); + fail("should not have saved"); + } + + @Test + public void mongodb_repository_save() { + userRepository.persist(getUser(200L, "Robert", "SMITH")); + assertThat(userRepository.save(getUser(200L, "Jane", "SMITH")).getEntityId()).isEqualTo(200L); + } + + @Test + public void mongodb_repository_persist_load() { + userRepository.persist(getUser(300L, "Robert", "SMITH")); + assertThat(userRepository.load(300L).getEntityId()).isEqualTo(300L); + } + + @Test + public void mongodb_repository_clear() { + userRepository.persist(getUser(400L, "Robert", "SMITH")); + userRepository.persist(getUser(401L, "Jayne", "SMITH")); + assertThat(userRepository.load(400L).getEntityId()).isEqualTo(400L); + assertThat(userRepository.load(401L).getEntityId()).isEqualTo(401L); + userRepository.clear(); + assertThat(userRepository.load(400L)).isNull(); + assertThat(userRepository.load(401L)).isNull(); } public User getUser(long id, String firstname, String lastName) { return new User(id, firstname, lastName, new Address("France", "75001", "Paris", "Champ Elysee avenue", 1)); } - } diff --git a/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/user/EntityStringId.java b/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/user/EntityStringId.java new file mode 100644 index 0000000..16ca9d9 --- /dev/null +++ b/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/user/EntityStringId.java @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2013-2016, The SeedStack authors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.seedstack.mongodb.morphia.fixtures.user; + +import org.mongodb.morphia.annotations.Entity; +import org.mongodb.morphia.annotations.Id; +import org.seedstack.business.domain.AggregateRoot; + +@Entity +public class EntityStringId implements AggregateRoot { + @Id + private String id; + + public EntityStringId() { + } + + public EntityStringId(String id) { + this.id = id; + } + + @Override + public String getEntityId() { + return id; + } +} diff --git a/morphia/src/it/resources/logback-test.xml b/morphia/src/it/resources/logback-test.xml index 06dda42..faf93bd 100644 --- a/morphia/src/it/resources/logback-test.xml +++ b/morphia/src/it/resources/logback-test.xml @@ -14,7 +14,7 @@ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - + \ No newline at end of file diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/BaseMorphiaRepository.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/BaseMorphiaRepository.java index e698e19..b421fab 100644 --- a/morphia/src/main/java/org/seedstack/mongodb/morphia/BaseMorphiaRepository.java +++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/BaseMorphiaRepository.java @@ -17,16 +17,21 @@ import org.seedstack.seed.Application; /** - * This class serves as inheritance base for the Mongodb repositories. + * This class can serve as a base class for Morphia repositories. It provides methods for common CRUD operations as + * well as access to the data store through the {@link #getDatastore()} ()} protected method. * - * @param Mongodb Entity Type (DDD: Aggregate) - * @param key type - * @author redouane.loulou@ext.mpsa.com Date: 20/10/2015 + * @param Aggregate root class + * @param Key class + * @author redouane.loulou@ext.mpsa.com */ public abstract class BaseMorphiaRepository, K> extends BaseRepository { - private Datastore datastore; + /** + * Provides access to the Morphia data store for implementing custom data access methods. + * + * @return the Morphia data store. + */ protected Datastore getDatastore() { return datastore; } @@ -41,6 +46,11 @@ protected A doLoad(K id) { return datastore.get(aggregateRootClass, id); } + @Override + protected void doClear() { + datastore.delete(datastore.createQuery(aggregateRootClass)); + } + @Override protected void doDelete(K id) { datastore.delete(aggregateRootClass, id); @@ -49,18 +59,16 @@ protected void doDelete(K id) { @Override protected void doDelete(A aggregate) { datastore.delete(aggregate); - } @Override protected void doPersist(A aggregate) { datastore.save(aggregate); - } @Override protected A doSave(A aggregate) { - return datastore.get(aggregateRootClass, datastore.save(aggregate).getId()); + datastore.merge(aggregate); + return aggregate; } - } \ No newline at end of file