Skip to content

Commit

Permalink
Merge pull request #36 from ErhanCitil/chore/unit-tests-for-base-app
Browse files Browse the repository at this point in the history
[#35] Write unit tests to ensure the most of the project is working well
  • Loading branch information
ErhanCitil committed Nov 17, 2023
2 parents bf4b95b + 14a0a55 commit b649a32
Show file tree
Hide file tree
Showing 10 changed files with 229 additions and 7 deletions.
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

0 comments on commit b649a32

Please sign in to comment.