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')