From f70aeac71fd083cff01c2752de0fa3a133e5029c Mon Sep 17 00:00:00 2001 From: Pablo Moreno Date: Thu, 28 Nov 2024 00:55:06 +0100 Subject: [PATCH] fix: improved coverage --- web/tests/test_cart.py | 181 +++++++++++++++++++++++++++++++++++++++++ web/utils.py | 9 -- web/views.py | 2 +- 3 files changed, 182 insertions(+), 10 deletions(-) create mode 100644 web/tests/test_cart.py diff --git a/web/tests/test_cart.py b/web/tests/test_cart.py new file mode 100644 index 0000000..e0ecb1c --- /dev/null +++ b/web/tests/test_cart.py @@ -0,0 +1,181 @@ +from django.contrib.auth.models import User +from django.test import TestCase +from django.urls import reverse + +from shop.models import Cart, CartItem +from shop.tests.mixins import CreateProductsMixin +from web.settings import ANONYMOUS_CART_ID_COOKIE_NAME + + +class TestCart(TestCase, CreateProductsMixin): + def setUp(self): + self.product = self.create_product() + self.user = User.objects.create_user("vader", "darth@vader.com", "ihatesand") + + def test_anonymous_cart(self): + assert Cart.objects.count() == 0 + response = self.client.get(reverse("web:cart_dropdown")) + assert response.status_code == 200 + cart = Cart.objects.all().first() + assert cart is not None + assert response.cookies.get(ANONYMOUS_CART_ID_COOKIE_NAME).value == str( + cart.uuid + ) + + def test_logged_user_without_cart(self): + assert Cart.objects.count() == 0 + self.client.force_login(self.user) + response = self.client.get(reverse("web:cart_dropdown")) + assert response.status_code == 200 + assert Cart.objects.count() == 1 + assert not response.cookies.get(ANONYMOUS_CART_ID_COOKIE_NAME) + + def test_logged_user_with_cart(self): + Cart.objects.create(user=self.user) + self.client.force_login(self.user) + response = self.client.get(reverse("web:cart_dropdown")) + assert response.status_code == 200 + assert not response.cookies.get(ANONYMOUS_CART_ID_COOKIE_NAME) + + def test_add_product_cart_item_to_anonymous_user_cart(self): + quantity = 2 + assert Cart.objects.count() == 0 + + response = self.client.post( + reverse("web:add_cart_item"), + {"product": self.product.pk, "quantity": quantity}, + ) + assert response.status_code == 201 + + cart = Cart.objects.all().first() + assert cart is not None + assert response.cookies.get(ANONYMOUS_CART_ID_COOKIE_NAME).value == str( + cart.uuid + ) + + cart_item = CartItem.objects.filter(cart=cart).first() + assert cart_item is not None + + assert cart_item.quantity == quantity + + def test_add_product_cart_item_to_logged_user_cart(self): + quantity = 2 + assert Cart.objects.count() == 0 + self.client.force_login(self.user) + + response = self.client.post( + reverse("web:add_cart_item"), + {"product": self.product.pk, "quantity": quantity}, + ) + assert response.status_code == 201 + + cart = Cart.objects.all().first() + assert cart is not None + assert not response.cookies.get(ANONYMOUS_CART_ID_COOKIE_NAME) + + cart_item = CartItem.objects.filter(cart=cart).first() + assert cart_item is not None + + assert cart_item.quantity == quantity + + def test_add_product_cart_item_to_logged_user_with_existing_cart(self): + quantity = 2 + Cart.objects.create(user=self.user) + self.client.force_login(self.user) + + response = self.client.post( + reverse("web:add_cart_item"), + {"product": self.product.pk, "quantity": quantity}, + ) + assert response.status_code == 201 + + cart = Cart.objects.all().first() + assert cart is not None + assert not response.cookies.get(ANONYMOUS_CART_ID_COOKIE_NAME) + + cart_item = CartItem.objects.filter(cart=cart).first() + assert cart_item is not None + + assert cart_item.quantity == quantity + + def test_add_same_product_cart_item_multiple_times(self): + quantity = 2 + Cart.objects.create(user=self.user) + self.client.force_login(self.user) + + response = self.client.post( + reverse("web:add_cart_item"), + {"product": self.product.pk, "quantity": quantity}, + ) + assert response.status_code == 201 + + response = self.client.post( + reverse("web:add_cart_item"), + {"product": self.product.pk, "quantity": quantity}, + ) + assert response.status_code == 201 + + cart = Cart.objects.all().first() + assert cart is not None + assert not response.cookies.get(ANONYMOUS_CART_ID_COOKIE_NAME) + + cart_item = CartItem.objects.filter(cart=cart).first() + assert cart_item is not None + + assert cart_item.quantity == quantity * 2 + assert CartItem.objects.filter(cart=cart).count() == 1 + + def test_create_delete_cart_item_anonymous_cart(self): + quantity = 2 + assert Cart.objects.count() == 0 + + response = self.client.post( + reverse("web:add_cart_item"), + {"product": self.product.pk, "quantity": quantity}, + ) + assert response.status_code == 201 + + cart = Cart.objects.all().first() + assert cart is not None + assert response.cookies.get(ANONYMOUS_CART_ID_COOKIE_NAME).value == str( + cart.uuid + ) + + cart_item = CartItem.objects.filter(cart=cart).first() + assert cart_item is not None + + assert cart_item.quantity == quantity + + response = self.client.post( + reverse("web:delete_cart_item", kwargs={"pk": cart_item.pk}), + {"product": self.product.pk, "quantity": quantity}, + ) + assert response.status_code == 204 + assert CartItem.objects.filter(cart=cart).count() == 0 + + def test_create_delete_cart_item_logged_user_cart(self): + quantity = 2 + assert Cart.objects.count() == 0 + + self.client.force_login(self.user) + response = self.client.post( + reverse("web:add_cart_item"), + {"product": self.product.pk, "quantity": quantity}, + ) + assert response.status_code == 201 + + cart = Cart.objects.all().first() + assert cart is not None + assert not response.cookies.get(ANONYMOUS_CART_ID_COOKIE_NAME) + + cart_item = CartItem.objects.filter(cart=cart).first() + assert cart_item is not None + + assert cart_item.quantity == quantity + + response = self.client.post( + reverse("web:delete_cart_item", kwargs={"pk": cart_item.pk}), + {"product": self.product.pk, "quantity": quantity}, + ) + assert response.status_code == 204 + assert CartItem.objects.filter(cart=cart).count() == 0 diff --git a/web/utils.py b/web/utils.py index a360186..587af9e 100644 --- a/web/utils.py +++ b/web/utils.py @@ -2,15 +2,6 @@ from shop.models import Cart from web.settings import ANONYMOUS_CART_ID_COOKIE_NAME -def get_cart(request): - if not request.user.is_authenticated: - uid = request.COOKIES.get(ANONYMOUS_CART_ID_COOKIE_NAME) - cart = Cart.objects.get(uuid=uid) - else: - cart = Cart.objects.filter(user=request.user).first() - return cart - - def get_or_create_cart(request): created = False if not request.user.is_authenticated: diff --git a/web/views.py b/web/views.py index 2bce995..8bfa603 100644 --- a/web/views.py +++ b/web/views.py @@ -4,7 +4,7 @@ from django.http.response import HttpResponse from django.views.decorators.http import require_http_methods from shop.models import Product, Cart, CartItem -from web.utils import get_cart, get_or_create_cart +from web.utils import get_or_create_cart from web.settings import ANONYMOUS_CART_ID_COOKIE_NAME