def test_identity_form(self):
        janeway = self.make_participant(
            'janeway',
            email='*****@*****.**',
            mangopay_user_id=None,
        )
        assert janeway.mangopay_user_id is None

        # Create a mangopay natural user
        data = dict(user_data, terms='agree')
        kw = dict(auth_as=janeway, raise_immediately=False, xhr=True)
        r = self.client.POST('/janeway/identity', data, **kw)
        assert r.code == 200, r.text
        janeway = janeway.refetch()
        assert janeway.mangopay_user_id

        # Test the rendering of the identity page
        r = self.client.GET('/janeway/identity.html', auth_as=janeway)
        assert r.code == 200, r.text
        assert user_data['FirstName'] in r.text

        # Edit the natural user
        data2 = dict(data,
                     FirstName='Kathryn',
                     Nationality='US',
                     Birthday='1970-01-01')
        r = self.client.POST('/janeway/identity', data2, **kw)
        assert r.code == 200, r.text
        janeway2 = janeway.refetch()
        assert janeway2.mangopay_user_id == janeway.mangopay_user_id

        # Add some money for the next test
        create_wallet(self.db, janeway, 'EUR')
        cr = create_card(janeway.mangopay_user_id)
        route = ExchangeRoute.insert(janeway,
                                     'mango-cc',
                                     cr.CardId,
                                     'chargeable',
                                     currency='EUR')
        charge(self.db, route, EUR('20.00'), 'http://127.0.0.1/')

        # Switch to a legal user
        data = dict(data2)
        data['organization'] = 'yes'
        data['LegalPersonType'] = 'BUSINESS'
        data['Name'] = 'Starfleet'
        data['confirmed'] = 'yes'
        r = self.client.POST('/janeway/identity', data, **kw)
        assert r.code == 200, r.text
        janeway = janeway.refetch()
        assert janeway.mangopay_user_id != janeway2.mangopay_user_id
        assert janeway.kind == 'organization'
        self.db.self_check()

        # Edit the legal user
        data2 = dict(data, LegalPersonType='ORGANIZATION')
        r = self.client.POST('/janeway/identity', data2, **kw)
        assert r.code == 200, r.text
        janeway2 = janeway.refetch()
        assert janeway2.mangopay_user_id == janeway.mangopay_user_id
Beispiel #2
0
 def test_charge_100(self, save):
     def add_redirect_url_to_payin(payin):
         payin.SecureModeRedirectURL = 'some url'
         return payin
     save.side_effect = add_redirect_url_to_payin
     with self.assertRaises(Redirect):
         charge(self.db, self.janet_route, EUR('100'), 'http://localhost/')
     janet = Participant.from_id(self.janet.id)
     assert self.janet.balance == janet.balance == 0
Beispiel #3
0
 def test_charge_suspended_user(self):
     self.db.run("""
         UPDATE participants
            SET is_suspended = true
          WHERE id = %s
     """, (self.janet.id,))
     self.janet.set_attributes(is_suspended=True)
     with self.assertRaises(AccountSuspended):
         charge(self.db, self.janet_route, EUR('10.00'), 'http://localhost/')
Beispiel #4
0
 def test_charge_100(self, save):
     def add_redirect_url_to_payin(payin):
         payin.SecureModeRedirectURL = 'some url'
         return payin
     save.side_effect = add_redirect_url_to_payin
     with self.assertRaises(Redirect):
         charge(self.db, self.janet_route, D('100'), 'http://localhost/')
     janet = Participant.from_id(self.janet.id)
     assert self.janet.balance == janet.balance == 0
 def test_charge_invalidated_card(self):
     bob = self.make_participant('bob')
     route = ExchangeRoute.insert(bob,
                                  'mango-cc',
                                  '-1',
                                  'canceled',
                                  currency='EUR')
     with self.assertRaises(AssertionError):
         charge(self.db, route, EUR('10.00'), 'http://localhost/')
Beispiel #6
0
 def test_charge_suspended_user(self):
     self.db.run("""
         UPDATE participants
            SET is_suspended = true
          WHERE id = %s
     """, (self.janet.id,))
     self.janet.set_attributes(is_suspended=True)
     with self.assertRaises(AccountSuspended):
         charge(self.db, self.janet_route, D('10.00'), 'http://localhost/')
Beispiel #7
0
 def test_1_sync_with_mangopay_records_exchange_success(self):
     with mock.patch('liberapay.billing.transactions.record_exchange_result') as rer:
         rer.side_effect = Foobar()
         with self.assertRaises(Foobar):
             charge(self.db, self.janet_route, PAYIN_CARD_MIN, 'http://localhost/')
     exchange = self.db.one("SELECT * FROM exchanges")
     assert exchange.status == 'pre'
     sync_with_mangopay(self.db)
     exchange = self.db.one("SELECT * FROM exchanges")
     assert exchange.status == 'succeeded'
     assert Participant.from_username('janet').balance == PAYIN_CARD_MIN
Beispiel #8
0
 def test_1_sync_with_mangopay_records_exchange_success(self):
     amount = PAYIN_CARD_MIN['EUR'].amount
     with mock.patch('liberapay.billing.transactions.record_exchange_result') as rer:
         rer.side_effect = Foobar()
         with self.assertRaises(Foobar):
             charge(self.db, self.janet_route, amount, 'http://localhost/')
     exchange = self.db.one("SELECT * FROM exchanges")
     assert exchange.status == 'pre'
     sync_with_mangopay(self.db)
     exchange = self.db.one("SELECT * FROM exchanges")
     assert exchange.status == 'succeeded'
     assert Participant.from_username('janet').balance == amount
    def test_identity_form(self):
        janeway = self.make_participant(
            'janeway', email='*****@*****.**', mangopay_user_id=None,
        )
        assert janeway.mangopay_user_id is None

        # Create a mangopay natural user
        data = dict(user_data, terms='agree')
        kw = dict(auth_as=janeway, raise_immediately=False, xhr=True)
        r = self.client.POST('/janeway/identity-v1', data, **kw)
        assert r.code == 200, r.text
        janeway = janeway.refetch()
        assert janeway.mangopay_user_id

        # Test the rendering of the identity page
        r = self.client.GET('/janeway/identity-v1.html', auth_as=janeway)
        assert r.code == 200, r.text
        assert user_data['FirstName'] in r.text

        # Edit the natural user
        data2 = dict(data, FirstName='Kathryn', Nationality='US', Birthday='1970-01-01')
        r = self.client.POST('/janeway/identity-v1', data2, **kw)
        assert r.code == 200, r.text
        janeway2 = janeway.refetch()
        assert janeway2.mangopay_user_id == janeway.mangopay_user_id

        # Add some money for the next test
        create_wallet(self.db, janeway, 'EUR')
        cr = create_card(janeway.mangopay_user_id)
        route = ExchangeRoute.insert(janeway, 'mango-cc', cr.CardId, 'chargeable', currency='EUR')
        charge(self.db, route, EUR('20.00'), 'http://127.0.0.1/')

        # Switch to a legal user
        data = dict(data2)
        data['organization'] = 'yes'
        data['LegalPersonType'] = 'BUSINESS'
        data['Name'] = 'Starfleet'
        data['confirmed'] = 'yes'
        r = self.client.POST('/janeway/identity-v1', data, **kw)
        assert r.code == 200, r.text
        janeway = janeway.refetch()
        assert janeway.mangopay_user_id != janeway2.mangopay_user_id
        assert janeway.kind == 'organization'
        self.db.self_check()

        # Edit the legal user
        data2 = dict(data, LegalPersonType='ORGANIZATION')
        r = self.client.POST('/janeway/identity-v1', data2, **kw)
        assert r.code == 200, r.text
        janeway2 = janeway.refetch()
        assert janeway2.mangopay_user_id == janeway.mangopay_user_id
Beispiel #10
0
 def test_2_sync_with_mangopay_handles_payins_that_didnt_happen(self):
     pass  # this is for pep8
     with mock.patch('liberapay.billing.transactions.record_exchange_result') as rer, \
          mock.patch('liberapay.billing.transactions.DirectPayIn.save', autospec=True) as save:
         rer.side_effect = save.side_effect = Foobar
         with self.assertRaises(Foobar):
             charge(self.db, self.janet_route, D('33.67'), 'http://localhost/')
     exchange = self.db.one("SELECT * FROM exchanges")
     assert exchange.status == 'pre'
     self.throw_transactions_back_in_time()
     sync_with_mangopay(self.db)
     exchange = self.db.one("SELECT * FROM exchanges")
     assert exchange.status == 'failed'
     assert exchange.note == 'interrupted'
     assert Participant.from_username('janet').balance == 0
Beispiel #11
0
 def test_2_sync_with_mangopay_handles_payins_that_didnt_happen(self):
     pass  # this is for pep8
     with mock.patch('liberapay.billing.transactions.record_exchange_result') as rer, \
          mock.patch('liberapay.billing.transactions.DirectPayIn.save', autospec=True) as save:
         rer.side_effect = save.side_effect = Foobar
         with self.assertRaises(Foobar):
             charge(self.db, self.janet_route, EUR('33.67'), 'http://localhost/')
     exchange = self.db.one("SELECT * FROM exchanges")
     assert exchange.status == 'pre'
     self.throw_transactions_back_in_time()
     sync_with_mangopay(self.db)
     exchange = self.db.one("SELECT * FROM exchanges")
     assert exchange.status == 'failed'
     assert exchange.note == 'interrupted'
     assert Participant.from_username('janet').balance == 0
 def test_refund_disputed_payin(self):
     self.make_participant(
         'LiberapayOrg',
         kind='organization',
         balance=EUR('100.00'),
         mangopay_user_id='0',
         mangopay_wallet_id='0',
     )
     exchange = charge(self.db, self.janet_route, EUR('20'),
                       'http://localhost/')
     # Dry run
     msg, e_refund = refund_disputed_payin(self.db, exchange, dry_run=True)
     assert msg.startswith('[dry run] partial refund ')
     assert e_refund is None
     # For real
     msg, e_refund = refund_disputed_payin(self.db, exchange)
     assert msg == 'succeeded'
     assert e_refund.amount == -exchange.amount
     assert e_refund.fee == exchange.fee.zero()
     janet = self.janet.refetch()
     assert janet.balance == 0
     self.db.self_check()
     # Again
     msg, e_refund_2 = refund_disputed_payin(self.db, exchange)
     assert msg == 'already done'
     assert e_refund_2.id == e_refund.id
Beispiel #13
0
 def test_charge_exception(self, test_hook):
     test_hook.side_effect = Foobar
     exchange = charge(self.db, self.janet_route, EUR('1.00'), 'http://localhost/')
     assert exchange.note == "Foobar()"
     assert exchange.amount
     assert exchange.status == 'failed'
     janet = Participant.from_id(self.janet.id)
     assert self.janet.balance == janet.balance == 0
Beispiel #14
0
 def test_charge_exception(self, test_hook):
     test_hook.side_effect = Foobar
     exchange = charge(self.db, self.janet_route, D('1.00'), 'http://localhost/')
     assert exchange.note == "Foobar()"
     assert exchange.amount
     assert exchange.status == 'failed'
     janet = Participant.from_id(self.janet.id)
     assert self.janet.balance == janet.balance == 0
Beispiel #15
0
 def test_charge_failure(self, save):
     save.side_effect = fail_payin
     exchange = charge(self.db, self.janet_route, D('1.00'), 'http://localhost/')
     error = "1: oops"
     assert exchange.note == error
     assert exchange.amount
     assert exchange.status == 'failed'
     janet = self.janet.refetch()
     assert self.janet.balance == janet.balance == 0
Beispiel #16
0
 def test_charge_failure(self, save):
     save.side_effect = fail_payin
     exchange = charge(self.db, self.janet_route, EUR('1.00'), 'http://localhost/')
     error = "1: oops"
     assert exchange.note == error
     assert exchange.amount
     assert exchange.status == 'failed'
     janet = self.janet.refetch()
     assert self.janet.balance == janet.balance == 0
Beispiel #17
0
 def test_charge_success_and_wallet_creation(self):
     self.db.run("DELETE FROM wallets WHERE owner = %s", (self.janet.id,))
     exchange = charge(self.db, self.janet_route, EUR('20'), 'http://localhost/')
     janet = Participant.from_id(self.janet.id)
     assert exchange.note is None
     assert exchange.amount == 20
     assert exchange.status == 'succeeded'
     assert self.janet.balance == janet.balance == 20
     assert janet.get_withdrawable_amount('EUR') == 20
     with mock.patch.multiple(transactions, QUARANTINE='1 month'):
         assert janet.get_withdrawable_amount('EUR') == 0
         self.db.self_check()
Beispiel #18
0
 def test_charge_success_and_wallet_creation(self):
     self.db.run("DELETE FROM wallets WHERE owner = %s", (self.janet.id,))
     exchange = charge(self.db, self.janet_route, D('20'), 'http://localhost/')
     janet = Participant.from_id(self.janet.id)
     assert exchange.note is None
     assert exchange.amount == 20
     assert exchange.status == 'succeeded'
     assert self.janet.balance == janet.balance == 20
     assert janet.get_withdrawable_amount('EUR') == 20
     with mock.patch.multiple(transactions, QUARANTINE='1 month'):
         assert janet.get_withdrawable_amount('EUR') == 0
         self.db.self_check()
Beispiel #19
0
 def test_payout(self):
     e = charge(self.db, self.janet_route, EUR('46.00'), 'http://localhost/')
     assert e.status == 'succeeded', e.note
     self.janet.set_tip_to(self.homer, EUR('42.00'))
     self.janet.close('downstream')
     self.homer = self.homer.refetch()
     assert self.homer.balance == 46
     exchange = payout(self.db, self.homer_route, EUR('30.00'))
     assert exchange.note is None
     assert exchange.status == 'created'
     self.homer = self.homer.refetch()
     assert self.homer.balance == 16
     self.db.self_check()
Beispiel #20
0
 def test_payout(self):
     e = charge(self.db, self.janet_route, D('46.00'), 'http://localhost/')
     assert e.status == 'succeeded', e.note
     self.janet.set_tip_to(self.homer, EUR('42.00'))
     self.janet.close('downstream')
     self.homer = self.homer.refetch()
     assert self.homer.balance == 46
     exchange = payout(self.db, self.homer_route, D('30.00'))
     assert exchange.note is None
     assert exchange.status == 'created'
     self.homer = self.homer.refetch()
     assert self.homer.balance == 16
     self.db.self_check()
Beispiel #21
0
 def test_charge_success_and_wallet_creation(self):
     self.db.run("UPDATE participants SET mangopay_wallet_id = NULL")
     self.janet.set_attributes(mangopay_wallet_id=None)
     exchange = charge(self.db, self.janet_route, D('20'), 'http://localhost/')
     janet = Participant.from_id(self.janet.id)
     assert exchange.note is None
     assert exchange.amount == 20
     assert exchange.status == 'succeeded'
     assert self.janet.balance == janet.balance == 20
     assert janet.withdrawable_balance == 20
     with mock.patch.multiple(transactions, QUARANTINE='1 month'):
         assert janet.withdrawable_balance == 0
         self.db.self_check()
Beispiel #22
0
 def test_refund_disputed_payin(self):
     self.make_participant(
         'LiberapayOrg', kind='organization', balance=EUR('100.00'),
         mangopay_user_id='0', mangopay_wallet_id='0',
     )
     exchange = charge(self.db, self.janet_route, EUR('20'), 'http://localhost/')
     # Dry run
     msg, e_refund = refund_disputed_payin(self.db, exchange, dry_run=True)
     assert msg.startswith('[dry run] partial refund ')
     assert e_refund is None
     # For real
     msg, e_refund = refund_disputed_payin(self.db, exchange)
     assert msg == 'succeeded'
     assert e_refund.amount == -exchange.amount
     assert e_refund.fee == exchange.fee.zero()
     janet = self.janet.refetch()
     assert janet.balance == 0
     self.db.self_check()
     # Again
     msg, e_refund_2 = refund_disputed_payin(self.db, exchange)
     assert msg == 'already done'
     assert e_refund_2.id == e_refund.id
 def test_charge_no_card(self):
     with self.assertRaises(AssertionError):
         charge(self.db, None, EUR('10.00'), 'http://localhost/')
 def test_charge_bad_card(self):
     self.janet_route.set_attributes(address='-1')
     exchange = charge(self.db, self.janet_route, EUR('10.00'),
                       'http://localhost/')
     assert exchange.note.startswith(
         'The value -1 is not valid (CardId) | Error ID: ')
Beispiel #25
0
 def test_charge_bad_card(self):
     self.janet_route.set_attributes(address='-1')
     exchange = charge(self.db, self.janet_route, D('10.00'), 'http://localhost/')
     assert exchange.note.startswith('The value -1 is not valid (CardId) | Error ID: ')
Beispiel #26
0
 def test_charge_bad_card(self):
     self.janet_route.set_attributes(address='-1')
     exchange = charge(self.db, self.janet_route, D('10.00'), 'http://localhost/')
     assert '"CardId":"The value -1 is not valid"' in exchange.note
Beispiel #27
0
 def test_charge_no_card(self):
     with self.assertRaises(AssertionError):
         charge(self.db, None, D('10.00'), 'http://localhost/')
Beispiel #28
0
 def test_charge_invalidated_card(self):
     bob = self.make_participant('bob')
     route = ExchangeRoute.insert(bob, 'mango-cc', '-1', error='invalidated', currency='EUR')
     with self.assertRaises(AssertionError):
         charge(self.db, route, D('10.00'), 'http://localhost/')