package br.usp.ime.academicdevoir.controller;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.*;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.util.test.JSR303MockValidator;
import br.com.caelum.vraptor.util.test.MockResult;
import br.usp.ime.academicdevoir.dao.AlunoDao;
import br.usp.ime.academicdevoir.dao.DisciplinaDao;
import br.usp.ime.academicdevoir.dao.TurmaDao;
import br.usp.ime.academicdevoir.entidade.Aluno;
import br.usp.ime.academicdevoir.entidade.Disciplina;
import br.usp.ime.academicdevoir.entidade.Turma;
import br.usp.ime.academicdevoir.infra.Criptografia;
import br.usp.ime.academicdevoir.infra.UsuarioSession;
import br.usp.ime.academicdevoir.util.Given;
public class AlunosControllerTeste {
/**
* @uml.property name="alunoC"
* @uml.associationEnd
*/
private AlunosController alunoC;
/**
* @uml.property name="result"
* @uml.associationEnd
*/
private MockResult result;
/**
* @uml.property name="alunoDao"
* @uml.associationEnd
*/
private AlunoDao alunoDao;
/**
* @uml.property name="turmaDao"
* @uml.associationEnd
*/
private TurmaDao turmaDao;
/**
* @uml.property name="disciplinaDao"
* @uml.associationEnd
*/
private DisciplinaDao disciplinaDao;
/**
* @uml.property name="usuarioSession"
* @uml.associationEnd readOnly="true"
*/
private UsuarioSession usuarioSession;
private Aluno aluno;
private Turma turma;
private Validator validator;
@Before
public void SetUp() {
result = spy(new MockResult());
validator = spy(new JSR303MockValidator());;
alunoDao = mock(AlunoDao.class);
disciplinaDao = mock(DisciplinaDao.class);
turmaDao = mock(TurmaDao.class);
usuarioSession = new UsuarioSession();
usuarioSession.setUsuario(Given.novoUsuario());
alunoC = new AlunosController(result, validator, alunoDao, disciplinaDao, turmaDao, usuarioSession);
aluno = Given.novoAluno();
turma = new Turma();
turma.setId(0L);
when(alunoDao.listaTudo()).thenReturn(new ArrayList<Aluno>());
when(alunoDao.carrega(aluno.getId())).thenReturn(aluno);
when(disciplinaDao.listaTudo()).thenReturn(new ArrayList<Disciplina>());
when(turmaDao.carrega(turma.getId())).thenReturn(turma);
}
@Test
public void listaDeAlunos() {
alunoC.lista();
List<Aluno> lista = result.included("listaDeAlunos");
assertNotNull(lista);
}
@Test
public void listaTurmas() {
alunoC.listaTurmas(this.aluno.getId());
Aluno aluno = result.included("aluno");
assertNotNull(aluno);
}
@Test
public void cadastraAluno() {
alunoC.cadastra(aluno);
verify(alunoDao).salvaAluno(aluno);
verify(result).redirectTo(AlunosController.class);
}
@Test
public void cadastraAlunoJaExistente() {
when(alunoDao.temDuplicidade(aluno.getLogin())).thenReturn(true);
alunoC.cadastra(aluno);
verify(result).include("ErrorDuplicidade", "Este login ja existe.");
verify(alunoDao, never()).salvaAluno(aluno);
verify(result).redirectTo(AlunosController.class);
}
@Test
public void alteracaoAluno() {
alunoC.alteracao(1l);
Aluno aluno = result.included("aluno");
assertNotNull(aluno);
}
@Test
public void atualizaAluno() {
String senhaCripto = new Criptografia().geraMd5("nova senha");
alunoC.altera(aluno.getId(), "novo nome", "novoemail@usp.br", "nova senha");
Assert.assertEquals(senhaCripto, aluno.getSenha());
verify(alunoDao).atualizaAluno(aluno);
verify(result).redirectTo(AlunosController.class);
}
@Test
public void atualizaAlunoSemMexerNaSenha() {
String senhaCripto = new Criptografia().geraMd5("senha");
aluno.setSenha(senhaCripto);
alunoC.altera(aluno.getId(), "novo nome", "novoemail@usp.br", "");
Assert.assertEquals(senhaCripto, aluno.getSenha());
verify(alunoDao).atualizaAluno(aluno);
verify(result).redirectTo(AlunosController.class);
}
@Test
public void removeAluno() {
alunoC.remove(1L);
verify(alunoDao).removeAluno(aluno);
verify(result).redirectTo(AlunosController.class);
}
@Test
public void naoDevematricular() {
alunoC.matricula();
List<Disciplina> lista = result.included("listaDeDisciplinas");
assertNull(lista);
}
@Test
public void testeInscreve() {
Calendar data = Calendar.getInstance();
data.setTimeInMillis(System.currentTimeMillis());
List<Integer> prazo = new ArrayList<Integer>();
prazo.add(data.get(Calendar.DAY_OF_MONTH + 1));
prazo.add(data.get(Calendar.MONTH) + 1);
prazo.add(data.get(Calendar.YEAR));
turma.setPrazoDeMatricula(prazo);
alunoC.inscreve(aluno.getId(), turma.getId());
verify(alunoDao).inscreve(aluno, turma);
verify(result).redirectTo(AlunosController.class);
}
@Test
public void testeRemoveMatricula() {
alunoC.removeMatricula(aluno.getId(), turma.getId());
verify(alunoDao).carrega(aluno.getId());
verify(turmaDao).carrega(turma.getId());
verify(alunoDao).removeMatricula(aluno, turma);
verify(result).redirectTo(AlunosController.class);
}
}