def test_yearly_schedule_with_interval(self): with freeze_time('2013-08-18'): now = utc_now() self.assert_schedule(started_at=now, frequency=self.plan_model.frequencies.YEARLY, interval=2, length=3, expected=[ utc_datetime(2013, 8, 18), utc_datetime(2015, 8, 18), utc_datetime(2017, 8, 18), ])
def test_yearly_schedule_with_interval(self): with freeze_time('2013-08-18'): now = utc_now() self.assert_schedule( started_at=now, frequency=self.plan_model.frequencies.YEARLY, interval=2, length=3, expected=[ utc_datetime(2013, 8, 18), utc_datetime(2015, 8, 18), utc_datetime(2017, 8, 18), ])
def test_daily_schedule_with_interval(self): with freeze_time('2013-07-28'): now = utc_now() self.assert_schedule(started_at=now, frequency=self.plan_model.frequencies.DAILY, interval=3, length=4, expected=[ utc_datetime(2013, 7, 28), utc_datetime(2013, 7, 31), utc_datetime(2013, 8, 3), utc_datetime(2013, 8, 6), ])
def test_monthly_schedule_with_interval(self): with freeze_time('2013-08-18'): now = utc_now() self.assert_schedule(started_at=now, frequency=self.plan_model.frequencies.MONTHLY, interval=6, length=4, expected=[ utc_datetime(2013, 8, 18), utc_datetime(2014, 2, 18), utc_datetime(2014, 8, 18), utc_datetime(2015, 2, 18), ])
def test_yearly_schedule_with_leap_year(self): with freeze_time('2012-02-29'): now = utc_now() self.assert_schedule(started_at=now, frequency=self.plan_model.frequencies.YEARLY, interval=1, length=5, expected=[ utc_datetime(2012, 2, 29), utc_datetime(2013, 2, 28), utc_datetime(2014, 2, 28), utc_datetime(2015, 2, 28), utc_datetime(2016, 2, 29), ])
def test_weekly_schedule(self): with freeze_time('2013-08-18'): now = utc_now() self.assert_schedule(started_at=now, frequency=self.plan_model.frequencies.WEEKLY, interval=1, length=5, expected=[ utc_datetime(2013, 8, 18), utc_datetime(2013, 8, 25), utc_datetime(2013, 9, 1), utc_datetime(2013, 9, 8), utc_datetime(2013, 9, 15), ])
def test_daily_schedule_with_interval(self): with freeze_time('2013-07-28'): now = utc_now() self.assert_schedule( started_at=now, frequency=self.plan_model.frequencies.DAILY, interval=3, length=4, expected=[ utc_datetime(2013, 7, 28), utc_datetime(2013, 7, 31), utc_datetime(2013, 8, 3), utc_datetime(2013, 8, 6), ] )
def test_monthly_schedule_with_interval(self): with freeze_time('2013-08-18'): now = utc_now() self.assert_schedule( started_at=now, frequency=self.plan_model.frequencies.MONTHLY, interval=6, length=4, expected=[ utc_datetime(2013, 8, 18), utc_datetime(2014, 2, 18), utc_datetime(2014, 8, 18), utc_datetime(2015, 2, 18), ] )
def test_yearly_schedule_with_leap_year(self): with freeze_time('2012-02-29'): now = utc_now() self.assert_schedule( started_at=now, frequency=self.plan_model.frequencies.YEARLY, interval=1, length=5, expected=[ utc_datetime(2012, 2, 29), utc_datetime(2013, 2, 28), utc_datetime(2014, 2, 28), utc_datetime(2015, 2, 28), utc_datetime(2016, 2, 29), ] )
def test_weekly_schedule(self): with freeze_time('2013-08-18'): now = utc_now() self.assert_schedule( started_at=now, frequency=self.plan_model.frequencies.WEEKLY, interval=1, length=5, expected=[ utc_datetime(2013, 8, 18), utc_datetime(2013, 8, 25), utc_datetime(2013, 9, 1), utc_datetime(2013, 9, 8), utc_datetime(2013, 9, 15), ] )
def test_create_subscription_with_started_at(self): amount = 5566 now = utc_now() now_iso = now.isoformat() # next week next_invoice_at = utc_datetime(2013, 8, 17) next_iso = next_invoice_at.isoformat() res = self.testapp.post( '/v1/subscriptions', dict( customer_guid=self.customer.guid, plan_guid=self.plan.guid, amount=amount, started_at='2013-08-17T00:00:00Z', ), extra_environ=dict(REMOTE_USER=self.api_key), status=200, ) self.failUnless('guid' in res.json) self.assertEqual(res.json['created_at'], now_iso) self.assertEqual(res.json['updated_at'], now_iso) self.assertEqual(res.json['next_invoice_at'], next_iso) self.assertEqual(res.json['invoice_count'], 0) self.assertEqual(res.json['amount'], amount) self.assertEqual(res.json['customer_guid'], self.customer.guid) self.assertEqual(res.json['plan_guid'], self.plan.guid)
def test_create_subscription(self, debit_method): amount = 5566 funding_instrument_uri = 'MOCK_CARD_URI' appears_on_statement_as = 'hello baby' now = utc_now() now_iso = now.isoformat() # next week next_invoice_at = utc_datetime(2013, 8, 23) next_iso = next_invoice_at.isoformat() debit_method.return_value = dict( processor_uri='MOCK_DEBIT_URI', status=self.transaction_model.statuses.SUCCEEDED, ) res = self.testapp.post( '/v1/subscriptions', dict( customer_guid=self.customer.guid, plan_guid=self.plan.guid, amount=amount, funding_instrument_uri=funding_instrument_uri, appears_on_statement_as=appears_on_statement_as, ), extra_environ=dict(REMOTE_USER=self.api_key), status=200, ) self.failUnless('guid' in res.json) self.assertEqual(res.json['created_at'], now_iso) self.assertEqual(res.json['updated_at'], now_iso) self.assertEqual(res.json['canceled_at'], None) self.assertEqual(res.json['next_invoice_at'], next_iso) self.assertEqual(res.json['invoice_count'], 1) self.assertEqual(res.json['amount'], amount) self.assertEqual(res.json['effective_amount'], amount) self.assertEqual(res.json['customer_guid'], self.customer.guid) self.assertEqual(res.json['plan_guid'], self.plan.guid) self.assertEqual(res.json['funding_instrument_uri'], funding_instrument_uri) self.assertEqual(res.json['appears_on_statement_as'], appears_on_statement_as) self.assertEqual(res.json['canceled'], False) subscription = self.subscription_model.get(res.json['guid']) self.assertEqual(subscription.invoice_count, 1) invoice = subscription.invoices[0] self.assertEqual(len(invoice.transactions), 1) self.assertEqual(invoice.amount, amount) self.assertEqual(invoice.scheduled_at, now) self.assertEqual(invoice.transaction_type, self.invoice_model.transaction_types.DEBIT) self.assertEqual(invoice.invoice_type, self.invoice_model.types.SUBSCRIPTION) self.assertEqual(invoice.appears_on_statement_as, appears_on_statement_as) transaction = invoice.transactions[0] debit_method.assert_called_once_with(transaction) self.assertEqual(transaction.processor_uri, 'MOCK_DEBIT_URI') self.assertEqual(transaction.submit_status, self.transaction_model.submit_statuses.DONE) self.assertEqual(transaction.appears_on_statement_as, subscription.appears_on_statement_as) self.assertEqual(transaction.amount, amount) self.assertEqual(transaction.transaction_type, self.transaction_model.types.DEBIT)
def test_daily_schedule_with_end_of_month(self): def assert_next_day(now_dt, expected): with freeze_time(now_dt): now = utc_now() next_dt = next_transaction_datetime( started_at=now, frequency=self.plan_model.frequencies.DAILY, period=1, ) self.assertEqual(next_dt, expected) assert_next_day('2013-01-31', utc_datetime(2013, 2, 1)) assert_next_day('2013-02-28', utc_datetime(2013, 3, 1)) assert_next_day('2013-03-31', utc_datetime(2013, 4, 1)) assert_next_day('2013-04-30', utc_datetime(2013, 5, 1)) assert_next_day('2013-05-31', utc_datetime(2013, 6, 1)) assert_next_day('2013-06-30', utc_datetime(2013, 7, 1)) assert_next_day('2013-07-31', utc_datetime(2013, 8, 1)) assert_next_day('2013-08-31', utc_datetime(2013, 9, 1)) assert_next_day('2013-09-30', utc_datetime(2013, 10, 1)) assert_next_day('2013-10-31', utc_datetime(2013, 11, 1)) assert_next_day('2013-11-30', utc_datetime(2013, 12, 1)) assert_next_day('2013-12-31', utc_datetime(2014, 1, 1))
def test_monthly_schedule_with_end_of_month(self): with freeze_time('2013-08-31'): now = utc_now() self.assert_schedule( started_at=now, frequency=self.plan_model.frequencies.MONTHLY, interval=1, length=7, expected=[ utc_datetime(2013, 8, 31), utc_datetime(2013, 9, 30), utc_datetime(2013, 10, 31), utc_datetime(2013, 11, 30), utc_datetime(2013, 12, 31), utc_datetime(2014, 1, 31), utc_datetime(2014, 2, 28), ] ) with freeze_time('2013-11-30'): now = utc_now() self.assert_schedule( started_at=now, frequency=self.plan_model.frequencies.MONTHLY, interval=1, length=6, expected=[ utc_datetime(2013, 11, 30), utc_datetime(2013, 12, 30), utc_datetime(2014, 1, 30), utc_datetime(2014, 2, 28), utc_datetime(2014, 3, 30), utc_datetime(2014, 4, 30), ] )
def test_monthly_schedule_with_end_of_month(self): with freeze_time('2013-08-31'): now = utc_now() self.assert_schedule(started_at=now, frequency=self.plan_model.frequencies.MONTHLY, interval=1, length=7, expected=[ utc_datetime(2013, 8, 31), utc_datetime(2013, 9, 30), utc_datetime(2013, 10, 31), utc_datetime(2013, 11, 30), utc_datetime(2013, 12, 31), utc_datetime(2014, 1, 31), utc_datetime(2014, 2, 28), ]) with freeze_time('2013-11-30'): now = utc_now() self.assert_schedule(started_at=now, frequency=self.plan_model.frequencies.MONTHLY, interval=1, length=6, expected=[ utc_datetime(2013, 11, 30), utc_datetime(2013, 12, 30), utc_datetime(2014, 1, 30), utc_datetime(2014, 2, 28), utc_datetime(2014, 3, 30), utc_datetime(2014, 4, 30), ])