diff --git a/src/bobvance/base/migrations/0006_alter_customer_phonenumber.py b/src/bobvance/base/migrations/0006_alter_customer_phonenumber.py new file mode 100644 index 0000000..2603f85 --- /dev/null +++ b/src/bobvance/base/migrations/0006_alter_customer_phonenumber.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.21 on 2023-11-17 14:46 + +from django.db import migrations +import phonenumber_field.modelfields + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0005_order_total_price'), + ] + + operations = [ + migrations.AlterField( + model_name='customer', + name='phonenumber', + field=phonenumber_field.modelfields.PhoneNumberField(error_messages={'invalid': 'Het ingevoerde telefoonnummer is niet juist. Gebruik het formaat +31 6xxxxxxxx.'}, max_length=128, region=None), + ), + ] diff --git a/src/bobvance/base/models.py b/src/bobvance/base/models.py index 00dc8a7..f660bd9 100644 --- a/src/bobvance/base/models.py +++ b/src/bobvance/base/models.py @@ -12,7 +12,7 @@ class Customer(models.Model): firstname = models.CharField(max_length=50) lastname = models.CharField(max_length=50) email = models.EmailField() - phonenumber = PhoneNumberField() + phonenumber = PhoneNumberField(error_messages={"invalid": "Het ingevoerde telefoonnummer is niet juist. Gebruik het formaat +31 6xxxxxxxx."}) address = models.CharField(max_length=100) postal_code = NLZipCodeField() city = models.CharField(max_length=50) diff --git a/src/bobvance/base/tests.py b/src/bobvance/base/tests.py deleted file mode 100644 index 7ce503c..0000000 --- a/src/bobvance/base/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/src/bobvance/base/tests/__init__.py b/src/bobvance/base/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/bobvance/base/tests/factories.py b/src/bobvance/base/tests/factories.py new file mode 100644 index 0000000..e654d8e --- /dev/null +++ b/src/bobvance/base/tests/factories.py @@ -0,0 +1,27 @@ +import factory +from factory.fuzzy import FuzzyChoice +from bobvance.base.models import Customer, Order, OrderProduct, Product +import random + +class CustomerFactory(factory.django.DjangoModelFactory): + class Meta: + model = Customer + + firstname = factory.Faker("first_name") + lastname = factory.Faker("last_name") + email = factory.Faker("email") + phonenumber = factory.LazyFunction(lambda: f"+31 6{random.randint(100, 999)}{random.randint(10000, 99999)}") + address = factory.Faker("street_address") + postal_code = factory.LazyFunction(lambda: f"{random.randint(1000, 9999)} {''.join(random.choice('ABCDEFGHIJKLMNOPQRSTUVWXYZ') for i in range(2))}") + city = factory.Faker("city") + country = factory.Faker("country") + +class ProductFactory(factory.django.DjangoModelFactory): + class Meta: + model = Product + + name = factory.Faker("word") + price = factory.Faker("pydecimal", left_digits=3, right_digits=2, positive=True) + description = factory.Faker("text") + image = factory.django.ImageField(color="blue") + new = FuzzyChoice([True, False]) diff --git a/src/bobvance/base/tests/test_forms.py b/src/bobvance/base/tests/test_forms.py new file mode 100644 index 0000000..3c9bdc6 --- /dev/null +++ b/src/bobvance/base/tests/test_forms.py @@ -0,0 +1,68 @@ +from bobvance.base.tests.factories import CustomerFactory, ProductFactory +from django_webtest import WebTest +from django.urls import reverse + +class FormTestCase(WebTest): + def setUp(self): + self.customer = CustomerFactory() + self.product = ProductFactory() + + self.url = reverse("order") + + def test_order_form_page(self): + response = self.app.get(self.url) + self.assertEqual(response.status_code, 200) + self.assertTemplateUsed(response, "base/order.html") + + def test_order_view(self): + form = self.app.get(self.url).form + form["firstname"] = self.customer.firstname + form["lastname"] = self.customer.lastname + form["email"] = self.customer.email + form["address"] = self.customer.address + form["postal_code"] = self.customer.postal_code + form["city"] = self.customer.city + form["country"] = self.customer.country + form["phonenumber"] = str(self.customer.phonenumber) + form["postal_code"] = self.customer.postal_code + response = form.submit() + self.assertEqual(response.status_code, 302) + self.assertRedirects(response, reverse("success", kwargs={"pk": 1})) + + def test_wrong_phone_number(self): + """ + The form is only accepting Dutch phone numbers + """ + + form = self.app.get(self.url).form + form["phonenumber"] = "1234567890" + response = form.submit() + self.assertEqual(response.context["form"].errors['phonenumber'][0], 'Het ingevoerde telefoonnummer is niet juist. Gebruik het formaat +31 6xxxxxxxx.') + + def test_wrong_postal_code(self): + """ + The form is only accepting Dutch postal codes + """ + + form = self.app.get(self.url).form + form["postal_code"] = "1234ABB" + response = form.submit() + self.assertEqual(response.context["form"].errors['postal_code'][0], 'Enter a valid zip code.') + + def test_wrong_email(self): + form = self.app.get(self.url).form + form["email"] = "test" + response = form.submit() + self.assertEqual(response.context["form"].errors['email'][0], 'Voer een geldig e-mailadres in.') + + def test_empty_form(self): + form = self.app.get(self.url).form + response = form.submit() + self.assertEqual(response.context["form"].errors['firstname'][0], 'Dit veld is verplicht.') + self.assertEqual(response.context["form"].errors['lastname'][0], 'Dit veld is verplicht.') + self.assertEqual(response.context["form"].errors['email'][0], 'Dit veld is verplicht.') + self.assertEqual(response.context["form"].errors['address'][0], 'Dit veld is verplicht.') + self.assertEqual(response.context["form"].errors['postal_code'][0], 'Dit veld is verplicht.') + self.assertEqual(response.context["form"].errors['city'][0], 'Dit veld is verplicht.') + self.assertEqual(response.context["form"].errors['country'][0], 'Dit veld is verplicht.') + self.assertEqual(response.context["form"].errors['phonenumber'][0], 'Dit veld is verplicht.') diff --git a/src/bobvance/base/tests/test_views.py b/src/bobvance/base/tests/test_views.py new file mode 100644 index 0000000..c3d8499 --- /dev/null +++ b/src/bobvance/base/tests/test_views.py @@ -0,0 +1,85 @@ +from django.test import TestCase +from django.urls import reverse +from bobvance.base.tests.factories import CustomerFactory, ProductFactory + +class ViewsTestCase(TestCase): + def home_view(self): + url = reverse("home") + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + + def products_view(self): + url = reverse("products") + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + + def new_products_view(self): + url = reverse("new_products") + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + + def used_products_view(self): + url = reverse("used_products") + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + + def product_detail_view(self): + product = ProductFactory() + url = reverse("product_detail", kwargs={"pk": product.pk}) + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + + def cart_view(self): + url = reverse("cart") + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + + def checkout_view(self): + url = reverse("checkout") + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + + def order_view(self): + url = reverse("order") + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + +class NewAndUsedProductsTestCase(TestCase): + def setUp(self): + self.new_product = ProductFactory(new=True) + self.used_product = ProductFactory(new=False) + + def test_new_products_view(self): + url = reverse("new_products") + response = self.client.get(url) + self.assertContains(response, self.new_product.name) + self.assertNotContains(response, self.used_product.name) + + def test_used_products_view(self): + url = reverse("used_products") + response = self.client.get(url) + self.assertContains(response, self.used_product.name) + self.assertNotContains(response, self.new_product.name) + +class ProductDetailViewTestCase(TestCase): + def setUp(self): + self.product = ProductFactory() + self.url = reverse("product_detail", kwargs={"pk": self.product.pk}) + + def test_product_detail_view(self): + response = self.client.get(self.url) + self.assertContains(response, self.product.name) + self.assertContains(response, self.product.description) + + def test_product_detail_view_more_products(self): + product_1 = ProductFactory() + product_2 = ProductFactory() + product_3 = ProductFactory() + product_4 = ProductFactory() + product_5 = ProductFactory() + response = self.client.get(self.url) + self.assertContains(response, product_1.name) + self.assertContains(response, product_2.name) + self.assertContains(response, product_3.name) + self.assertContains(response, product_4.name) + self.assertContains(response, product_5.name) diff --git a/src/bobvance/base/views.py b/src/bobvance/base/views.py index ac1cb27..cbc1222 100644 --- a/src/bobvance/base/views.py +++ b/src/bobvance/base/views.py @@ -178,8 +178,8 @@ def form_valid(self, form): OrderProduct.objects.create( order=order, product=product, quantity=cart[str(product.id)] ) - - del self.request.session["cart"] + if 'cart' in self.request.session: + del self.request.session["cart"] self.object = order diff --git a/src/bobvance/contact/tests/test_forms.py b/src/bobvance/contact/tests/test_forms.py index f69a275..48ef024 100644 --- a/src/bobvance/contact/tests/test_forms.py +++ b/src/bobvance/contact/tests/test_forms.py @@ -18,3 +18,29 @@ def test_contact_view(self): response = self.app.get(reverse("contact")) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, "contact/contact.html") + + def test_contact_form(self): + form = self.app.get(reverse("contact")).form + form["name"] = self.contact.name + form["email"] = self.contact.email + form["message"] = self.contact.message + response = form.submit() + self.assertEqual(response.status_code, 302) + self.assertEqual(Contact.objects.count(), 2) + self.assertEqual(Contact.objects.last().name, self.contact.name) + self.assertEqual(Contact.objects.last().email, self.contact.email) + self.assertEqual(Contact.objects.last().message, self.contact.message) + + def test_wrong_email(self): + form = self.app.get(reverse("contact")).form + form["email"] = "test" + response = form.submit() + self.assertEqual( + response.context["form"].errors["email"][0], "Voer een geldig e-mailadres in." + ) + + def test_empty_name_field(self): + form = self.app.get(reverse("contact")).form + form["name"] = "" + response = form.submit() + self.assertEqual(response.context["form"].errors["name"][0], "Dit veld is verplicht.") diff --git a/src/bobvance/templates/base/order.html b/src/bobvance/templates/base/order.html index cb740ea..cd084eb 100644 --- a/src/bobvance/templates/base/order.html +++ b/src/bobvance/templates/base/order.html @@ -5,7 +5,7 @@
-
+ {% csrf_token %}
{{form.as_p}}