Author: fdesbois Date: 2012-04-13 20:14:05 +0200 (Fri, 13 Apr 2012) New Revision: 3274 Url: http://chorem.org/repositories/revision/pollen/3274 Log: add test for lostPassword Modified: trunk/pollen-services/src/test/java/org/chorem/pollen/services/AbstractPollenServiceTest.java trunk/pollen-services/src/test/java/org/chorem/pollen/services/FakeServiceContext.java trunk/pollen-services/src/test/java/org/chorem/pollen/services/impl/UserServiceTest.java Modified: trunk/pollen-services/src/test/java/org/chorem/pollen/services/AbstractPollenServiceTest.java =================================================================== --- trunk/pollen-services/src/test/java/org/chorem/pollen/services/AbstractPollenServiceTest.java 2012-04-13 17:56:05 UTC (rev 3273) +++ trunk/pollen-services/src/test/java/org/chorem/pollen/services/AbstractPollenServiceTest.java 2012-04-13 18:14:05 UTC (rev 3274) @@ -23,9 +23,12 @@ */ package org.chorem.pollen.services; +import com.google.common.collect.Maps; import org.junit.Before; import org.junit.Rule; +import java.util.Map; + /** * For each test, create an isolated transaction context, in a H2 database. * The H2 file is stored in a directory depending on the test class name, the @@ -33,20 +36,55 @@ * to see how database changed between each test run). * <p/> * Any unit test of a service should subclass this class and use the - * {@link #newService(Class)} to get a service ready to be used. + * {@link #newService(Class)} to get a service ready to be used. + * + * @since 1.3 */ public abstract class AbstractPollenServiceTest extends PollenServiceSupport { @Rule public FakeServiceContext fakeContext = new FakeServiceContext(); + + protected PollenServiceMockFactory serviceFactory; @Before public void setUp() throws Exception { - getServiceContext().setServiceFactory(new PollenServiceFactory()); + serviceFactory = new PollenServiceMockFactory(); + getServiceContext().setServiceFactory(serviceFactory); setServiceContext(getServiceContext()); } public FakeServiceContext getServiceContext() { return fakeContext; } + + /** + * Mock for {@link PollenServiceMockFactory}. You can use + * {@link #registerService(Class, PollenService)} to set an explicit + * instance for one of the service used. the {@link PollenServiceContext} + * will be set to the instance each time the {@link #newService(Class, + * PollenServiceContext)} is requested. + */ + protected class PollenServiceMockFactory extends PollenServiceFactory { + + private Map<Class<? extends PollenService>, PollenService> services = Maps.newHashMap(); + + public <E extends PollenService> void registerService(Class<E> clazz, E instance) { + services.put(clazz, instance); + } + + @Override + public <E extends PollenService> E newService(Class<E> clazz, PollenServiceContext serviceContext) { + + E result; + if (services.containsKey(clazz)) { + result = (E) services.get(clazz); + result.setServiceContext(serviceContext); + + } else { + result = super.newService(clazz, serviceContext); + } + return result; + } + } } Modified: trunk/pollen-services/src/test/java/org/chorem/pollen/services/FakeServiceContext.java =================================================================== --- trunk/pollen-services/src/test/java/org/chorem/pollen/services/FakeServiceContext.java 2012-04-13 17:56:05 UTC (rev 3273) +++ trunk/pollen-services/src/test/java/org/chorem/pollen/services/FakeServiceContext.java 2012-04-13 18:14:05 UTC (rev 3274) @@ -28,7 +28,6 @@ import org.apache.commons.logging.LogFactory; import org.chorem.pollen.PolleIOUtil; import org.chorem.pollen.PollenConfiguration; -import org.chorem.pollen.PollenConfigurationOption; import org.chorem.pollen.PollenTopiaRootContextFactory; import org.junit.rules.TestWatcher; import org.junit.runner.Description; @@ -66,6 +65,8 @@ protected Date fakeCurrentTime; protected File testDir; + + protected URL applicationUrl; public TopiaContext getRootContext() { return this.rootContext; @@ -148,9 +149,13 @@ @Override public URL getApplicationURL() { - return null; + return applicationUrl; } + public void setApplicationUrl(URL applicationUrl) { + this.applicationUrl = applicationUrl; + } + /** * Create an id to easily managed polls using urls. * Modified: trunk/pollen-services/src/test/java/org/chorem/pollen/services/impl/UserServiceTest.java =================================================================== --- trunk/pollen-services/src/test/java/org/chorem/pollen/services/impl/UserServiceTest.java 2012-04-13 17:56:05 UTC (rev 3273) +++ trunk/pollen-services/src/test/java/org/chorem/pollen/services/impl/UserServiceTest.java 2012-04-13 18:14:05 UTC (rev 3274) @@ -23,18 +23,25 @@ */ package org.chorem.pollen.services.impl; +import com.google.common.collect.Queues; +import org.chorem.pollen.business.persistence.UserAccount; +import org.chorem.pollen.business.persistence.UserAccountDAO; import org.chorem.pollen.services.AbstractPollenServiceTest; +import org.junit.Assert; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; +import java.net.URL; +import java.util.Queue; + +import static org.chorem.pollen.services.impl.EmailService.PollenEmail; + /** * Tests the {@link UserService}. * * @author tchemit <chemit@codelutin.com> * @since 1.3 */ -@Ignore public class UserServiceTest extends AbstractPollenServiceTest { @Override @@ -80,4 +87,79 @@ public void testGetNbUsers() throws Exception { } + + @Test + public void testLostPassword() throws Exception { + + // ---- PREPARE ---- // + + // mock service for email that don't send them through smtp but keep them + EmailServiceQueueMock emailQueue = new EmailServiceQueueMock(); + getServiceContext().setApplicationUrl(new URL("http", "test", "pollen")); + serviceFactory.registerService(EmailService.class, emailQueue); + + // need to force the generated password + serviceFactory.registerService(UserService.class, + new UserServiceGeneratePasswordMock("password")); + + // Create a user + UserAccountDAO userAccountDAO = getDAO(UserAccount.class); + UserAccount user = create(userAccountDAO); + user.setEmail("bob@toto.fr"); + user.setLogin("login"); + user.setPassword("none"); + commitTransaction("can't create user"); + String userId = user.getTopiaId(); + + // ---- EXECUTE ---- // + UserService userService = serviceFactory.newService(UserService.class, getServiceContext()); + userService.lostPassword("bob@toto.fr"); + + // ---- VERIFY ---- // + PollenEmail result = emailQueue.readEmail(); + Assert.assertEquals("bob@toto.fr", result.getTo()); + + // TODO-fdesbois-2012-04-13 : check email subject and content + + UserAccount userUpdated = getEntityById(UserAccount.class, userId); + Assert.assertNotNull(userUpdated); + String encodedPassword = userService.encodePassword("password"); + Assert.assertEquals(encodedPassword, userUpdated.getPassword()); + } + + /** + * Mock to avoid sending emails. It uses a queue instead to allow tests + * to retrieve emails and check them. Use {@link #readEmail()} to read + * the current email (FIFO). + */ + public class EmailServiceQueueMock extends EmailService { + + protected Queue<PollenEmail> emailQueue = Queues.newPriorityQueue(); + + @Override + protected void sendEmail(PollenEmail pollenEmail) { + emailQueue.add(pollenEmail); + } + + public PollenEmail readEmail() { + return emailQueue.poll(); + } + } + + /** + * Mock to force using a static password instead of generating a random one. + */ + protected class UserServiceGeneratePasswordMock extends UserService { + + private String password; + + public UserServiceGeneratePasswordMock(String password) { + this.password = password; + } + + @Override + protected String generatePassword() { + return password; + } + } }