def test_sums(self): # Empty sum actual = self.db.one( "SELECT sum(x) FROM unnest(NULL::currency_amount[]) x") assert actual is None actual = self.db.one( "SELECT sum(x) FROM unnest(ARRAY[NULL]::currency_amount[]) x") assert actual is None # Empty fuzzy sum actual = self.db.one( "SELECT sum(x, 'EUR') FROM unnest(NULL::currency_amount[]) x") assert actual is None actual = self.db.one( "SELECT sum(x, 'EUR') FROM unnest(ARRAY[NULL]::currency_amount[]) x" ) assert actual is None # Single-currency sum amounts = [JPY('133'), JPY('977')] expected = sum(amounts) actual = self.db.one("SELECT sum(x, 'JPY') FROM unnest(%s) x", (amounts + [None], )) assert expected == actual # Fuzzy sum amounts = [EUR('0.50'), USD('1.20')] expected = MoneyBasket(*amounts).fuzzy_sum('EUR') actual = self.db.one("SELECT sum(x, 'EUR') FROM unnest(%s) x", (amounts + [None], )) assert expected == actual, (expected.__dict__, actual.__dict__)
def test_02_payin_stripe_card_one_to_many(self): self.db.run("ALTER SEQUENCE payins_id_seq RESTART WITH 102") self.db.run("ALTER SEQUENCE payin_transfers_id_seq RESTART WITH 102") self.add_payment_account(self.creator_1, 'stripe', id=self.acct_switzerland.id) self.add_payment_account(self.creator_3, 'stripe') self.add_payment_account(self.creator_3, 'paypal') tip1 = self.donor.set_tip_to(self.creator_1, JPY('1250')) tip3 = self.donor.set_tip_to(self.creator_3, JPY('1250')) # 1st request: test getting the payment pages expected_uri = '/donor/giving/pay/stripe/?beneficiary=%i,%i&method=card' % ( self.creator_1.id, self.creator_3.id) r = self.client.GET('/donor/giving/pay/', auth_as=self.donor) assert r.code == 200, r.text assert str(Markup.escape(expected_uri)) in r.text r = self.client.GET(expected_uri, auth_as=self.donor) assert r.code == 200, r.text # 2nd request: prepare the payment form_data = { 'amount': '10000', 'currency': 'JPY', 'tips': '%i,%i' % (tip1['id'], tip3['id']), 'token': 'tok_jp', } r = self.client.PxST('/donor/giving/pay/stripe', form_data, auth_as=self.donor) assert r.code == 200, r.text assert r.headers[b'Refresh'] == b'0;url=/donor/giving/pay/stripe/102' payin = self.db.one("SELECT * FROM payins") assert payin.status == 'pre' assert payin.amount == JPY('10000') payin_transfers = self.db.all( "SELECT * FROM payin_transfers ORDER BY id") assert len(payin_transfers) == 2 pt1, pt2 = payin_transfers assert pt1.status == 'pre' assert pt1.amount == JPY('5000') assert pt2.status == 'pre' assert pt2.amount == JPY('5000') # 3rd request: execute the payment r = self.client.GET('/donor/giving/pay/stripe/102', auth_as=self.donor) assert r.code == 200, r.text payin = self.db.one("SELECT * FROM payins") assert payin.status == 'succeeded' assert payin.amount_settled == EUR('78.66') assert payin.fee == EUR('2.53') payin_transfers = self.db.all( "SELECT * FROM payin_transfers ORDER BY id") assert len(payin_transfers) == 2 pt1, pt2 = payin_transfers assert pt1.status == 'succeeded' assert pt1.amount == EUR('38.07') assert pt1.remote_id assert pt2.status == 'succeeded' assert pt2.amount == EUR('38.06')
def test_take_paid_in_advance_in_unaccepted_currency(self): team = self.make_participant('team', kind='group', accepted_currencies=None) alice = self.make_participant('alice', main_currency='EUR', accepted_currencies='EUR,USD') team.set_take_for(alice, EUR('1.00'), team) bob = self.make_participant('bob', main_currency='USD', accepted_currencies='EUR,USD') team.set_take_for(bob, USD('1.00'), team) stripe_account_alice = self.add_payment_account(alice, 'stripe', default_currency='EUR') self.add_payment_account(bob, 'stripe', country='US', default_currency='USD') carl = self.make_participant('carl') carl.set_tip_to(team, JPY('1250')) carl_card = ExchangeRoute.insert( carl, 'stripe-card', 'x', 'chargeable', remote_user_id='x' ) payin, pt = self.make_payin_and_transfer(carl_card, team, JPY('1250')) assert pt.destination == stripe_account_alice.pk Payday.start().run() transfers = self.db.all("SELECT * FROM transfers ORDER BY id") assert len(transfers) == 1 assert transfers[0].virtual is True assert transfers[0].tipper == carl.id assert transfers[0].tippee == alice.id assert transfers[0].amount == JPY('125')
def test_stripe_card_receipt(self): self.donor.set_tip_to(self.recipient, JPY('100')) route = self.upsert_route(self.donor, 'stripe-card', address='pm_1EZc8vFk4eGpfLOCibbhONPo') payin = self.make_payin_and_transfer(route, self.recipient, JPY('2001'))[0] r = self.client.GET(self.donor.path('receipts/direct/%s' % payin.id), auth_as=self.donor) assert r.code == 200, r.text
def test_int_to_Money(self): expected = USD('1.02') actual = int_to_Money(102, 'USD') assert expected == actual expected = JPY('1') actual = int_to_Money(1, 'JPY') assert expected == actual
def test_Money_to_int(self): expected = 101 actual = Money_to_int(EUR('1.01')) assert expected == actual expected = 1 actual = Money_to_int(JPY('1')) assert expected == actual
def test_payin_pages_when_currencies_dont_match(self): self.add_payment_account(self.creator_1, 'stripe') self.add_payment_account(self.creator_2, 'paypal') self.add_payment_account(self.creator_3, 'stripe') self.add_payment_account(self.creator_3, 'paypal') self.donor.set_tip_to(self.creator_1, EUR('11.00')) self.donor.set_tip_to(self.creator_2, JPY('1100')) self.donor.set_tip_to(self.creator_3, USD('11.00')) paypal_path = '/donor/giving/pay/paypal/?beneficiary=%i,%i' % ( self.creator_2.id, self.creator_3.id ) stripe_path = '/donor/giving/pay/stripe/?beneficiary=%i,%i&method=card' % ( self.creator_1.id, self.creator_3.id ) r = self.client.GET('/donor/giving/pay/', auth_as=self.donor) assert r.code == 200, r.text assert str(Markup.escape(paypal_path)) not in r.text assert str(Markup.escape(stripe_path)) not in r.text r = self.client.GxT(paypal_path, auth_as=self.donor) assert r.code == 400, r.text r = self.client.GxT(stripe_path, auth_as=self.donor) assert r.code == 400, r.text
def test_takes_paid_in_advance_to_now_inactive_members(self): team = self.make_participant('team', kind='group', accepted_currencies=None) alice = self.make_participant('alice', main_currency='EUR', accepted_currencies=None) team.set_take_for(alice, EUR('1.00'), team) bob = self.make_participant('bob', main_currency='USD', accepted_currencies=None) team.set_take_for(bob, USD('1.00'), team) stripe_account_alice = self.add_payment_account( alice, 'stripe', default_currency='EUR' ) stripe_account_bob = self.add_payment_account( bob, 'stripe', country='US', default_currency='USD' ) carl = self.make_participant('carl') carl.set_tip_to(team, JPY('250')) carl_card = ExchangeRoute.insert( carl, 'stripe-card', 'x', 'chargeable', remote_user_id='x' ) payin, pt = self.make_payin_and_transfer(carl_card, team, JPY('1250')) assert pt.destination == stripe_account_alice.pk payin, pt = self.make_payin_and_transfer(carl_card, team, JPY('1250')) assert pt.destination == stripe_account_bob.pk team.set_take_for(alice, EUR('0.00'), team) team.set_take_for(bob, None, team) takes = dict(self.db.all(""" SELECT DISTINCT ON (member) member, paid_in_advance FROM takes ORDER BY member, mtime DESC """)) assert takes == { alice.id: EUR('10.00'), bob.id: USD('12.00'), } Payday.start().run() transfers = self.db.all("SELECT * FROM transfers ORDER BY id") assert len(transfers) == 2 assert transfers[0].virtual is True assert transfers[0].tipper == carl.id assert transfers[0].tippee == alice.id assert transfers[0].amount == JPY('125') assert transfers[1].virtual is True assert transfers[1].tipper == carl.id assert transfers[1].tippee == bob.id assert transfers[1].amount == JPY('125') takes = dict(self.db.all(""" SELECT DISTINCT ON (member) member, paid_in_advance FROM takes ORDER BY member, mtime DESC """)) assert takes == { alice.id: EUR('9.00'), bob.id: USD('10.80'), } notifications = self.db.all("SELECT * FROM notifications") assert len(notifications) == 0 leftovers = dict(self.db.all("SELECT username, leftover FROM participants")) assert leftovers == { 'team': MoneyBasket(JPY('250.00')), 'alice': None, 'bob': None, 'carl': None, }
def test_sorting(self): amounts = [JPY('130'), EUR('99.58'), Money('79', 'KRW'), USD('35.52')] expected = sorted(amounts, key=lambda m: -m.convert('EUR').amount) actual = self.db.all("SELECT x FROM unnest(%s) x ORDER BY x DESC", (amounts, )) assert expected == actual