feat: improved coverage
This commit is contained in:
@@ -12,6 +12,7 @@ class CreateProductsMixin:
|
|||||||
name="Producto 1",
|
name="Producto 1",
|
||||||
description="Descripción",
|
description="Descripción",
|
||||||
price=Decimal("10.00"),
|
price=Decimal("10.00"),
|
||||||
|
is_shipping=False,
|
||||||
) -> Product:
|
) -> Product:
|
||||||
tax, created = Tax.objects.get_or_create(
|
tax, created = Tax.objects.get_or_create(
|
||||||
code="IVA",
|
code="IVA",
|
||||||
@@ -21,6 +22,7 @@ class CreateProductsMixin:
|
|||||||
sku=sku,
|
sku=sku,
|
||||||
name=name,
|
name=name,
|
||||||
description=description,
|
description=description,
|
||||||
|
is_shipping_method=is_shipping,
|
||||||
)
|
)
|
||||||
ProductPrice.objects.create(
|
ProductPrice.objects.create(
|
||||||
price=price,
|
price=price,
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ class RegisterForm(BaseUserCreationForm, SetPasswordMixin):
|
|||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
for field_name in self.fields.keys():
|
for field_name in self.fields.keys():
|
||||||
|
self.fields[field_name].required = True
|
||||||
self.fields[field_name].widget.attrs.update(
|
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 "
|
"class": "my-2 bg-gray-50 border border-gray-300 text-gray-900 sm:text-sm rounded-lg "
|
||||||
|
|||||||
+1
-2
@@ -8,13 +8,12 @@ class CartItemForm(forms.Form):
|
|||||||
<label for="quantity">{% translate 'Cantidad' %}</label>
|
<label for="quantity">{% translate 'Cantidad' %}</label>
|
||||||
<input id="quantity" type="number" name="quantity" value="1">
|
<input id="quantity" type="number" name="quantity" value="1">
|
||||||
"""
|
"""
|
||||||
|
|
||||||
product = forms.IntegerField(widget=widgets.HiddenInput)
|
product = forms.IntegerField(widget=widgets.HiddenInput)
|
||||||
quantity = forms.IntegerField()
|
quantity = forms.IntegerField()
|
||||||
|
|
||||||
|
|
||||||
class CreateOrderForm(forms.Form):
|
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_full_name = forms.CharField(max_length=128, required=True)
|
||||||
shipping_address = forms.CharField(max_length=128, required=True)
|
shipping_address = forms.CharField(max_length=128, required=True)
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 4.1 KiB |
@@ -96,3 +96,18 @@ class TestLogin(APITestCase):
|
|||||||
response = self.client.get(reverse("web:logout"))
|
response = self.client.get(reverse("web:logout"))
|
||||||
assert response.status_code == status.HTTP_302_FOUND
|
assert response.status_code == status.HTTP_302_FOUND
|
||||||
assert response.url == reverse("web:index")
|
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
|
||||||
|
|||||||
@@ -1,13 +1,24 @@
|
|||||||
|
import os
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
from web.models import WebSettings
|
from web.models import WebSettings
|
||||||
|
from django.core.files.uploadedfile import SimpleUploadedFile
|
||||||
|
|
||||||
|
|
||||||
class TestManifest(TestCase):
|
class TestManifest(TestCase):
|
||||||
def setUp(self):
|
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"))
|
response = self.client.get(reverse("web:manifest_json"))
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
|
|||||||
@@ -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()
|
||||||
@@ -1,17 +1,21 @@
|
|||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.shortcuts import reverse
|
from django.shortcuts import reverse
|
||||||
from django.test import TestCase
|
from django.test import TransactionTestCase
|
||||||
|
|
||||||
User = get_user_model()
|
User = get_user_model()
|
||||||
|
|
||||||
|
|
||||||
class TestRegister(TestCase):
|
class TestRegister(TransactionTestCase):
|
||||||
def setUp(self) -> None:
|
def setUp(self) -> None:
|
||||||
self.password = "theonering"
|
self.password = "theonering"
|
||||||
self.email = "sauron@mordor.middleearth"
|
self.email = "sauron@mordor.middleearth"
|
||||||
self.first_name = "Sauron"
|
self.first_name = "Sauron"
|
||||||
self.last_name = "The Lord of the Rings"
|
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):
|
def test_create_user_account(self):
|
||||||
response = self.client.post(
|
response = self.client.post(
|
||||||
reverse("web:register"),
|
reverse("web:register"),
|
||||||
@@ -84,7 +88,7 @@ class TestRegister(TestCase):
|
|||||||
{
|
{
|
||||||
"email": self.email,
|
"email": self.email,
|
||||||
"password1": self.password,
|
"password1": self.password,
|
||||||
"password2": "otherpassword",
|
"password2": self.password,
|
||||||
"first_name": self.first_name,
|
"first_name": self.first_name,
|
||||||
"last_name": "",
|
"last_name": "",
|
||||||
},
|
},
|
||||||
@@ -98,3 +102,29 @@ class TestRegister(TestCase):
|
|||||||
).exists()
|
).exists()
|
||||||
|
|
||||||
assert response.status_code == 400
|
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
|
||||||
|
|||||||
@@ -44,6 +44,16 @@ class TestWishlist(TestCase, CreateProductsMixin):
|
|||||||
user=self.user, product=self.product
|
user=self.user, product=self.product
|
||||||
).exists()
|
).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):
|
def test_logged_user_delete_wishlisted_product(self):
|
||||||
wishlisted = WishlistedProduct.objects.create(
|
wishlisted = WishlistedProduct.objects.create(
|
||||||
user=self.user, product=self.product
|
user=self.user, product=self.product
|
||||||
|
|||||||
@@ -209,6 +209,8 @@ class OrdersView(TemplateView, FilteredQuerysetMixin, PaginatedQuerysetMixin):
|
|||||||
page = self.get_paginated_queryset(qs)
|
page = self.get_paginated_queryset(qs)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
"title": settings.web_title,
|
||||||
|
"web_title": settings.web_title,
|
||||||
"page": page,
|
"page": page,
|
||||||
"has_next_page": page.has_next(),
|
"has_next_page": page.has_next(),
|
||||||
"has_previous_page": page.has_previous(),
|
"has_previous_page": page.has_previous(),
|
||||||
|
|||||||
Reference in New Issue
Block a user