package br.com.caelum.calopsita.logic; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertThat; import org.jmock.Expectations; import org.jmock.Mockery; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import br.com.caelum.calopsita.controller.UsersController; import br.com.caelum.calopsita.infra.vraptor.SessionUser; import br.com.caelum.calopsita.mocks.MockHttpSession; import br.com.caelum.calopsita.model.User; import br.com.caelum.calopsita.repository.UserRepository; import br.com.caelum.vraptor.util.test.MockResult; import br.com.caelum.vraptor.util.test.MockValidator; import br.com.caelum.vraptor.validator.ValidationException; public class UserTest { private SessionUser sessionUser; private Mockery mockery; private UsersController logic; private UserRepository repository; @Before public void setUp() throws Exception { mockery = new Mockery(); sessionUser = new SessionUser(new MockHttpSession()); repository = mockery.mock(UserRepository.class); logic = new UsersController(new MockResult(), new MockValidator(), sessionUser); } @Test public void aNewUserIsNewbie() throws Exception { final User user = givenUser("caue"); givenThatUserDoesntExist(user); shouldSaveTheUser(user); whenISaveTheUser(user); assertThat(sessionUser.getUser(), is(notNullValue())); assertThat(sessionUser.getUser().isNewbie(), is(true)); mockery.assertIsSatisfied(); } @Test public void toggleNewbie() throws Exception { final User user = givenUser("caue"); givenThatUserExists(user); assertThat(sessionUser.getUser().isNewbie(), is(false)); whenIToggleNewbie(); assertThat(sessionUser.getUser().isNewbie(), is(true)); } @Test public void signUpWithNewUser() throws Exception { final User user = givenUser("caue"); givenThatUserDoesntExist(user); shouldSaveTheUser(user); whenISaveTheUser(user); assertThat(sessionUser.getUser(), is(notNullValue())); mockery.assertIsSatisfied(); } @Test(expected=ValidationException.class) public void signUpWithExistingUser() throws Exception { final User user = givenUser("caue"); givenThatUserExists(user); shouldNotSave(user); whenISaveTheUser(user); assertThat(sessionUser.getUser(), is(nullValue())); mockery.assertIsSatisfied(); } @Test public void loginWithValidUser() throws Exception { final User user = givenUser("caue"); givenThatUserExists(user); whenILoginWith(user); assertThat(sessionUser.getUser(), is(user)); mockery.assertIsSatisfied(); } @Test(expected=ValidationException.class) public void loginWithInvalidUser() throws Exception { final User user = givenUser("caue"); givenThatUserDoesntExist(user); shouldNotSave(user); whenILoginWith(user); assertThat(sessionUser.getUser(), is(nullValue())); mockery.assertIsSatisfied(); } @Test public void logout() throws Exception { givenThereIsAnUserOnSession(); whenILogout(); assertThat(sessionUser.getUser(), is(nullValue())); mockery.assertIsSatisfied(); } private void givenThereIsAnUserOnSession() { sessionUser.setUser(new User(repository)); } @Test public void hashPassword() throws Exception { final User user = givenUser("caue"); shouldHavePasswordHashed(user, "caue"); mockery.assertIsSatisfied(); } private void whenIToggleNewbie() { logic.toggleNewbie(); } private void shouldHavePasswordHashed(User user, String login) { Assert.assertNotSame(user.getPassword(), login); } private void shouldNotSave(final User user) { mockery.checking(new Expectations() { { never(repository).add(user); } }); } private void givenThatUserDoesntExist(final User user) { mockery.checking(new Expectations() { { one(repository).find(user.getLogin()); will(returnValue(null)); } }); } private void givenThatUserExists(final User user) { mockery.checking(new Expectations() { { one(repository).find(user.getLogin()); will(returnValue(user)); } }); sessionUser.setUser(user); } private void whenISaveTheUser(final User user) { logic.save(user); } private void whenILoginWith(final User user) { logic.login(user); } private void whenILogout() { logic.logout(); } private void shouldSaveTheUser(final User user) { mockery.checking(new Expectations() { { one(repository).add(user); } }); } private User givenUser(String login) { final User user = new User(repository); user.setLogin(login); user.setEmail(login + "@caelum.com.br"); user.setName(login); user.setPassword(login); return user; } }