public void QuandoAlgumAtributoNaoForInformadoCorretamenteRetornaFalse(LancamentoOV lancamentoOV)
            {
                //Arrange
                var mock = new Mock <IRepositorioDeContaCorrente>();

                if (lancamentoOV.ContaOrigem == "12")
                {
                    mock.Setup(x => x.Obter(lancamentoOV.ContaOrigem))
                    .ReturnsAsync(lancamentoOV.ContaOrigem == "12"
                        ? new ContaCorrente()
                    {
                        NumeroDaConta = "12"
                    }
                        : null);
                }

                if (lancamentoOV.ContaDestino == "13")
                {
                    mock.Setup(x => x.Obter(lancamentoOV.ContaDestino))
                    .ReturnsAsync(lancamentoOV.ContaDestino == "13"
                        ? new ContaCorrente()
                    {
                        NumeroDaConta = "13"
                    }
                        : null);
                }

                // Act
                var resultado = ValidarLancamento.Validar(lancamentoOV, mock.Object);

                // Assert
                Assert.False(resultado);
            }
            public void QuandoTodosOsAtributosForamInformadosCorretamente()
            {
                //Arrange
                var lancamentoOV = new LancamentoOV()
                {
                    ContaOrigem  = "12",
                    ContaDestino = "13",
                    Valor        = 1
                };

                var mock = new Mock <IRepositorioDeContaCorrente>();

                mock.Setup(x => x.Obter(lancamentoOV.ContaOrigem))
                .ReturnsAsync(new ContaCorrente()
                {
                    NumeroDaConta = "12"
                });
                mock.Setup(x => x.Obter(lancamentoOV.ContaDestino))
                .ReturnsAsync(new ContaCorrente()
                {
                    NumeroDaConta = "13"
                });

                // Act
                var resultado = ValidarLancamento.Validar(lancamentoOV, mock.Object);

                // Assert
                Assert.True(resultado);
            }
        public async Task <bool> Adicionar(LancamentoOV lancamentoOV)
        {
            try
            {
                if (!ValidarLancamento.Validar(lancamentoOV, _repositorioDeContaCorrente))
                {
                    return(false);
                }

                var lancamento = new Lancamento
                {
                    ContaOrigem  = lancamentoOV.ContaOrigem,
                    ContaDestino = lancamentoOV.ContaDestino,
                    Valor        = lancamentoOV.Valor
                };

                // inverte a operacao caso o valor seja negativo
                if (lancamentoOV.Valor < 0)
                {
                    lancamento.ContaOrigem  = lancamentoOV.ContaDestino;
                    lancamento.ContaDestino = lancamentoOV.ContaOrigem;
                    lancamento.Valor       *= (-1);
                }

                // Alterar o saldo da Origem
                var contaOrigem = await _repositorioDeContaCorrente.Obter(lancamento.ContaOrigem);

                contaOrigem.SaldoDaConta -= lancamento.Valor;
                _repositorioDeContaCorrente.Alterar(contaOrigem);

                // Alterar o saldo do destino
                var contaDestino = await _repositorioDeContaCorrente.Obter(lancamento.ContaDestino);

                contaDestino.SaldoDaConta += lancamento.Valor;
                _repositorioDeContaCorrente.Alterar(contaDestino);

                // Adicionar Lancamento
                _repositorioDeLancamento.Adicionar(lancamento);

                return(true);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }