Add JSON support for product description

This commit is contained in:
Nico Schottelius 2020-09-28 21:34:24 +02:00
commit c32499199a
10 changed files with 1589 additions and 653 deletions

View file

@ -6,6 +6,36 @@ from django.utils import timezone
from .models import *
from uncloud_service.models import GenericServiceProduct
import json
# class OrderTestCase(TestCase):
# """
# The heart of ordering products
# """
# def setUp(self):
# self.user = get_user_model().objects.create(
# username='random_user',
# email='jane.random@domain.tld')
# self.ba = BillingAddress.objects.create(
# owner=self.user,
# organization = 'Test org',
# street="unknown",
# city="unknown",
# postal_code="somewhere else",
# active=True)
# def test_create_one_time_product(self):
# """
# One time payment products cannot be updated - can they?
# """
# p = SampleOneTimeProduct.objects.create(owner=self.user)
# self.assertEqual(p.one_time_price, 5)
# self.assertEqual(p.recurring_price, 0)
class ProductTestCase(TestCase):
"""
@ -25,486 +55,534 @@ class ProductTestCase(TestCase):
postal_code="somewhere else",
active=True)
def test_create_one_time_product(self):
def test_create_product(self):
"""
One time payment products cannot be updated - can they?
Create a sample product
"""
p = SampleOneTimeProduct.objects.create(owner=self.user)
self.assertEqual(p.one_time_price, 5)
self.assertEqual(p.recurring_price, 0)
def test_create_product_without_active_billing_address(self):
"""
Fail to create a product without an active billing address
"""
self.ba.active = False
self.ba.save()
with self.assertRaises(ValidationError):
p = SampleOneTimeProduct.objects.create(owner=self.user)
def test_create_product_without_billing_address(self):
"""
Fail to create a product without a billing address
"""
user2 = get_user_model().objects.create(
username='random_user2',
email='jane.randomly@domain.tld')
with self.assertRaises(ValidationError):
p = SampleOneTimeProduct.objects.create(owner=user2)
def test_create_order_creates_correct_order_count(self):
"""
Ensure creating orders from product only creates 1 order
"""
# One order
p = SampleOneTimeProduct.objects.create(owner=self.user)
p.create_order(timezone.make_aware(datetime.datetime(2020,3,3)))
order_count = Order.objects.filter(owner=self.user).count()
self.assertEqual(order_count, 1)
# One more order
p = SampleRecurringProduct.objects.create(owner=self.user)
p.create_order(timezone.make_aware(datetime.datetime(2020,3,3)))
order_count = Order.objects.filter(owner=self.user).count()
self.assertEqual(order_count, 2)
# Should create 2 orders
p = SampleRecurringProductOneTimeFee.objects.create(owner=self.user)
p.create_order(timezone.make_aware(datetime.datetime(2020,3,3)))
order_count = Order.objects.filter(owner=self.user).count()
self.assertEqual(order_count, 4)
def test_update_recurring_order(self):
"""
Ensure creating orders from product only creates 1 order
"""
p = SampleRecurringProduct.objects.create(owner=self.user)
p.create_order(timezone.make_aware(datetime.datetime(2020,3,3)))
p.create_or_update_recurring_order(timezone.make_aware(datetime.datetime(2020,3,4)))
# FIXME: where is the assert?
class BillingAddressTestCase(TestCase):
def setUp(self):
self.user = get_user_model().objects.create(
username='random_user',
email='jane.random@domain.tld')
def test_user_no_address(self):
"""
Raise an error, when there is no address
"""
self.assertRaises(uncloud_pay.models.BillingAddress.DoesNotExist,
BillingAddress.get_address_for,
self.user)
def test_user_only_inactive_address(self):
"""
Raise an error, when there is no active address
"""
ba = BillingAddress.objects.create(
owner=self.user,
organization = 'Test org',
street="unknown",
city="unknown",
postal_code="somewhere else",
active=False)
self.assertRaises(uncloud_pay.models.BillingAddress.DoesNotExist,
BillingAddress.get_address_for,
self.user)
def test_find_active_address(self):
"""
Find the active address
"""
ba = BillingAddress.objects.create(
owner=self.user,
organization = 'Test org',
street="unknown",
city="unknown",
postal_code="unknown",
active=True)
self.assertEqual(BillingAddress.get_address_for(self.user), ba)
def test_find_right_address_with_multiple_addresses(self):
"""
Find the active address only, skip inactive
"""
ba = BillingAddress.objects.create(
owner=self.user,
organization = 'Test org',
street="unknown",
city="unknown",
postal_code="unknown",
active=True)
ba2 = BillingAddress.objects.create(
owner=self.user,
organization = 'Test org',
street="unknown",
city="unknown",
postal_code="somewhere else",
active=False)
self.assertEqual(BillingAddress.get_address_for(self.user), ba)
def test_change_addresses(self):
"""
Switch the active address
"""
ba = BillingAddress.objects.create(
owner=self.user,
organization = 'Test org',
street="unknown",
city="unknown",
postal_code="unknown",
active=True)
self.assertEqual(BillingAddress.get_address_for(self.user), ba)
ba.active=False
ba.save()
ba2 = BillingAddress.objects.create(
owner=self.user,
organization = 'Test org',
street="unknown",
city="unknown",
postal_code="somewhere else",
active=True)
self.assertEqual(BillingAddress.get_address_for(self.user), ba2)
class BillTestCase(TestCase):
def setUp(self):
self.user_without_address = get_user_model().objects.create(
username='no_home_person',
email='far.away@domain.tld')
self.user = get_user_model().objects.create(
username='jdoe',
email='john.doe@domain.tld')
self.recurring_user = get_user_model().objects.create(
username='recurrent_product_user',
email='jane.doe@domain.tld')
self.user_addr = BillingAddress.objects.create(
owner=self.user,
organization = 'Test org',
street="unknown",
city="unknown",
postal_code="unknown",
active=True)
self.recurring_user_addr = BillingAddress.objects.create(
owner=self.recurring_user,
organization = 'Test org',
street="Somewhere",
city="Else",
postal_code="unknown",
active=True)
self.order_meta = {}
self.order_meta[1] = {
'starting_date': timezone.make_aware(datetime.datetime(2020,3,3)),
'ending_date': timezone.make_aware(datetime.datetime(2020,4,17)),
'price': 15,
'description': 'One chocolate bar'
config = {
'features': {
'cores':
{ 'min': 1,
'max': 48,
'one_time_price': 0,
'recurring_price': 4
},
'ram_gb':
{ 'min': 1,
'max': 256,
'one_time_price': 0,
'recurring_price': 3
},
},
}
self.one_time_order = Order.objects.create(
owner=self.user,
starting_date=self.order_meta[1]['starting_date'],
ending_date=self.order_meta[1]['ending_date'],
recurring_period=RecurringPeriod.ONE_TIME,
price=self.order_meta[1]['price'],
description=self.order_meta[1]['description'],
billing_address=BillingAddress.get_address_for(self.user))
p = Product.objects.create(name="Testproduct",
description="Only for testing",
config=config)
self.recurring_order = Order.objects.create(
owner=self.recurring_user,
starting_date=timezone.make_aware(datetime.datetime(2020,3,3)),
recurring_period=RecurringPeriod.PER_30D,
price=15,
description="A pretty VM",
billing_address=BillingAddress.get_address_for(self.recurring_user)
)
# used for generating multiple bills
self.bill_dates = [
timezone.make_aware(datetime.datetime(2020,3,31)),
timezone.make_aware(datetime.datetime(2020,4,30)),
timezone.make_aware(datetime.datetime(2020,5,31)),
]
# self.assertEqual(p.one_time_price, 5)
# self.assertEqual(p.recurring_price, 0)
# class ProductTestCase(TestCase):
# """
# Test products and products <-> order interaction
# """
def test_bill_one_time_one_bill_record(self):
"""
Ensure there is only 1 bill record per order
"""
# def setUp(self):
# self.user = get_user_model().objects.create(
# username='random_user',
# email='jane.random@domain.tld')
bill = Bill.create_next_bill_for_user_address(self.user_addr)
# self.ba = BillingAddress.objects.create(
# owner=self.user,
# organization = 'Test org',
# street="unknown",
# city="unknown",
# postal_code="somewhere else",
# active=True)
self.assertEqual(self.one_time_order.billrecord_set.count(), 1)
# def test_create_one_time_product(self):
# """
# One time payment products cannot be updated - can they?
# """
def test_bill_sum_onetime(self):
"""
Check the bill sum for a single one time order
"""
# p = SampleOneTimeProduct.objects.create(owner=self.user)
bill = Bill.create_next_bill_for_user_address(self.user_addr)
self.assertEqual(bill.sum, self.order_meta[1]['price'])
# self.assertEqual(p.one_time_price, 5)
# self.assertEqual(p.recurring_price, 0)
# def test_create_product_without_active_billing_address(self):
# """
# Fail to create a product without an active billing address
# """
# self.ba.active = False
# self.ba.save()
# with self.assertRaises(ValidationError):
# p = SampleOneTimeProduct.objects.create(owner=self.user)
# def test_create_product_without_billing_address(self):
# """
# Fail to create a product without a billing address
# """
# user2 = get_user_model().objects.create(
# username='random_user2',
# email='jane.randomly@domain.tld')
# with self.assertRaises(ValidationError):
# p = SampleOneTimeProduct.objects.create(owner=user2)
def test_bill_creates_record_for_recurring_order(self):
"""
Ensure there is only 1 bill record per order
"""
# def test_create_order_creates_correct_order_count(self):
# """
# Ensure creating orders from product only creates 1 order
# """
bill = Bill.create_next_bill_for_user_address(self.recurring_user_addr)
# # One order
# p = SampleOneTimeProduct.objects.create(owner=self.user)
# p.create_order(timezone.make_aware(datetime.datetime(2020,3,3)))
self.assertEqual(self.recurring_order.billrecord_set.count(), 1)
self.assertEqual(bill.billrecord_set.count(), 1)
# order_count = Order.objects.filter(owner=self.user).count()
# self.assertEqual(order_count, 1)
# # One more order
# p = SampleRecurringProduct.objects.create(owner=self.user)
# p.create_order(timezone.make_aware(datetime.datetime(2020,3,3)))
# order_count = Order.objects.filter(owner=self.user).count()
# self.assertEqual(order_count, 2)
# # Should create 2 orders
# p = SampleRecurringProductOneTimeFee.objects.create(owner=self.user)
# p.create_order(timezone.make_aware(datetime.datetime(2020,3,3)))
# order_count = Order.objects.filter(owner=self.user).count()
# self.assertEqual(order_count, 4)
def test_new_bill_after_closing(self):
"""
After closing a bill and the user has a recurring product,
the next bill run should create e new bill
"""
for ending_date in self.bill_dates:
b = Bill.create_next_bill_for_user_address(self.recurring_user_addr, ending_date)
b.close()
bill_count = Bill.objects.filter(owner=self.recurring_user).count()
self.assertEqual(len(self.bill_dates), bill_count)
def test_multi_addr_multi_bill(self):
"""
Ensure multiple bills are created if orders exist with different billing addresses
"""
username="lotsofplaces"
multi_addr_user = get_user_model().objects.create(
username=username,
email=f"{username}@example.org")
user_addr1 = BillingAddress.objects.create(
owner=multi_addr_user,
organization = 'Test org',
street="unknown",
city="unknown",
postal_code="unknown",
active=True)
order1 = Order.objects.create(
owner=multi_addr_user,
starting_date=self.order_meta[1]['starting_date'],
ending_date=self.order_meta[1]['ending_date'],
recurring_period=RecurringPeriod.ONE_TIME,
price=self.order_meta[1]['price'],
description=self.order_meta[1]['description'],
billing_address=BillingAddress.get_address_for(self.user))
# Make this address inactive
user_addr1.active = False
user_addr1.save()
user_addr2 = BillingAddress.objects.create(
owner=multi_addr_user,
organization = 'Test2 org',
street="unknown2",
city="unknown2",
postal_code="unknown2",
active=True)
order2 = Order.objects.create(
owner=multi_addr_user,
starting_date=self.order_meta[1]['starting_date'],
ending_date=self.order_meta[1]['ending_date'],
recurring_period=RecurringPeriod.ONE_TIME,
price=self.order_meta[1]['price'],
description=self.order_meta[1]['description'],
billing_address=BillingAddress.get_address_for(self.user))
bills = Bill.create_next_bills_for_user(multi_addr_user)
self.assertEqual(len(bills), 2)
# TO BE IMPLEMENTED -- once orders can be marked as "done" / "inactive" / "not for billing"
# def test_skip_disabled_orders(self):
# def test_update_recurring_order(self):
# """
# Ensure that a bill only considers "active" orders
# Ensure creating orders from product only creates 1 order
# """
# self.assertEqual(1, 2)
# p = SampleRecurringProduct.objects.create(owner=self.user)
# p.create_order(timezone.make_aware(datetime.datetime(2020,3,3)))
# p.create_or_update_recurring_order(timezone.make_aware(datetime.datetime(2020,3,4)))
# # FIXME: where is the assert?
class ModifyProductTestCase(TestCase):
def setUp(self):
self.user = get_user_model().objects.create(
username='random_user',
email='jane.random@domain.tld')
self.ba = BillingAddress.objects.create(
owner=self.user,
organization = 'Test org',
street="unknown",
city="unknown",
postal_code="somewhere else",
active=True)
def test_no_pro_rata_first_bill(self):
"""
The bill should NOT contain a partial amount -- this is a BILL TEST :-)
"""
price = 5
# Standard 30d recurring product
product = SampleRecurringProduct.objects.create(owner=self.user,
rc_price=price)
starting_date = timezone.make_aware(datetime.datetime(2020,3,3))
ending_date = timezone.make_aware(datetime.datetime(2020,3,31))
time_diff = (ending_date - starting_date).total_seconds()
product.create_order(starting_date)
bills = Bill.create_next_bills_for_user(self.user,
ending_date=ending_date)
# class BillingAddressTestCase(TestCase):
# def setUp(self):
# self.user = get_user_model().objects.create(
# username='random_user',
# email='jane.random@domain.tld')
# We expect 1 bill for 1 billing address and 1 time frame
self.assertEqual(len(bills), 1)
# def test_user_no_address(self):
# """
# Raise an error, when there is no address
# """
pro_rata_amount = time_diff / product.default_recurring_period.value
# self.assertRaises(uncloud_pay.models.BillingAddress.DoesNotExist,
# BillingAddress.get_address_for,
# self.user)
self.assertNotEqual(bills[0].sum, pro_rata_amount * price)
self.assertEqual(bills[0].sum, price)
# def test_user_only_inactive_address(self):
# """
# Raise an error, when there is no active address
# """
# ba = BillingAddress.objects.create(
# owner=self.user,
# organization = 'Test org',
# street="unknown",
# city="unknown",
# postal_code="somewhere else",
# active=False)
# self.assertRaises(uncloud_pay.models.BillingAddress.DoesNotExist,
# BillingAddress.get_address_for,
# self.user)
# def test_find_active_address(self):
# """
# Find the active address
# """
# ba = BillingAddress.objects.create(
# owner=self.user,
# organization = 'Test org',
# street="unknown",
# city="unknown",
# postal_code="unknown",
# active=True)
def test_downgrade_product(self):
"""
Test downgrading behaviour:
# self.assertEqual(BillingAddress.get_address_for(self.user), ba)
We create a recurring product (recurring time: 30 days) and downgrade after 15 days.
# def test_find_right_address_with_multiple_addresses(self):
# """
# Find the active address only, skip inactive
# """
We create the bill right AFTER the end of the first order.
# ba = BillingAddress.objects.create(
# owner=self.user,
# organization = 'Test org',
# street="unknown",
# city="unknown",
# postal_code="unknown",
# active=True)
Expected result:
# ba2 = BillingAddress.objects.create(
# owner=self.user,
# organization = 'Test org',
# street="unknown",
# city="unknown",
# postal_code="somewhere else",
# active=False)
- First bill record for 30 days
- Second bill record starting after 30 days
- Bill contains two bill records
"""
# self.assertEqual(BillingAddress.get_address_for(self.user), ba)
user = self.user
# def test_change_addresses(self):
# """
# Switch the active address
# """
# ba = BillingAddress.objects.create(
# owner=self.user,
# organization = 'Test org',
# street="unknown",
# city="unknown",
# postal_code="unknown",
# active=True)
# self.assertEqual(BillingAddress.get_address_for(self.user), ba)
# ba.active=False
# ba.save()
# ba2 = BillingAddress.objects.create(
# owner=self.user,
# organization = 'Test org',
# street="unknown",
# city="unknown",
# postal_code="somewhere else",
# active=True)
# self.assertEqual(BillingAddress.get_address_for(self.user), ba2)
starting_price = 10
downgrade_price = 5
# class BillTestCase(TestCase):
# def setUp(self):
# self.user_without_address = get_user_model().objects.create(
# username='no_home_person',
# email='far.away@domain.tld')
# self.user = get_user_model().objects.create(
# username='jdoe',
# email='john.doe@domain.tld')
# self.recurring_user = get_user_model().objects.create(
# username='recurrent_product_user',
# email='jane.doe@domain.tld')
# self.user_addr = BillingAddress.objects.create(
# owner=self.user,
# organization = 'Test org',
# street="unknown",
# city="unknown",
# postal_code="unknown",
# active=True)
# self.recurring_user_addr = BillingAddress.objects.create(
# owner=self.recurring_user,
# organization = 'Test org',
# street="Somewhere",
# city="Else",
# postal_code="unknown",
# active=True)
# self.order_meta = {}
# self.order_meta[1] = {
# 'starting_date': timezone.make_aware(datetime.datetime(2020,3,3)),
# 'ending_date': timezone.make_aware(datetime.datetime(2020,4,17)),
# 'price': 15,
# 'description': 'One chocolate bar'
# }
# self.one_time_order = Order.objects.create(
# owner=self.user,
# starting_date=self.order_meta[1]['starting_date'],
# ending_date=self.order_meta[1]['ending_date'],
# recurring_period=RecurringPeriod.ONE_TIME,
# price=self.order_meta[1]['price'],
# description=self.order_meta[1]['description'],
# billing_address=BillingAddress.get_address_for(self.user))
# self.recurring_order = Order.objects.create(
# owner=self.recurring_user,
# starting_date=timezone.make_aware(datetime.datetime(2020,3,3)),
# recurring_period=RecurringPeriod.PER_30D,
# price=15,
# description="A pretty VM",
# billing_address=BillingAddress.get_address_for(self.recurring_user)
# )
# # used for generating multiple bills
# self.bill_dates = [
# timezone.make_aware(datetime.datetime(2020,3,31)),
# timezone.make_aware(datetime.datetime(2020,4,30)),
# timezone.make_aware(datetime.datetime(2020,5,31)),
# ]
starting_date = timezone.make_aware(datetime.datetime(2019,3,3))
first_order_should_end_at = starting_date + datetime.timedelta(days=30)
change1_date = start_after(starting_date + datetime.timedelta(days=15))
bill_ending_date = change1_date + datetime.timedelta(days=1)
# def test_bill_one_time_one_bill_record(self):
# """
# Ensure there is only 1 bill record per order
# """
# bill = Bill.create_next_bill_for_user_address(self.user_addr)
# self.assertEqual(self.one_time_order.billrecord_set.count(), 1)
# def test_bill_sum_onetime(self):
# """
# Check the bill sum for a single one time order
# """
# bill = Bill.create_next_bill_for_user_address(self.user_addr)
# self.assertEqual(bill.sum, self.order_meta[1]['price'])
product = SampleRecurringProduct.objects.create(owner=user, rc_price=starting_price)
product.create_order(starting_date)
# def test_bill_creates_record_for_recurring_order(self):
# """
# Ensure there is only 1 bill record per order
# """
product.rc_price = downgrade_price
product.save()
product.create_or_update_recurring_order(when_to_start=change1_date)
# bill = Bill.create_next_bill_for_user_address(self.recurring_user_addr)
bills = Bill.create_next_bills_for_user(user, ending_date=bill_ending_date)
# self.assertEqual(self.recurring_order.billrecord_set.count(), 1)
# self.assertEqual(bill.billrecord_set.count(), 1)
bill = bills[0]
bill_records = BillRecord.objects.filter(bill=bill)
self.assertEqual(len(bill_records), 2)
# def test_new_bill_after_closing(self):
# """
# After closing a bill and the user has a recurring product,
# the next bill run should create e new bill
# """
self.assertEqual(bill_records[0].starting_date, starting_date)
# for ending_date in self.bill_dates:
# b = Bill.create_next_bill_for_user_address(self.recurring_user_addr, ending_date)
# b.close()
self.assertEqual(bill_records[0].order.ending_date, first_order_should_end_at)
# bill_count = Bill.objects.filter(owner=self.recurring_user).count()
# self.assertEqual(bill_records[0].ending_date, first_order_should_end_at)
# self.assertEqual(len(self.bill_dates), bill_count)
# self.assertEqual(bill_records[0].quantity, 1)
# def test_multi_addr_multi_bill(self):
# """
# Ensure multiple bills are created if orders exist with different billing addresses
# """
# self.assertEqual(bill_records[1].quantity, 1)
# self.assertEqual(int(bill.sum), 15)
# username="lotsofplaces"
# multi_addr_user = get_user_model().objects.create(
# username=username,
# email=f"{username}@example.org")
def test_upgrade_product(self):
"""
Test upgrading behaviour
"""
# user_addr1 = BillingAddress.objects.create(
# owner=multi_addr_user,
# organization = 'Test org',
# street="unknown",
# city="unknown",
# postal_code="unknown",
# active=True)
user = self.user
# order1 = Order.objects.create(
# owner=multi_addr_user,
# starting_date=self.order_meta[1]['starting_date'],
# ending_date=self.order_meta[1]['ending_date'],
# recurring_period=RecurringPeriod.ONE_TIME,
# price=self.order_meta[1]['price'],
# description=self.order_meta[1]['description'],
# billing_address=BillingAddress.get_address_for(self.user))
# Create product
starting_date = timezone.make_aware(datetime.datetime(2019,3,3))
starting_price = 10
product = SampleRecurringProduct.objects.create(owner=user, rc_price=starting_price)
product.create_order(starting_date)
# # Make this address inactive
# user_addr1.active = False
# user_addr1.save()
change1_date = start_after(starting_date + datetime.timedelta(days=15))
product.rc_price = 20
product.save()
product.create_or_update_recurring_order(when_to_start=change1_date)
# user_addr2 = BillingAddress.objects.create(
# owner=multi_addr_user,
# organization = 'Test2 org',
# street="unknown2",
# city="unknown2",
# postal_code="unknown2",
# active=True)
bill_ending_date = change1_date + datetime.timedelta(days=1)
bills = Bill.create_next_bills_for_user(user, ending_date=bill_ending_date)
# order2 = Order.objects.create(
# owner=multi_addr_user,
# starting_date=self.order_meta[1]['starting_date'],
# ending_date=self.order_meta[1]['ending_date'],
# recurring_period=RecurringPeriod.ONE_TIME,
# price=self.order_meta[1]['price'],
# description=self.order_meta[1]['description'],
# billing_address=BillingAddress.get_address_for(self.user))
bill = bills[0]
bill_records = BillRecord.objects.filter(bill=bill)
self.assertEqual(len(bill_records), 2)
self.assertEqual(bill_records[0].quantity, .5)
# bills = Bill.create_next_bills_for_user(multi_addr_user)
self.assertEqual(bill_records[0].ending_date, end_before(change1_date))
# self.assertEqual(len(bills), 2)
self.assertEqual(bill_records[1].quantity, 1)
self.assertEqual(bill_records[1].starting_date, change1_date)
self.assertEqual(int(bill.sum), 25)
# # TO BE IMPLEMENTED -- once orders can be marked as "done" / "inactive" / "not for billing"
# # def test_skip_disabled_orders(self):
# # """
# # Ensure that a bill only considers "active" orders
# # """
# # self.assertEqual(1, 2)
# class ModifyProductTestCase(TestCase):
# def setUp(self):
# self.user = get_user_model().objects.create(
# username='random_user',
# email='jane.random@domain.tld')
# self.ba = BillingAddress.objects.create(
# owner=self.user,
# organization = 'Test org',
# street="unknown",
# city="unknown",
# postal_code="somewhere else",
# active=True)
# def test_no_pro_rata_first_bill(self):
# """
# The bill should NOT contain a partial amount -- this is a BILL TEST :-)
# """
# price = 5
# # Standard 30d recurring product
# product = SampleRecurringProduct.objects.create(owner=self.user,
# rc_price=price)
# starting_date = timezone.make_aware(datetime.datetime(2020,3,3))
# ending_date = timezone.make_aware(datetime.datetime(2020,3,31))
# time_diff = (ending_date - starting_date).total_seconds()
# product.create_order(starting_date)
# bills = Bill.create_next_bills_for_user(self.user,
# ending_date=ending_date)
# # We expect 1 bill for 1 billing address and 1 time frame
# self.assertEqual(len(bills), 1)
# pro_rata_amount = time_diff / product.default_recurring_period.value
# self.assertNotEqual(bills[0].sum, pro_rata_amount * price)
# self.assertEqual(bills[0].sum, price)
# def test_downgrade_product(self):
# """
# Test downgrading behaviour:
# We create a recurring product (recurring time: 30 days) and downgrade after 15 days.
# We create the bill right AFTER the end of the first order.
# Expected result:
# - First bill record for 30 days
# - Second bill record starting after 30 days
# - Bill contains two bill records
# """
# user = self.user
# starting_price = 10
# downgrade_price = 5
# starting_date = timezone.make_aware(datetime.datetime(2019,3,3))
# first_order_should_end_at = starting_date + datetime.timedelta(days=30)
# change1_date = start_after(starting_date + datetime.timedelta(days=15))
# bill_ending_date = change1_date + datetime.timedelta(days=1)
# product = SampleRecurringProduct.objects.create(owner=user, rc_price=starting_price)
# product.create_order(starting_date)
# product.rc_price = downgrade_price
# product.save()
# product.create_or_update_recurring_order(when_to_start=change1_date)
# bills = Bill.create_next_bills_for_user(user, ending_date=bill_ending_date)
# bill = bills[0]
# bill_records = BillRecord.objects.filter(bill=bill)
# self.assertEqual(len(bill_records), 2)
# self.assertEqual(bill_records[0].starting_date, starting_date)
# self.assertEqual(bill_records[0].order.ending_date, first_order_should_end_at)
# # self.assertEqual(bill_records[0].ending_date, first_order_should_end_at)
# # self.assertEqual(bill_records[0].quantity, 1)
# # self.assertEqual(bill_records[1].quantity, 1)
# # self.assertEqual(int(bill.sum), 15)
# def test_upgrade_product(self):
# """
# Test upgrading behaviour
# """
# user = self.user
# # Create product
# starting_date = timezone.make_aware(datetime.datetime(2019,3,3))
# starting_price = 10
# product = SampleRecurringProduct.objects.create(owner=user, rc_price=starting_price)
# product.create_order(starting_date)
# change1_date = start_after(starting_date + datetime.timedelta(days=15))
# product.rc_price = 20
# product.save()
# product.create_or_update_recurring_order(when_to_start=change1_date)
# bill_ending_date = change1_date + datetime.timedelta(days=1)
# bills = Bill.create_next_bills_for_user(user, ending_date=bill_ending_date)
# bill = bills[0]
# bill_records = BillRecord.objects.filter(bill=bill)
# self.assertEqual(len(bill_records), 2)
# self.assertEqual(bill_records[0].quantity, .5)
# self.assertEqual(bill_records[0].ending_date, end_before(change1_date))
# self.assertEqual(bill_records[1].quantity, 1)
# self.assertEqual(bill_records[1].starting_date, change1_date)
# self.assertEqual(int(bill.sum), 25)