Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[#35] Write unit tests to ensure the most of the project is working well #36

Merged
merged 3 commits into from
Nov 17, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions src/bobvance/base/migrations/0006_alter_customer_phonenumber.py
Original file line number Diff line number Diff line change
@@ -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),
),
]
2 changes: 1 addition & 1 deletion src/bobvance/base/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
3 changes: 0 additions & 3 deletions src/bobvance/base/tests.py

This file was deleted.

Empty file.
27 changes: 27 additions & 0 deletions src/bobvance/base/tests/factories.py
Original file line number Diff line number Diff line change
@@ -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])
68 changes: 68 additions & 0 deletions src/bobvance/base/tests/test_forms.py
Original file line number Diff line number Diff line change
@@ -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.')
85 changes: 85 additions & 0 deletions src/bobvance/base/tests/test_views.py
Original file line number Diff line number Diff line change
@@ -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)
4 changes: 2 additions & 2 deletions src/bobvance/base/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
26 changes: 26 additions & 0 deletions src/bobvance/contact/tests/test_forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.")
2 changes: 1 addition & 1 deletion src/bobvance/templates/base/order.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

<div class="items-center justify-center p-12">
<div class="mx-auto w-full max-w-[550px]">
<form action="" method="POST">
<form action="" name="order_form" method="POST">
{% csrf_token %}
<div class="p-10">
{{form.as_p}}
Expand Down
Loading