Exemple #1
0
 def refund(charge, amount):
     stripe_charge = stripe.Charge(charge.stripe_id)
     refund = stripe_charge.refunds.create(amount)
     charge.customer.account_balance -= amount
     charge.customer.save()
     return StripeRefund.objects.create(charge=charge,
                                        stripe_id=refund.stripe_id)
Exemple #2
0
 def setUp(self):
     super(StripeSourcePaymentAdminTestCase, self).setUp()
     account = generate_stripe_payout_account()
     bank_account = ExternalAccountFactory.create(connect_account=account)
     funding = FundingFactory.create(bank_account=bank_account)
     self.client.force_login(self.superuser)
     self.donation = DonationFactory(
         amount=Money(100, 'EUR'),
         activity=funding
     )
     with patch('stripe.Source.modify'):
         self.payment = StripeSourcePaymentFactory.create(
             source_token='source-token',
             charge_token='charge-token',
             donation=self.donation
         )
     self.admin_url = reverse('admin:funding_stripe_stripesourcepayment_change', args=(self.payment.id,))
     self.check_status_url = reverse('admin:funding_payment_check', args=(self.payment.id,))
     self.source = stripe.Source('source-token')
     self.source.update({
         'amount': 10000,
         'currency': 'EUR',
         'status': 'charged'
     })
     self.charge = stripe.Charge('charge-token')
     self.charge.update({
         'status': 'succeeded',
         'refunded': None,
         'dispute': None
     })
Exemple #3
0
    def test_source_chargeable(self):
        data = {'object': {'id': self.payment.source_token}}
        charge = stripe.Charge('some charge token')
        charge.update({'status': 'succeeded', 'refunded': False})

        with mock.patch('stripe.Webhook.construct_event',
                        return_value=MockEvent('source.chargeable', data)):
            with mock.patch('stripe.Charge.create',
                            return_value=charge) as create_charge:
                response = self.client.post(
                    self.webhook, HTTP_STRIPE_SIGNATURE='some signature')

                create_charge.assert_called_with(
                    amount=int(self.donation.amount.amount * 100),
                    currency=self.donation.amount.currency,
                    metadata={
                        'tenant_name': u'test',
                        'activity_id': self.funding.pk,
                        'activity_title': self.funding.title,
                        'tenant_domain': u'testserver'
                    },
                    source=u'some-source-id',
                    statement_descriptor_suffix=u'Test',
                    transfer_data={
                        'destination':
                        self.funding.bank_account.connect_account.account_id
                    })

                self.assertEqual(response.status_code, status.HTTP_200_OK)

        self._refresh()
        self.assertEqual(self.donation.status, 'new')
        self.assertEqual(self.payment.status, 'charged')
    def test_unset_metadata(self):
        charge = stripe.Charge(id='ch_foo')
        charge.metadata = {}
        charge.save()

        self.requestor_mock.request.assert_called_with('post',
                                                       '/v1/charges/ch_foo', {
                                                           'metadata': {},
                                                       })
Exemple #5
0
    def test_mark_as_safe(self):
        charge = stripe.Charge(id='ch_update_id')
        charge.mark_as_safe()

        self.requestor_mock.request.assert_called_with(
            'post', '/v1/charges/ch_update_id',
            {'fraud_details': {
                'user_report': 'safe'
            }})
    def test_noop_metadata(self):
        charge = stripe.Charge(id='ch_foo')
        charge.description = 'test'
        charge.save()

        self.requestor_mock.request.assert_called_with(
            'post', '/v1/charges/ch_foo', {
                'description': 'test',
            })
    def test_charge_close_dispute(self):
        charge = stripe.Charge(id='ch_update_id')
        charge.close_dispute(idempotency_key='foo')

        self.requestor_mock.request.assert_called_with(
            'post',
            '/v1/charges/ch_update_id/dispute/close',
            {},
            {'Idempotency-Key': 'foo'},
        )
    def test_whole_update(self):
        charge = stripe.Charge(id='ch_foo')
        charge.metadata = {'whole': 'update'}
        charge.save()

        self.requestor_mock.request.assert_called_with(
            'post', '/v1/charges/ch_foo', {
                'metadata': {
                    'whole': 'update'
                },
            })
    def test_individual_delete(self):
        charge = stripe.Charge(id='ch_foo')
        charge.metadata = {'whole': None}
        charge.save()

        self.requestor_mock.request.assert_called_with('post',
                                                       '/v1/charges/ch_foo', {
                                                           'metadata': {
                                                               'whole': None
                                                           },
                                                       })
Exemple #10
0
 def test_charge_log_transaction_no_unpaid(self, monkeypatch):
     group = Group()
     monkeypatch.setattr(Group, 'amount_unpaid', 0)
     charge = Charge(targets=[group], amount=1000,
                     description="Test charge")
     charge.response = stripe.Charge(id=10)
     txn = charge.stripe_transaction_from_charge()
     result = charge.stripe_transaction_for_model(group, txn)
     assert result.group_id == group.id
     assert result.txn_id == txn.id
     assert result.share == 1000
Exemple #11
0
 def test_charge_log_transaction_attendee(self, monkeypatch):
     attendee = Attendee()
     monkeypatch.setattr(Attendee, 'amount_unpaid', 10)
     charge = Charge(targets=[attendee],
                     description="Test charge")
     charge.response = stripe.Charge(id=10)
     txn = charge.stripe_transaction_from_charge()
     result = charge.stripe_transaction_for_model(attendee, txn)
     assert result.attendee_id == attendee.id
     assert result.txn_id == txn.id
     assert result.share == 1000
Exemple #12
0
 def test_charge_log_transaction(self, monkeypatch):
     attendee = Attendee()
     monkeypatch.setattr(Attendee, 'amount_unpaid', 10)
     charge = Charge(targets=[attendee], amount=1000, description="Test charge")
     charge.response = stripe.Charge(id=10)
     result = charge.stripe_transaction_from_charge()
     assert result.stripe_id == 10
     assert result.amount == 1000
     assert result.desc == "Test charge"
     assert result.type == c.PAYMENT
     assert result.who == 'non-admin'
Exemple #13
0
 def test_charge_log_transaction(self):
     attendee = Attendee()
     charge = Charge(targets=[attendee], amount=1000, description="Test charge")
     charge.response = stripe.Charge(id=10)
     result = charge.stripe_transaction_from_charge()
     assert result.stripe_id == 10
     assert result.amount == 1000
     assert result.desc == "Test charge"
     assert result.type == c.PAYMENT
     assert result.who == 'non-admin'
     assert result.fk_id == attendee.id
     assert result.fk_model == attendee.__class__.__name__
    def test_mark_as_fraudulent(self):
        charge = stripe.Charge(id='ch_update_id')
        charge.mark_as_fraudulent(idempotency_key='foo')

        self.requestor_mock.request.assert_called_with(
            'post',
            '/v1/charges/ch_update_id',
            {'fraud_details': {
                'user_report': 'fraudulent'
            }},
            {'Idempotency-Key': 'foo'},
        )
Exemple #15
0
 def test_already_charged(self, charge_create_mocked):
     charge_create_mocked.return_value = stripe.Charge(id="AA1")
     self.charge.charge()
     self.assertTrue(self.charge.is_charged)
     self.assertTrue(self.success_signal_was_called)
     self.assertFalse(self.exception_signal_was_called)
     self._reset_signals()
     with self.assertRaises(StripeMethodNotAllowed) as ctx:
         self.charge.charge()
     self.assertEqual(ctx.exception.args[0], "Already charged.")
     self.assertTrue(self.charge.is_charged)
     self.assertFalse(self.success_signal_was_called)
     self.assertFalse(self.exception_signal_was_called)
Exemple #16
0
 def create_charge(self, amount, currency="usd", customer=None, card=None, description=None ):
 # https://stripe.com/docs/api?lang=python#create_charge
 # customer.id or card required but not both
 # charge the Customer instead of the card
 # amount in cents
 
     charge = stripe.Charge(api_key=self.api_key).create(
         amount=int(100*amount), # in cents
         currency=currency,
         customer=customer,
         card=card,
         description=description
     )
     
     return charge
Exemple #17
0
    def test_refund(self):
        self.payment.states.succeed(save=True)
        payment_intent = stripe.PaymentIntent('some intent id')

        charge = stripe.Charge('charge-id')
        charges = stripe.ListObject()
        charges.data = [charge]

        payment_intent.charges = charges

        with mock.patch('stripe.PaymentIntent.retrieve',
                        return_value=payment_intent):
            with mock.patch('stripe.Charge.refund') as refund_mock:
                self.payment.states.request_refund(save=True)

        self.assertTrue(refund_mock.called_once)
def capture(charge, amount=None, idempotency_key=None):
    """
    Capture the payment of an existing, uncaptured, charge.

    Args:
        charge: a pinax.stripe.models.Charge object
        amount: the decimal.Decimal amount of the charge to capture
    """
    amount = utils.convert_amount_for_api(
        amount if amount else charge.amount,
        charge.currency
    )
    stripe_charge = stripe.Charge(charge.stripe_id).capture(
        amount=amount,
        idempotency_key=idempotency_key,
        expand=["balance_transaction"],
    )
    sync_charge_from_stripe_data(stripe_charge)
Exemple #19
0
 def test_charge_with_idempotency_key(self, charge_create_mocked):
     charge_create_mocked.return_value = stripe.Charge(id="AA1")
     idempotency_key = "idempotency_key123"
     self.charge.charge(idempotency_key=idempotency_key)
     self.assertTrue(self.charge.is_charged)
     self.assertTrue(self.success_signal_was_called)
     self.assertFalse(self.exception_signal_was_called)
     self.assertEqual(self.charge.stripe_response["id"], "AA1")
     charge_create_mocked.assert_called_with(
         idempotency_key="{}-{}-{}".format(self.charge.object_id,
                                           self.charge.content_type_id,
                                           idempotency_key),
         amount=self.charge.amount,
         currency=self.data["currency"],
         customer=self.data["customer_id"],
         description=self.data["description"],
         metadata={
             "object_id": self.charge.object_id,
             "content_type_id": self.charge.content_type_id,
         },
     )
Exemple #20
0
    def test_charges(self, charge_create_mocked):
        self.success_signal_was_called = False
        self.exception_signal_was_called = False

        def success_handler(sender, instance, **kwargs):
            self.success_signal_was_called = True

        def exception_handler(sender, instance, **kwargs):
            self.exception_signal_was_called = True

        stripe_charge_succeeded.connect(success_handler)
        stripe_charge_card_exception.connect(exception_handler)

        data = {
            "customer_id": "cus_AlSWz1ZQw7qG2z",
            "currency": "usd",
            "amount": 100,
            "description": "ABC"
        }

        charge_create_mocked.return_value = stripe.Charge(id="AA1")
        StripeCustomer.objects.create(user=self.user,
                                      stripe_customer_id="bum",
                                      stripe_js_response='"aa"')

        StripeCustomer.objects.create(user=self.user,
                                      stripe_customer_id=data["customer_id"],
                                      stripe_js_response='"foo"')
        customer = StripeCustomer.objects.create(
            user=self.user,
            stripe_customer_id=data["customer_id"],
            stripe_js_response='"foo"')
        self.assertTrue(
            customer,
            StripeCustomer.get_latest_active_customer_for_user(self.user))

        charge = StripeCharge.objects.create(user=self.user,
                                             amount=data["amount"],
                                             customer=customer,
                                             description=data["description"])
        manual_charge = StripeCharge.objects.create(
            user=self.user,
            amount=data["amount"],
            customer=customer,
            description=data["description"])
        self.assertFalse(charge.is_charged)

        # test in case of an API error
        charge_create_mocked.side_effect = StripeError()
        with self.assertRaises(SystemExit):
            out = StringIO()
            sys.stdout = out
            call_command('charge_stripe')
            self.assertFalse(self.success_signal_was_called)
            charge.refresh_from_db()
            self.assertFalse(charge.is_charged)
            self.assertIn('Exception happened', out.getvalue())

        charge_create_mocked.reset_mock()
        charge_create_mocked.side_effect = CardError(message="a",
                                                     param="b",
                                                     code="c")
        # test regular case
        call_command("charge_stripe")
        self.assertTrue(self.exception_signal_was_called)
        charge.refresh_from_db()
        self.assertFalse(charge.is_charged)
        self.assertTrue(charge.charge_attempt_failed)

        charge_create_mocked.reset_mock()
        charge_create_mocked.side_effect = None
        # test regular case
        # reset charge
        charge.charge_attempt_failed = False
        charge.save()
        call_command("charge_stripe")
        self.assertTrue(self.success_signal_was_called)
        charge.refresh_from_db()
        self.assertTrue(charge.is_charged)
        manual_charge.refresh_from_db()
        self.assertFalse(manual_charge.is_charged)
        self.assertEqual(charge.stripe_response["id"], "AA1")
        charge_create_mocked.assert_called_with(
            amount=charge.amount,
            currency=data["currency"],
            customer=data["customer_id"],
            description=data["description"])

        # manual call
        manual_charge.charge()
        self.assertTrue(manual_charge.is_charged)
Exemple #21
0
 def refund_charge(self, charge_id):
     # https://stripe.com/docs/api?lang=python#refund_charge
     ch = stripe.Charge(api_key=self.api_key).retrieve(charge_id)
     ch.refund()
     return ch 
Exemple #22
0
 def charge(self):
     return stripe.Charge(api_key=self.api_key)
Exemple #23
0
 def create(**kw):
     assert kw['card'] == 'stripeToken'
     assert kw['description'] == self.purchase.invoiceUrl[0]
     charge = stripe.Charge()
     charge.update(dict(id='stripe_id', created=1, paid=True, **kw))
     return charge
Exemple #24
0
def build_full_manual_refunded_charge():
    # can't find a way to make this inline - stripe.Charge(amount_refunded=10) does not work
    sc = stripe.Charge(id="AA1")
    sc.amount_refunded = 100
    return sc
    def test_charge_close_dispute(self):
        charge = stripe.Charge(id='ch_update_id')
        charge.close_dispute()

        self.requestor_mock.request.assert_called_with(
            'post', '/v1/charges/ch_update_id/dispute/close', {})