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
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
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/')
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/')
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/')
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
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
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
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
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
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
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
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
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()
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()
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()
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()
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()
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: ')
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: ')
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
def test_charge_no_card(self): with self.assertRaises(AssertionError): charge(self.db, None, D('10.00'), 'http://localhost/')
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/')