148 lines
6.5 KiB
Python
148 lines
6.5 KiB
Python
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, CustomerAddress, Order, OrderLine, 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()
|
|
|
|
def test_order_from_cart_with_variant_uses_variant_price(self):
|
|
size_m = self.create_attribute_value('Talla', 'M')
|
|
variant = self.create_product_variant(self.product, sku='V1', price=Decimal('25.00'), attribute_values=[size_m])
|
|
CartItem.objects.create(cart=self.cart_for_user, product=self.product, variant=variant, quantity=1)
|
|
|
|
self.client.force_login(self.user)
|
|
|
|
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.get(user=self.user)
|
|
variant_line = OrderLine.objects.get(order=order, variant=variant)
|
|
assert variant_line.price == Decimal('25.00')
|