def test_process_payments_fail(mocker):
    """Process payments."""
    with mock.patch('stripe.Customer.create') as mock_customer:
        mock_customer.side_effect = CheckoutError('Mock')
        today = date.today()
        install = ObjectPaymentPlanInstalmentFactory(
            due=today+relativedelta(days=-1),
            amount=Decimal('1'),
            object_payment_plan=ObjectPaymentPlanFactory(
                content_object=ContactFactory(),
            ),
        )
        CustomerFactory(
            email=install.object_payment_plan.content_object.checkout_email
        )
        NotifyFactory()
        ObjectPaymentPlanInstalment.objects.process_payments()
        # check
        install.refresh_from_db()
        assert install.state == CheckoutState.objects.fail
        assert 1 == Message.objects.count()
        assert 'FAIL' in Message.objects.first().subject
def test_process_payments(mocker):
    """Process payments."""
    mocker.patch('stripe.Charge.create')
    mocker.patch('stripe.Customer.create')
    today = date.today()
    install_1 = ObjectPaymentPlanInstalmentFactory(
        due=today+relativedelta(days=1),
        amount=Decimal('2'),
        object_payment_plan=ObjectPaymentPlanFactory(
            content_object=ContactFactory(),
        ),
    )
    install_2 = ObjectPaymentPlanInstalmentFactory(
        due=today+relativedelta(days=-1),
        amount=Decimal('1'),
        object_payment_plan=ObjectPaymentPlanFactory(
            content_object=ContactFactory(),
        ),
    )
    install_3 = ObjectPaymentPlanInstalmentFactory(
        due=today+relativedelta(days=-2),
        amount=Decimal('2'),
        object_payment_plan=ObjectPaymentPlanFactory(
            content_object=ContactFactory(),
        ),
    )
    CustomerFactory(
        email=install_2.object_payment_plan.content_object.checkout_email
    )
    CustomerFactory(
        email=install_3.object_payment_plan.content_object.checkout_email
    )
    ObjectPaymentPlanInstalment.objects.process_payments()
    # check
    install_1.refresh_from_db()
    assert install_1.state == CheckoutState.objects.pending
    install_2.refresh_from_db()
    assert install_2.state == CheckoutState.objects.success
    install_3.refresh_from_db()
    assert install_3.state == CheckoutState.objects.success