Esempio n. 1
0
 def test_increase_is_based_on_nominal_take_last_week(self):
     team, alice, bob = self.make_team_of_two()
     self.warbucks.set_tip_to(team, EUR('15.03'))
     self.take_last_week(team, alice, EUR('20.00'), actual_amount=EUR('15.03'))
     team.set_take_for(alice, EUR('35.00'), team, check_max=False)
     assert team.set_take_for(alice, EUR('42.00'), alice) == 40
 def test_receiving_includes_taking_when_updated_from_set_tip_to(self):
     alice = self.make_participant('alice', balance=EUR(100))
     bob = self.make_participant('bob', taking=EUR('42.00'))
     alice.set_tip_to(bob, EUR('3.00'))
     assert Participant.from_username(
         'bob').receiving == bob.receiving == EUR('45.00')
 def test_pledging_isnt_giving(self):
     alice = self.make_participant('alice', balance=EUR(100))
     bob = self.make_elsewhere('github', 58946, 'bob').participant
     alice.set_tip_to(bob, EUR('3.00'))
     assert alice.giving == EUR('0.00')
 def test_stt_doesnt_allow_self_tipping(self):
     alice = self.make_participant('alice', balance=EUR(100))
     with pytest.raises(NoSelfTipping):
         alice.set_tip_to(alice, EUR('10.00'))
 def test_stt_fails_to_tip_unknown_people(self):
     alice = self.make_participant('alice', balance=EUR(100))
     with pytest.raises(NoTippee):
         alice.set_tip_to('bob', EUR('1.00'))
Esempio n. 6
0
 def test_get_end_of_year_balances(self):
     make_history(self)
     balances = get_end_of_year_balances(self.db, self.alice, self.past_year, datetime.now().year)
     assert list(balances) == [EUR('10.00'), USD('0.00')]
 def test_getting_tips_not_made(self):
     expected = EUR('0.00')
     user2 = self.make_participant('user2')
     actual = self.stub.get_tip_to(user2)['amount']
     assert actual == expected
 def test_stt_sets_tip_to(self):
     alice = self.make_participant('alice')
     bob = self.make_stub()
     alice.set_tip_to(bob, EUR('1.00'))
     actual = alice.get_tip_to(bob).amount
     assert actual == EUR('1.00')
    def test_only_funded_tips_count(self):
        alice = self.make_participant('alice')
        bob = self.make_participant('bob')
        carl = self.make_participant('carl')
        dana = self.make_participant('dana')
        alice_card = self.upsert_route(alice, 'stripe-card')
        alice.set_tip_to(dana, EUR('3.00'))
        self.make_payin_and_transfer(alice_card, dana, EUR('15.00'))
        alice.set_tip_to(bob, EUR('6.00'))
        self.make_payin_and_transfer(alice_card, bob, EUR('30.00'))
        bob.set_tip_to(alice, EUR('5.00'))
        bob.set_tip_to(dana, EUR('2.00'))
        carl.set_tip_to(dana, EUR('2.08'))

        assert alice.giving == EUR('9.00')
        assert alice.receiving == EUR('0.00')
        assert bob.giving == EUR('0.00')
        assert bob.receiving == EUR('6.00')
        assert carl.giving == EUR('0.00')
        assert carl.receiving == EUR('0.00')
        assert dana.receiving == EUR('3.00')
        assert dana.npatrons == 1

        funded_tips = self.db.all("SELECT amount FROM tips WHERE is_funded ORDER BY id")
        assert funded_tips == [3, 6]
Esempio n. 10
0
    def test_set_tip_to_patron(self):
        self.make_participant("alice", goal=EUR(-1))
        bob = self.make_participant("bob")

        response = self.tip(bob, "alice", "10.00", raise_immediately=False)
        assert response.code == 200
Esempio n. 11
0
    def test_resolve_destination(self):
        alice = self.make_participant('alice')
        bob = self.make_participant('bob')
        carl = self.make_participant('carl')
        team = self.make_participant('team', kind='group')
        alice.set_tip_to(team, EUR('10'))

        # Test without payment account
        team.add_member(bob)
        with self.assertRaises(MissingPaymentAccount):
            resolve_destination(self.db, team, 'stripe', alice, 'FR',
                                EUR('10'))

        # Test without payment account at the requested provider
        stripe_account_bob = self.add_payment_account(bob, 'stripe')
        with self.assertRaises(MissingPaymentAccount):
            resolve_destination(self.db, team, 'paypal', alice, 'US',
                                EUR('10'))

        # Test with a single member and the take at zero
        account = resolve_destination(self.db, team, 'stripe', alice, 'GB',
                                      EUR('7'))
        assert account == stripe_account_bob

        # Test with two members but only one payment account
        team.add_member(carl)
        account = resolve_destination(self.db, team, 'stripe', alice, 'CH',
                                      EUR('8'))
        assert account == stripe_account_bob

        # Test with two members but only one payment account at the requested provider
        paypal_account_carl = self.add_payment_account(carl, 'paypal')
        account = resolve_destination(self.db, team, 'stripe', alice, 'BE',
                                      EUR('42'))
        assert account == stripe_account_bob

        # Test with two members and both takes at zero
        stripe_account_carl = self.add_payment_account(carl, 'stripe')
        account = resolve_destination(self.db, team, 'stripe', alice, 'PL',
                                      EUR('5.46'))
        assert account == stripe_account_bob
        account = resolve_destination(self.db, team, 'paypal', alice, 'PL',
                                      EUR('99.9'))
        assert account == paypal_account_carl

        # Test with two members and one non-zero take
        team.set_take_for(bob, EUR('1'), bob)
        account = resolve_destination(self.db, team, 'stripe', alice, 'RU',
                                      EUR('50.02'))
        assert account == stripe_account_bob
        account = resolve_destination(self.db, team, 'paypal', alice, 'RU',
                                      EUR('33'))
        assert account == paypal_account_carl

        # Test with two members and two different non-zero takes
        team.set_take_for(carl, EUR('2'), carl)
        account = resolve_destination(self.db, team, 'stripe', alice, 'BR',
                                      EUR('10'))
        assert account == stripe_account_carl
        account = resolve_destination(self.db, team, 'stripe', alice, 'BR',
                                      EUR('1'))
        assert account == stripe_account_carl
        account = resolve_destination(self.db, team, 'paypal', alice, 'BR',
                                      EUR('5'))
        assert account == paypal_account_carl

        # Check that members are cycled through
        alice_card = ExchangeRoute.insert(alice,
                                          'stripe-card',
                                          'x',
                                          'chargeable',
                                          remote_user_id='x')
        payin, pt = self.make_payin_and_transfer(alice_card, team, EUR('2'))
        assert pt.destination == stripe_account_carl.pk
        payin, pt = self.make_payin_and_transfer(alice_card, team, EUR('1'))
        assert pt.destination == stripe_account_bob.pk
        payin, pt = self.make_payin_and_transfer(alice_card, team, EUR('4'))
        assert pt.destination == stripe_account_carl.pk
        payin, pt = self.make_payin_and_transfer(alice_card, team, EUR('10'))
        assert pt.destination == stripe_account_carl.pk
        payin, pt = self.make_payin_and_transfer(alice_card, team, EUR('2'))
        assert pt.destination == stripe_account_bob.pk
Esempio n. 12
0
 def test_can_take_leftover(self):
     team, alice, bob = self.make_team_of_two()
     self.take_last_week(team, alice, EUR('0.01'))
     actual = team.set_take_for(alice, EUR('200.00'), team)
     assert actual == 100
Esempio n. 13
0
 def test_can_take_any_amount_when_takes_were_all_zero_last_week(self):
     team, alice, bob = self.make_team_of_two()
     self.take_last_week(team, alice, EUR('0.00'))
     self.take_last_week(team, bob, EUR('0.00'))
     actual = team.set_take_for(alice, EUR('222.00'), team)
     assert actual == 222
Esempio n. 14
0
 def test_if_last_week_is_less_than_one_can_increase_to_one(self):
     team, alice, bob = self.make_team_of_two()
     self.warbucks.set_tip_to(team, EUR('0.50'))
     self.take_last_week(team, alice, EUR('0.01'))
     actual = team.set_take_for(alice, EUR('42.00'), team)
     assert actual == 1
Esempio n. 15
0
    def test_update_cached_amounts(self):
        team = self.make_participant('team', kind='group')
        alice = self.make_participant('alice')
        alice_card = self.upsert_route(alice, 'stripe-card')
        bob = self.make_participant('bob')
        carl = self.make_participant('carl')
        carl_card = self.upsert_route(carl, 'stripe-card')
        dana = self.make_participant('dana')
        emma = Participant.make_stub(username='******')
        team2 = self.make_participant('team2', kind='group')
        team2.add_member(dana)
        alice.set_tip_to(dana, EUR('3.00'))
        self.make_payin_and_transfer(alice_card, dana, EUR('30.00'))
        alice.set_tip_to(bob, EUR('6.00'))
        self.make_payin_and_transfer(alice_card, bob, EUR('60.00'))
        alice.set_tip_to(emma, EUR('0.50'))
        alice.set_tip_to(team, EUR('1.20'))
        alice.set_tip_to(team2, EUR('0.49'))
        self.make_payin_and_transfer(alice_card, team2, EUR('4.90'))
        bob.set_tip_to(alice, EUR('5.00'))
        team.set_take_for(bob, EUR('1.00'), team)
        self.make_payin_and_transfer(alice_card, team, EUR('12.00'))
        bob.set_tip_to(dana, EUR('2.00'))  # funded by bob's take
        bob.set_tip_to(emma, EUR('7.00'))  # not funded, insufficient receiving
        carl.set_tip_to(dana, EUR('2.08'))  # not funded, insufficient balance
        self.make_payin_and_transfer(carl_card, dana, EUR('1.56'))

        def check():
            alice = Participant.from_username('alice')
            bob = Participant.from_username('bob')
            carl = Participant.from_username('carl')
            dana = Participant.from_username('dana')
            emma = Participant.from_username('emma')
            assert alice.giving == EUR('10.69')
            assert alice.receiving == EUR('0.00')
            assert alice.npatrons == 0
            assert alice.nteampatrons == 0
            assert bob.giving == EUR('0.00')
            assert bob.taking == EUR('1.00')
            assert bob.receiving == EUR('7.00')
            assert bob.npatrons == 1
            assert bob.nteampatrons == 1
            assert carl.giving == EUR('0.00')
            assert carl.receiving == EUR('0.00')
            assert carl.npatrons == 0
            assert carl.nteampatrons == 0
            assert dana.receiving == EUR('3.49')
            assert dana.npatrons == 1
            assert dana.nteampatrons == 1
            assert emma.receiving == EUR('0.50')
            assert emma.npatrons == 1
            assert emma.nteampatrons == 0
            funded_tips = self.db.all(
                "SELECT amount FROM tips WHERE is_funded ORDER BY id")
            assert funded_tips == [3, 6, 0.5, EUR('1.20'), EUR('0.49')]

            team = Participant.from_username('team')
            assert team.receiving == EUR('1.20')
            assert team.npatrons == 1
            assert team.leftover == EUR('0.20')

            team2 = Participant.from_username('team2')
            assert team2.receiving == EUR('0.49')
            assert team2.npatrons == 1
            assert team2.leftover == EUR('0.00')

            janet = self.janet.refetch()
            assert janet.giving == 0
            assert janet.receiving == 0
            assert janet.taking == 0
            assert janet.npatrons == 0
            assert janet.nteampatrons == 0

        # Pre-test check
        check()

        # Check that update_cached_amounts doesn't mess anything up
        Payday.start().update_cached_amounts()
        check()

        # Check that update_cached_amounts actually updates amounts
        self.db.run("""
            UPDATE tips t
               SET is_funded = true
              FROM participants p
             WHERE p.id = t.tippee
               AND p.mangopay_user_id IS NOT NULL;
            UPDATE participants
               SET giving = (10000,'EUR')
                 , taking = (10000,'EUR')
             WHERE mangopay_user_id IS NOT NULL;
            UPDATE participants
               SET npatrons = 10000
                 , receiving = (10000,'EUR')
             WHERE status = 'active';
        """)
        Payday.start().update_cached_amounts()
        check()

        # Check that the update methods of Participant concur
        for p in self.db.all("SELECT p.*::participants FROM participants p"):
            p.update_receiving()
            p.update_giving()
        check()
Esempio n. 16
0
 def test_close_raises_for_unknown_disbursement_strategy(self):
     alice = self.make_participant('alice', balance=EUR('0.00'))
     with pytest.raises(alice.UnknownDisbursementStrategy):
         alice.close('cheese')
Esempio n. 17
0
 def test_get_end_of_period_balances(self):
     make_history(self)
     today = get_start_of_current_utc_day()
     period_end = today.replace(month=1, day=1)
     balances = get_end_of_period_balances(self.db, self.alice, period_end, today)
     assert balances == EUR('10.00')
Esempio n. 18
0
        def check():
            alice = Participant.from_username('alice')
            bob = Participant.from_username('bob')
            carl = Participant.from_username('carl')
            dana = Participant.from_username('dana')
            emma = Participant.from_username('emma')
            assert alice.giving == EUR('10.69')
            assert alice.receiving == EUR('0.00')
            assert alice.npatrons == 0
            assert alice.nteampatrons == 0
            assert bob.giving == EUR('0.00')
            assert bob.taking == EUR('1.00')
            assert bob.receiving == EUR('7.00')
            assert bob.npatrons == 1
            assert bob.nteampatrons == 1
            assert carl.giving == EUR('0.00')
            assert carl.receiving == EUR('0.00')
            assert carl.npatrons == 0
            assert carl.nteampatrons == 0
            assert dana.receiving == EUR('3.49')
            assert dana.npatrons == 1
            assert dana.nteampatrons == 1
            assert emma.receiving == EUR('0.50')
            assert emma.npatrons == 1
            assert emma.nteampatrons == 0
            funded_tips = self.db.all(
                "SELECT amount FROM tips WHERE is_funded ORDER BY id")
            assert funded_tips == [3, 6, 0.5, EUR('1.20'), EUR('0.49')]

            team = Participant.from_username('team')
            assert team.receiving == EUR('1.20')
            assert team.npatrons == 1
            assert team.leftover == EUR('0.20')

            team2 = Participant.from_username('team2')
            assert team2.receiving == EUR('0.49')
            assert team2.npatrons == 1
            assert team2.leftover == EUR('0.00')

            janet = self.janet.refetch()
            assert janet.giving == 0
            assert janet.receiving == 0
            assert janet.taking == 0
            assert janet.npatrons == 0
            assert janet.nteampatrons == 0
Esempio n. 19
0
    def test_iter_payday_events(self):
        now = datetime.now()
        Payday.start().run()
        team = self.make_participant('team', kind='group')
        alice = self.make_participant('alice')
        self.make_exchange('mango-cc', 10000, 0, alice)
        self.make_exchange('mango-cc', -5000, 0, alice)
        self.db.run("""
            UPDATE exchanges
               SET timestamp = "timestamp" - interval '1 week'
        """)
        bob = self.make_participant('bob')
        carl = self.make_participant('carl')
        david = self.make_participant('david')
        self.make_exchange('mango-cc', 10000, 0, david)
        david.set_tip_to(team, EUR('1.00'))
        team.set_take_for(bob, EUR('1.00'), team)
        alice.set_tip_to(bob, EUR('5.00'))

        assert bob.balance == 0
        for i in range(2):
            Payday.start().run()
            self.db.run("""
                UPDATE exchanges
                   SET timestamp = "timestamp" - interval '1 week';
                UPDATE paydays
                   SET ts_start = ts_start - interval '1 week'
                     , ts_end = ts_end - interval '1 week';
                UPDATE transfers
                   SET timestamp = "timestamp" - interval '1 week';
            """)
        bob = Participant.from_id(bob.id)
        assert bob.balance == 12

        Payday().start()

        # Make sure events are all in the same year
        delta = '%s days' % (364 - (now - datetime(now.year, 1, 1)).days)
        self.db.run("""
            UPDATE exchanges
               SET timestamp = "timestamp" + interval %(delta)s;
            UPDATE paydays
               SET ts_start = ts_start + interval %(delta)s;
            UPDATE paydays
               SET ts_end = ts_end + interval %(delta)s
             WHERE ts_end >= ts_start;
            UPDATE transfers
               SET timestamp = "timestamp" + interval %(delta)s;
        """, dict(delta=delta))

        events = list(iter_payday_events(self.db, bob, now.year))
        assert len(events) == 9
        assert events[0]['kind'] == 'totals'
        assert not events[0]['regular_donations']['sent']
        assert events[0]['regular_donations']['received'].eur == 12
        assert events[1]['kind'] == 'day-open'
        assert events[1]['payday_number'] == 3
        assert events[2]['balances'].eur == 12
        assert events[-1]['kind'] == 'day-close'
        assert events[-1]['balances'].eur == 0

        alice = Participant.from_id(alice.id)
        assert alice.balance == 4990
        events = list(iter_payday_events(self.db, alice, now.year))
        assert events[0]['regular_donations']['sent'].eur == 10
        assert len(events) == 11

        carl = Participant.from_id(carl.id)
        assert carl.balance == 0
        events = list(iter_payday_events(self.db, carl, now.year))
        assert len(events) == 0
Esempio n. 20
0
    def test_payday_handles_paid_in_advance(self):
        self.make_exchange('mango-cc', EUR('2.00'), 0, self.janet)
        self.janet.set_tip_to(self.david, EUR('0.60'))
        team = self.make_participant('team', kind='group')
        team.set_take_for(self.homer, EUR('0.40'), team)
        self.janet.set_tip_to(team, EUR('0.40'))
        self.janet.distribute_balances_to_donees()

        self.db.run(
            "UPDATE participants SET payment_providers = 1")  # dirty trick

        # Preliminary checks
        janet = self.janet.refetch()
        assert janet.balance == 0
        tips = self.db.all(
            """
            SELECT *
              FROM current_tips
             WHERE tipper = %s
          ORDER BY id
        """, (janet.id, ))
        assert len(tips) == 2
        assert tips[0].paid_in_advance == EUR('1.20')
        assert tips[1].paid_in_advance == EUR('0.80')
        transfers = self.db.all("SELECT * FROM transfers ORDER BY id")
        assert len(transfers) == 2
        assert transfers[0].amount == EUR('1.20')
        assert transfers[0].context == 'tip-in-advance'
        assert transfers[1].amount == EUR('0.80')
        assert transfers[1].context == 'take-in-advance'

        # Now run a payday and check the results
        Payday.start().run()
        tips = self.db.all(
            """
            SELECT *
              FROM current_tips
             WHERE tipper = %s
          ORDER BY id
        """, (janet.id, ))
        assert len(tips) == 2
        assert tips[0].paid_in_advance == EUR('0.60')
        assert tips[1].paid_in_advance == EUR('0.40')
        transfers = self.db.all("SELECT * FROM transfers ORDER BY id")
        assert len(transfers) == 4

        emails = self.get_emails()
        assert len(emails) == 2
        assert emails[0]['to'][0] == 'david <%s>' % self.david.email
        assert '0.60' in emails[0]['subject']
        assert emails[1]['to'][0] == 'homer <%s>' % self.homer.email
        assert '0.40' in emails[1]['text']

        # Now run a second payday and check the results again
        self.db.run("UPDATE notifications SET ts = ts - interval '1 week'")
        Payday.start().run()
        tips = self.db.all(
            """
            SELECT *
              FROM current_tips
             WHERE tipper = %s
          ORDER BY id
        """, (janet.id, ))
        assert len(tips) == 2
        assert not tips[0].paid_in_advance
        assert not tips[1].paid_in_advance
        transfers = self.db.all("SELECT * FROM transfers ORDER BY id")
        assert len(transfers) == 6

        emails = self.get_emails()
        assert len(emails) == 3
        assert emails[0]['to'][0] == 'david <%s>' % self.david.email
        assert '0.60' in emails[0]['subject']
        assert emails[1]['to'][0] == 'homer <%s>' % self.homer.email
        assert '0.40' in emails[1]['text']
        assert emails[2]['to'][0] == 'janet <%s>' % self.janet.email
        assert 'renew your donation' in emails[2]['subject']
        assert '2 donations' in emails[2]['text']
 def test_stt_works_for_yearly_donations(self):
     alice = self.make_participant('alice', balance=EUR(100))
     bob = self.make_participant('bob')
     t = alice.set_tip_to(bob, EUR('104'), 'yearly')
     assert t['amount'] == 2
Esempio n. 22
0
    def test_wellfunded_team(self):
        """
        This tests two properties:
        - takes are maximums
        - donors all pay their share, the first donor doesn't pay everything
        """
        team = self.make_participant('team', kind='group')
        alice = self.make_participant('alice')
        team.set_take_for(alice, EUR('0.79'), team)
        bob = self.make_participant('bob')
        team.set_take_for(bob, EUR('0.21'), team)
        charlie = self.make_participant('charlie', balance=EUR(10))
        charlie.set_tip_to(team, EUR('5.00'))
        dan = self.make_participant('dan', balance=EUR(10))
        dan.set_tip_to(team, EUR('5.00'))

        Payday.start().run()

        d = dict(self.db.all("SELECT username, balance FROM participants"))
        expected = {
            'alice': EUR('0.79'),
            'bob': EUR('0.21'),
            'charlie': EUR('9.5'),
            'dan': EUR('9.5'),
            'team': EUR('0.00'),
        }
        assert d == expected
 def test_stt_doesnt_allow_just_any_ole_amount(self):
     alice = self.make_participant('alice', balance=EUR(100))
     bob = self.make_participant('bob')
     with pytest.raises(BadAmount):
         alice.set_tip_to(bob, EUR('1000.00'))
Esempio n. 24
0
    def test_wellfunded_team_with_early_donor(self):
        team = self.make_participant('team', kind='group')
        alice = self.make_participant('alice')
        team.set_take_for(alice, EUR('0.79'), team)
        bob = self.make_participant('bob')
        team.set_take_for(bob, EUR('0.21'), team)
        charlie = self.make_participant('charlie', balance=EUR(10))
        charlie.set_tip_to(team, EUR('2.00'))

        print("> Step 1: three weeks of donations from charlie only")
        print()
        for i in range(3):
            Payday.start().run(recompute_stats=0, update_cached_amounts=False)
            print()

        d = dict(self.db.all("SELECT username, balance FROM participants"))
        expected = {
            'alice': EUR('0.79') * 3,
            'bob': EUR('0.21') * 3,
            'charlie': EUR('7.00'),
            'team': EUR('0.00'),
        }
        assert d == expected

        print(
            "> Step 2: dan joins the party, charlie's donation is automatically "
            "reduced while dan catches up")
        print()
        dan = self.make_participant('dan', balance=EUR(10))
        dan.set_tip_to(team, EUR('2.00'))

        for i in range(6):
            Payday.start().run(recompute_stats=0, update_cached_amounts=False)
            print()

        d = dict(self.db.all("SELECT username, balance FROM participants"))
        expected = {
            'alice': EUR('0.79') * 9,
            'bob': EUR('0.21') * 9,
            'charlie': EUR('5.50'),
            'dan': EUR('5.50'),
            'team': EUR('0.00'),
        }
        assert d == expected

        print(
            "> Step 3: dan has caught up with charlie, they will now both give 0.50"
        )
        print()
        for i in range(3):
            Payday.start().run(recompute_stats=0, update_cached_amounts=False)
            print()

        d = dict(self.db.all("SELECT username, balance FROM participants"))
        expected = {
            'alice': EUR('0.79') * 12,
            'bob': EUR('0.21') * 12,
            'charlie': EUR('4.00'),
            'dan': EUR('4.00'),
            'team': EUR('0.00'),
        }
        assert d == expected
    def test_only_funded_tips_count(self):
        alice = self.make_participant('alice', balance=EUR(100))
        bob = self.make_participant('bob')
        carl = self.make_participant('carl', last_bill_result="Fail!")
        dana = self.make_participant('dana')
        alice.set_tip_to(dana, EUR('3.00'))
        alice.set_tip_to(bob, EUR('6.00'))
        bob.set_tip_to(alice, EUR('5.00'))
        bob.set_tip_to(dana, EUR('2.00'))
        carl.set_tip_to(dana, EUR('2.08'))

        assert alice.giving == EUR('9.00')
        assert alice.receiving == EUR('5.00')
        assert bob.giving == EUR('5.00')
        assert bob.receiving == EUR('6.00')
        assert carl.giving == EUR('0.00')
        assert carl.receiving == EUR('0.00')
        assert dana.receiving == EUR('3.00')
        assert dana.npatrons == 1

        funded_tips = self.db.all(
            "SELECT amount FROM tips WHERE is_funded ORDER BY id")
        assert funded_tips == [3, 6, 5]
Esempio n. 26
0
    def test_wellfunded_team_with_two_early_donors_and_low_amounts(self):
        team = self.make_participant('team', kind='group')
        alice = self.make_participant('alice')
        team.set_take_for(alice, EUR('0.01'), team)
        bob = self.make_participant('bob')
        team.set_take_for(bob, EUR('0.01'), team)
        charlie = self.make_participant('charlie', balance=EUR(10))
        charlie.set_tip_to(team, EUR('0.02'))
        dan = self.make_participant('dan', balance=EUR(10))
        dan.set_tip_to(team, EUR('0.02'))

        print("> Step 1: three weeks of donations from early donors")
        print()
        for i in range(3):
            Payday.start().run(recompute_stats=0, update_cached_amounts=False)
            print()

        d = dict(self.db.all("SELECT username, balance FROM participants"))
        expected = {
            'alice': EUR('0.01') * 3,
            'bob': EUR('0.01') * 3,
            'charlie': EUR('9.97'),
            'dan': EUR('9.97'),
            'team': EUR('0.00'),
        }
        assert d == expected

        print("> Step 2: a new donor appears, the contributions of the early "
              "donors automatically decrease while the new donor catches up")
        print()
        emma = self.make_participant('emma', balance=EUR(10))
        emma.set_tip_to(team, EUR('0.02'))

        for i in range(6):
            Payday.start().run(recompute_stats=0, update_cached_amounts=False)
            print()

        d = dict(self.db.all("SELECT username, balance FROM participants"))
        expected = {
            'alice': EUR('0.01') * 9,
            'bob': EUR('0.01') * 9,
            'charlie': EUR('9.94'),
            'dan': EUR('9.94'),
            'emma': EUR('9.94'),
            'team': EUR('0.00'),
        }
        assert d == expected
 def test_cant_pledge_to_locked_accounts(self):
     alice = self.make_participant('alice', balance=EUR(100))
     bob = self.make_stub(goal=EUR(-1))
     with self.assertRaises(UserDoesntAcceptTips):
         alice.set_tip_to(bob, EUR('3.00'))
Esempio n. 28
0
    def test_wellfunded_team_with_early_donor_and_small_leftover(self):
        team = self.make_participant('team', kind='group')
        alice = self.make_participant('alice')
        team.set_take_for(alice, EUR('0.50'), team)
        bob = self.make_participant('bob')
        team.set_take_for(bob, EUR('0.50'), team)
        charlie = self.make_participant('charlie', balance=EUR(10))
        charlie.set_tip_to(team, EUR('0.52'))

        print("> Step 1: three weeks of donations from early donor")
        print()
        for i in range(3):
            Payday.start().run(recompute_stats=0, update_cached_amounts=False)
            print()

        d = dict(self.db.all("SELECT username, balance FROM participants"))
        expected = {
            'alice': EUR('0.26') * 3,
            'bob': EUR('0.26') * 3,
            'charlie': EUR('8.44'),
            'team': EUR('0.00'),
        }
        assert d == expected

        print("> Step 2: a new donor appears, the contribution of the early "
              "donor automatically decreases while the new donor catches up, "
              "but the leftover is small so the adjustments are limited")
        print()
        dan = self.make_participant('dan', balance=EUR(10))
        dan.set_tip_to(team, EUR('0.52'))

        for i in range(3):
            Payday.start().run(recompute_stats=0, update_cached_amounts=False)
            print()

        d = dict(self.db.all("SELECT username, balance FROM participants"))
        expected = {
            'alice': EUR('0.26') * 3 + EUR('0.50') * 3,
            'bob': EUR('0.26') * 3 + EUR('0.50') * 3,
            'charlie': EUR('7.00'),
            'dan': EUR('8.44'),
            'team': EUR('0.00'),
        }
        assert d == expected
 def test_cross_tip_doesnt_become_self_tip(self):
     alice = self.make_participant('alice', elsewhere='twitter')
     bob = self.make_elsewhere('twitter', 2, 'bob')
     alice.set_tip_to(bob.participant, EUR('1.00'))
     alice.take_over(bob, have_confirmation=True)
     self.db.self_check()
Esempio n. 30
0
 def test_take_can_double_but_not_a_penny_more(self):
     team, alice, bob = self.make_team_of_two()
     self.warbucks.set_tip_to(team, EUR('20'))
     self.take_last_week(team, alice, EUR('40.00'))
     actual = team.set_take_for(alice, EUR('80.01'), alice)
     assert actual == 80