def test_create_subscription_mf_units_log_with_insufficient_data(self): subscription = SubscriptionFactory.create() metered_feature = MeteredFeatureFactory.create() subscription.plan.metered_features.add(metered_feature) subscription.activate() subscription.save() url = reverse('mf-log-units', kwargs={'subscription_pk': subscription.pk, 'customer_pk': subscription.customer.pk, 'mf_product_code': metered_feature.product_code}) data = { "count": 150, "date": "2008-12-24", "update_type": "absolute" } for field in data: data_copy = data.copy() data_copy.pop(field) response = self.client.patch(url, json.dumps(data_copy), content_type='application/json') assert response.status_code == status.HTTP_400_BAD_REQUEST assert response.data == {field: ['This field is required.']}
def seat_feature(self): return MeteredFeatureFactory( name="Charcoal Users", unit="Seats", included_units=Decimal('0.00'), product_code=ProductCodeFactory(value="charc-seats"), price_per_unit=Decimal('0.0'))
def test_create_subscription_mf_units_log_with_sub_canceled_before(self): subscription = SubscriptionFactory.create( state=Subscription.STATES.CANCELED, start_date=datetime.date(2016, 1, 1), cancel_date=datetime.date(2016, 12, 31)) metered_feature = MeteredFeatureFactory.create() subscription.plan.metered_features.add(metered_feature) url = reverse('mf-log-units', kwargs={ 'subscription_pk': subscription.pk, 'customer_pk': subscription.customer.pk, 'mf_product_code': metered_feature.product_code }) date = str(datetime.date.today()) response = self.client.patch(url, json.dumps({ "count": 150, "date": date, "update_type": "absolute" }), content_type='application/json') assert response.status_code == status.HTTP_400_BAD_REQUEST assert response.data == {"detail": "Date is out of bounds."}
def test_create_subscription_mf_units_log_with_invalid_date(self): subscription = SubscriptionFactory.create() metered_feature = MeteredFeatureFactory.create() subscription.plan.metered_features.add(metered_feature) subscription.activate() subscription.save() url = reverse('mf-log-units', kwargs={ 'subscription_pk': subscription.pk, 'customer_pk': subscription.customer.pk, 'mf_product_code': metered_feature.product_code }) response = self.client.patch(url, json.dumps({ "count": 150, "date": "2008-12-24", "update_type": "absolute" }), content_type='application/json') assert response.status_code == status.HTTP_400_BAD_REQUEST assert response.data == {'detail': 'Date is out of bounds.'}
def test_create_subscription_mf_units_log(self): subscription = SubscriptionFactory.create() metered_feature = MeteredFeatureFactory.create() subscription.plan.metered_features.add(metered_feature) subscription.activate() subscription.save() url = reverse('mf-log-units', kwargs={'subscription_pk': subscription.pk, 'customer_pk': subscription.customer.pk, 'mf_product_code': metered_feature.product_code}) date = str(datetime.date.today()) response = self.client.patch(url, json.dumps({ "count": 150, "date": date, "update_type": "absolute" }), content_type='application/json') assert response.status_code == status.HTTP_200_OK assert response.data == {'count': 150} response = self.client.patch(url, json.dumps({ "count": 29, "date": date, "update_type": "relative" }), content_type='application/json') assert response.status_code == status.HTTP_200_OK assert response.data == {'count': 179}
def test_create_subscription_mf_units_log_with_insufficient_data(self): subscription = SubscriptionFactory.create() metered_feature = MeteredFeatureFactory.create() subscription.plan.metered_features.add(metered_feature) subscription.activate() subscription.save() url = reverse('mf-log-units', kwargs={ 'subscription_pk': subscription.pk, 'customer_pk': subscription.customer.pk, 'mf_product_code': metered_feature.product_code }) data = {"count": 150, "date": "2008-12-24", "update_type": "absolute"} for field in data: data_copy = data.copy() data_copy.pop(field) response = self.client.patch(url, json.dumps(data_copy), content_type='application/json') assert response.status_code == status.HTTP_400_BAD_REQUEST assert response.data == {field: ['This field is required.']}
def metered_feature(self): return MeteredFeatureFactory( name="Charcoal Base Units", unit="Barrels (per seat)", included_units=Decimal('0.00'), included_units_during_trial=Decimal('0.00'), product_code=ProductCodeFactory(value="charc-base"), price_per_unit=Decimal('5.00'), )
def test_get_metered_feature_list(self): MeteredFeatureFactory.create_batch(40) url = reverse('metered-feature-list') response = self.client.get(url) full_url = build_absolute_test_url(url) assert response.status_code == status.HTTP_200_OK assert response._headers['link'] == \ ('Link', '<' + full_url + '?page=2>; rel="next", ' + '<' + full_url + '?page=1>; rel="first", ' + '<' + full_url + '?page=2> rel="last"') response = self.client.get(url + '?page=2') assert response.status_code == status.HTTP_200_OK assert response._headers['link'] == \ ('Link', '<' + full_url + '>; rel="prev", ' + '<' + full_url + '?page=1>; rel="first", ' + '<' + full_url + '?page=2> rel="last"')
def test_get_metered_feature_list(self): MeteredFeatureFactory.create_batch(40) url = reverse('metered-feature-list') response = self.client.get(url) full_url = "http://testserver" + url assert response.status_code == status.HTTP_200_OK assert response._headers['link'] == \ ('Link', '<' + full_url + '?page=2; rel="next">, ' + '<' + full_url + '?page=1; rel="first">, ' + '<' + full_url + '?page=2; rel="last">') response = self.client.get(url + '?page=2') assert response.status_code == status.HTTP_200_OK assert response._headers['link'] == \ ('Link', '<' + full_url + '; rel="prev">, ' + '<' + full_url + '?page=1; rel="first">, ' + '<' + full_url + '?page=2; rel="last">')
def test_subscription_mf_units_log_intervals_3(self): # Every 2 weeks, 8 days of trial subscription = SubscriptionFactory.create() metered_feature = MeteredFeatureFactory.create() subscription.plan.metered_features.add(metered_feature) subscription.start_date = datetime.date(year=2015, month=2, day=17) subscription.activate() subscription.save() subscription.plan.interval = Plan.INTERVALS.WEEK subscription.plan.interval_count = 2 subscription.plan.separate_cycles_during_trial = True subscription.plan.save() subscription.start_date = datetime.date(year=2015, month=5, day=31) subscription.trial_end = (subscription.start_date + datetime.timedelta(days=7)) subscription.save() start_date = datetime.date(year=2015, month=5, day=31) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=5, day=31)) end_date = datetime.date(year=2015, month=5, day=31) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=5, day=31)) start_date = datetime.date(year=2015, month=6, day=1) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=6, day=1)) end_date = datetime.date(year=2015, month=6, day=7) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=6, day=1)) start_date = datetime.date(year=2015, month=6, day=8) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=6, day=8)) end_date = datetime.date(year=2015, month=6, day=14) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=6, day=8)) start_date = datetime.date(year=2015, month=6, day=15) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=6, day=15)) end_date = datetime.date(year=2015, month=6, day=28) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=6, day=28))
def test_subscription_billing_cycle_intervals_3(self): """ Every 2 weeks, 8 days of trial separate_cycles_during_trial = True generate_documents_on_trial_end = True """ subscription = SubscriptionFactory.create() metered_feature = MeteredFeatureFactory.create() subscription.plan.metered_features.add(metered_feature) subscription.plan.interval = Plan.INTERVALS.WEEK subscription.plan.interval_count = 2 subscription.plan.separate_cycles_during_trial = True subscription.plan.generate_documents_on_trial_end = True subscription.plan.save() subscription.start_date = datetime.date(year=2015, month=5, day=31) subscription.trial_end = (subscription.start_date + datetime.timedelta(days=7)) subscription.activate() subscription.save() start_date = subscription.start_date reference_date = start_date assert start_date == subscription.cycle_start_date(reference_date) end_date = datetime.date(year=2015, month=5, day=31) # billing cycle alignment assert end_date == subscription.cycle_end_date(reference_date) start_date = datetime.date(year=2015, month=6, day=1) reference_date = start_date assert start_date == subscription.cycle_start_date(reference_date) end_date = datetime.date(year=2015, month=6, day=7) # trial end assert end_date == subscription.cycle_end_date(reference_date) start_date = datetime.date(year=2015, month=6, day=8) reference_date = start_date assert start_date == subscription.cycle_start_date(reference_date) end_date = datetime.date(year=2015, month=6, day=14) # cycle realignment after trial assert end_date == subscription.cycle_end_date(reference_date) start_date = datetime.date(year=2015, month=6, day=15) reference_date = start_date assert start_date == subscription.cycle_start_date(reference_date) end_date = datetime.date(year=2015, month=6, day=28) assert end_date == subscription.cycle_end_date(reference_date)
def test_subscription_mf_units_log_intervals_1(self): # Every month, 16 days of trial subscription = SubscriptionFactory.create() metered_feature = MeteredFeatureFactory.create() subscription.plan.metered_features.add(metered_feature) subscription.start_date = datetime.date(year=2015, month=2, day=17) subscription.activate() subscription.save() subscription.plan.interval = Plan.INTERVALS.MONTH subscription.plan.interval_count = 1 subscription.plan.save() subscription.plan.separate_cycles_during_trial = True subscription.trial_end = (subscription.start_date + datetime.timedelta(days=15)) start_date = subscription.start_date assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=2, day=17)) end_date = datetime.date(year=2015, month=2, day=28) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=2, day=23)) start_date = datetime.date(year=2015, month=3, day=1) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=3, day=1)) end_date = datetime.date(year=2015, month=3, day=4) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=3, day=1)) start_date = datetime.date(year=2015, month=3, day=5) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=3, day=5)) end_date = datetime.date(year=2015, month=3, day=31) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=3, day=22)) start_date = datetime.date(year=2015, month=4, day=1) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=4, day=5)) end_date = datetime.date(year=2015, month=4, day=30) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=4, day=22))
def test_create_subscription_mf_units_log_with_unactivated_sub(self): subscription = SubscriptionFactory.create() metered_feature = MeteredFeatureFactory.create() subscription.plan.metered_features.add(metered_feature) url = reverse('mf-log-units', kwargs={'subscription_pk': subscription.pk, 'customer_pk': subscription.customer.pk, 'mf_product_code': metered_feature.product_code}) response = self.client.patch(url) assert response.status_code == status.HTTP_403_FORBIDDEN assert response.data == {'detail': 'Subscription is not active.'}
def test_subscription_mf_units_log_intervals_4(self): # Every year, 3 months (90 days) of trial subscription = SubscriptionFactory.create() metered_feature = MeteredFeatureFactory.create() subscription.plan.metered_features.add(metered_feature) subscription.start_date = datetime.date(year=2015, month=2, day=17) subscription.activate() subscription.save() subscription.plan.interval = Plan.INTERVALS.YEAR subscription.plan.interval_count = 1 subscription.plan.save() subscription.start_date = datetime.date(year=2015, month=2, day=2) subscription.trial_end = (subscription.start_date + datetime.timedelta(days=90)) subscription.save() start_date = subscription.start_date assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=2, day=2) ) end_date = datetime.date(year=2015, month=5, day=3) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=2, day=2)) start_date = datetime.date(year=2015, month=5, day=4) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=5, day=4)) end_date = datetime.date(year=2015, month=12, day=31) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=5, day=5)) start_date = datetime.date(year=2016, month=1, day=1) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2016, month=1, day=1)) end_date = datetime.date(year=2016, month=12, day=31) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2016, month=12, day=31))
def test_subscription_billing_cycle_intervals_1(self): """ Every month, 16 days of trial separate_cycles_during_trial = True generate_documents_on_trial_end = False """ subscription = SubscriptionFactory.create() metered_feature = MeteredFeatureFactory.create() subscription.plan.metered_features.add(metered_feature) start_date = datetime.date(year=2015, month=2, day=17) subscription.start_date = start_date subscription.trial_end = (subscription.start_date + datetime.timedelta(days=15)) subscription.activate() subscription.save() subscription.plan.interval = Plan.INTERVALS.MONTH subscription.plan.interval_count = 1 subscription.plan.separate_cycles_during_trial = True subscription.plan.generate_documents_on_trial_end = False subscription.plan.save() reference_date = start_date assert start_date == subscription.cycle_start_date(reference_date) end_date = datetime.date(year=2015, month=2, day=28) assert end_date == subscription.cycle_end_date(reference_date) start_date = datetime.date(year=2015, month=3, day=1) reference_date = start_date assert start_date == subscription.cycle_start_date(reference_date) end_date = datetime.date(year=2015, month=3, day=31) assert end_date == subscription.cycle_end_date(reference_date) start_date = datetime.date(year=2015, month=4, day=1) reference_date = start_date assert start_date == subscription.cycle_start_date(reference_date) end_date = datetime.date(year=2015, month=4, day=30) assert end_date == subscription.cycle_end_date(reference_date)
def test_create_subscription_mf_units_log_with_invalid_date(self): subscription = SubscriptionFactory.create() metered_feature = MeteredFeatureFactory.create() subscription.plan.metered_features.add(metered_feature) subscription.activate() subscription.save() url = reverse('mf-log-units', kwargs={'subscription_pk': subscription.pk, 'customer_pk': subscription.customer.pk, 'mf_product_code': metered_feature.product_code}) response = self.client.patch(url, json.dumps({ "count": 150, "date": "2008-12-24", "update_type": "absolute" }), content_type='application/json') assert response.status_code == status.HTTP_400_BAD_REQUEST assert response.data == {'detail': 'Date is out of bounds.'}
def test_create_subscription_mf_units_log_with_sub_canceled_before(self): subscription = SubscriptionFactory.create(state=Subscription.STATES.CANCELED, start_date=datetime.date(2016, 1, 1), cancel_date=datetime.date(2016, 12, 31)) metered_feature = MeteredFeatureFactory.create() subscription.plan.metered_features.add(metered_feature) url = reverse('mf-log-units', kwargs={'subscription_pk': subscription.pk, 'customer_pk': subscription.customer.pk, 'mf_product_code': metered_feature.product_code}) date = str(datetime.date.today()) response = self.client.patch(url, json.dumps({ "count": 150, "date": date, "update_type": "absolute" }), content_type='application/json') assert response.status_code == status.HTTP_400_BAD_REQUEST assert response.data == {"detail": "Date is out of bounds."}
def test_subscription_mf_units_log_intervals(self): subscription = SubscriptionFactory.create() metered_feature = MeteredFeatureFactory.create() subscription.plan.metered_features.add(metered_feature) subscription.start_date = datetime.date(year=2015, month=2, day=17) subscription.activate() subscription.save() # Every month, 16 days of trial subscription.plan.interval = Plan.INTERVALS.MONTH subscription.plan.interval_count = 1 subscription.plan.save() subscription.trial_end = (subscription.start_date + datetime.timedelta(days=15)) start_date = subscription.start_date assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=2, day=17)) end_date = datetime.date(year=2015, month=2, day=28) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=2, day=23)) start_date = datetime.date(year=2015, month=3, day=1) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=3, day=1)) end_date = datetime.date(year=2015, month=3, day=4) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=3, day=1)) start_date = datetime.date(year=2015, month=3, day=5) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=3, day=5)) end_date = datetime.date(year=2015, month=3, day=31) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=3, day=22)) start_date = datetime.date(year=2015, month=4, day=1) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=4, day=5)) end_date = datetime.date(year=2015, month=4, day=30) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=4, day=22)) # Every 2 months, 5 months of trial (2015-05-30) subscription.plan.interval = Plan.INTERVALS.MONTH subscription.plan.interval_count = 2 subscription.plan.save() subscription.start_date = datetime.date(year=2014, month=12, day=31) subscription.trial_end = (subscription.start_date + datetime.timedelta(days=150)) subscription.save() start_date = datetime.date(year=2014, month=12, day=31) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2014, month=12, day=31)) end_date = datetime.date(year=2014, month=12, day=31) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2014, month=12, day=31)) start_date = datetime.date(year=2015, month=1, day=1) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=1, day=1)) end_date = datetime.date(year=2015, month=1, day=31) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=1, day=1)) start_date = datetime.date(year=2015, month=3, day=1) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=3, day=23)) end_date = datetime.date(year=2015, month=4, day=30) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=4, day=30)) start_date = datetime.date(year=2015, month=5, day=1) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=5, day=23)) end_date = datetime.date(year=2015, month=5, day=30) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=5, day=30)) start_date = datetime.date(year=2015, month=6, day=1) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=6, day=1)) end_date = datetime.date(year=2015, month=6, day=30) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=6, day=1)) # Every 2 weeks, 8 days of trial subscription.plan.interval = Plan.INTERVALS.WEEK subscription.plan.interval_count = 2 subscription.plan.save() subscription.start_date = datetime.date(year=2015, month=5, day=31) subscription.trial_end = (subscription.start_date + datetime.timedelta(days=7)) subscription.save() start_date = datetime.date(year=2015, month=5, day=31) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=5, day=31)) end_date = datetime.date(year=2015, month=5, day=31) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=5, day=31)) start_date = datetime.date(year=2015, month=6, day=1) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=6, day=1)) end_date = datetime.date(year=2015, month=6, day=7) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=6, day=1)) start_date = datetime.date(year=2015, month=6, day=8) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=6, day=8)) end_date = datetime.date(year=2015, month=6, day=14) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=6, day=8)) start_date = datetime.date(year=2015, month=6, day=15) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=6, day=15)) end_date = datetime.date(year=2015, month=6, day=28) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=6, day=28)) # Every year, 3 months (90 days) of trial subscription.plan.interval = Plan.INTERVALS.YEAR subscription.plan.interval_count = 1 subscription.plan.save() subscription.start_date = datetime.date(year=2015, month=2, day=2) subscription.trial_end = (subscription.start_date + datetime.timedelta(days=90)) subscription.save() start_date = subscription.start_date assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=2, day=2)) end_date = datetime.date(year=2015, month=5, day=3) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=2, day=2)) start_date = datetime.date(year=2015, month=5, day=4) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=5, day=4)) end_date = datetime.date(year=2015, month=12, day=31) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=5, day=5)) start_date = datetime.date(year=2016, month=1, day=1) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2016, month=1, day=1)) end_date = datetime.date(year=2016, month=12, day=31) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2016, month=12, day=31))
def test_subscription_transaction_declined_suspend(self): """ Confirm that a failed transaction can trigger a subscription to suspend. """ # We'll create a plan that starts here start_date = dt.date(2019, 1, 1) # And the trial date ends here too trial_end_date = dt.date(2019, 1, 1) # The customer will use some metered features here metered_usage_on = dt.date(2019, 1, 10) # Docs will be generated to bill here. prev_billing_date = dt.date(2019, 1, 3) # So, the customer grace period ends here. # First billing interval: dt.date(2019, 2, 1) # billing_grace_exp = dt.date(2019, 2, 3) # The next billing check should discover that the subscription # is unpaid. # Billing due date is: dt.date(2019, 2, 6) # With the grace period: dt.date(2019, 2, 9) # billing_post_grace_check = dt.date(2019, 2, 10) # Create a customer # customer = CustomerFactory.create(sales_tax_percent=Decimal('0.00'), payment_due_days=3) PaymentMethodFactory.create( payment_processor=triggered_processor, customer=customer, canceled=False, verified=True, ) # Create a metered feature # mf_price = Decimal('2.5') metered_feature = MeteredFeatureFactory( included_units_during_trial=Decimal('0.00'), price_per_unit=mf_price) currency = 'USD' # Crate a plan with metered features. Generate the invoice after # the 5 day trial period, the plan will be billed every 30 days. # generate_after = 5 plan = PlanFactory.create(interval=Plan.INTERVALS.DAY, interval_count=30, generate_after=generate_after, enabled=True, amount=Decimal('20.00'), trial_period_days=1, metered_features=[metered_feature], currency=currency) # Subscribe the customer # subscription = SubscriptionFactory.create(plan=plan, start_date=start_date, customer=customer) subscription.activate() subscription.save() # Log some metered usage consumed_1 = Decimal('5.00') consumed_2 = Decimal('5.00') mf_log = MeteredFeatureUnitsLogFactory.create( subscription=subscription, metered_feature=metered_feature, start_date=metered_usage_on, end_date=subscription.trial_end, consumed_units=consumed_1) # Generate the docs call_command('generate_docs', billing_date=prev_billing_date, stdout=self.output) proforma = Proforma.objects.first() assert proforma.proforma_entries.count() != 0 assert Subscription.objects.all().count() == 1 assert Invoice.objects.all().count() == 0 assert Proforma.objects.all()[0].total > Decimal('0.00') # Consume more units mf_log.consumed_units += consumed_2 mf_log.save() call_command('generate_docs', billing_date=billing_grace_exp, stdout=self.output) assert Proforma.objects.all().count() != 0 assert Invoice.objects.all().count() == 0 for pf in Proforma.objects.all(): # # Issue the proforma to generate transactions # proforma = Proforma.objects.all()[1] pf.issue() pf.save() self.assertEqual(pf.state, Proforma.STATES.ISSUED) # Fail the transaction for tx in pf.transactions: # tx = proforma.transactions[0] tx.fail() tx.save() self.assertEqual(tx.state, Transaction.States.Failed) assert Transaction.objects.all().count() != 0 call_command('check_subscriptions', billing_date=billing_post_grace_check, stdout=self.output) subscr = Subscription.objects.first() # Scan for subscriptions with unpaid documents logging.debug("subscr %s" % subscr) self.assertEqual(subscr.state, Subscription.STATES.CANCELED)
def test_subscription_billing_cycle_intervals(self): subscription = SubscriptionFactory.create() metered_feature = MeteredFeatureFactory.create() subscription.plan.metered_features.add(metered_feature) start_date = datetime.date(year=2015, month=2, day=17) subscription.start_date = start_date subscription.activate() subscription.save() with patch('silver.models.timezone') as mock_timezone: # Every month, 16 days of trial subscription.plan.interval = Plan.INTERVALS.MONTH subscription.plan.interval_count = 1 subscription.plan.save() subscription.trial_end = (subscription.start_date + datetime.timedelta(days=15)) mock_timezone.now.return_value = datetime.datetime.combine( start_date, datetime.datetime.min.time()) assert start_date == subscription.current_start_date end_date = datetime.date(year=2015, month=2, day=28) assert end_date == subscription.current_end_date start_date = datetime.date(year=2015, month=3, day=1) mock_timezone.now.return_value = datetime.datetime.combine( start_date, datetime.datetime.min.time()) assert start_date == subscription.current_start_date end_date = datetime.date(year=2015, month=3, day=31) assert end_date == subscription.current_end_date start_date = datetime.date(year=2015, month=4, day=1) mock_timezone.now.return_value = datetime.datetime.combine( start_date, datetime.datetime.min.time()) assert start_date == subscription.current_start_date end_date = datetime.date(year=2015, month=4, day=30) assert end_date == subscription.current_end_date # Every 2 months, 5 months of trial (2015-05-30) subscription.plan.interval = Plan.INTERVALS.MONTH subscription.plan.interval_count = 2 subscription.plan.save() subscription.start_date = datetime.date(year=2014, month=12, day=31) subscription.trial_end = (subscription.start_date + datetime.timedelta(days=150)) subscription.save() start_date = subscription.start_date mock_timezone.now.return_value = datetime.datetime.combine( start_date, datetime.datetime.min.time()) assert start_date == subscription.current_start_date end_date = datetime.date(year=2014, month=12, day=31) assert end_date == subscription.current_end_date start_date = datetime.date(year=2015, month=1, day=1) mock_timezone.now.return_value = datetime.datetime.combine( start_date, datetime.datetime.min.time()) assert start_date == subscription.current_start_date end_date = datetime.date(year=2015, month=2, day=28) assert end_date == subscription.current_end_date start_date = datetime.date(year=2015, month=3, day=1) mock_timezone.now.return_value = datetime.datetime.combine( start_date, datetime.datetime.min.time()) assert start_date == subscription.current_start_date end_date = datetime.date(year=2015, month=4, day=30) assert end_date == subscription.current_end_date start_date = datetime.date(year=2015, month=5, day=1) mock_timezone.now.return_value = datetime.datetime.combine( start_date, datetime.datetime.min.time()) assert start_date == subscription.current_start_date end_date = datetime.date(year=2015, month=6, day=30) assert end_date == subscription.current_end_date start_date = datetime.date(year=2015, month=7, day=1) mock_timezone.now.return_value = datetime.datetime.combine( start_date, datetime.datetime.min.time()) assert start_date == subscription.current_start_date end_date = datetime.date(year=2015, month=8, day=31) assert end_date == subscription.current_end_date # Every 2 weeks, 8 days of trial subscription.plan.interval = Plan.INTERVALS.WEEK subscription.plan.interval_count = 2 subscription.plan.save() subscription.start_date = datetime.date(year=2015, month=5, day=31) subscription.trial_end = (subscription.start_date + datetime.timedelta(days=7)) subscription.save() start_date = subscription.start_date mock_timezone.now.return_value = datetime.datetime.combine( start_date, datetime.datetime.min.time()) assert start_date == subscription.current_start_date end_date = datetime.date(year=2015, month=5, day=31) assert end_date == subscription.current_end_date start_date = datetime.date(year=2015, month=6, day=1) mock_timezone.now.return_value = datetime.datetime.combine( start_date, datetime.datetime.min.time()) assert start_date == subscription.current_start_date end_date = datetime.date(year=2015, month=6, day=14) assert end_date == subscription.current_end_date start_date = datetime.date(year=2015, month=6, day=15) mock_timezone.now.return_value = datetime.datetime.combine( start_date, datetime.datetime.min.time()) assert start_date == subscription.current_start_date end_date = datetime.date(year=2015, month=6, day=28) assert end_date == subscription.current_end_date # Every year, 3 months (90 days) of trial subscription.plan.interval = Plan.INTERVALS.YEAR subscription.plan.interval_count = 1 subscription.plan.save() subscription.start_date = datetime.date(year=2015, month=2, day=2) subscription.trial_end = (subscription.start_date + datetime.timedelta(days=90)) subscription.save() start_date = subscription.start_date mock_timezone.now.return_value = datetime.datetime.combine( start_date, datetime.datetime.min.time()) assert start_date == subscription.current_start_date end_date = datetime.date(year=2015, month=12, day=31) assert end_date == subscription.current_end_date start_date = datetime.date(year=2016, month=1, day=1) mock_timezone.now.return_value = datetime.datetime.combine( start_date, datetime.datetime.min.time()) assert start_date == subscription.current_start_date end_date = datetime.date(year=2016, month=12, day=31) assert end_date == subscription.current_end_date
def test_subscription_mf_units_log_intervals(self): subscription = SubscriptionFactory.create() metered_feature = MeteredFeatureFactory.create() subscription.plan.metered_features.add(metered_feature) subscription.start_date = datetime.date(year=2015, month=2, day=17) subscription.activate() subscription.save() # Every month, 16 days of trial subscription.plan.interval = Plan.INTERVALS.MONTH subscription.plan.interval_count = 1 subscription.plan.save() subscription.trial_end = (subscription.start_date + datetime.timedelta(days=15)) start_date = subscription.start_date assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=2, day=17)) end_date = datetime.date(year=2015, month=2, day=28) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=2, day=23)) start_date = datetime.date(year=2015, month=3, day=1) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=3, day=1)) end_date = datetime.date(year=2015, month=3, day=4) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=3, day=1)) start_date = datetime.date(year=2015, month=3, day=5) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=3, day=5)) end_date = datetime.date(year=2015, month=3, day=31) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=3, day=22)) start_date = datetime.date(year=2015, month=4, day=1) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=4, day=5)) end_date = datetime.date(year=2015, month=4, day=30) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=4, day=22)) # Every 2 months, 5 months of trial (2015-05-30) subscription.plan.interval = Plan.INTERVALS.MONTH subscription.plan.interval_count = 2 subscription.plan.save() subscription.start_date = datetime.date(year=2014, month=12, day=31) subscription.trial_end = (subscription.start_date + datetime.timedelta(days=150)) subscription.save() start_date = datetime.date(year=2014, month=12, day=31) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2014, month=12, day=31)) end_date = datetime.date(year=2014, month=12, day=31) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2014, month=12, day=31)) start_date = datetime.date(year=2015, month=1, day=1) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=1, day=1)) end_date = datetime.date(year=2015, month=1, day=31) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=1, day=1)) start_date = datetime.date(year=2015, month=3, day=1) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=3, day=23)) end_date = datetime.date(year=2015, month=4, day=30) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=4, day=30)) start_date = datetime.date(year=2015, month=5, day=1) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=5, day=23)) end_date = datetime.date(year=2015, month=5, day=30) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=5, day=30)) start_date = datetime.date(year=2015, month=6, day=1) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=6, day=1)) end_date = datetime.date(year=2015, month=6, day=30) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=6, day=1)) # Every 2 weeks, 8 days of trial subscription.plan.interval = Plan.INTERVALS.WEEK subscription.plan.interval_count = 2 subscription.plan.save() subscription.start_date = datetime.date(year=2015, month=5, day=31) subscription.trial_end = (subscription.start_date + datetime.timedelta(days=7)) subscription.save() start_date = datetime.date(year=2015, month=5, day=31) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=5, day=31)) end_date = datetime.date(year=2015, month=5, day=31) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=5, day=31)) start_date = datetime.date(year=2015, month=6, day=1) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=6, day=1)) end_date = datetime.date(year=2015, month=6, day=7) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=6, day=1)) start_date = datetime.date(year=2015, month=6, day=8) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=6, day=8)) end_date = datetime.date(year=2015, month=6, day=14) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=6, day=8)) start_date = datetime.date(year=2015, month=6, day=15) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=6, day=15)) end_date = datetime.date(year=2015, month=6, day=28) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=6, day=28)) # Every year, 3 months (90 days) of trial subscription.plan.interval = Plan.INTERVALS.YEAR subscription.plan.interval_count = 1 subscription.plan.save() subscription.start_date = datetime.date(year=2015, month=2, day=2) subscription.trial_end = (subscription.start_date + datetime.timedelta(days=90)) subscription.save() start_date = subscription.start_date assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=2, day=2) ) end_date = datetime.date(year=2015, month=5, day=3) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=2, day=2)) start_date = datetime.date(year=2015, month=5, day=4) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2015, month=5, day=4)) end_date = datetime.date(year=2015, month=12, day=31) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2015, month=5, day=5)) start_date = datetime.date(year=2016, month=1, day=1) assert start_date == subscription.bucket_start_date( reference_date=datetime.date(year=2016, month=1, day=1)) end_date = datetime.date(year=2016, month=12, day=31) assert end_date == subscription.bucket_end_date( reference_date=datetime.date(year=2016, month=12, day=31))
def test_subscription_billing_cycle_intervals_2(self): """ Every 2 months, 150 days of trial (2015-05-30) separate_cycles_during_trial = True generate_documents_on_trial_end = True """ subscription = SubscriptionFactory.create() metered_feature = MeteredFeatureFactory.create() subscription.plan.metered_features.add(metered_feature) subscription.plan.interval = Plan.INTERVALS.MONTH subscription.plan.interval_count = 2 subscription.plan.separate_cycles_during_trial = True subscription.plan.generate_documents_on_trial_end = True subscription.plan.save() subscription.start_date = datetime.date(year=2014, month=12, day=31) subscription.trial_end = (subscription.start_date + datetime.timedelta(days=150)) subscription.activate() subscription.save() start_date = subscription.start_date reference_date = start_date assert start_date == subscription.cycle_start_date(reference_date) end_date = datetime.date(year=2014, month=12, day=31) assert end_date == subscription.cycle_end_date(reference_date) start_date = datetime.date(year=2015, month=1, day=1) reference_date = start_date assert start_date == subscription.cycle_start_date(reference_date) end_date = datetime.date(year=2015, month=2, day=28) assert end_date == subscription.cycle_end_date(reference_date) start_date = datetime.date(year=2015, month=3, day=1) reference_date = start_date assert start_date == subscription.cycle_start_date(reference_date) end_date = datetime.date(year=2015, month=4, day=30) assert end_date == subscription.cycle_end_date(reference_date) start_date = datetime.date(year=2015, month=5, day=1) reference_date = start_date assert start_date == subscription.cycle_start_date(reference_date) end_date = datetime.date(year=2015, month=5, day=30) # trial end assert end_date == subscription.cycle_end_date(reference_date) start_date = datetime.date(year=2015, month=5, day=31) reference_date = start_date assert start_date == subscription.cycle_start_date(reference_date) end_date = datetime.date(year=2015, month=6, day=30) # realigned to initial alignment assert end_date == subscription.cycle_end_date(reference_date) start_date = datetime.date(year=2015, month=7, day=1) reference_date = start_date assert start_date == subscription.cycle_start_date(reference_date) end_date = datetime.date(year=2015, month=8, day=31) assert end_date == subscription.cycle_end_date(reference_date)