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
;
}
}