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.ATIVO_NAO;
import static br.gov.al.saude.test.ConstantesTestHelper.ATIVO_SIM;
import static br.gov.al.saude.test.ConstantesTestHelper.FuncaoConstantes.DESCRICAO_FUNCAO_ASSESSOR_TECNICO;
import static br.gov.al.saude.test.ConstantesTestHelper.FuncaoConstantes.NIVEL_GTR7;
import static br.gov.al.saude.test.ConstantesTestHelper.FuncaoConstantes.QUANTIDADE_VAGAS_2;
import static br.gov.al.saude.test.ConstantesTestHelper.FuncaoConstantes.QUANTIDADE_VAGAS_NAO_INFORMADA;
import static br.gov.al.saude.test.ConstantesTestHelper.FuncaoConstantes.SEQUENCIAL_FUNCAO_CHEFE_13;
import static br.gov.al.saude.test.ConstantesTestHelper.FuncaoConstantes.TIPO_CARGO_COMISSIONADO_C;
import static br.gov.al.saude.test.ConstantesTestHelper.FuncaoConstantes.TIPO_FUNCAO_GRATIFICADA_F;
import static br.gov.al.saude.test.ConstantesTestHelper.MensagensRetorno.NAO_EH_POSSIVEL_INATIVAR_FUNCAO;

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.funcao.FuncaoService;
import br.gov.al.saude.srv.core.domain.funcao.impl.FuncaoServiceImpl;
import br.gov.al.saude.srv.core.infrastructure.persistence.jpa.funcao.FuncaoRepository;
import br.gov.al.saude.srv.core.infrastructure.persistence.jpa.servidor.ServidorRepository;
import br.gov.al.saude.srv.model.Funcao;
import br.gov.al.saude.srv.model.dto.ParametroConsultaFuncaoDTO;
import br.gov.al.saude.srv.model.enums.TipoFuncao;
import br.gov.al.saude.test.builder.FuncaoBuilder;
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 FuncaoServiceImplTest extends ServiceImplTest<Funcao> {

        private static final String OBRIGATÓRIO_INFORMAR_QUANTIDADE_DE_VAGAS = "Obrigatório informar quantidade de vagas.";
        private FuncaoService funcaoService;
        private FuncaoRepository funcaoRepositoryMock;
        private ServidorRepository servidorRepositoryMock;
        private ParametroConsultaFuncaoDTO parametroConsultaFuncaoDTO;
        private Funcao funcao;
        private List<Funcao> funcoes;
       
        @Before
        public void inicializarContexto() {
                funcaoRepositoryMock = getContexto().mock(FuncaoRepository.class);
                servidorRepositoryMock = getContexto().mock(ServidorRepository.class);
                validadorMock = getContexto().mock(Validador.class);
                funcaoService = new FuncaoServiceImpl(validadorMock, funcaoRepositoryMock, servidorRepositoryMock);
                parametroConsultaFuncaoDTO = new ParametroConsultaFuncaoDTO(DESCRICAO_FUNCAO_ASSESSOR_TECNICO, NIVEL_GTR7, TipoFuncao.FUNCAO_GRATIFICADA, true,0, Integer.MAX_VALUE);
                funcao = new FuncaoBuilder()
                        .comDescricao(DESCRICAO_FUNCAO_ASSESSOR_TECNICO)
                        .comNivel(NIVEL_GTR7)
                        .comTipoFuncao(TIPO_FUNCAO_GRATIFICADA_F)
                        .comQuantidadeVagas(QUANTIDADE_VAGAS_NAO_INFORMADA)
                        .comAtivo(ATIVO_NAO)
                        .build();
                setEntidade(funcao);
                funcoes = new ArrayList<Funcao>();
                funcoes.add(funcao);
        }
       
        @Override
        protected GenericService<Funcao> getService() {
                return funcaoService;
        }

        @Override
        protected GenericRepository<Funcao> getRepositoryMock() {
                return funcaoRepositoryMock;
        }
       
        @Test
        public void aoConsultarFuncaoDeveriaDelegarParaOhRepositorio() {
                getContexto().checking(new Expectations(){{
                        oneOf(funcaoRepositoryMock).consultar(parametroConsultaFuncaoDTO);
                }});

                ((FuncaoService) getService()).consultar(parametroConsultaFuncaoDTO);
        }
       
        @Test
        public void aoObterQuantideRegistrosConsultarFuncoesAtivasDeveriaDelegarParaOhRepositorio() {
                getContexto().checking(new Expectations(){{
                        oneOf(funcaoRepositoryMock).obterQuantideRegistrosConsultarFuncoesAtivas(parametroConsultaFuncaoDTO);
                }});

                funcaoService.obterQuantideRegistrosConsultarFuncoesAtivas(parametroConsultaFuncaoDTO);
        }
       
        @Test
        public void aoConsultarFuncoesAtivasDeveriaDelegarParaOhRepositorio() {
                getContexto().checking(new Expectations(){{
                        oneOf(funcaoRepositoryMock).consultarFuncoesAtivas(parametroConsultaFuncaoDTO);
                }});

                funcaoService.consultarFuncoesAtivas(parametroConsultaFuncaoDTO);
        }
       
        @Test
        public void aoObterQuantidadeDeRegistrosDeveriaDelegarParaOhRepositorio() {
                getContexto().checking(new Expectations(){{
                        oneOf(funcaoRepositoryMock).obterQuantidadeDeRegistros(parametroConsultaFuncaoDTO);
                }});

                funcaoService.obterQuantidadeDeRegistros(parametroConsultaFuncaoDTO);
        }

        @Test
        public void aoCadastrarFuncaoCargoComissionadoSemQuantidadeDeVagasDeveriaLancarExcecao() throws Exception {
                final Funcao funcaoAssessor = new FuncaoBuilder()
                        .comDescricao(DESCRICAO_FUNCAO_ASSESSOR_TECNICO)
                        .comNivel(NIVEL_GTR7)
                        .comTipoFuncao(TIPO_CARGO_COMISSIONADO_C)
                        .comQuantidadeVagas(QUANTIDADE_VAGAS_NAO_INFORMADA)
                        .build();
               
                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(funcaoAssessor), with(new Class<?>[]{Cadastrar.class}));
                        ignoring(funcaoRepositoryMock).consultarPassandoRestricoes(with(funcaoAssessor),
                                with(any(Integer.class)), with(any(Integer.class)), with(gerarRestricoesParaVerificacaoDeNivelJaCadastrado(funcaoAssessor)));
                        never(getRepositoryMock()).cadastrar(with(getEntidade()));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                funcaoService.cadastrar(funcaoAssessor);
                        }

                }, OBRIGATÓRIO_INFORMAR_QUANTIDADE_DE_VAGAS);
        }
       
        @Test
        public void aoCadastrarFuncaoCargoGratificadaComQuantidadeDeVagasDeveriaLancarExcecao() throws Exception {
                final Funcao funcaoAssessor = new FuncaoBuilder()
                        .comDescricao(DESCRICAO_FUNCAO_ASSESSOR_TECNICO)
                        .comNivel(NIVEL_GTR7)
                        .comTipoFuncao(TIPO_FUNCAO_GRATIFICADA_F)
                        .comQuantidadeVagas(QUANTIDADE_VAGAS_2)
                        .build();
               
                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(funcaoAssessor), with(new Class<?>[]{Cadastrar.class}));
                        ignoring(funcaoRepositoryMock).consultarPassandoRestricoes(with(funcaoAssessor),
                                with(any(Integer.class)), with(any(Integer.class)), with(gerarRestricoesParaVerificacaoDeNivelJaCadastrado(funcaoAssessor)));
                        never(getRepositoryMock()).cadastrar(with(getEntidade()));
                        oneOf(funcaoRepositoryMock).cadastrar(with(getEntidade()));
                }});
               
                        funcaoService.cadastrar(funcaoAssessor);
        }
       
        @Test
        public void aoCadastrarFuncaoCargoGratificadaSemQuantidadeDeVagasDeveriaLancarExcecao() throws Exception {
                final Funcao funcaoAssessor = new FuncaoBuilder()
                        .comDescricao(DESCRICAO_FUNCAO_ASSESSOR_TECNICO)
                        .comNivel(NIVEL_GTR7)
                        .comTipoFuncao(TIPO_FUNCAO_GRATIFICADA_F)
                        .comQuantidadeVagas(QUANTIDADE_VAGAS_NAO_INFORMADA)
                        .build();
               
                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(funcaoAssessor), with(new Class<?>[]{Cadastrar.class}));
                        ignoring(funcaoRepositoryMock).consultarPassandoRestricoes(with(funcaoAssessor),
                                with(any(Integer.class)), with(any(Integer.class)), with(gerarRestricoesParaVerificacaoDeNivelJaCadastrado(funcaoAssessor)));
                        never(getRepositoryMock()).cadastrar(with(getEntidade()));
                        oneOf(funcaoRepositoryMock).cadastrar(with(getEntidade()));
                }});
               
                        funcaoService.cadastrar(funcaoAssessor);
        }
       
        @Test
        public void aoCadastrarFuncaoDeveriaDelegarParaOhRepositorioConsultarFuncaoPorNivel() throws Exception {
                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(funcao), with(new Class<?>[]{Cadastrar.class}));
                        oneOf(funcaoRepositoryMock).consultarPassandoRestricoes(with(getEntidade()),
                                with(any(Integer.class)), with(any(Integer.class)), with(gerarRestricoesParaVerificacaoDeNivelJaCadastrado(getEntidade())));
                        will(returnValue(null));
                        ignoring(getRepositoryMock()).cadastrar(with(getEntidade()));
                }});
               
                funcaoService.cadastrar(funcao);
        }
       
        @Test
        public void aoCadastrarFuncaoComNivelJaCadastradoDeveriaLancarExcessao() throws Exception {
                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(funcao), with(new Class<?>[]{Cadastrar.class}));
                        oneOf(funcaoRepositoryMock).consultarPassandoRestricoes(with(getEntidade()),
                                with(any(Integer.class)), with(any(Integer.class)), with(gerarRestricoesParaVerificacaoDeNivelJaCadastrado(getEntidade())));
                        will(returnValue(funcoes));
                        never(getRepositoryMock()).cadastrar(with(getEntidade()));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                funcaoService.cadastrar(funcao);
                        }

                }, "Nível já cadastrado.");
        }
       
        @Test
        public void aoAlterarFuncaoCargoComissionadoSemQuantidadeDeVagasDeveriaLancarExcecao() throws Exception {
                final Funcao funcaoAssessor = new FuncaoBuilder()
                        .comCodigo(SEQUENCIAL_FUNCAO_CHEFE_13)
                        .comDescricao(DESCRICAO_FUNCAO_ASSESSOR_TECNICO)
                        .comNivel(NIVEL_GTR7)
                        .comTipoFuncao(TIPO_CARGO_COMISSIONADO_C)
                        .comQuantidadeVagas(QUANTIDADE_VAGAS_NAO_INFORMADA)
                        .comAtivo(ATIVO_SIM)
                        .build();

                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(funcaoAssessor), with(new Class<?>[]{Alterar.class}));
                        ignoring(funcaoRepositoryMock).consultarPassandoRestricoes(with(funcaoAssessor),
                                with(any(Integer.class)), with(any(Integer.class)), with(gerarRestricoesParaVerificacaoDeNivelJaCadastrado(funcaoAssessor)));
                        ignoring(servidorRepositoryMock).consultarSeExisteDadoFuncionalPassandoRestricoes(with(gerarListaRestricoesConsultaDadoFuncionalPorFuncao()));
                        never(getRepositoryMock()).alterar(with(getEntidade()));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                funcaoService.alterar(funcaoAssessor);
                        }

                }, OBRIGATÓRIO_INFORMAR_QUANTIDADE_DE_VAGAS);
        }
       
        @Test
        public void aoAlterarFuncaoDeveriaDelegarParaOhRepositorioConsultarFuncaoPorNivel() throws Exception {
                getEntidade().setCodigo(new Integer(SEQUENCIAL_FUNCAO_CHEFE_13));
                getEntidade().setAtivo(true);

                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(funcao), with(new Class<?>[]{Alterar.class}));
                        oneOf(funcaoRepositoryMock).consultarPassandoRestricoes(with(getEntidade()),
                                with(any(Integer.class)), with(any(Integer.class)), with(gerarRestricoesParaVerificacaoDeNivelJaCadastrado(getEntidade())));
                        will(returnValue(null));
                        ignoring(servidorRepositoryMock).consultarSeExisteDadoFuncionalPassandoRestricoes(with(gerarListaRestricoesConsultaDadoFuncionalPorFuncao()));
                        ignoring(getRepositoryMock()).alterar(with(getEntidade()));
                }});
               
                funcaoService.alterar(funcao);
        }
       
        @Test
        public void aoAlterarFuncaoComNivelJaCadastradoDeveriaLancarExcecao() throws Exception {
                getEntidade().setCodigo(new Integer(SEQUENCIAL_FUNCAO_CHEFE_13));

                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(funcao), with(new Class<?>[]{Alterar.class}));
                        oneOf(funcaoRepositoryMock).consultarPassandoRestricoes(with(getEntidade()),
                                with(any(Integer.class)), with(any(Integer.class)), with(gerarRestricoesParaVerificacaoDeNivelJaCadastrado(getEntidade())));
                        will(returnValue(funcoes));
                        ignoring(servidorRepositoryMock).consultarSeExisteDadoFuncionalPassandoRestricoes(with(gerarListaRestricoesConsultaDadoFuncionalPorFuncao()));
                        never(getRepositoryMock()).alterar(with(getEntidade()));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                funcaoService.alterar(funcao);
                        }

                }, "Nível já cadastrado.");
        }
       
        @Test
        public void aoAlterarFuncaoComoInativaComFuncaoVinculadaAhServidorDadoFuncionalDeveriaLancarExcecao() throws Exception {
                getEntidade().setCodigo(new Integer(SEQUENCIAL_FUNCAO_CHEFE_13));
                getEntidade().setAtivo(false);

                getContexto().checking(new Expectations(){{
                        ignoring(validadorMock).validar(with(funcao), with(new Class<?>[]{Alterar.class}));
                        ignoring(funcaoRepositoryMock).consultarPassandoRestricoes(with(getEntidade()), with(any(Integer.class)), with(any(Integer.class)),
                                        with(gerarRestricoesParaVerificacaoDeNivelJaCadastrado(getEntidade())));
                        oneOf(servidorRepositoryMock).consultarSeExisteDadoFuncionalPassandoRestricoes(with(gerarListaRestricoesConsultaDadoFuncionalPorFuncao()));
                        will(returnValue(true));
                        never(getRepositoryMock()).alterar(with(getEntidade()));
                }});
               
                VerificadorLancamentoException.verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem() {
                        @Override
                        public void execute() throws Exception {
                                funcaoService.alterar(funcao);
                        }

                }, NAO_EH_POSSIVEL_INATIVAR_FUNCAO);
        }
       
        @Override
        protected void expectativasDeNegocioFuncionalidadeCadastrar() {
                getContexto().checking(new Expectations(){{
                        oneOf(funcaoRepositoryMock).consultarPassandoRestricoes(with(getEntidade()),
                                with(any(Integer.class)), with(any(Integer.class)), with(gerarRestricoesParaVerificacaoDeNivelJaCadastrado(getEntidade())));
                        will(returnValue(new ArrayList<Funcao>()));
                }});
        }
       
        @Override
        protected void expectativasDeNegocioFuncionalidadeAlterar() {
                getContexto().checking(new Expectations(){{
                        oneOf(funcaoRepositoryMock).consultarPassandoRestricoes(with(getEntidade()),
                                with(any(Integer.class)), with(any(Integer.class)), with(gerarRestricoesParaVerificacaoDeNivelJaCadastrado(getEntidade())));
                        will(returnValue(new ArrayList<Funcao>()));
                        oneOf(servidorRepositoryMock).consultarSeExisteDadoFuncionalPassandoRestricoes(with(gerarListaRestricoesConsultaDadoFuncionalPorFuncao()));
                        will(returnValue(false));
                }});
        }
       
        private List<Restricoes> gerarRestricoesParaVerificacaoDeNivelJaCadastrado(Funcao entidade) {
                List<Restricoes> restricoes = new ArrayList<Restricoes>();
                adicionarRestricaoDiferenteDeCasoEntidadePossuaCodigo(entidade, restricoes);
                adicionarRestricaoIgualParaNivel(entidade, restricoes);
                return restricoes;
        }
       
        private void adicionarRestricaoIgualParaNivel(Funcao entidade, List<Restricoes> restricoes) {
                restricoes.add(Restricoes.igual("nivel", entidade.getNivel()));
        }

        private void adicionarRestricaoDiferenteDeCasoEntidadePossuaCodigo(Funcao entidade, List<Restricoes> restricoes) {
                if (VerificadorUtil.naoEstaNulo(entidade.getCodigo())) {
                        restricoes.add(Restricoes.diferenteDe("codigo", entidade.getCodigo()));
                }
        }
       
        private List<Restricoes> gerarListaRestricoesConsultaDadoFuncionalPorFuncao() {
                List<Restricoes> restricoes = new ArrayList<Restricoes>();
                restricoes.add(Restricoes.igual("funcao", getEntidade()));
                return restricoes;
        }

}