Test that creating products w/o correct billing address fails

This commit is contained in:
Nico Schottelius 2020-08-25 21:31:12 +02:00
parent 7b83efe995
commit ab412cb877
3 changed files with 89 additions and 13 deletions

View File

@ -0,0 +1,33 @@
# Generated by Django 3.1 on 2020-08-25 19:15
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('uncloud_pay', '0013_auto_20200809_1237'),
]
operations = [
migrations.AddField(
model_name='sampleonetimeproduct',
name='ot_price',
field=models.IntegerField(default=5),
),
migrations.AddField(
model_name='samplerecurringproduct',
name='rc_price',
field=models.IntegerField(default=10),
),
migrations.AddField(
model_name='samplerecurringproductonetimefee',
name='ot_price',
field=models.IntegerField(default=5),
),
migrations.AddField(
model_name='samplerecurringproductonetimefee',
name='rc_price',
field=models.IntegerField(default=10),
),
]

View File

@ -789,8 +789,25 @@ class Product(UncloudModel):
# FIXME: use the right type of exception here!
raise Exception("Did not implement the discounter for this case")
def save(self, *args, **kwargs):
try:
ba = BillingAddress.get_address_for(self.owner)
except BillingAddress.DoesNotExist:
raise ValidationError("User does not have a billing address")
if not ba.active:
raise ValidationError("User does not have an active billing address")
super().save(*args, **kwargs)
# Sample products included into uncloud
class SampleOneTimeProduct(Product):
"""
Products are usually more complex, but this product shows how easy
it can be to create your own one time product.
"""
default_recurring_period = RecurringPeriod.ONE_TIME
@ -801,6 +818,11 @@ class SampleOneTimeProduct(Product):
return self.ot_price
class SampleRecurringProduct(Product):
"""
Products are usually more complex, but this product shows how easy
it can be to create your own recurring fee product.
"""
default_recurring_period = RecurringPeriod.PER_30D
rc_price = models.IntegerField(default=10)
@ -810,6 +832,11 @@ class SampleRecurringProduct(Product):
return self.rc_price
class SampleRecurringProductOneTimeFee(Product):
"""
Products are usually more complex, but this product shows how easy
it can be to create your own one time + recurring fee product.
"""
default_recurring_period = RecurringPeriod.PER_30D
ot_price = models.IntegerField(default=5)

View File

@ -16,7 +16,7 @@ class ProductTestCase(TestCase):
username='random_user',
email='jane.random@domain.tld')
ba = BillingAddress.objects.create(
self.ba = BillingAddress.objects.create(
owner=self.user,
organization = 'Test org',
street="unknown",
@ -34,6 +34,29 @@ class ProductTestCase(TestCase):
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):
"""
@ -329,6 +352,7 @@ class BillTestCase(TestCase):
class ModifyProductTestCase(TestCase):
def setUp(self):
self.user = get_user_model().objects.create(
username='random_user',
@ -340,23 +364,15 @@ class ModifyProductTestCase(TestCase):
street="unknown",
city="unknown",
postal_code="somewhere else",
active=False)
active=True)
def test_user_no_address(self):
"""
Raise an error, when there is no address
def test_modify_recurring_product(self):
"""
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
"""
product = SampleRecurringProduct.objects.create(owner=self.user)
# class NotABillingTC(TestCase):