package br.com.caelum.vraptor.musicjungle.controller;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.hasSize;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import br.com.caelum.vraptor.musicjungle.dao.UserDao;
import br.com.caelum.vraptor.musicjungle.interceptor.UserInfo;
import br.com.caelum.vraptor.musicjungle.model.User;
import br.com.caelum.vraptor.musicjungle.util.model.UserBuilder;
import br.com.caelum.vraptor.util.test.MockResult;
import br.com.caelum.vraptor.util.test.MockValidator;
import br.com.caelum.vraptor.validator.Message;
import br.com.caelum.vraptor.validator.SimpleMessage;
import br.com.caelum.vraptor.validator.ValidationException;
public class HomeControllerTest {
private MockResult result;
private MockValidator validator;
private HomeController controller;
@Mock
private UserDao dao;
@Mock
private UserInfo userInfo;
private User user;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
result = new MockResult();
validator = new MockValidator();
controller = new HomeController(dao, userInfo, result, validator);
user = new UserBuilder().withName("Renan").withLogin("renanigt").withPassword("1234").build();
}
@Test
public void shouldLoginWhenUserExists() {
when(dao.find(user.getLogin(), user.getPassword())).thenReturn(user);
controller.login(user.getLogin(), user.getPassword());
assertThat(validator.getErrors(), empty());
}
@Test(expected=ValidationException.class)
public void shouldNotLoginWhenUserDoesNotExists() {
when(dao.find(user.getLogin(), user.getPassword())).thenReturn(null);
controller.login(user.getLogin(), user.getPassword());
}
@Test
public void shouldNotLoginWhenUserDoesNotExistsAndHasOneError() {
when(dao.find(user.getLogin(), user.getPassword())).thenReturn(null);
try {
controller.login(user.getLogin(), user.getPassword());
fail("Should throw an exception.");
} catch (ValidationException e) {
List<Message> errors = e.getErrors();
assertThat(errors, hasSize(1));
assertTrue(errors.contains(new SimpleMessage("login", "invalid_login_or_password")));
}
}
@Test
public void shouldLogoutUser() {
controller.logout();
verify(userInfo).logout();
}
}