package com.baeldung.services; import com.baeldung.domain.Foo; import com.baeldung.util.IDUtil; import org.hamcrest.Matchers; import org.junit.Ignore; import org.junit.Test; import org.springframework.dao.DataAccessException; import java.io.Serializable; import java.util.List; import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.not; import static org.junit.Assert.*; public abstract class AbstractServicePersistenceIntegrationTest { // tests // find - one @Test /**/public final void givenResourceDoesNotExist_whenResourceIsRetrieved_thenNoResourceIsReceived() { // When final Foo createdResource = getApi().findOne(IDUtil.randomPositiveLong()); // Then assertNull(createdResource); } @Test public void givenResourceExists_whenResourceIsRetrieved_thenNoExceptions() { final Foo existingResource = persistNewEntity(); getApi().findOne(existingResource.getId()); } @Test public void givenResourceDoesNotExist_whenResourceIsRetrieved_thenNoExceptions() { getApi().findOne(IDUtil.randomPositiveLong()); } @Test public void givenResourceExists_whenResourceIsRetrieved_thenTheResultIsNotNull() { final Foo existingResource = persistNewEntity(); final Foo retrievedResource = getApi().findOne(existingResource.getId()); assertNotNull(retrievedResource); } @Test public void givenResourceExists_whenResourceIsRetrieved_thenResourceIsRetrievedCorrectly() { final Foo existingResource = persistNewEntity(); final Foo retrievedResource = getApi().findOne(existingResource.getId()); assertEquals(existingResource, retrievedResource); } // find - one - by name // find - all @Test /**/public void whenAllResourcesAreRetrieved_thenNoExceptions() { getApi().findAll(); } @Test /**/public void whenAllResourcesAreRetrieved_thenTheResultIsNotNull() { final List resources = getApi().findAll(); assertNotNull(resources); } @Test /**/public void givenAtLeastOneResourceExists_whenAllResourcesAreRetrieved_thenRetrievedResourcesAreNotEmpty() { persistNewEntity(); // When final List allResources = getApi().findAll(); // Then assertThat(allResources, not(Matchers. empty())); } @Test /**/public void givenAnResourceExists_whenAllResourcesAreRetrieved_thenTheExistingResourceIsIndeedAmongThem() { final Foo existingResource = persistNewEntity(); final List resources = getApi().findAll(); assertThat(resources, hasItem(existingResource)); } @Test /**/public void whenAllResourcesAreRetrieved_thenResourcesHaveIds() { persistNewEntity(); // When final List allResources = getApi().findAll(); // Then for (final Foo resource : allResources) { assertNotNull(resource.getId()); } } // create @Test(expected = RuntimeException.class) /**/public void whenNullResourceIsCreated_thenException() { getApi().create(null); } @Test /**/public void whenResourceIsCreated_thenNoExceptions() { persistNewEntity(); } @Test /**/public void whenResourceIsCreated_thenResourceIsRetrievable() { final Foo existingResource = persistNewEntity(); assertNotNull(getApi().findOne(existingResource.getId())); } @Test /**/public void whenResourceIsCreated_thenSavedResourceIsEqualToOriginalResource() { final Foo originalResource = createNewEntity(); final Foo savedResource = getApi().create(originalResource); assertEquals(originalResource, savedResource); } @Test(expected = RuntimeException.class) public void whenResourceWithFailedConstraintsIsCreated_thenException() { final Foo invalidResource = createNewEntity(); invalidate(invalidResource); getApi().create(invalidResource); } /** * -- specific to the persistence engine */ @Test(expected = DataAccessException.class) @Ignore("Hibernate simply ignores the id silently and still saved (tracking this)") public void whenResourceWithIdIsCreated_thenDataAccessException() { final Foo resourceWithId = createNewEntity(); resourceWithId.setId(IDUtil.randomPositiveLong()); getApi().create(resourceWithId); } // update @Test(expected = RuntimeException.class) /**/public void whenNullResourceIsUpdated_thenException() { getApi().update(null); } @Test /**/public void givenResourceExists_whenResourceIsUpdated_thenNoExceptions() { // Given final Foo existingResource = persistNewEntity(); // When getApi().update(existingResource); } /** * - can also be the ConstraintViolationException which now occurs on the update operation will not be translated; as a consequence, it will be a TransactionSystemException */ @Test(expected = RuntimeException.class) public void whenResourceIsUpdatedWithFailedConstraints_thenException() { final Foo existingResource = persistNewEntity(); invalidate(existingResource); getApi().update(existingResource); } @Test /**/public void givenResourceExists_whenResourceIsUpdated_thenUpdatesArePersisted() { // Given final Foo existingResource = persistNewEntity(); // When change(existingResource); getApi().update(existingResource); final Foo updatedResource = getApi().findOne(existingResource.getId()); // Then assertEquals(existingResource, updatedResource); } // delete // @Test(expected = RuntimeException.class) // public void givenResourceDoesNotExists_whenResourceIsDeleted_thenException() { // // When // getApi().delete(IDUtil.randomPositiveLong()); // } // // @Test(expected = RuntimeException.class) // public void whenResourceIsDeletedByNegativeId_thenException() { // // When // getApi().delete(IDUtil.randomNegativeLong()); // } // // @Test // public void givenResourceExists_whenResourceIsDeleted_thenNoExceptions() { // // Given // final Foo existingResource = persistNewEntity(); // // // When // getApi().delete(existingResource.getId()); // } // // @Test // /**/public final void givenResourceExists_whenResourceIsDeleted_thenResourceNoLongerExists() { // // Given // final Foo existingResource = persistNewEntity(); // // // When // getApi().delete(existingResource.getId()); // // // Then // assertNull(getApi().findOne(existingResource.getId())); // } // template method protected Foo createNewEntity() { return new Foo(randomAlphabetic(6)); } protected abstract IOperations getApi(); private final void invalidate(final Foo entity) { entity.setName(null); } private final void change(final Foo entity) { entity.setName(randomAlphabetic(6)); } protected Foo persistNewEntity() { return getApi().create(createNewEntity()); } }