package gcom.faturamento.controladores;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.ejb.EJBException;
import javax.ejb.EJBLocalHome;
import javax.ejb.EJBLocalObject;
import javax.ejb.RemoveException;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import gcom.arrecadacao.repositorio.RepositorioDevolucao;
import gcom.atendimentopublico.ligacaoagua.LigacaoAguaSituacao;
import gcom.atendimentopublico.ligacaoesgoto.LigacaoEsgotoSituacao;
import gcom.cadastro.imovel.Imovel;
import gcom.enums.Status;
import gcom.faturamento.FaturamentoSituacaoTipo;
import gcom.faturamento.credito.CreditoARealizar;
import gcom.faturamento.debito.DebitoACobrar;
import gcom.faturamento.debito.DebitoCreditoSituacao;
import gcom.faturamento.debito.DebitoTipo;
import gcom.faturamento.repositorio.RepositorioCreditoARealizar;
import gcom.util.ControladorException;
import gcom.util.ErroRepositorioException;
public class ControladorAnaliseGeracaoContaTest {
@InjectMocks
private ControladorAnaliseGeracaoConta analisadorGeracaoConta;
private Imovel imovel;
private LigacaoAguaSituacao aguaLigada;
private LigacaoAguaSituacao aguaDesligada;
private LigacaoEsgotoSituacao esgotoLigado;
private LigacaoEsgotoSituacao esgotoDesligado;
private int anoMesFaturamento;
@Mock
private RepositorioCreditoARealizar creditoRealizarRepositorio;
@Mock
private RepositorioDevolucao repositorioDevolucao;
private boolean aguaEsgotoZerados;
private Collection<DebitoACobrar> debitos;
@Before
public void setup(){
analisadorGeracaoConta = new ControladorAnaliseGeracaoConta(){
private static final long serialVersionUID = 6767710520463134199L;
protected ControladorDebitoACobrarLocal getControladorDebitoACobrar(){
return new ControladorDebitoACobrarLocal() {
public void remove() throws RemoveException, EJBException {
}
public boolean isIdentical(EJBLocalObject arg0) throws EJBException {
return false;
}
public Object getPrimaryKey() throws EJBException {
return null;
}
public EJBLocalHome getEJBLocalHome() throws EJBException {
return null;
}
public Collection<DebitoACobrar> debitosCobrarVigentes(Integer idImovel) throws ControladorException {
return null;
}
public Collection<DebitoACobrar> debitosCobrarSemPagamentos(Integer idImovel) throws ControladorException {
return getDebitos();
}
public void atualizarDebitoCobrar(List<DebitoACobrar> debitosCobrar) throws ErroRepositorioException {
}
};
}
};
anoMesFaturamento = 0;
imovel = new Imovel();
aguaLigada = new LigacaoAguaSituacao();
aguaLigada.setId(LigacaoAguaSituacao.LIGADO);
imovel.setLigacaoAguaSituacao(aguaLigada);
aguaDesligada = new LigacaoAguaSituacao();
aguaDesligada.setId(LigacaoAguaSituacao.POTENCIAL);
esgotoLigado = new LigacaoEsgotoSituacao();
esgotoLigado.setId(LigacaoEsgotoSituacao.LIGADO);
imovel.setLigacaoEsgotoSituacao(esgotoLigado);
esgotoDesligado = new LigacaoEsgotoSituacao();
esgotoDesligado.setId(LigacaoEsgotoSituacao.POTENCIAL);
MockitoAnnotations.initMocks(this);
}
@Test
public void naoGeraContaSemConsumo_AguaLigada_EsgotoLigado_NaoPertenceACondominio() throws Exception {
aguaEsgotoZerados = true;
assertFalse(analisadorGeracaoConta.verificarSituacaoImovelParaGerarConta(aguaEsgotoZerados, imovel));
}
@Test
public void naoGeraContaSemConsumo_AguaDesligada_EsgotoDesligado_NaoPertenceACondominio() throws Exception {
aguaEsgotoZerados = true;
imovel.setLigacaoAguaSituacao(aguaLigada);
imovel.setLigacaoEsgotoSituacao(esgotoDesligado);
assertFalse(analisadorGeracaoConta.verificarSituacaoImovelParaGerarConta(aguaEsgotoZerados, imovel));
}
@Test
public void geraContaComConsumoDeAguaEEsgoto_AguaLigada_sgotoDesligado_NaoPertenceACondominio() throws Exception {
aguaEsgotoZerados = false;
imovel.setLigacaoEsgotoSituacao(esgotoDesligado);
assertTrue(analisadorGeracaoConta.verificarSituacaoImovelParaGerarConta(aguaEsgotoZerados, imovel));
}
@Test
public void geraContaComConsumoDeAguaEEsgoto_AguaLigada() throws Exception {
aguaEsgotoZerados = false;
assertTrue(analisadorGeracaoConta.verificarSituacaoImovelParaGerarConta(aguaEsgotoZerados, imovel));
}
@Test
public void naoGeraContaComConsumoDeAguaEsgoto_AguaDesligada_EsgotoDesligado() throws Exception {
aguaEsgotoZerados = false;
imovel.setLigacaoAguaSituacao(aguaDesligada);
imovel.setLigacaoEsgotoSituacao(esgotoDesligado);
assertFalse(analisadorGeracaoConta.verificarSituacaoImovelParaGerarConta(aguaEsgotoZerados, imovel));
}
@Test
public void naoGeraContaComConsumoDeAguaEsgoto_AguaEsgotoDesligados_ESemCondominio() throws Exception {
aguaEsgotoZerados = false;
imovel.setLigacaoAguaSituacao(aguaDesligada);
imovel.setLigacaoEsgotoSituacao(esgotoDesligado);
assertFalse(analisadorGeracaoConta.verificarSituacaoImovelParaGerarConta(aguaEsgotoZerados, imovel));
}
@Test
public void geraContaSemConsumo_AguaDesligada_EsgotoDesligado_EPerterceACondominio() throws Exception {
aguaEsgotoZerados = true;
imovel.setLigacaoAguaSituacao(aguaDesligada);
imovel.setLigacaoEsgotoSituacao(esgotoDesligado);
imovel.setImovelCondominio(new Imovel());
assertTrue(analisadorGeracaoConta.verificarSituacaoDeCondominio(aguaEsgotoZerados, imovel));
}
@Test
public void geraContaComDebitoCobrar() throws Exception {
assertFalse(analisadorGeracaoConta.verificarDebitosECreditosParaGerarConta(anoMesFaturamento, imovel));
}
@Test
public void geraContaComParalisacaoFaturamento() throws Exception {
this.debitos = buildCollectionDebitosCobrarVazio(false);
adicionaFaturamentoSituacaoTipoParaImovel(Status.ATIVO);
assertFalse(analisadorGeracaoConta.verificarDebitosECreditosParaGerarConta(anoMesFaturamento, imovel));
}
@Test
public void geraContaQuandoHaDebitoSemPagamento() throws Exception {
this.debitos = buildCollectionDebitosCobrarVazio(false);
adicionaFaturamentoSituacaoTipoParaImovel(Status.INATIVO);
assertTrue(analisadorGeracaoConta.verificarDebitosECreditosParaGerarConta(anoMesFaturamento, imovel));
}
@Test
public void naoGeraContaQuandoNaoHaDebitosCobrarAtivosENaoHaCreditosRealizar() throws Exception {
this.debitos = buildCollectionDebitosCobrarComDebitoTipo(Status.INATIVO);
mockPesquisarCreditoARealizar(null);
adicionaFaturamentoSituacaoTipoParaImovel(Status.INATIVO);
assertFalse(analisadorGeracaoConta.verificarDebitosECreditosParaGerarConta(anoMesFaturamento, imovel));
}
@Test
public void geraContaQuandoHaDebitosCobrarAtivosENaoHaCreditosRealizar() throws Exception {
this.debitos = buildCollectionDebitosCobrarComDebitoTipo(Status.ATIVO);
mockPesquisarCreditoARealizar(null);
adicionaFaturamentoSituacaoTipoParaImovel(Status.INATIVO);
assertTrue(analisadorGeracaoConta.verificarDebitosECreditosParaGerarConta(anoMesFaturamento, imovel));
}
@Test
public void naoGeraContaQuandoNaoHaDebitosCobrarAtivosEHaCreditosRealizarComDevolucao() throws Exception {
this.debitos = buildCollectionDebitosCobrarComDebitoTipo(Status.INATIVO);
Collection<CreditoARealizar> creditosRealizar = buildCollectionCreditosRealizar();
mockPesquisarCreditoARealizar(creditosRealizar);
mockExisteCreditoComDevolucao(creditosRealizar, true);
adicionaFaturamentoSituacaoTipoParaImovel(Status.INATIVO);
assertFalse(analisadorGeracaoConta.verificarDebitosECreditosParaGerarConta(anoMesFaturamento, imovel));
}
@Test
public void geraContaQuandoHaDebitosCobrarAtivosEHaCreditosRealizarComDevolucao() throws Exception {
this.debitos = buildCollectionDebitosCobrarComDebitoTipo(Status.ATIVO);
Collection<CreditoARealizar> creditosRealizar = buildCollectionCreditosRealizar();
mockPesquisarCreditoARealizar(creditosRealizar);
mockExisteCreditoComDevolucao(creditosRealizar, true);
adicionaFaturamentoSituacaoTipoParaImovel(Status.INATIVO);
assertTrue(analisadorGeracaoConta.verificarDebitosECreditosParaGerarConta(anoMesFaturamento, imovel));
}
@Test
public void geraContaQuandoHaCreditosRealizarENaoHaCreditosComDevolucao() throws Exception {
this.debitos = buildCollectionDebitosCobrarVazio(false);
Collection<CreditoARealizar> creditosRealizar = buildCollectionCreditosRealizar();
mockPesquisarCreditoARealizar(creditosRealizar);
mockExisteCreditoComDevolucao(creditosRealizar, false);
adicionaFaturamentoSituacaoTipoParaImovel(Status.INATIVO);
assertTrue(analisadorGeracaoConta.verificarDebitosECreditosParaGerarConta(anoMesFaturamento, imovel));
}
private Collection<CreditoARealizar> buildCollectionCreditosRealizar() {
Collection<CreditoARealizar> creditosRealizar = new ArrayList<CreditoARealizar>();
CreditoARealizar creditoRealizar = new CreditoARealizar();
creditosRealizar.add(creditoRealizar);
return creditosRealizar;
}
private void mockPesquisarCreditoARealizar(Collection<CreditoARealizar> retorno) throws ErroRepositorioException {
when(creditoRealizarRepositorio.buscarCreditoRealizarPorImovel(imovel.getId(), DebitoCreditoSituacao.NORMAL, anoMesFaturamento))
.thenReturn(retorno);
}
private void mockExisteCreditoComDevolucao(Collection<CreditoARealizar> creditosRealizar, boolean retorno) throws ErroRepositorioException {
when(repositorioDevolucao.existeCreditoComDevolucao(creditosRealizar))
.thenReturn(retorno);
}
private void adicionaFaturamentoSituacaoTipoParaImovel(Status status) {
FaturamentoSituacaoTipo faturamentoSituacaoTipo = new FaturamentoSituacaoTipo();
faturamentoSituacaoTipo.setIndicadorParalisacaoFaturamento(status.getId());
imovel.setFaturamentoSituacaoTipo(faturamentoSituacaoTipo);
}
private Collection<DebitoACobrar> buildCollectionDebitosCobrarVazio(boolean vazio){
Collection<DebitoACobrar> debitosCobrar = new ArrayList<DebitoACobrar>();
if(vazio == false){
DebitoACobrar debitoCobrar = new DebitoACobrar();
DebitoTipo debitoTipo = new DebitoTipo();
debitoTipo.setIndicadorGeracaoConta(Status.ATIVO.getId());
debitoCobrar.setDebitoTipo(debitoTipo);
debitosCobrar.add(debitoCobrar);
}
return debitosCobrar;
}
private Collection<DebitoACobrar> buildCollectionDebitosCobrarComDebitoTipo(Status status){
Collection<DebitoACobrar> debitosCobrar = new ArrayList<DebitoACobrar>();
DebitoTipo debitoTipo = new DebitoTipo();
debitoTipo.setIndicadorGeracaoConta(status.getId());
DebitoACobrar debitoCobrar = new DebitoACobrar();
debitoCobrar.setDebitoTipo(debitoTipo);
debitosCobrar.add(debitoCobrar);
return debitosCobrar;
}
private Collection<DebitoACobrar> getDebitos(){
return debitos;
}
}