package br.gov.al.saude.srv.core.domain;
import static br.gov.al.saude.test.ConstantesTestHelper.MensagensRetorno.CODIGO_ORGAO_JA_CADASTRADO;
import static br.gov.al.saude.test.ConstantesTestHelper.MensagensRetorno.DESCRICAO_ORGAO_JA_CADASTRADA;
import static br.gov.al.saude.test.ConstantesTestHelper.MensagensRetorno.NAO_EH_POSSIVEL_INATIVAR_ORGAO_VINCULADO_A_UNIDADE_ATIVA;
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.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.validador.Validador;
import br.gov.al.saude.srv.core.domain.orgao.OrgaoService;
import br.gov.al.saude.srv.core.domain.orgao.impl.OrgaoServiceImpl;
import br.gov.al.saude.srv.core.infrastructure.persistence.jpa.orgao.OrgaoRepository;
import br.gov.al.saude.srv.core.infrastructure.persistence.jpa.unidade.UnidadeRepository;
import br.gov.al.saude.srv.model.Orgao;
import br.gov.al.saude.srv.model.Unidade;
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 OrgaoServiceImplTest
extends ServiceImplTest
<Orgao
> {
private OrgaoService orgaoService
;
private OrgaoRepository orgaoRepositoryMock
;
private UnidadeRepository unidadeRepositoryMock
;
private Orgao getOrgao
() {
Orgao orgao =
new Orgao
();
orgao.
setSequencial(1);
orgao.
setCodigoOrgao(1500);
orgao.
setDescricao("SECRETARIA DE ALAGOAS");
orgao.
setEsfera("E");
orgao.
setSigla("SAL");
orgao.
setAtivo(false);
return orgao
;
}
private List<Unidade
> getUnidadeAtivas
() {
List<Unidade
> unidadesAtiva =
new ArrayList<Unidade
>();
return unidadesAtiva
;
}
@Before
public void inicializarContexto
() {
orgaoRepositoryMock = getContexto
().
mock(OrgaoRepository.
class);
unidadeRepositoryMock = getContexto
().
mock(UnidadeRepository.
class);
validadorMock = getContexto
().
mock(Validador.
class);
orgaoService =
new OrgaoServiceImpl
(validadorMock, orgaoRepositoryMock, unidadeRepositoryMock
);
Orgao orgao =
new Orgao
();
orgao.
setAtivo(true);
setEntidade
(orgao
);
}
@
Override
protected GenericService
<Orgao
> getService
() {
return orgaoService
;
}
@
Override
protected void expectativasDeNegocioFuncionalidadeCadastrar
() {
getContexto
().
checking(new Expectations
(){{
never
(orgaoRepositoryMock
).
consultarPorCodigoOrgao(with
(any
(Integer.
class)));
oneOf
(orgaoRepositoryMock
).
consultarPorDescricao(with
(any
(String.
class)));
will
(returnValue
(null));
}});
}
@
Override
protected void expectativasDeNegocioFuncionalidadeAlterar
() {
getContexto
().
checking(new Expectations
(){{
never
(orgaoRepositoryMock
).
consultarPorCodigoOrgao(with
(any
(Integer.
class)));
oneOf
(orgaoRepositoryMock
).
consultarPorDescricao(with
(any
(String.
class)));
will
(returnValue
(null));
never
(unidadeRepositoryMock
).
consultarUnidadeAtivasPorOrgao(with
(any
(Orgao.
class)));
}});
}
@Test
public void aoCadastrarOrgaoComCodigoDeveriaDelegarParaOhRepositorio
() {
final Orgao orgao = getOrgao
();
getContexto
().
checking(new Expectations
(){{
oneOf
(getValidadorMock
()).
validar(with
(same
(orgao
)), with
(new Class<?>[]{ Cadastrar.
class }));
oneOf
(orgaoRepositoryMock
).
consultarPorCodigoOrgao(with
(any
(Integer.
class)));
will
(returnValue
(null));
oneOf
(orgaoRepositoryMock
).
consultarPorDescricao(with
(any
(String.
class)));
will
(returnValue
(null));
oneOf
(orgaoRepositoryMock
).
cadastrar(with
(same
(orgao
)));
}});
orgaoService.
cadastrar(orgao
);
}
@Test
public void aoCadastrarOrgaoComCodigoJahCadastradoDeveriaRetornarMensagem
() {
final Orgao orgao = getOrgao
();
getContexto
().
checking(new Expectations
(){{
oneOf
(getValidadorMock
()).
validar(with
(same
(orgao
)), with
(new Class<?>[]{ Cadastrar.
class }));
oneOf
(orgaoRepositoryMock
).
consultarPorCodigoOrgao(with
(any
(Integer.
class)));
will
(returnValue
(orgao
));
never
(orgaoRepositoryMock
).
consultarPorDescricao(with
(any
(String.
class)));
never
(orgaoRepositoryMock
).
cadastrar(with
(same
(orgao
)));
}});
VerificadorLancamentoException.
verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem
() {
@
Override
public void execute
() throws Exception {
orgaoService.
cadastrar(orgao
);
}
}, CODIGO_ORGAO_JA_CADASTRADO
);
}
@Test
public void aoCadastrarOrgaoComDescricaoJahCadastradaDeveriaRetornarMensagem
() {
final Orgao orgao = getOrgao
();
getContexto
().
checking(new Expectations
(){{
oneOf
(getValidadorMock
()).
validar(with
(same
(orgao
)), with
(new Class<?>[]{ Cadastrar.
class }));
oneOf
(orgaoRepositoryMock
).
consultarPorCodigoOrgao(with
(any
(Integer.
class)));
will
(returnValue
(null));
oneOf
(orgaoRepositoryMock
).
consultarPorDescricao(with
(any
(String.
class)));
will
(returnValue
(orgao
));
never
(orgaoRepositoryMock
).
cadastrar(with
(same
(orgao
)));
}});
VerificadorLancamentoException.
verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem
() {
@
Override
public void execute
() throws Exception {
orgaoService.
cadastrar(orgao
);
}
}, DESCRICAO_ORGAO_JA_CADASTRADA
);
}
@Test
public void aoAlterarOrgaoParaInativoComUnidadesAtivasDeveriaRetornarMensagem
() {
final Orgao orgao = getOrgao
();
final List<Unidade
> unidadesAtiva = getUnidadeAtivas
();
unidadesAtiva.
add(new Unidade
());
getContexto
().
checking(new Expectations
(){{
oneOf
(getValidadorMock
()).
validar(with
(any
(Orgao.
class)), with
(new Class<?>[]{ Alterar.
class }));
oneOf
(orgaoRepositoryMock
).
consultarPorCodigoOrgao(with
(any
(Integer.
class)));
will
(returnValue
(null));
oneOf
(orgaoRepositoryMock
).
consultarPorDescricao(with
(any
(String.
class)));
will
(returnValue
(null));
oneOf
(unidadeRepositoryMock
).
consultarUnidadeAtivasPorOrgao(with
(any
(Orgao.
class)));
will
(returnValue
(unidadesAtiva
));
never
(orgaoRepositoryMock
).
alterar(with
(same
(orgao
)));
}});
VerificadorLancamentoException.
verificarMensagemLancamentoExceptionSemRetornoMensagem(new CommandSemMensagem
() {
@
Override
public void execute
() throws Exception {
orgaoService.
alterar(orgao
);
}
}, NAO_EH_POSSIVEL_INATIVAR_ORGAO_VINCULADO_A_UNIDADE_ATIVA
);
}
@Test
public void aoAlterarOrgaoParaInativoSemUnidadesAtivasDeveriaDelegarParaOhRepositorio
() {
final Orgao orgao = getOrgao
();
final List<Unidade
> unidadesAtiva = getUnidadeAtivas
();
getContexto
().
checking(new Expectations
(){{
oneOf
(getValidadorMock
()).
validar(with
(any
(Orgao.
class)), with
(new Class<?>[]{ Alterar.
class }));
oneOf
(orgaoRepositoryMock
).
consultarPorCodigoOrgao(with
(any
(Integer.
class)));
will
(returnValue
(null));
oneOf
(orgaoRepositoryMock
).
consultarPorDescricao(with
(any
(String.
class)));
will
(returnValue
(null));
oneOf
(unidadeRepositoryMock
).
consultarUnidadeAtivasPorOrgao(with
(any
(Orgao.
class)));
will
(returnValue
(unidadesAtiva
));
oneOf
(orgaoRepositoryMock
).
alterar(with
(same
(orgao
)));
}});
orgaoService.
alterar(orgao
);
}
@Test
public void aoAlterarOrgaoSemAlterarDescricaoIhCodigoDeveriaDelegarParaOhRepositorio
() {
final Orgao orgao = getOrgao
();
final List<Unidade
> unidadesAtiva = getUnidadeAtivas
();
getContexto
().
checking(new Expectations
(){{
oneOf
(getValidadorMock
()).
validar(with
(any
(Orgao.
class)), with
(new Class<?>[]{ Alterar.
class }));
oneOf
(orgaoRepositoryMock
).
consultarPorCodigoOrgao(with
(any
(Integer.
class)));
will
(returnValue
(orgao
));
oneOf
(orgaoRepositoryMock
).
consultarPorDescricao(with
(any
(String.
class)));
will
(returnValue
(orgao
));
oneOf
(unidadeRepositoryMock
).
consultarUnidadeAtivasPorOrgao(with
(any
(Orgao.
class)));
will
(returnValue
(unidadesAtiva
));
oneOf
(orgaoRepositoryMock
).
alterar(with
(same
(orgao
)));
}});
orgaoService.
alterar(orgao
);
}
@Test
public void aoConsultarOrgaosDeveriaDelegarParaOhRepositorio
() {
getContexto
().
checking(new Expectations
(){{
oneOf
(orgaoRepositoryMock
).
consultarOrgaos(with
(any
(Orgao.
class)), with
(any
(Integer.
class)), with
(any
(Integer.
class)));
}});
orgaoService.
consultarOrgaos(getOrgao
(),
0,
5);
}
@Test
public void aoObterQuantidadeDeRegistrosDeConsultarOrgaosDeveriaDelegarParaOhRepositorio
() {
getContexto
().
checking(new Expectations
(){{
oneOf
(orgaoRepositoryMock
).
obterQuantidadeDeRegistrosDeConsultarOrgaos(with
(any
(Orgao.
class)));
}});
orgaoService.
obterQuantidadeDeRegistrosDeConsultarOrgaos(getOrgao
());
}
@
Override
protected GenericRepository
<Orgao
> getRepositoryMock
() {
return orgaoRepositoryMock
;
}
@Test
public void aoListarOrgaosDeveriaDelegarParaOhRepositorio
() {
getContexto
().
checking(new Expectations
(){{
oneOf
(orgaoRepositoryMock
).
listarOrgao();
}});
orgaoService.
listarOrgao();
}
@Test
public void aoListarOrgaoAtivoDeveriaDelegarParaOhRepositorio
() {
getContexto
().
checking(new Expectations
(){{
oneOf
(orgaoRepositoryMock
).
listarOrgaoAtivo();
}});
orgaoService.
listarOrgaoAtivo();
}
}