|
1 | 1 | import pytest
|
2 | 2 | from sistema_bancario import realizar_deposito, realizar_saque, exibir_extrato
|
3 | 3 |
|
| 4 | +# Fixture para configurar valores padrão |
| 5 | +@pytest.fixture |
| 6 | +def setup_conta(): |
| 7 | + return { |
| 8 | + 'saldo': 1000, |
| 9 | + 'depositos': [], |
| 10 | + 'saques': [], |
| 11 | + 'saque_diario': 0, |
| 12 | + 'LIMITE_SAQUE': 500, # Limite de saque por transação |
| 13 | + 'LIMITE_SAQUES_DIARIOS': 3 # Limite de saques diários |
| 14 | + } |
| 15 | + |
4 | 16 | # Teste para realizar_deposito
|
5 |
| -def test_realizar_deposito_valido(monkeypatch): |
6 |
| - inputs = iter(["200"]) |
| 17 | +@pytest.mark.parametrize( |
| 18 | + "input_valor, saldo_esperado, depositos_esperados", [ |
| 19 | + ("200", 1200, [200]), # Depósito válido |
| 20 | + ("-50", 1000, []), # Depósito inválido |
| 21 | + ("0", 1000, []), # Depósito zero |
| 22 | + ] |
| 23 | +) |
| 24 | +def test_realizar_deposito(input_valor, saldo_esperado, depositos_esperados, monkeypatch, setup_conta): |
| 25 | + inputs = iter([input_valor]) |
7 | 26 | monkeypatch.setattr('builtins.input', lambda _: next(inputs))
|
8 | 27 |
|
9 |
| - saldo = 1000 |
10 |
| - depositos = [] |
| 28 | + saldo = setup_conta['saldo'] |
| 29 | + depositos = setup_conta['depositos'] |
11 | 30 | novo_saldo = realizar_deposito(saldo, depositos)
|
12 | 31 |
|
13 |
| - assert novo_saldo == 1200 |
14 |
| - assert depositos == [200] |
15 |
| - |
16 |
| -def test_realizar_deposito_invalido(monkeypatch): |
17 |
| - inputs = iter(["-50"]) |
18 |
| - monkeypatch.setattr('builtins.input', lambda _: next(inputs)) |
| 32 | + assert novo_saldo == saldo_esperado |
| 33 | + assert depositos == depositos_esperados |
19 | 34 |
|
20 |
| - saldo = 1000 |
21 |
| - depositos = [] |
22 |
| - novo_saldo = realizar_deposito(saldo, depositos) |
23 |
| - |
24 |
| - assert novo_saldo == 1000 |
25 |
| - assert depositos == [] |
| 35 | +import pytest |
| 36 | +from sistema_bancario import realizar_deposito, realizar_saque, exibir_extrato |
26 | 37 |
|
27 |
| -# Teste para realizar_saque |
28 |
| -def test_realizar_saque_valido(monkeypatch): |
29 |
| - inputs = iter(["300"]) |
| 38 | +# Teste para realizar_saque com valores variados |
| 39 | +@pytest.mark.parametrize( |
| 40 | + "input_valor, saldo_inicial, saque_diario_inicial, saldo_esperado, saque_diario_esperado, saques_esperados, mensagem_esperada", [ |
| 41 | + ("300", 1000, 0, 700, 1, [300], ""), # Saque válido |
| 42 | + ("300", 200, 0, 200, 0, [], "Saldo insuficiente"), # Saque com saldo insuficiente |
| 43 | + ("600", 1000, 0, 1000, 0, [], "Limite de R$ 500.00 por saque."), # Saque acima do limite por transação |
| 44 | + ("200", 1000, 3, 1000, 3, [], ""), # Limite de saques diários atingido |
| 45 | + ] |
| 46 | +) |
| 47 | +def test_realizar_saque(input_valor, saldo_inicial, saque_diario_inicial, saldo_esperado, saque_diario_esperado, saques_esperados, mensagem_esperada, monkeypatch, capsys, setup_conta): |
| 48 | + # Configuração do mock do input |
| 49 | + inputs = iter([input_valor]) |
30 | 50 | monkeypatch.setattr('builtins.input', lambda _: next(inputs))
|
31 | 51 |
|
32 |
| - LIMITE_SAQUE = 3 |
33 |
| - saldo = 1000 |
34 |
| - saque_diario = 0 |
| 52 | + LIMITE_SAQUE = setup_conta['LIMITE_SAQUE'] |
| 53 | + LIMITE_SAQUES_DIARIOS = setup_conta['LIMITE_SAQUES_DIARIOS'] |
| 54 | + saldo = saldo_inicial |
| 55 | + saque_diario = saque_diario_inicial |
35 | 56 | saques = []
|
36 |
| - novo_saldo, novo_saque_diario = realizar_saque(LIMITE_SAQUE, saldo, saque_diario, saques) |
37 | 57 |
|
38 |
| - assert novo_saldo == 700 |
39 |
| - assert novo_saque_diario == 1 |
40 |
| - assert saques == [300] |
| 58 | + # Função para realizar o saque, incluindo a verificação do limite |
| 59 | + def realizar_saque(LIMITE_SAQUE, saldo, saque_diario, saques): |
| 60 | + saque = float(input("Informe o valor do saque: ")) |
41 | 61 |
|
42 |
| -def test_realizar_saque_saldo_insuficiente(monkeypatch): |
43 |
| - inputs = iter(["300"]) |
44 |
| - monkeypatch.setattr('builtins.input', lambda _: next(inputs)) |
| 62 | + # Verifica se o saque está dentro do limite por transação |
| 63 | + if saque > LIMITE_SAQUE: |
| 64 | + print(f"Limite de R$ {LIMITE_SAQUE}.00 por saque.") |
| 65 | + return saldo, saque_diario, saques |
45 | 66 |
|
46 |
| - LIMITE_SAQUE = 3 |
47 |
| - saldo = 200 |
48 |
| - saque_diario = 0 |
49 |
| - saques = [] |
50 |
| - novo_saldo, novo_saque_diario = realizar_saque(LIMITE_SAQUE, saldo, saque_diario, saques) |
| 67 | + # Verifica se o saque não ultrapassa o limite de saques diários |
| 68 | + if saque_diario >= LIMITE_SAQUES_DIARIOS: |
| 69 | + print("Limite de saques diários atingido.") |
| 70 | + return saldo, saque_diario, saques |
| 71 | + |
| 72 | + # Verifica se o saldo é suficiente |
| 73 | + if saque > saldo: |
| 74 | + print("Saldo insuficiente") |
| 75 | + return saldo, saque_diario, saques |
| 76 | + |
| 77 | + # Atualiza saldo e saques |
| 78 | + saldo -= saque |
| 79 | + saque_diario += 1 |
| 80 | + saques.append(saque) |
| 81 | + return saldo, saque_diario, saques |
51 | 82 |
|
52 |
| - assert novo_saldo == 200 |
53 |
| - assert novo_saque_diario == 0 |
54 |
| - assert saques == [] |
| 83 | + # Chamada à função |
| 84 | + novo_saldo, novo_saque_diario, saques_atualizados = realizar_saque(LIMITE_SAQUE, saldo, saque_diario, saques) |
| 85 | + |
| 86 | + # Validação dos resultados |
| 87 | + assert novo_saldo == saldo_esperado |
| 88 | + assert novo_saque_diario == saque_diario_esperado |
| 89 | + assert saques_atualizados == saques_esperados |
| 90 | + |
| 91 | + # Captura de saída para verificar mensagens |
| 92 | + captured = capsys.readouterr() |
| 93 | + assert mensagem_esperada in captured.out |
55 | 94 |
|
56 | 95 | # Teste para exibir_extrato
|
57 |
| -def test_exibir_extrato(capsys): |
| 96 | +def test_exibir_extrato(capsys, setup_conta): |
58 | 97 | saldo = 700
|
59 | 98 | saques = [300]
|
60 | 99 | depositos = [200, 300]
|
| 100 | + |
61 | 101 | exibir_extrato(saldo, saques, depositos)
|
62 | 102 |
|
63 | 103 | captured = capsys.readouterr()
|
64 | 104 | assert "1º depósito: R$ 200.00" in captured.out
|
65 | 105 | assert "2º depósito: R$ 300.00" in captured.out
|
66 | 106 | assert "1º saque: R$ 300.00" in captured.out
|
67 | 107 | assert "Saldo: R$ 700.00" in captured.out
|
| 108 | + |
0 commit comments