diff --git a/shop/tests/mixins.py b/shop/tests/mixins.py
index af7bac0..d5f1cf2 100644
--- a/shop/tests/mixins.py
+++ b/shop/tests/mixins.py
@@ -12,6 +12,7 @@ class CreateProductsMixin:
name="Producto 1",
description="Descripción",
price=Decimal("10.00"),
+ is_shipping=False,
) -> Product:
tax, created = Tax.objects.get_or_create(
code="IVA",
@@ -21,6 +22,7 @@ class CreateProductsMixin:
sku=sku,
name=name,
description=description,
+ is_shipping_method=is_shipping,
)
ProductPrice.objects.create(
price=price,
diff --git a/users/forms/register.py b/users/forms/register.py
index d31067a..e197683 100644
--- a/users/forms/register.py
+++ b/users/forms/register.py
@@ -10,6 +10,7 @@ class RegisterForm(BaseUserCreationForm, SetPasswordMixin):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field_name in self.fields.keys():
+ self.fields[field_name].required = True
self.fields[field_name].widget.attrs.update(
{
"class": "my-2 bg-gray-50 border border-gray-300 text-gray-900 sm:text-sm rounded-lg "
diff --git a/web/forms.py b/web/forms.py
index 9827bc5..ee9ba4f 100644
--- a/web/forms.py
+++ b/web/forms.py
@@ -8,13 +8,12 @@ class CartItemForm(forms.Form):
"""
-
product = forms.IntegerField(widget=widgets.HiddenInput)
quantity = forms.IntegerField()
class CreateOrderForm(forms.Form):
- email = forms.CharField(max_length=254)
+ email = forms.CharField(max_length=254, required=True)
shipping_address_full_name = forms.CharField(max_length=128, required=True)
shipping_address = forms.CharField(max_length=128, required=True)
diff --git a/web/tests/images/trolley.png b/web/tests/images/trolley.png
new file mode 100644
index 0000000..8205a33
Binary files /dev/null and b/web/tests/images/trolley.png differ
diff --git a/web/tests/test_login.py b/web/tests/test_login.py
index 0f0a7a4..4d39cb9 100644
--- a/web/tests/test_login.py
+++ b/web/tests/test_login.py
@@ -96,3 +96,18 @@ class TestLogin(APITestCase):
response = self.client.get(reverse("web:logout"))
assert response.status_code == status.HTTP_302_FOUND
assert response.url == reverse("web:index")
+
+ def test_login_then_get_my_account(self):
+ response = self.client.post(
+ reverse("web:login"),
+ {
+ "username": self.user.username,
+ "password": self.password,
+ },
+ )
+
+ assert response.status_code == status.HTTP_302_FOUND
+ assert response.url == reverse("web:index")
+
+ response = self.client.get(reverse("web:my_account"))
+ assert response.status_code == status.HTTP_200_OK
diff --git a/web/tests/test_manifest.py b/web/tests/test_manifest.py
index c843974..93db4a5 100644
--- a/web/tests/test_manifest.py
+++ b/web/tests/test_manifest.py
@@ -1,13 +1,24 @@
+import os
from django.test import TestCase
from django.urls import reverse
+from django.conf import settings
from web.models import WebSettings
+from django.core.files.uploadedfile import SimpleUploadedFile
class TestManifest(TestCase):
def setUp(self):
- WebSettings.objects.create()
+ self.settings = WebSettings.load()
- def test_index_view(self):
+ with open(os.path.join(settings.BASE_DIR, 'web', 'tests', 'images', 'trolley.png'), 'rb') as f:
+ file_128 = SimpleUploadedFile('logo_128.png', f.read())
+ self.settings.logo_128 = file_128
+ file_240 = SimpleUploadedFile('logo_240.png', f.read())
+ self.settings.logo_240 = file_240
+ self.settings.logo = file_240
+ self.settings.save()
+
+ def test_manifest_view(self):
response = self.client.get(reverse("web:manifest_json"))
assert response.status_code == 200
diff --git a/web/tests/test_orders.py b/web/tests/test_orders.py
new file mode 100644
index 0000000..e23a008
--- /dev/null
+++ b/web/tests/test_orders.py
@@ -0,0 +1,119 @@
+from decimal import Decimal
+
+from django.contrib.auth.models import User
+from django.test import TestCase
+from django.urls import reverse
+
+from shop.models import Cart, CartItem, Order, CustomerAddress, ShippingMethod, ShopSettings
+from shop.tests.mixins import CreateProductsMixin
+
+
+class TestOrders(TestCase, CreateProductsMixin):
+ def setUp(self):
+ self.product = self.create_product()
+ self.user = User.objects.create_user("anakin", "anakin@skywalker.com", "ihatesand")
+ self.cart_for_user = self.create_cart(user=self.user)
+ self.anonymous_cart = self.create_cart()
+ self.address = CustomerAddress.objects.create(
+ vat_id="11111111H",
+ full_name="Vader",
+ address="Tatooine",
+ address_town="Mos Eisley",
+ address_zip="00001",
+ address_state="Tatooine",
+ address_country="Mos Eisley",
+ address_phone="00000000",
+ address_type=CustomerAddress.Types.BILLING,
+ email=self.user.email,
+ default=True,
+ )
+ self.shipping_method = self.create_shipping_method()
+ self.settings = ShopSettings.load()
+ self.settings.shared_secret = "sq7HjrUOBfKmC576ILgskD5srU870gJ7" # Debug secret
+ self.settings.save()
+
+ def create_cart(self, user=None):
+ cart = Cart.objects.create(
+ user=user,
+ )
+ CartItem.objects.create(
+ cart=cart,
+ product=self.product,
+ quantity=1,
+ )
+ return cart
+
+ def create_shipping_method(self):
+ product = self.create_product(sku="SM1", name="SM1", price=Decimal("1.00"))
+ method = ShippingMethod.objects.create(name="SM 1", shipping_product=product)
+ return method
+
+ def test_logged_user_orders_page(self):
+ self.client.force_login(self.user)
+ response = self.client.get(reverse("web:orders"))
+ assert response.status_code == 200
+
+ def test_logged_user_create_get_order_page(self):
+ self.client.force_login(self.user)
+ response = self.client.get(reverse("web:cart_detail"))
+ assert response.status_code == 200
+
+ # Crear pedido
+ data = {
+ "email": self.user.email,
+ "shipping_address_full_name": self.address.full_name,
+ "shipping_address": self.address.address,
+ "shipping_address_town": self.address.address_town,
+ "shipping_address_zip": self.address.address_zip,
+ "shipping_address_state": self.address.address_state,
+ "shipping_address_country": self.address.address_country,
+ "shipping_address_phone": self.address.address_phone,
+ "same_as_shipping": True,
+ "billing_address_full_name": self.address.full_name,
+ "billing_address": self.address.address,
+ "billing_address_town": self.address.address_town,
+ "billing_address_zip": self.address.address_zip,
+ "billing_address_state": self.address.address_state,
+ "billing_address_country": self.address.address_country,
+ "billing_address_phone": self.address.address_phone,
+ "shipping_method": self.shipping_method.pk,
+ }
+
+ response = self.client.post(reverse("web:cart_detail"), data)
+ assert response.status_code == 302
+
+ order = Order.objects.filter(user=self.user).first()
+ assert order is not None
+
+ response = self.client.get(response.url)
+ assert response.status_code == 200
+
+ def test_logged_user_create_get_order_page_invalid_data(self):
+ self.client.force_login(self.user)
+ response = self.client.get(reverse("web:cart_detail"))
+ assert response.status_code == 200
+
+ # Sin e-mail
+ data = {
+ "shipping_address_full_name": self.address.full_name,
+ "shipping_address": self.address.address,
+ "shipping_address_town": self.address.address_town,
+ "shipping_address_zip": self.address.address_zip,
+ "shipping_address_state": self.address.address_state,
+ "shipping_address_country": self.address.address_country,
+ "shipping_address_phone": self.address.address_phone,
+ "same_as_shipping": True,
+ "billing_address_full_name": self.address.full_name,
+ "billing_address": self.address.address,
+ "billing_address_town": self.address.address_town,
+ "billing_address_zip": self.address.address_zip,
+ "billing_address_state": self.address.address_state,
+ "billing_address_country": self.address.address_country,
+ "billing_address_phone": self.address.address_phone,
+ "shipping_method": self.shipping_method.pk,
+ }
+
+ response = self.client.post(reverse("web:cart_detail"), data)
+ assert response.status_code == 200
+
+ assert not Order.objects.filter(user=self.user).exists()
diff --git a/web/tests/test_register.py b/web/tests/test_register.py
index 1810858..ee7b7f6 100644
--- a/web/tests/test_register.py
+++ b/web/tests/test_register.py
@@ -1,17 +1,21 @@
from django.contrib.auth import get_user_model
from django.shortcuts import reverse
-from django.test import TestCase
+from django.test import TransactionTestCase
User = get_user_model()
-class TestRegister(TestCase):
+class TestRegister(TransactionTestCase):
def setUp(self) -> None:
self.password = "theonering"
self.email = "sauron@mordor.middleearth"
self.first_name = "Sauron"
self.last_name = "The Lord of the Rings"
+ def test_get_register_page(self):
+ response = self.client.get(reverse("web:register"))
+ assert response.status_code == 200
+
def test_create_user_account(self):
response = self.client.post(
reverse("web:register"),
@@ -84,7 +88,7 @@ class TestRegister(TestCase):
{
"email": self.email,
"password1": self.password,
- "password2": "otherpassword",
+ "password2": self.password,
"first_name": self.first_name,
"last_name": "",
},
@@ -98,3 +102,29 @@ class TestRegister(TestCase):
).exists()
assert response.status_code == 400
+
+ def test_create_user_account_already_existing(self):
+ assert User.objects.all().count() == 0
+ User.objects.create_user(
+ email=self.email,
+ username=self.email,
+ )
+ response = self.client.post(
+ reverse("web:register"),
+ {
+ "email": self.email,
+ "password1": self.password,
+ "password2": self.password,
+ "first_name": self.first_name,
+ "last_name": self.last_name,
+ },
+ )
+
+ assert not User.objects.filter(
+ username=self.email,
+ email=self.email,
+ first_name=self.first_name,
+ last_name="",
+ ).exists()
+
+ assert response.status_code == 400
diff --git a/web/tests/test_wishlist.py b/web/tests/test_wishlist.py
index 7a3fa5a..8a2b500 100644
--- a/web/tests/test_wishlist.py
+++ b/web/tests/test_wishlist.py
@@ -44,6 +44,16 @@ class TestWishlist(TestCase, CreateProductsMixin):
user=self.user, product=self.product
).exists()
+ def test_not_logged_user_create_wishlisted_product(self):
+ assert WishlistedProduct.objects.count() == 0
+ response = self.client.post(
+ reverse("web:add_to_wishlist"),
+ {
+ "product": self.product.pk,
+ },
+ )
+ assert response.status_code == 400
+
def test_logged_user_delete_wishlisted_product(self):
wishlisted = WishlistedProduct.objects.create(
user=self.user, product=self.product
diff --git a/web/views/web.py b/web/views/web.py
index fcda7e2..0ab8b78 100644
--- a/web/views/web.py
+++ b/web/views/web.py
@@ -209,6 +209,8 @@ class OrdersView(TemplateView, FilteredQuerysetMixin, PaginatedQuerysetMixin):
page = self.get_paginated_queryset(qs)
return {
+ "title": settings.web_title,
+ "web_title": settings.web_title,
"page": page,
"has_next_page": page.has_next(),
"has_previous_page": page.has_previous(),