package br.usp.ime.academicdevoir.controller; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.any; import java.sql.Date; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import java.util.Random; import br.com.caelum.vraptor.validator.ValidationException; import org.junit.Before; import org.junit.Test; import br.com.caelum.vraptor.util.test.JSR303MockValidator; import br.com.caelum.vraptor.util.test.MockResult; import br.usp.ime.academicdevoir.dao.ListaDeExerciciosDao; import br.usp.ime.academicdevoir.dao.ListaDeRespostasDao; import br.usp.ime.academicdevoir.dao.ProfessorDao; import br.usp.ime.academicdevoir.dao.QuestaoDao; import br.usp.ime.academicdevoir.dao.TurmaDao; import br.usp.ime.academicdevoir.entidade.ListaDeExercicios; import br.usp.ime.academicdevoir.entidade.Professor; import br.usp.ime.academicdevoir.entidade.PropriedadesDaListaDeExercicios; import br.usp.ime.academicdevoir.entidade.QuestaoDaLista; import br.usp.ime.academicdevoir.entidade.QuestaoDeMultiplaEscolha; import br.usp.ime.academicdevoir.entidade.Turma; import br.usp.ime.academicdevoir.infra.Privilegio; import br.usp.ime.academicdevoir.infra.UsuarioSession; public class ListasDeExerciciosControllerTeste { /** * @uml.property name="listasDeExerciciosController" * @uml.associationEnd */ //@SuppressWarnings("unused") private ListasDeExerciciosController listasDeExerciciosController; /** * @uml.property name="result" * @uml.associationEnd */ private MockResult result; /** * @uml.property name="dao" * @uml.associationEnd */ private ListaDeExerciciosDao dao; /** * @uml.property name="dao" * @uml.associationEnd */ private ListaDeRespostasDao respostasDao; /** * @uml.property name="questaoDao" * @uml.associationEnd */ private QuestaoDao questaoDao; /** * @uml.property name="turmaDao" * @uml.associationEnd */ private TurmaDao turmaDao; /** * @uml.property name="validator" * @uml.associationEnd */ private JSR303MockValidator validator; /** * @uml.property name="listaDeExercicios" * @uml.associationEnd */ private ListaDeExercicios listaDeExercicios; /** * @uml.property name="prazoDeEntrega" * @uml.associationEnd multiplicity="(0 -1)" elementType="java.lang.Integer" */ private PropriedadesDaListaDeExercicios propriedadesDaListaDeExercicios; private List<Integer> prazoDeEntrega; /** * @uml.property name="prazoProvisorio" * @uml.associationEnd multiplicity="(0 -1)" elementType="java.lang.Integer" */ private Calendar prazoProvisorio = Calendar.getInstance(); /** * @uml.property name="questao" * @uml.associationEnd */ private QuestaoDeMultiplaEscolha questao; /** * @uml.property name="turma" * @uml.associationEnd */ private Turma turma; /** * @uml.property name="professorDao" * @uml.associationEnd readOnly="true" */ private ProfessorDao professorDao; /** * @uml.property name="usuarioLogado" * @uml.associationEnd readOnly="true" */ private UsuarioSession usuarioSession; private ArrayList<Turma> turmas; @Before public void SetUp() { Professor professor = new Professor(); professor.setId(0L); professor.setPrivilegio(Privilegio.ADMINISTRADOR); usuarioSession = new UsuarioSession(); usuarioSession.setUsuario(professor); result = spy(new MockResult()); dao = mock(ListaDeExerciciosDao.class); respostasDao = mock(ListaDeRespostasDao.class); questaoDao = mock(QuestaoDao.class); professorDao = mock(ProfessorDao.class); turmaDao = mock(TurmaDao.class); validator = spy(new JSR303MockValidator()); listasDeExerciciosController = new ListasDeExerciciosController(result, dao, respostasDao, questaoDao, professorDao, turmaDao, validator, usuarioSession); listaDeExercicios = new ListaDeExercicios(); listaDeExercicios.setId(0L); propriedadesDaListaDeExercicios = new PropriedadesDaListaDeExercicios(); Calendar prazoProvisorio = Calendar.getInstance(); prazoProvisorio.setTimeInMillis(System.currentTimeMillis()); prazoDeEntrega = new ArrayList<Integer>(); prazoDeEntrega.add(prazoProvisorio.get(Calendar.DAY_OF_MONTH)); prazoDeEntrega.add(prazoProvisorio.get(Calendar.MONTH) + 1); prazoDeEntrega.add(prazoProvisorio.get(Calendar.YEAR)); prazoDeEntrega.add(prazoProvisorio.get(Calendar.HOUR_OF_DAY)); questao = new QuestaoDeMultiplaEscolha(); questao.setId(0L); turma = new Turma(); turma.setId(0L); turmas = new ArrayList<Turma>(); turmas.add(turma); professor.setTurmas(turmas); when(dao.carrega(listaDeExercicios.getId())).thenReturn( listaDeExercicios); when(dao.listaTudo()).thenReturn(new ArrayList<ListaDeExercicios>()); when(questaoDao.carrega(questao.getId())).thenReturn(questao); when(professorDao.carrega(professor.getId())).thenReturn(professor); when(turmaDao.carrega(turma.getId())).thenReturn(turma); } private void prazoFuturo(List<Integer> prazoDeEntrega) { prazoDeEntrega.add(prazoProvisorio.get(Calendar.MINUTE) + 1 + new Random().nextInt(100000)); } private Date prazoFuturo() { Date prazoDeEntrega = new Date(System.currentTimeMillis() + 1L + (long) (new Random().nextInt(1000000)) ); return prazoDeEntrega; } private void prazoPassado(List<Integer> prazoDeEntrega) { prazoDeEntrega.add(prazoProvisorio.get(Calendar.MINUTE) - new Random().nextInt(100000)); } @Test public void testeCadastra() { prazoFuturo(prazoDeEntrega); listasDeExerciciosController.cadastra(propriedadesDaListaDeExercicios, prazoDeEntrega, turma.getId()); verify(validator).validate(propriedadesDaListaDeExercicios); verify(validator).onErrorUsePageOf(listasDeExerciciosController); verify(dao).salva(any(ListaDeExercicios.class)); verify(result).redirectTo(listasDeExerciciosController); } @Test(expected = ValidationException.class) public void testeNaoDeveCadastrarQuestaoComPrazoPassado() { prazoPassado(prazoDeEntrega); listasDeExerciciosController.cadastra(propriedadesDaListaDeExercicios, prazoDeEntrega, turma.getId()); verify(validator).validate(propriedadesDaListaDeExercicios); verify(validator).onErrorUsePageOf(listasDeExerciciosController); } @Test public void testeVerListaIncluiListaEDataEmResult() { Date prazoDeEntrega = prazoFuturo(); propriedadesDaListaDeExercicios.setPrazoDeEntrega(prazoDeEntrega); listaDeExercicios.setPropriedades(propriedadesDaListaDeExercicios); listaDeExercicios.setQuestoes(new ArrayList<QuestaoDaLista>()); listasDeExerciciosController.verLista(listaDeExercicios.getId()); ListaDeExercicios lista = result.included("listaDeExercicios"); String prazo = result.included("prazo"); List<Turma> turmas = result.included("turmasDoProfessor"); assertNotNull(lista); assertNotNull(prazo); assertNotNull(turmas); } @Test public void testeAlteracao() { Date prazoDeEntrega = prazoFuturo(); propriedadesDaListaDeExercicios.setPrazoDeEntrega(prazoDeEntrega); listaDeExercicios.setPropriedades(propriedadesDaListaDeExercicios); listasDeExerciciosController.alteracao(listaDeExercicios.getId()); ListaDeExercicios lista = result.included("listaDeExercicios"); List<Integer> prazo = result.included("prazo"); assertNotNull(lista); assertNotNull(prazo); } @Test public void testeAltera() { prazoFuturo(prazoDeEntrega); listasDeExerciciosController.altera(listaDeExercicios,propriedadesDaListaDeExercicios, prazoDeEntrega); verify(validator).validate(listaDeExercicios); verify(validator).onErrorUsePageOf(ListasDeExerciciosController.class); verify(dao).atualiza(listaDeExercicios); verify(result).redirectTo(listasDeExerciciosController); } @Test(expected = ValidationException.class) public void testeNaoDeveAlterarQuestaoComPrazoPassado() { prazoPassado(prazoDeEntrega); listasDeExerciciosController.altera(listaDeExercicios,propriedadesDaListaDeExercicios, prazoDeEntrega); verify(validator).validate(listaDeExercicios); verify(validator).onErrorUsePageOf(ListasDeExerciciosController.class); verify(dao).atualiza(listaDeExercicios); verify(result).redirectTo(listasDeExerciciosController); } @Test public void testeRemove() { listasDeExerciciosController.remove(listaDeExercicios.getId()); verify(dao).remove(listaDeExercicios); verify(result).redirectTo(listasDeExerciciosController); } @Test public void testeIncluiQuestao() { listaDeExercicios.setQuestoes(new ArrayList<QuestaoDaLista>()); listasDeExerciciosController.incluiQuestao(listaDeExercicios, questao.getId(), 1); assertEquals(questao, listaDeExercicios.getQuestoes().get(0) .getQuestao()); verify(dao).atualiza(listaDeExercicios); verify(result).redirectTo(listasDeExerciciosController); } // @Test // public void testeTrocaQuestao() { // List<QuestaoDaLista> questoesDaLista = new ArrayList<QuestaoDaLista>(); // questoesDaLista.add(new QuestaoDaLista()); // listaDeExercicios.setQuestoes(questoesDaLista); // listasDeExerciciosController.trocaQuestao(listaDeExercicios.getId(), 0, questao.getId(), 0); // // assertEquals(questao, listaDeExercicios.getQuestoes().get(0) // .getQuestao()); // verify(dao).atualiza(listaDeExercicios); // verify(result).redirectTo(listasDeExerciciosController); // } @Test(expected = IndexOutOfBoundsException.class) public void testeRemoveQuestao() { QuestaoDaLista questao0 = new QuestaoDaLista(); questao0.setOrdem(1); QuestaoDaLista questao1 = new QuestaoDaLista(); questao1.setOrdem(2); List<QuestaoDaLista> questoesDaLista = new ArrayList<QuestaoDaLista>(); questoesDaLista.add(questao0); questoesDaLista.add(questao1); listaDeExercicios.setQuestoes(questoesDaLista); int numeroInicialDeQuestoes = listaDeExercicios.getQuestoes().size(); listasDeExerciciosController.removeQuestao(listaDeExercicios.getId(), 0); assertEquals(questao1, listaDeExercicios.getQuestoes().get(0)); listaDeExercicios.getQuestoes().get(numeroInicialDeQuestoes); verify(dao).atualiza(listaDeExercicios); verify(result).redirectTo(listasDeExerciciosController); } @Test public void testeCadastro() { listasDeExerciciosController.cadastro(); List<Turma> turmas = result.included("turmasDoProfessor"); assertNotNull(turmas); } @Test public void testeLista() { listasDeExerciciosController.lista(); List<ListaDeExercicios> listaDeListas = result.included("listaDeListas"); assertNotNull(listaDeListas); } @Test public void testeListasTurma() { listasDeExerciciosController.listasTurma(this.turma.getId()); List<ListaDeExercicios> listaDeListas = result.included("listaDeListas"); assertNotNull(listaDeListas); } //TODO Teste para Autocorreção }