def test_iter_payday_events(self): now = datetime.now() Payday().start().run() Enterprise = self.make_team(is_approved=True) self.obama.set_payment_instruction(Enterprise, '10.00') # >= MINIMUM_CHARGE! for i in range(2): with patch.object(Payday, 'fetch_card_holds') as fch: fch.return_value = {} Payday.start().run() self.db.run(""" UPDATE paydays SET ts_start = ts_start - interval '1 week' , ts_end = ts_end - interval '1 week'; UPDATE payments SET timestamp = "timestamp" - interval '1 week'; UPDATE transfers SET timestamp = "timestamp" - interval '1 week'; """) obama = Participant.from_username('obama') picard = Participant.from_username('picard') assert obama.balance == D('0.00') assert picard.balance == D('20.00') Payday().start() # to demonstrate that we ignore any open payday? # Make all events in the same year. delta = '%s days' % (364 - (now - datetime(now.year, 1, 1)).days) self.db.run( """ UPDATE paydays SET ts_start = ts_start + interval %(delta)s , ts_end = ts_end + interval %(delta)s; UPDATE payments SET timestamp = "timestamp" + interval %(delta)s; UPDATE transfers SET timestamp = "timestamp" + interval %(delta)s; """, dict(delta=delta)) events = list(iter_payday_events(self.db, picard, now.year)) assert len(events) == 7 assert events[0]['kind'] == 'totals' assert events[0]['given'] == 0 assert events[0]['received'] == 20 assert events[1]['kind'] == 'day-open' assert events[1]['payday_number'] == 2 assert events[2]['balance'] == 20 assert events[-1]['kind'] == 'day-close' assert events[-1]['balance'] == 0 events = list(iter_payday_events(self.db, obama)) assert events[0]['given'] == 20 assert len(events) == 11
def test_iter_payday_events(self): now = datetime.now() Payday().start().run() self.shift_all_paydays_by('-1 week') Enterprise = self.make_team(is_approved=True) self.obama.set_payment_instruction(Enterprise, '10.00') # >= MINIMUM_CHARGE! for i in range(2): with patch.object(Payday, 'fetch_card_holds') as fch: fch.return_value = {} Payday.start().run() self.shift_all_paydays_by('-1 week') obama = P('obama') picard = P('picard') assert obama.balance == D('0.00') assert picard.balance == D('20.00') Payday().start() # to demonstrate that we ignore any open payday? # Make all events in the same year. if now.month < 2: # Above, we created four paydays in sequential weeks, with the # latest being today. We don't want them to go back into the # previous year, so let's shift them forward if it's close. self.shift_all_paydays_by('3 months') events = list(iter_payday_events(self.db, picard, now.year)) assert len(events) == 7 assert events[0]['kind'] == 'totals' assert events[0]['given'] == 0 assert events[0]['received'] == 20 assert events[1]['kind'] == 'day-open' assert events[1]['payday_number'] == 2 assert events[2]['balance'] == 20 assert events[-1]['kind'] == 'day-close' assert events[-1]['balance'] == 0 events = list(iter_payday_events(self.db, obama)) assert events[0]['given'] == 20 assert len(events) == 9
def test_iter_payday_events(self): Payday.start().run() team = self.make_participant('team', number='plural', claimed_time='now') alice = self.make_participant('alice', claimed_time='now') self.make_exchange('bill', 10000, 0, team) self.make_exchange('bill', 10000, 0, alice) self.make_exchange('bill', -5000, 0, alice) self.db.run(""" UPDATE transfers SET timestamp = "timestamp" - interval '1 month' """) bob = self.make_participant('bob', claimed_time='now') carl = self.make_participant('carl', claimed_time='now') team.add_member(bob) team.set_take_for(bob, Decimal('1.00'), team) alice.set_tip_to(bob, Decimal('5.00')) assert bob.balance == 0 for i in range(2): with patch.object(Payday, 'fetch_card_holds') as fch: fch.return_value = {} Payday.start().run() self.db.run(""" 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() events = list(iter_payday_events(self.db, bob)) assert len(events) == 9 assert events[0]['kind'] == 'totals' assert events[0]['given'] == 0 assert events[0]['received'] == 12 assert events[1]['kind'] == 'day-open' assert events[1]['payday_number'] == 2 assert events[2]['balance'] == 12 assert events[-1]['kind'] == 'day-close' assert events[-1]['balance'] == '0.00' alice = Participant.from_id(alice.id) assert alice.balance == 4990 events = list(iter_payday_events(self.db, alice)) assert events[0]['given'] == 10 assert len(events) == 11 carl = Participant.from_id(carl.id) assert carl.balance == 0 events = list(iter_payday_events(self.db, carl)) assert len(events) == 0
def test_iter_payday_events(self): Payday().start().run() Enterprise = self.make_team(is_approved=True) self.obama.set_payment_instruction(Enterprise, '6.00') # under $10! for i in range(2): with patch.object(Payday, 'fetch_card_holds') as fch: fch.return_value = {} Payday.start().run() self.db.run(""" UPDATE paydays SET ts_start = ts_start - interval '1 week' , ts_end = ts_end - interval '1 week'; UPDATE payments SET timestamp = "timestamp" - interval '1 week'; UPDATE transfers SET timestamp = "timestamp" - interval '1 week'; """) obama = Participant.from_username('obama') picard = Participant.from_username('picard') assert obama.balance == D('6.82') assert picard.balance == D('12.00') Payday().start() # to demonstrate that we ignore any open payday? events = list(iter_payday_events(self.db, picard)) assert len(events) == 7 assert events[0]['kind'] == 'totals' assert events[0]['given'] == 0 assert events[0]['received'] == 12 assert events[1]['kind'] == 'day-open' assert events[1]['payday_number'] == 2 assert events[2]['balance'] == 12 assert events[-1]['kind'] == 'day-close' assert events[-1]['balance'] == 0 events = list(iter_payday_events(self.db, obama)) assert events[0]['given'] == 12 assert len(events) == 11
def _start_payday(self): try: d = self.app.db.one(""" INSERT INTO paydays DEFAULT VALUES RETURNING id, (ts_start AT TIME ZONE 'UTC') AS ts_start, stage """, back_as=dict) aspen.log("Starting a new payday.") except IntegrityError: # Collision, we have a Payday already. d = self.app.db.one(""" SELECT id, (ts_start AT TIME ZONE 'UTC') AS ts_start, stage FROM paydays WHERE ts_end='1970-01-01T00:00:00+00'::timestamptz """, back_as=dict) aspen.log("Picking up with an existing payday.") d['ts_start'] = d['ts_start'].replace(tzinfo=aspen.utils.utc) aspen.log("Payday started at %s." % d['ts_start']) payday = Payday(self) payday.__dict__.update(d) return payday
def test_end_raises_NoPayday(self): with self.assertRaises(NoPayday): Payday().end()
def test_end_raises_NoPayday(self): with self.assertRaises(NoPayday): Payday(self.client.website).end()