def test_estoque_indisponivel(self):
        """ Cenário: Estoque Indisponível.
        Dado que o estoque da coca-cola é de 50 unidades
        Quando informo uma venda de 60 unidades
        Então a venda não é registrada
             E é exibida na tela a mensagem "estoque insuficiente!"
        """
        # criando o produto
        cocacola = Produto(codigo=13, nome='Coca-cola', preco=5.20)

        # preparando o estoque
        estoque = Estoque()
        estoque.add_produto(produto=cocacola, quantidade=50)

        # preparando a venda
        venda = Venda()
        venda.add_item(produto=cocacola, qtd=60, estoque=estoque)

        # realiza a venda
        with pytest.raises(EstoqueInsuficienteError) as exception:
            venda.realizar()

        # asserções do teste
        assert venda.foi_registrada() == False
        assert "estoque insuficiente!" == str(exception.value)
    def test_venda_cartao_indisp_valor_abaixo_vinte(self):
        """ Cenário: Venda com cartão indisponível para valores
        abaixo de 20,00.
        Dado que o valor da venda é de 10,00
             E o valor mínimo de vendas para cartão é de 20,00
        Quando informo que o meio de pagamento é cartão de crédito
             OU informo que o meio de pagamento é cartão de débito
        Então a venda não é registrada
             E é exibida na tela a mensagem "Meio de pagamento
             inválido! Para valores inferiores a 20 reais somente dinheiro."
        """
        # criando o produto
        cocacola = Produto(codigo=13, nome='Coca-cola', preco=5.00)
        fanta = Produto(codigo=14, nome='Fanta', preco=5.00)

        # preparando o estoque
        estoque = Estoque()
        estoque.add_produto(produto=cocacola, quantidade=50)
        estoque.add_produto(produto=fanta, quantidade=40)

        # preparando a venda
        venda = Venda(lim_compra_cartao=20.00)
        venda.add_item(produto=cocacola, qtd=1, estoque=estoque)
        venda.add_item(produto=fanta, qtd=1, estoque=estoque)

        # meio de pagamento
        with pytest.raises(MeioPagamentoInvalidoError) as expt_credito:
            Pagamento(venda.calcular_total(), Pagamento.CARTAO_CREDITO)

        with pytest.raises(MeioPagamentoInvalidoError) as expt_debito:
            Pagamento(venda.calcular_total(), Pagamento.CARTAO_DEBITO)
                    
        msg_esperada = 'Meio de pagamento inválido! Para valores inferiores a 20 reais somente dinheiro.'

        # asserções do teste
        assert venda.foi_registrada() is False
        assert venda.calcular_total() == 10
        assert msg_esperada in (str(expt_credito.value) and str(expt_debito.value))
    def test_estoque_disponivel(self):
        """ Cenário: Estoque disponível.
        Dado que o estoque da coca-cola é de 50 unidades
        Quando informo uma venda de 40 unidades
        Então a venda é registrada
            E o estoque passa a ser de 10 unidades
        """
        # criando o produto
        cocacola = Produto(codigo=13, nome='Coca-cola', preco=5.20)

        # preparando o estoque
        estoque = Estoque()
        estoque.add_produto(produto=cocacola, quantidade=50)

        # preparando a venda
        venda = Venda()
        venda.add_item(produto=cocacola, qtd=40, estoque=estoque)

        # realiza a venda
        venda.realizar()

        # asserções do teste
        assert venda.foi_registrada() == True
        assert estoque.quantos(produto_codigo=13) == 10
    def test_estoque_disponivel_venda_limitada_30(self):
        """ Cenário: Estoque disponível, venda limitada a 30.
        Dado que o estoque da coca-cola é de 50 unidades
            E a venda máxima por cliente é limitada a 30 unidades
        Quando informo uma venda de 20 unidades
        Então a venda é registrada
            E o estoque passa a ser de 30 unidades
        """
        # criando o produto
        cocacola = Produto(codigo=13, nome='Coca-cola', preco=5.20)
    
        # preparando o estoque
        estoque = Estoque()
        estoque.add_produto(produto=cocacola, quantidade=50)

        # preparando a venda
        venda = Venda(lim_cliente=30)
        venda.add_item(produto=cocacola, qtd=20, estoque=estoque)

        # realiza a venda
        venda.realizar()

        assert venda.foi_registrada() == True
        assert estoque.quantos(produto_codigo=13) == 30