Subversion Repositories Integrator Subversion

Rev

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

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

import static br.gov.al.saude.test.ConstantesTestHelper.CargoConstantes.DESCRICAO_CARGO_ASSISTENTE_ADMINISTRATIVO;
import static br.gov.al.saude.test.ConstantesTestHelper.CargoConstantes.QUANTIDADE_VAGAS_50;
import static br.gov.al.saude.test.ConstantesTestHelper.CargoConstantes.SEQUENCIAL_CARGO_13;
import static br.gov.al.saude.test.ConstantesTestHelper.GrauInstrucaoConstantes.SEQUENCIAL_GRAU_INSTRUCAO_6;

import java.util.ArrayList;
import java.util.List;

import org.jmock.Expectations;
import org.junit.Before;
import org.junit.Test;

import br.gov.al.saude.framework.core.consulta.restricao.Restricoes;
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.VerificadorUtil;
import br.gov.al.saude.framework.core.validador.Validador;
import br.gov.al.saude.srv.core.domain.cargo.CargoService;
import br.gov.al.saude.srv.core.domain.cargo.impl.CargoServiceImpl;
import br.gov.al.saude.srv.core.infrastructure.persistence.jpa.cargo.CargoRepository;
import br.gov.al.saude.srv.core.infrastructure.persistence.jpa.servidor.ServidorRepository;
import br.gov.al.saude.srv.model.Cargo;
import br.gov.al.saude.srv.model.dto.CargoDTO;
import br.gov.al.saude.srv.model.dto.ParametroConsultaCargoDTO;
import br.gov.al.saude.test.builder.CargoBuilder;
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;

public class CargoServiceImplTest extends ServiceImplTest<Cargo> {

        private CargoService cargoService;
        private CargoRepository cargoRepositoryMock;
        private ServidorRepository servidorRepositoryMock;
        private Cargo cargo;
       
        @Before
        public void inicializarContexto() {
                cargoRepositoryMock = getContexto().mock(CargoRepository.class);
                validadorMock = getContexto().mock(Validador.class);
                servidorRepositoryMock = getContexto().mock(ServidorRepository.class);
                cargoService = new CargoServiceImpl(validadorMock, cargoRepositoryMock, servidorRepositoryMock);
                cargo = new CargoBuilder().comDescricao(DESCRICAO_CARGO_ASSISTENTE_ADMINISTRATIVO)
                                .comGrauInstrucao(SEQUENCIAL_GRAU_INSTRUCAO_6)
                                .comQuantidadeDeVagas(QUANTIDADE_VAGAS_50)
                                .comAtivo("SIM")
                                .build();
                setEntidade(cargo);
        }
       
        @Override
        protected GenericService<Cargo> getService() {
                return cargoService;
        }

        @Override
        protected GenericRepository<Cargo> getRepositoryMock() {
                return cargoRepositoryMock;
        }
       
        @Override
        protected void expectativasDeNegocioFuncionalidadeCadastrar() {
                getContexto().checking(new Expectations(){{
                        oneOf(cargoRepositoryMock).consultarPassandoRestricoes(with(getEntidade()),
                                with(any(Integer.class)), with(any(Integer.class)), with(gerarRestricoesParaVerificacaoDeCargoJaCadastrado(getEntidade())));
                        will(returnValue(new ArrayList<Cargo>()));
                }});
        }
       
        @Override
        protected void expectativasDeNegocioFuncionalidadeAlterar() {
                getContexto().checking(new Expectations(){{
                        oneOf(cargoRepositoryMock).consultarPassandoRestricoes(with(getEntidade()),
                                with(any(Integer.class)), with(any(Integer.class)), with(gerarRestricoesParaVerificacaoDeCargoJaCadastrado(getEntidade())));
                        will(returnValue(new ArrayList<Cargo>()));
                        ignoring(servidorRepositoryMock).consultarSeExisteDadoFuncionalPassandoRestricoes(with(gerarListraRestricoesConsultarDadoFuncionalPorCargo(getEntidade())));
                        ignoring(servidorRepositoryMock).consultarSeExisteDadoFuncionalPassandoRestricoes(with(gerarListraRestricoesConsultarDadoFuncionalPorCargoCarreira(getEntidade())));
                }});
        }
       
        @Test
        public void aoConsultarDeveriaDelegarParaOhRepositorio() throws Exception {
                getContexto().checking(new Expectations(){{
                        oneOf(cargoRepositoryMock).consultar(with(any(ParametroConsultaCargoDTO.class)));
                        will(returnValue(new ArrayList<Cargo>()));
                }});
               
                cargoService.consultar(new ParametroConsultaCargoDTO());
        }
       
        @Test
        public void aoObterQuantideRegistrosConsultarCargosAtivosDeveriaDelegarParaOhRepositorio() throws Exception {
                getContexto().checking(new Expectations(){{
                        oneOf(cargoRepositoryMock).obterQuantideRegistrosConsultarCargosAtivos(with(any(ParametroConsultaCargoDTO.class)));
                }});
               
                cargoService.obterQuantideRegistrosConsultarCargosAtivos(new ParametroConsultaCargoDTO());
        }

        @Test
        public void aoConsultarCargosAtivosDeveriaDelegarParaOhRepositorio() throws Exception {
                getContexto().checking(new Expectations(){{
                        oneOf(cargoRepositoryMock).consultarCargosAtivos(with(any(ParametroConsultaCargoDTO.class)));
                        will(returnValue(new ArrayList<CargoDTO>()));
                }});
               
                cargoService.consultarCargosAtivos(new ParametroConsultaCargoDTO());
        }

        @Test
        public void aoObterQuantidadeRegistrosDeveriaDelegarParaOhRepositorio() throws Exception {
                getContexto().checking(new Expectations(){{
                        oneOf(cargoRepositoryMock).obterQuantidadeDeRegistros(with(any(ParametroConsultaCargoDTO.class)));
                }});
               
                cargoService.obterQuantidadeDeRegistros(new ParametroConsultaCargoDTO());
        }
       
        @Test
        public void aoCadastrarDeveriaDelegarParaOhRepositorioConsultarPassandoRestricoes() throws Exception {
                getContexto().checking(new Expectations(){{
                        ignoring(getValidadorMock()).validar(with(getEntidade()), with(new Class<?>[]{Cadastrar.class}));
                        oneOf(cargoRepositoryMock).consultarPassandoRestricoes(with(getEntidade()),
                                with(any(Integer.class)), with(any(Integer.class)), with(gerarRestricoesParaVerificacaoDeCargoJaCadastrado(getEntidade())));
                        will(returnValue(new ArrayList<Cargo>()));
                        ignoring(getRepositoryMock()).cadastrar(with(getEntidade()));
                }});
               
                getService().cadastrar(getEntidade());
        }
       
        @Test
        public void aoCadastrarCargoJaCadastradoDeveriaLancarExcecao() throws Exception {
                final List<Cargo> listaCargos = new ArrayList<Cargo>();
                listaCargos.add(new Cargo());

                getContexto().checking(new Expectations(){{
                        ignoring(getValidadorMock()).validar(with(getEntidade()), with(new Class<?>[]{Cadastrar.class}));
                        oneOf(cargoRepositoryMock).consultarPassandoRestricoes(with(getEntidade()),
                                with(any(Integer.class)), with(any(Integer.class)), with(gerarRestricoesParaVerificacaoDeCargoJaCadastrado(getEntidade())));
                        will(returnValue(listaCargos));
                        never(getRepositoryMock()).cadastrar(with(getEntidade()));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                cargoService.cadastrar(getEntidade());
                        }

                }, "Cargo já cadastrado.");
        }
       
        @Test
        public void aoAlterarDeveriaDelegarParaOhRepositorioConsultarPassandoRestricoes() throws Exception {
                getContexto().checking(new Expectations(){{
                        ignoring(getValidadorMock()).validar(with(getEntidade()), with(new Class<?>[]{Alterar.class}));
                        oneOf(cargoRepositoryMock).consultarPassandoRestricoes(with(getEntidade()),
                                with(any(Integer.class)), with(any(Integer.class)), with(gerarRestricoesParaVerificacaoDeCargoJaCadastrado(getEntidade())));
                        will(returnValue(new ArrayList<Cargo>()));
                        ignoring(servidorRepositoryMock).consultarSeExisteDadoFuncionalPassandoRestricoes(with(gerarListraRestricoesConsultarDadoFuncionalPorCargo(getEntidade())));
                        ignoring(servidorRepositoryMock).consultarSeExisteDadoFuncionalPassandoRestricoes(with(gerarListraRestricoesConsultarDadoFuncionalPorCargoCarreira(getEntidade())));
                        ignoring(getRepositoryMock()).alterar(with(getEntidade()));
                }});
               
                getService().alterar(getEntidade());
        }
       
        @Test
        public void aoAlterarCargoParaJaCadastradoDeveriaLancarExcecao() throws Exception {
                final List<Cargo> listaCargos = new ArrayList<Cargo>();
                listaCargos.add(new Cargo());
                getEntidade().setCodigo(new Integer(SEQUENCIAL_CARGO_13));

                getContexto().checking(new Expectations(){{
                        ignoring(getValidadorMock()).validar(with(getEntidade()), with(new Class<?>[]{Alterar.class}));
                        oneOf(cargoRepositoryMock).consultarPassandoRestricoes(with(getEntidade()),
                                with(any(Integer.class)), with(any(Integer.class)), with(gerarRestricoesParaVerificacaoDeCargoJaCadastrado(getEntidade())));
                        will(returnValue(listaCargos));
                        never(servidorRepositoryMock).consultarSeExisteDadoFuncionalPassandoRestricoes(with(gerarListraRestricoesConsultarDadoFuncionalPorCargo(getEntidade())));
                        never(servidorRepositoryMock).consultarSeExisteDadoFuncionalPassandoRestricoes(with(gerarListraRestricoesConsultarDadoFuncionalPorCargoCarreira(getEntidade())));
                        never(getRepositoryMock()).alterar(with(getEntidade()));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                cargoService.alterar(getEntidade());
                        }

                }, "Cargo já cadastrado.");
        }
       
        @Test
        public void aoAlterarCargoInativoDeveriaDelegarParaOhServidorRepositorioConsultarDadoFuncionalPassandoRestricoes() throws Exception {
                getEntidade().setAtivo(false);
               
                getContexto().checking(new Expectations(){{
                        ignoring(getValidadorMock()).validar(with(getEntidade()), with(new Class<?>[]{Alterar.class}));
                        ignoring(cargoRepositoryMock).consultarPassandoRestricoes(with(getEntidade()),
                                with(any(Integer.class)), with(any(Integer.class)), with(gerarRestricoesParaVerificacaoDeCargoJaCadastrado(getEntidade())));
                        will(returnValue(new ArrayList<Cargo>()));
                        oneOf(servidorRepositoryMock).consultarSeExisteDadoFuncionalPassandoRestricoes(with(gerarListraRestricoesConsultarDadoFuncionalPorCargo(getEntidade())));
                        will(returnValue(false));
                        oneOf(servidorRepositoryMock).consultarSeExisteDadoFuncionalPassandoRestricoes(with(gerarListraRestricoesConsultarDadoFuncionalPorCargoCarreira(getEntidade())));
                        will(returnValue(false));
                        ignoring(getRepositoryMock()).alterar(with(getEntidade()));
                }});
               
                getService().alterar(getEntidade());
        }
       
        @Test
        public void aoAlterarCargoInativoComDadoFuncionalComCargoVinculadoDeveriaLancarExcecao() throws Exception {
                getEntidade().setAtivo(false);
               
                getContexto().checking(new Expectations(){{
                        ignoring(getValidadorMock()).validar(with(getEntidade()), with(new Class<?>[]{Alterar.class}));
                        ignoring(cargoRepositoryMock).consultarPassandoRestricoes(with(getEntidade()),
                                with(any(Integer.class)), with(any(Integer.class)), with(gerarRestricoesParaVerificacaoDeCargoJaCadastrado(getEntidade())));
                        will(returnValue(new ArrayList<Cargo>()));
                        oneOf(servidorRepositoryMock).consultarSeExisteDadoFuncionalPassandoRestricoes(with(gerarListraRestricoesConsultarDadoFuncionalPorCargo(getEntidade())));
                        will(returnValue(true));
                        never(servidorRepositoryMock).consultarSeExisteDadoFuncionalPassandoRestricoes(with(gerarListraRestricoesConsultarDadoFuncionalPorCargoCarreira(getEntidade())));
                        never(getRepositoryMock()).alterar(with(getEntidade()));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                getService().alterar(getEntidade());
                        }

                }, "Não é possível inativar cargo que possua dado funcional de servidor vinculado.");
        }
       
        @Test
        public void aoAlterarCargoInativoComDadoFuncionalComCargoCarreiraVinculadoDeveriaLancarExcecao() throws Exception {
                getEntidade().setAtivo(false);
               
                getContexto().checking(new Expectations(){{
                        ignoring(getValidadorMock()).validar(with(getEntidade()), with(new Class<?>[]{Alterar.class}));
                        ignoring(cargoRepositoryMock).consultarPassandoRestricoes(with(getEntidade()),
                                with(any(Integer.class)), with(any(Integer.class)), with(gerarRestricoesParaVerificacaoDeCargoJaCadastrado(getEntidade())));
                        will(returnValue(new ArrayList<Cargo>()));
                        oneOf(servidorRepositoryMock).consultarSeExisteDadoFuncionalPassandoRestricoes(with(gerarListraRestricoesConsultarDadoFuncionalPorCargo(getEntidade())));
                        will(returnValue(false));
                        oneOf(servidorRepositoryMock).consultarSeExisteDadoFuncionalPassandoRestricoes(with(gerarListraRestricoesConsultarDadoFuncionalPorCargoCarreira(getEntidade())));
                        will(returnValue(true));
                        never(getRepositoryMock()).alterar(with(getEntidade()));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                getService().alterar(getEntidade());
                        }

                }, "Não é possível inativar cargo que possua dado funcional de servidor vinculado.");
        }
       
        private List<Restricoes> gerarRestricoesParaVerificacaoDeCargoJaCadastrado(Cargo entidade) {
                List<Restricoes> restricoes = new ArrayList<Restricoes>();
                adicionarRestricaoDiferenteDeCasoEntidadePossuaCodigo(entidade, restricoes);
                adicionarRestricaoIgualParaDescricao(entidade, restricoes);
                return restricoes;
        }

        private void adicionarRestricaoIgualParaDescricao(Cargo entidade, List<Restricoes> restricoes) {
                restricoes.add(Restricoes.igualIgnorandoAcentuacao("descricao", entidade.getDescricao()));
        }

        private void adicionarRestricaoDiferenteDeCasoEntidadePossuaCodigo(Cargo entidade, List<Restricoes> restricoes) {
                if (VerificadorUtil.naoEstaNulo(entidade.getCodigo())) {
                        restricoes.add(Restricoes.diferenteDe("codigo", entidade.getCodigo()));
                }
        }
       
        private List<Restricoes> gerarListraRestricoesConsultarDadoFuncionalPorCargo(Cargo entidade) {
                List<Restricoes> restricoes = new ArrayList<Restricoes>();
                restricoes.add(Restricoes.igual("cargo", entidade));
                return restricoes;
        }
       
        private List<Restricoes> gerarListraRestricoesConsultarDadoFuncionalPorCargoCarreira(Cargo entidade) {
                List<Restricoes> restricoes = new ArrayList<Restricoes>();
                restricoes.add(Restricoes.igual("cargoCarreira", entidade));
                return restricoes;
        }

}