Subversion Repositories Integrator Subversion

Rev

Blame | Last modification | View Log | Download | RSS feed

package br.gov.al.saude.rhd.core.domain;

import static br.gov.al.saude.test.ConstantesTestHelper.CronogramaConstantes.ANO_2012;
import static br.gov.al.saude.test.ConstantesTestHelper.CronogramaEtapaConstantes.DATA_FINAL_01_06_2013;
import static br.gov.al.saude.test.ConstantesTestHelper.CronogramaEtapaConstantes.DATA_INICIAL_01_01_2013;
import static br.gov.al.saude.test.ConstantesTestHelper.CronogramaEtapaConstantes.DATA_INICIAL_01_03_2013;
import static br.gov.al.saude.test.ConstantesTestHelper.EtapaConstantes.SEQUENCIAL_ETAPA_1;
import static br.gov.al.saude.test.ConstantesTestHelper.EtapaConstantes.SEQUENCIAL_ETAPA_3;

import java.util.ArrayList;
import java.util.HashSet;

import org.jmock.Expectations;
import org.jmock.integration.junit4.JMock;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import br.gov.al.saude.framework.core.exception.NegocioException;
import br.gov.al.saude.framework.core.generic.GenericRepository;
import br.gov.al.saude.framework.core.generic.GenericService;
import br.gov.al.saude.framework.core.interfaces.Alterar;
import br.gov.al.saude.framework.core.interfaces.Cadastrar;
import br.gov.al.saude.framework.core.util.DataUtils;
import br.gov.al.saude.framework.core.validador.Validador;
import br.gov.al.saude.rhd.core.domain.cronograma.CronogramaService;
import br.gov.al.saude.rhd.core.domain.cronograma.impl.CronogramaServiceImpl;
import br.gov.al.saude.rhd.core.infrastructure.persistence.jpa.CronogramaRepository;
import br.gov.al.saude.rhd.model.Cronograma;
import br.gov.al.saude.rhd.model.CronogramaEtapa;
import br.gov.al.saude.rhd.model.Etapa;
import br.gov.al.saude.rhd.model.dto.PeriodoDTO;
import br.gov.al.saude.sca.model.usuario.view.UsuarioView;
import br.gov.al.saude.test.builder.CronogramaBuilder;
import br.gov.al.saude.test.builder.CronogramaEtapaBuilder;
import br.gov.al.saude.test.builder.EtapaBuilder;
import br.gov.al.saude.test.unidade.generic.service.ServiceImplTest;
import br.gov.al.saude.test.util.CommandSemMensagem;
import br.gov.al.saude.test.util.VerificadorLancamentoException;

/**
 * @author Anderson Gomes
 * @since 10/05/2013
 */

@RunWith(JMock.class)
public class CronogramaServiceImplTest extends ServiceImplTest<Cronograma> {
       
        private static final String MENSAGEM_O_CRONOGRAMA_INFORMADO_JA_EXISTE = "O cronograma informado já existe.";
        private static final String MENSAGEM_UM_CRONOGRAMA_DEVERA_TER_NO_MINIMO_UMA_ETAPA_VINCULADA = "Um cronograma deverá ter, no mínimo, uma etapa vinculada.";
        private static final String MENSAGEM_A_DATA_INICIAL_NAO_PODE_SER_POSTERIOR_A_DATA_FINAL = "A data inicial não pode ser posterior a data final.";
        private static final String MENSAGEM_OBRIGATORIO_INFORMAR_A_DATA_FINAL_DA_ETAPA = "Obrigatório informar a data final da etapa";
        private static final String MENSAGEM_OBRIGATORIO_INFORMAR_A_DATA_INICIAL_DA_ETAPA = "Obrigatório informar a data inicial da etapa";
        private static final String MENSAGEM_OBRIGATORIO_INFORMAR_O_ANO = "Obrigatório informar o ano";
        private static final String MENSAGEM_ETAPA_JA_VINCULADA_AO_CRONOGRAMA = "A etapa já está vinculada ao cronograma.";
        private static final String MENSAGEM_EXISTE_CRONOGRAMA_PERIODO_INFORMADO = "Já existe um cronograma vigente no período informado.";

        private static final String DATA_INICIO_02_01_2013 = "02/01/2013";
        private static final String DATA_INICIO_19_01_2013 = "19/01/2013";
        private static final String DATA_INICIO_20_01_2013 = "20/01/2013";
        private static final String DATA_INICIO_21_01_2013 = "21/01/2013";
        private static final String DATA_FINAL_20_01_2013 = "20/01/2013";
        private static final String DATA_FINAL_21_01_2013 = "21/01/2013";
        private static final String DATA_FINAL_26_02_2013 = "26/02/2013";
       
        private CronogramaService cronogramaService;
        private CronogramaRepository cronogramaRepositoryMock;
        private Cronograma cronograma;
        private Etapa etapa;
        private CronogramaEtapa cronogramaEtapa;
       
        @Before
        public void inicializarContexto() {
                super.inicializarContexto();
                cronogramaRepositoryMock = getContexto().mock(CronogramaRepository.class);
                validadorMock = getContexto().mock(Validador.class);
                cronogramaService = new CronogramaServiceImpl(validadorMock, cronogramaRepositoryMock);
                cronograma = new CronogramaBuilder().comNumeroAno(ANO_2012).build();
                etapa = new EtapaBuilder().comCodigo(SEQUENCIAL_ETAPA_1).build();
                cronogramaEtapa = new CronogramaEtapaBuilder()
                                                          .comEtapa(etapa)
                                                          .comCronograma(cronograma)
                                                          .comDataInicialEtapa(DATA_INICIO_20_01_2013)
                                                          .comDataFinalEtapa(DATA_FINAL_21_01_2013)
                                                          .build();
                cronograma.adicionarCronogramaEtapa(cronogramaEtapa);
                setEntidade(cronograma);
        }

        @Override
        protected GenericService<Cronograma> getService() {
                return cronogramaService;
        }

        @Override
        protected GenericRepository<Cronograma> getRepositoryMock() {
                return cronogramaRepositoryMock;
        }
       
        @Test
        public void aoConsultarCronogramaPorNumeroAnoDeveriaDelegarParaOhRepositorio() throws Exception {
                getContexto().checking(new Expectations(){{
                        oneOf(cronogramaRepositoryMock).consultarCronogramaPorNumeroAno(with(new Long(ANO_2012)));
                        will(returnValue(new ArrayList<Cronograma>()));
                }});
               
                cronogramaService.consultarCronogramaPorNumeroAno(new Long(ANO_2012));
        }

        @Test
        public void aoCadastrarCronogramaComParametroAnoNaoInformadoDeveriaLancarExcecao() throws Exception {
                preencherCronogramaSemInformarOhAnoDoCronograma();

                getContexto().checking(new Expectations(){{
                        oneOf(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Cadastrar.class}));
                        will(throwException(new NegocioException(MENSAGEM_OBRIGATORIO_INFORMAR_O_ANO)));
                        never(cronogramaRepositoryMock).cadastrar(with(same(getEntidade())));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                cronogramaService.cadastrar(cronograma);
                        }
                }, MENSAGEM_OBRIGATORIO_INFORMAR_O_ANO);
        }

        @Test
        public void aoCadastrarCronogramaComParametroDataInicialDaEtapaNaoForInformadaDeveriaLancarExcecao() throws Exception {
                preencherCronogramaSemInformarAhDataInicialDaEtapa();

                getContexto().checking(new Expectations(){{
                        oneOf(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Cadastrar.class}));
                        will(throwException(new NegocioException(MENSAGEM_OBRIGATORIO_INFORMAR_A_DATA_INICIAL_DA_ETAPA)));
                        never(cronogramaRepositoryMock).cadastrar(with(same(getEntidade())));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                cronogramaService.cadastrar(cronograma);
                        }
                }, MENSAGEM_OBRIGATORIO_INFORMAR_A_DATA_INICIAL_DA_ETAPA);
        }

        @Test
        public void aoCadastrarCronogramaComParametroDataFinalDaEtapaNaoForInformadaDeveriaLancarExcecao() throws Exception {
                preencherCronogramaSemInformarAhDataFinalDaEtapa();

                getContexto().checking(new Expectations(){{
                        oneOf(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Cadastrar.class}));
                        will(throwException(new NegocioException(MENSAGEM_OBRIGATORIO_INFORMAR_A_DATA_FINAL_DA_ETAPA)));
                        never(cronogramaRepositoryMock).cadastrar(with(same(getEntidade())));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                cronogramaService.cadastrar(cronograma);
                        }
                }, MENSAGEM_OBRIGATORIO_INFORMAR_A_DATA_FINAL_DA_ETAPA);
        }

        @Test
        public void aoCadastrarCronogramaComDataInicialPosteriorAhDataFinalDaEtapaDeveriaLancarExcecao() throws Exception {
                preencherCronogramaComDataInicialPosteriorAhDataFinalDaEtapa();

                getContexto().checking(new Expectations(){{
                        oneOf(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Cadastrar.class}));
                        will(throwException(new NegocioException(MENSAGEM_A_DATA_INICIAL_NAO_PODE_SER_POSTERIOR_A_DATA_FINAL)));
                        never(cronogramaRepositoryMock).cadastrar(with(same(getEntidade())));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                cronogramaService.cadastrar(cronograma);
                        }
                }, MENSAGEM_A_DATA_INICIAL_NAO_PODE_SER_POSTERIOR_A_DATA_FINAL);
        }

        @Test
        public void aoCadastrarCronogramaComNenhumaEtapaVinculadaDeveriaLancarExcecao() throws Exception {
                preencherCronogramaComNenhumaEtapaVinculada();
               
                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Cadastrar.class}));
                        never(cronogramaRepositoryMock).cadastrar(with(same(getEntidade())));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                cronogramaService.cadastrar(cronograma);
                        }
                }, MENSAGEM_UM_CRONOGRAMA_DEVERA_TER_NO_MINIMO_UMA_ETAPA_VINCULADA);
        }

        @Test
        public void aoCadastrarCronogramaComCronogramaJaExistenteDeveriaLancarExcecao() throws Exception {
               
                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Cadastrar.class}));
                        ignoring(cronogramaRepositoryMock).consultarPeriodoDeVigenciaDasEtapasCadastradas(with(any(Cronograma.class)));
                        oneOf(cronogramaRepositoryMock).consultarPorId(with(same(getEntidade())));
                        will(returnValue(new Cronograma()));
                        never(cronogramaRepositoryMock).cadastrar(with(same(getEntidade())));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                cronogramaService.cadastrar(cronograma);
                        }
                }, MENSAGEM_O_CRONOGRAMA_INFORMADO_JA_EXISTE);
        }
       
        @Test
        public void aoCadastrarCronogramaComEtapaJaVinculadaDuasVezesDeveriaLancarExcecao() throws Exception {
                preencherCronogramaComDuasEtapasDeIdIguais();

                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Cadastrar.class}));
                        never(cronogramaRepositoryMock).cadastrar(with(same(getEntidade())));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                cronogramaService.cadastrar(cronograma);
                        }
                }, MENSAGEM_ETAPA_JA_VINCULADA_AO_CRONOGRAMA);
        }
       
        @Test
        public void aoCadastrarCronogramaComCronogramaVigenteNoPeriodoDeveriaLancarExcecao() throws Exception {
                final PeriodoDTO periodo = new PeriodoDTO();
                periodo.setDataInicial(DataUtils.converterStringParaData(DATA_INICIO_19_01_2013));
                periodo.setDataFinal(DataUtils.converterStringParaData(DATA_FINAL_21_01_2013));
               
                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Cadastrar.class}));
                        ignoring(cronogramaRepositoryMock).consultarPorId(with(same(getEntidade())));
                        will(returnValue(null));
                        oneOf(cronogramaRepositoryMock).consultarPeriodoDeVigenciaDasEtapasCadastradas(with(any(Cronograma.class)));
                        will(returnValue(periodo));
                        never(cronogramaRepositoryMock).cadastrar(with(same(getEntidade())));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                cronogramaService.cadastrar(cronograma);
                        }
                }, MENSAGEM_EXISTE_CRONOGRAMA_PERIODO_INFORMADO);
        }
       
        @Test
        public void aoCadastrarCronogramaComDataInicialProximoCronogramaAntesDataFinalCronogramaAhCadastrarDeveriaLancarExcecao() throws Exception {
                final PeriodoDTO periodo = new PeriodoDTO();
                periodo.setDataFinal(DataUtils.converterStringParaData(DATA_FINAL_20_01_2013));
               
                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Cadastrar.class}));
                        ignoring(cronogramaRepositoryMock).consultarPorId(with(same(getEntidade())));
                        will(returnValue(null));
                        oneOf(cronogramaRepositoryMock).consultarPeriodoDeVigenciaDasEtapasCadastradas(with(any(Cronograma.class)));
                        will(returnValue(periodo));
                        never(cronogramaRepositoryMock).cadastrar(with(same(getEntidade())));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                cronogramaService.cadastrar(cronograma);
                        }
                }, MENSAGEM_EXISTE_CRONOGRAMA_PERIODO_INFORMADO);
        }
       
        @Test
        public void aoCadastrarCronogramaComDataInicialProximoCronogramaIgualAhDataFinalCronogramaAhCadastrarDeveriaLancarExcecao() throws Exception {
                final PeriodoDTO periodo = new PeriodoDTO();
                periodo.setDataFinal(DataUtils.converterStringParaData(DATA_FINAL_21_01_2013));
               
                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Cadastrar.class}));
                        ignoring(cronogramaRepositoryMock).consultarPorId(with(same(getEntidade())));
                        will(returnValue(null));
                        oneOf(cronogramaRepositoryMock).consultarPeriodoDeVigenciaDasEtapasCadastradas(with(any(Cronograma.class)));
                        will(returnValue(periodo));
                        never(cronogramaRepositoryMock).cadastrar(with(same(getEntidade())));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                cronogramaService.cadastrar(cronograma);
                        }
                }, MENSAGEM_EXISTE_CRONOGRAMA_PERIODO_INFORMADO);
        }
       
        @Test
        public void aoCadastrarCronogramaComDataInicialProximoCronogramaAposDataFinalCronogramaAhCadastrarDeveriaDelegarParaOhRepositorio() throws Exception {
                final PeriodoDTO periodo = new PeriodoDTO();
                periodo.setDataFinal(DataUtils.converterStringParaData(DATA_FINAL_26_02_2013));
                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Cadastrar.class}));
                        ignoring(cronogramaRepositoryMock).consultarPorId(with(same(getEntidade())));
                        will(returnValue(null));
                        oneOf(cronogramaRepositoryMock).consultarPeriodoDeVigenciaDasEtapasCadastradas(with(any(Cronograma.class)));
                        will(returnValue(periodo));
                        oneOf(cronogramaRepositoryMock).cadastrar(with(same(getEntidade())));
                }});
               
                cronogramaService.cadastrar(cronograma);
        }
       
        @Test
        public void aoCadastrarCronogramaComDataInicialProximoCronogramaNulaDeveriaDelegarParaOhRepositorio() throws Exception {
                final PeriodoDTO periodo = new PeriodoDTO();
                periodo.setDataFinal(null);
                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Cadastrar.class}));
                        ignoring(cronogramaRepositoryMock).consultarPorId(with(same(getEntidade())));
                        will(returnValue(null));
                        oneOf(cronogramaRepositoryMock).consultarPeriodoDeVigenciaDasEtapasCadastradas(with(any(Cronograma.class)));
                        will(returnValue(periodo));
                        oneOf(cronogramaRepositoryMock).cadastrar(with(same(getEntidade())));
                }});
               
                cronogramaService.cadastrar(cronograma);
        }
       
        @Test
        public void aoCadastrarCronogramaComDataFinalCronogramaAnteriorAposDataInicialCronogramaAhCadastrarDeveriaLancarExcecao() throws Exception {
                final PeriodoDTO periodo = new PeriodoDTO();
                periodo.setDataInicial(DataUtils.converterStringParaData(DATA_INICIO_21_01_2013));
                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Cadastrar.class}));
                        ignoring(cronogramaRepositoryMock).consultarPorId(with(same(getEntidade())));
                        will(returnValue(null));
                        oneOf(cronogramaRepositoryMock).consultarPeriodoDeVigenciaDasEtapasCadastradas(with(any(Cronograma.class)));
                        will(returnValue(periodo));
                        never(cronogramaRepositoryMock).cadastrar(with(same(getEntidade())));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                cronogramaService.cadastrar(cronograma);
                        }
                }, MENSAGEM_EXISTE_CRONOGRAMA_PERIODO_INFORMADO);
        }
       
        @Test
        public void aoCadastrarCronogramaComDataFinalCronogramaAnteriorIgualAhDataInicialCronogramaAhCadastrarDeveriaLancarExcecao() throws Exception {
                final PeriodoDTO periodo = new PeriodoDTO();
                periodo.setDataInicial(DataUtils.converterStringParaData(DATA_INICIO_20_01_2013));
                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Cadastrar.class}));
                        ignoring(cronogramaRepositoryMock).consultarPorId(with(same(getEntidade())));
                        will(returnValue(null));
                        oneOf(cronogramaRepositoryMock).consultarPeriodoDeVigenciaDasEtapasCadastradas(with(any(Cronograma.class)));
                        will(returnValue(periodo));
                        never(cronogramaRepositoryMock).cadastrar(with(same(getEntidade())));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                cronogramaService.cadastrar(cronograma);
                        }
                }, MENSAGEM_EXISTE_CRONOGRAMA_PERIODO_INFORMADO);
        }
       
        @Test
        public void aoCadastrarCronogramaComDataFinalCronogramaAnteriorAntesDataInicialCronogramaAhCadastrarDeveriaDelegarParaOhRepositorio() throws Exception {
                final PeriodoDTO periodo = new PeriodoDTO();
                periodo.setDataInicial(DataUtils.converterStringParaData(DATA_INICIO_02_01_2013));
               
                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Cadastrar.class}));
                        ignoring(cronogramaRepositoryMock).consultarPorId(with(same(getEntidade())));
                        will(returnValue(null));
                        oneOf(cronogramaRepositoryMock).consultarPeriodoDeVigenciaDasEtapasCadastradas(with(any(Cronograma.class)));
                        will(returnValue(periodo));
                        oneOf(cronogramaRepositoryMock).cadastrar(with(same(getEntidade())));
                }});
               
                cronogramaService.cadastrar(cronograma);
        }
       
        @Test
        public void aoCadastrarCronogramaComDataFinalCronogramaAnteriorNulaDeveriaDelegarParaRepositorio() throws Exception {
                Etapa etapa2 = new EtapaBuilder().comCodigo(SEQUENCIAL_ETAPA_3).build();
                getEntidade().adicionarCronogramaEtapa(new CronogramaEtapaBuilder()
                                                                                                   .comCronogramaEtapaId(SEQUENCIAL_ETAPA_3, ANO_2012)
                                                                                                   .comEtapa(etapa2).comCronograma(getEntidade())
                                                                                                   .comDataInicialEtapa(DATA_INICIAL_01_01_2013)
                                                                                                   .comDataFinalEtapa(DATA_FINAL_26_02_2013)
                                                                                                   .build());
                final PeriodoDTO periodo = new PeriodoDTO();
                periodo.setDataInicial(null);
                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Cadastrar.class}));
                        ignoring(cronogramaRepositoryMock).consultarPorId(with(same(getEntidade())));
                        will(returnValue(null));
                        oneOf(cronogramaRepositoryMock).consultarPeriodoDeVigenciaDasEtapasCadastradas(with(any(Cronograma.class)));
                        will(returnValue(periodo));
                        oneOf(cronogramaRepositoryMock).cadastrar(with(same(getEntidade())));
                }});
               
                cronogramaService.cadastrar(cronograma);
        }

        @Test
        public void aoAlterarCronogramaInserindoHistoricoDeveriaDelegarParaOhValidadorComContextoAlterar() throws Exception {
                getContexto().checking(new Expectations(){{
                        oneOf(validadorMock).validar(with(any(Cronograma.class)), with(new Class<?>[]{Alterar.class}));
                        ignoring(cronogramaRepositoryMock).consultarPeriodoDeVigenciaDasEtapasCadastradas(with(any(Cronograma.class)));
                        will(returnValue(null));
                        ignoring(cronogramaRepositoryMock).inserirHistorico(with(same(cronograma)), with(any(UsuarioView.class)));
                        ignoring(cronogramaRepositoryMock).alterar(with(same(cronograma)));
                }});
                cronogramaService.alterarCronogramaInserindoHistorico(cronograma, new UsuarioView());
        }

        @Test
        public void aoAlterarCronogramaInserindoHistoricoQuandoParametroDataInicialDaEtapaNaoForInformadaDeveriaLancarExcecao() throws Exception {
                getContexto().checking(new Expectations(){{
                        oneOf(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Alterar.class}));
                        will(throwException(new NegocioException(MENSAGEM_OBRIGATORIO_INFORMAR_A_DATA_INICIAL_DA_ETAPA)));
                        never(cronogramaRepositoryMock).alterar(cronograma);
                }});
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                cronogramaService.alterarCronogramaInserindoHistorico(cronograma, new UsuarioView());
                        }
                }, MENSAGEM_OBRIGATORIO_INFORMAR_A_DATA_INICIAL_DA_ETAPA);
        }

        @Test
        public void aoAlterarCronogramaInserindoHistoricoQuandoParametroDataFinalDaEtapaNaoForInformadaDeveriaLancarExcecao() throws Exception {
                getContexto().checking(new Expectations(){{
                        oneOf(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Alterar.class}));
                        will(throwException(new NegocioException(MENSAGEM_OBRIGATORIO_INFORMAR_A_DATA_FINAL_DA_ETAPA)));
                        never(cronogramaRepositoryMock).alterar(cronograma);
                }});
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                cronogramaService.alterarCronogramaInserindoHistorico(cronograma, new UsuarioView());
                        }
                }, MENSAGEM_OBRIGATORIO_INFORMAR_A_DATA_FINAL_DA_ETAPA);
        }
       
        @Test
        public void aoAlterarCronogramaInserindoHistoricoComDataInicialPosteriorAhDataFinalDaEtapaDeveriaLancarExcecao() throws Exception {
                preencherCronogramaComDataInicialPosteriorAhDataFinalDaEtapa();
               
                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Alterar.class}));
                        never(cronogramaRepositoryMock).alterar(cronograma);
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                cronogramaService.alterarCronogramaInserindoHistorico(cronograma, new UsuarioView());
                        }
                }, MENSAGEM_A_DATA_INICIAL_NAO_PODE_SER_POSTERIOR_A_DATA_FINAL);
        }
       
        @Test
        public void aoAlterarCronogramaInserindoHistoricoComNenhumaEtapaVinculadaDeveriaLancarExcecao() throws Exception {
                preencherCronogramaComNenhumaEtapaVinculada();
               
                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Alterar.class}));
                        never(cronogramaRepositoryMock).cadastrar(with(same(getEntidade())));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                cronogramaService.alterar(cronograma);
                        }
                }, MENSAGEM_UM_CRONOGRAMA_DEVERA_TER_NO_MINIMO_UMA_ETAPA_VINCULADA);
        }
       
        @Test
        public void aoAlterarCronogramaInserindoHistoricoDeveriaDelegarOhAlterarParaOhRepositorio() throws Exception {
                getContexto().checking(new Expectations(){{
                        ignoring(getValidadorMock()).validar(with(same(getEntidade())), with(new Class<?>[]{Alterar.class}));
                        ignoring(cronogramaRepositoryMock).consultarPeriodoDeVigenciaDasEtapasCadastradas(with(any(Cronograma.class)));
                        oneOf(cronogramaRepositoryMock).inserirHistorico(with(same(cronograma)), with(any(UsuarioView.class)));
                        oneOf(cronogramaRepositoryMock).alterar(with(same(cronograma)));
                }});
                cronogramaService.alterarCronogramaInserindoHistorico(cronograma, new UsuarioView());
        }
       
        @Test
        public void aoAlterarCronogramaComEtapaJaVinculadaDuasVezesDeveriaLancarExcecao() throws Exception {
                preencherCronogramaComDuasEtapasDeIdIguais();
                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Alterar.class}));
                        never(cronogramaRepositoryMock).alterar(with(same(getEntidade())));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                cronogramaService.alterar(cronograma);
                        }
                }, MENSAGEM_ETAPA_JA_VINCULADA_AO_CRONOGRAMA);
        }
       
        @Test
        public void aoAlterarCronogramaComCronogramaVigenteNoPeriodoDeveriaLancarExcecao() throws Exception {
                final PeriodoDTO periodo = new PeriodoDTO();
                periodo.setDataInicial(DataUtils.converterStringParaData(DATA_INICIO_19_01_2013));
                periodo.setDataFinal(DataUtils.converterStringParaData(DATA_FINAL_21_01_2013));
               
                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Alterar.class}));
                        oneOf(cronogramaRepositoryMock).consultarPeriodoDeVigenciaDasEtapasCadastradas(with(any(Cronograma.class)));
                        will(returnValue(periodo));
                        never(cronogramaRepositoryMock).alterar(with(same(getEntidade())));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                cronogramaService.alterar(cronograma);
                        }
                }, MENSAGEM_EXISTE_CRONOGRAMA_PERIODO_INFORMADO);
        }
       
        @Test
        public void aoAlterarCronogramaComDataInicialProximoCronogramaAntesDataFinalCronogramaAhCadastrarDeveriaLancarExcecao() throws Exception {
                final PeriodoDTO periodo = new PeriodoDTO();
                periodo.setDataFinal(DataUtils.converterStringParaData(DATA_FINAL_20_01_2013));
                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Alterar.class}));
                        oneOf(cronogramaRepositoryMock).consultarPeriodoDeVigenciaDasEtapasCadastradas(with(any(Cronograma.class)));
                        will(returnValue(periodo));
                        never(cronogramaRepositoryMock).alterar(with(same(getEntidade())));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                cronogramaService.alterar(cronograma);
                        }
                }, MENSAGEM_EXISTE_CRONOGRAMA_PERIODO_INFORMADO);
        }
       
        @Test
        public void aoAlterarCronogramaComDataInicialProximoCronogramaIgualAhDataFinalCronogramaAhCadastrarDeveriaLancarExcecao() throws Exception {
                final PeriodoDTO periodo = new PeriodoDTO();
                periodo.setDataFinal(DataUtils.converterStringParaData(DATA_FINAL_21_01_2013));
                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Alterar.class}));
                        oneOf(cronogramaRepositoryMock).consultarPeriodoDeVigenciaDasEtapasCadastradas(with(any(Cronograma.class)));
                        will(returnValue(periodo));
                        never(cronogramaRepositoryMock).alterar(with(same(getEntidade())));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                cronogramaService.alterar(cronograma);
                        }
                }, MENSAGEM_EXISTE_CRONOGRAMA_PERIODO_INFORMADO);
        }
       
        @Test
        public void aoAlterarCronogramaComDataInicialProximoCronogramaAposDataFinalCronogramaAhCadastrarDeveriaDelegarParaOhRepositorio() throws Exception {
                Etapa etapa2 = new EtapaBuilder().comCodigo(SEQUENCIAL_ETAPA_3).build();
                getEntidade().adicionarCronogramaEtapa(new CronogramaEtapaBuilder()
                                                                                                   .comCronogramaEtapaId(SEQUENCIAL_ETAPA_3, ANO_2012)
                                                                                                   .comEtapa(etapa2).comCronograma(getEntidade())
                                                                                                   .comDataInicialEtapa(DATA_INICIAL_01_01_2013)
                                                                                                   .comDataFinalEtapa(DATA_FINAL_26_02_2013)
                                                                                                   .build());
                final PeriodoDTO periodo = new PeriodoDTO();
                periodo.setDataFinal(DataUtils.converterStringParaData(DATA_FINAL_01_06_2013));
                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Alterar.class}));
                        oneOf(cronogramaRepositoryMock).consultarPeriodoDeVigenciaDasEtapasCadastradas(with(any(Cronograma.class)));
                        will(returnValue(periodo));
                        oneOf(cronogramaRepositoryMock).alterar(with(same(getEntidade())));
                }});
                cronogramaService.alterar(getEntidade());
        }
       
        @Test
        public void aoAlterarCronogramaComDataInicialProximoCronogramaNulaDeveriaDelegarParaOhRepositorio() throws Exception {
                final PeriodoDTO periodo = new PeriodoDTO();
                periodo.setDataFinal(null);
                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(same(getEntidade())), with(new Class<?>[]{Alterar.class}));
                        oneOf(cronogramaRepositoryMock).consultarPeriodoDeVigenciaDasEtapasCadastradas(with(any(Cronograma.class)));
                        will(returnValue(periodo));
                        oneOf(cronogramaRepositoryMock).alterar(with(same(getEntidade())));
                }});
               
                cronogramaService.alterar(cronograma);
        }
                       
       
        @Test
        public void aoConsultarCronogramaCorrenteDeveriaDelegarParaOhRepositorio() throws Exception {
                getContexto().checking(new Expectations(){{
                        oneOf(cronogramaRepositoryMock).consultarCronogramaCorrente();
                        will(returnValue(new Cronograma()));
                }});
               
                cronogramaService.consultarCronogramaCorrente();
        }
       
        @Override
        protected void expectativasDeNegocioFuncionalidadeCadastrar() {
                getContexto().checking(new Expectations(){{
                        ignoring(cronogramaRepositoryMock).consultarPeriodoDeVigenciaDasEtapasCadastradas(with(any(Cronograma.class)));
                        ignoring(getRepositoryMock()).consultarPorId(with(same(getEntidade())));
                        will(returnValue(null));
                }});
        }
       
        @Override
        protected void expectativasDeNegocioFuncionalidadeAlterar() {
                getContexto().checking(new Expectations(){{
                        ignoring(cronogramaRepositoryMock).consultarPeriodoDeVigenciaDasEtapasCadastradas(with(any(Cronograma.class)));
                        ignoring(getRepositoryMock()).consultarPorId(with(same(getEntidade())));
                        will(returnValue(null));
                }});
        }
       
        private void preencherCronogramaSemInformarOhAnoDoCronograma() {
                cronograma.setNumeroAno(null);
                cronograma.adicionarCronogramaEtapa(new CronogramaEtapaBuilder().comEtapa(etapa).comCronograma(cronograma).comDataInicialEtapa(DATA_INICIAL_01_01_2013).build());
        }

        private void preencherCronogramaSemInformarAhDataInicialDaEtapa() {
                cronograma.setCronogramaEtapas(null);
                cronograma.setNumeroAno(new Long(ANO_2012));
                cronograma.adicionarCronogramaEtapa(new CronogramaEtapaBuilder().comEtapa(etapa).comCronograma(cronograma).comDataFinalEtapa(DATA_FINAL_01_06_2013).build());
        }

        private void preencherCronogramaSemInformarAhDataFinalDaEtapa() {
                cronograma.setCronogramaEtapas(null);
                cronograma.setNumeroAno(new Long(ANO_2012));
                cronograma.adicionarCronogramaEtapa(new CronogramaEtapaBuilder().comEtapa(etapa).comCronograma(cronograma).comDataInicialEtapa(DATA_INICIAL_01_01_2013).build());
        }

        private void preencherCronogramaComDataInicialPosteriorAhDataFinalDaEtapa() {
                cronograma.setCronogramaEtapas(null);
                cronograma.setNumeroAno(new Long(ANO_2012));
                cronograma.adicionarCronogramaEtapa(new CronogramaEtapaBuilder().comEtapa(etapa).comCronograma(cronograma).comDataInicialEtapa(DATA_FINAL_01_06_2013).comDataFinalEtapa(DATA_INICIAL_01_01_2013).build());
        }
       
        private void preencherCronogramaComDuasEtapasDeIdIguais() {
                cronograma.setCronogramaEtapas(null);
                cronograma.setNumeroAno(new Long(ANO_2012));
                Etapa etapa1 = new EtapaBuilder().comCodigo(SEQUENCIAL_ETAPA_1).build();
                Etapa etapa2 = new EtapaBuilder().comCodigo(SEQUENCIAL_ETAPA_1).build();
                cronograma.adicionarCronogramaEtapa(new CronogramaEtapaBuilder().comEtapa(etapa1).comCronograma(cronograma).comDataInicialEtapa(DATA_INICIAL_01_01_2013).comDataFinalEtapa(DATA_FINAL_01_06_2013).build());
                cronograma.adicionarCronogramaEtapa(new CronogramaEtapaBuilder().comEtapa(etapa2).comCronograma(cronograma).comDataInicialEtapa(DATA_INICIAL_01_03_2013).comDataFinalEtapa(DATA_FINAL_01_06_2013).build());
        }

        private void preencherCronogramaComNenhumaEtapaVinculada() {
                cronograma.setCronogramaEtapas(new HashSet<CronogramaEtapa>());
        }

}