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