public async void NaoDevePermitirEfetuarTransferenciaSeUsuarioLogadoNaoForDonoDaConta()
        {
            IUsuarioAutenticado outroUsuarioAutenticado = Substitute.For <IUsuarioAutenticado>();

            outroUsuarioAutenticado.Id.Returns(Guid.NewGuid());

            var useCase = new TransferirUseCAse(contaRepository, outroUsuarioAutenticado);
            var contaId = Guid.NewGuid();

            contaOrigemFake.Creditar(100);

            this.contaRepository.Obter(contaOrigemFake.NumeroAgencia, contaOrigemFake.NumeroConta, contaOrigemFake.DigitoConta).Returns(contaOrigemFake);
            this.contaRepository.Obter(contaDestinoFake.NumeroAgencia, contaDestinoFake.NumeroConta, contaDestinoFake.DigitoConta).Returns(contaDestinoFake);

            await Assert.ThrowsAsync <UsuarioLogadoNaoEhDonoDaContaException>(() =>
            {
                return(useCase.Execute(contaOrigemFake.NumeroAgencia,
                                       contaOrigemFake.NumeroConta,
                                       contaOrigemFake.DigitoConta,
                                       contaDestinoFake.NumeroAgencia,
                                       contaDestinoFake.NumeroConta,
                                       contaDestinoFake.DigitoConta,
                                       50));
            });
        }
        public async void DeveDispararUmaExceptionSeValorDaTransferenciaForMenorOuIgualAZero()
        {
            var useCase = new TransferirUseCAse(contaRepository, usuarioAutenticado);
            var contaId = Guid.NewGuid();

            contaOrigemFake.Creditar(100);

            this.contaRepository.Obter(contaOrigemFake.NumeroAgencia, contaOrigemFake.NumeroConta, contaOrigemFake.DigitoConta).Returns(contaOrigemFake);
            this.contaRepository.Obter(contaDestinoFake.NumeroAgencia, contaDestinoFake.NumeroConta, contaDestinoFake.DigitoConta).Returns(contaDestinoFake);

            await Assert.ThrowsAsync <ValorInvalidoException>(() =>
            {
                return(useCase.Execute(contaOrigemFake.NumeroAgencia,
                                       contaOrigemFake.NumeroConta,
                                       contaOrigemFake.DigitoConta,
                                       contaDestinoFake.NumeroAgencia,
                                       contaDestinoFake.NumeroConta,
                                       contaDestinoFake.DigitoConta,
                                       0));
            });

            await Assert.ThrowsAsync <ValorInvalidoException>(() =>
            {
                return(useCase.Execute(contaOrigemFake.NumeroAgencia,
                                       contaOrigemFake.NumeroConta,
                                       contaOrigemFake.DigitoConta,
                                       contaDestinoFake.NumeroAgencia,
                                       contaDestinoFake.NumeroConta,
                                       contaDestinoFake.DigitoConta,
                                       -50));
            });
        }
        public async void NaoDeveConseguirEfetuarUmaTransferenciaSeContaDeOrigemNaoExistir()
        {
            var useCase = new TransferirUseCAse(contaRepository, usuarioAutenticado);
            var contaId = Guid.NewGuid();

            var ex = await Assert.ThrowsAsync <ContaNaoEncontradaException>(() =>
            {
                return(useCase.Execute(contaOrigemFake.NumeroAgencia,
                                       contaOrigemFake.NumeroConta,
                                       contaOrigemFake.DigitoConta,
                                       contaDestinoFake.NumeroAgencia,
                                       contaDestinoFake.NumeroConta,
                                       contaDestinoFake.DigitoConta,
                                       50));
            });

            Assert.Equal($"Conta '{contaOrigemFake.NumeroConta}-{contaOrigemFake.DigitoConta}' não encontrada na agência '{contaOrigemFake.NumeroAgencia}'.", ex.Message);
        }
        public async void NaoDeveConseguirEfetuarUmaTransferenciaEntreAMesmaConta()
        {
            var useCase = new TransferirUseCAse(contaRepository, usuarioAutenticado);
            var contaId = Guid.NewGuid();

            this.contaRepository.Obter(contaOrigemFake.NumeroAgencia, contaOrigemFake.NumeroConta, contaOrigemFake.DigitoConta).Returns(contaOrigemFake);
            this.contaRepository.Obter(contaDestinoFake.NumeroAgencia, contaDestinoFake.NumeroConta, contaDestinoFake.DigitoConta).Returns(contaOrigemFake);

            var ex = await Assert.ThrowsAsync <ContaCreditoIgualContaDebitoException>(() =>
            {
                return(useCase.Execute(contaOrigemFake.NumeroAgencia,
                                       contaOrigemFake.NumeroConta,
                                       contaOrigemFake.DigitoConta,
                                       contaDestinoFake.NumeroAgencia,
                                       contaDestinoFake.NumeroConta,
                                       contaDestinoFake.DigitoConta,
                                       50));
            });

            Assert.Equal(ex.Message, $"Conta de destino não pode ser a conta de origem.");
        }
        public async void DeveConseguirFazerTransferenciaEntreContas()
        {
            var useCase = new TransferirUseCAse(contaRepository, usuarioAutenticado);
            var contaId = Guid.NewGuid();

            contaOrigemFake.Creditar(100);

            this.contaRepository.Obter(contaOrigemFake.NumeroAgencia, contaOrigemFake.NumeroConta, contaOrigemFake.DigitoConta).Returns(contaOrigemFake);
            this.contaRepository.Obter(contaDestinoFake.NumeroAgencia, contaDestinoFake.NumeroConta, contaDestinoFake.DigitoConta).Returns(contaDestinoFake);

            var result = await useCase.Execute(contaOrigemFake.NumeroAgencia,
                                               contaOrigemFake.NumeroConta,
                                               contaOrigemFake.DigitoConta,
                                               contaDestinoFake.NumeroAgencia,
                                               contaDestinoFake.NumeroConta,
                                               contaDestinoFake.DigitoConta,
                                               50);

            Assert.NotNull(result.ContaDestinoResult);
            Assert.NotNull(result.ContaDestinoResult);
            Assert.NotNull(result.TransacaoId.ToString());
            Assert.Equal(50, result.ValorTransacao);
        }