diff --git a/src/shop/tests.py b/src/shop/tests.py index 3cd492d0..452baf25 100644 --- a/src/shop/tests.py +++ b/src/shop/tests.py @@ -1,14 +1,14 @@ +from django.contrib.auth.models import User from django.core.exceptions import ValidationError from django.test import TestCase +from django.urls import reverse from django.utils import timezone from psycopg2.extras import DateTimeTZRange from shop.forms import OrderProductRelationForm -from .factories import ( - ProductFactory, - OrderProductRelationFactory, -) +from utils.factories import UserFactory +from .factories import ProductFactory, OrderProductRelationFactory class ProductAvailabilityTest(TestCase): @@ -41,7 +41,6 @@ class ProductAvailabilityTest(TestCase): self.assertTrue(product.is_stock_available) self.assertTrue(product.is_available()) - def test_product_available_by_time(self): """ The product is available if now is in the right timeframe. """ product = ProductFactory() @@ -53,7 +52,7 @@ class ProductAvailabilityTest(TestCase): """ The product is not available if now is outside the timeframe. """ available_in = DateTimeTZRange( lower=timezone.now() - timezone.timedelta(5), - upper=timezone.now() - timezone.timedelta(1) + upper=timezone.now() - timezone.timedelta(1), ) product = ProductFactory(available_in=available_in) # The factory defines the timeframe as now and 31 days forward. @@ -62,9 +61,7 @@ class ProductAvailabilityTest(TestCase): def test_product_is_not_available_yet(self): """ The product is not available because we are before lower bound. """ - available_in = DateTimeTZRange( - lower=timezone.now() + timezone.timedelta(5) - ) + available_in = DateTimeTZRange(lower=timezone.now() + timezone.timedelta(5)) product = ProductFactory(available_in=available_in) # Make sure there is no upper - just in case. self.assertEqual(product.available_in.upper, None) @@ -74,9 +71,7 @@ class ProductAvailabilityTest(TestCase): def test_product_is_available_from_now_on(self): """ The product is available because we are after lower bound. """ - available_in = DateTimeTZRange( - lower=timezone.now() - timezone.timedelta(1) - ) + available_in = DateTimeTZRange(lower=timezone.now() - timezone.timedelta(1)) product = ProductFactory(available_in=available_in) # Make sure there is no upper - just in case. self.assertEqual(product.available_in.upper, None) @@ -86,7 +81,6 @@ class ProductAvailabilityTest(TestCase): class TestOrderProductRelationForm(TestCase): - def test_clean_quantity_succeeds_when_stock_not_exceeded(self): product = ProductFactory(stock_amount=2) @@ -112,3 +106,48 @@ class TestOrderProductRelationForm(TestCase): form = OrderProductRelationForm(instance=opr2) self.assertFalse(form.is_valid()) + + +class TestProductDetailView(TestCase): + def setUp(self): + self.user = UserFactory() + + def test_product_is_available(self): + product = ProductFactory() + self.client.force_login(self.user) + response = self.client.get( + reverse("shop:product_detail", kwargs={"slug": product.slug}) + ) + + self.assertIn("Add to order", str(response.content)) + self.assertEqual(response.status_code, 200) + + def test_product_is_available_with_stock_left(self): + product = ProductFactory(stock_amount=2) + + opr1 = OrderProductRelationFactory(product=product, quantity=1) + opr1.order.open = None + opr1.order.save() + + self.client.force_login(self.user) + response = self.client.get( + reverse("shop:product_detail", kwargs={"slug": product.slug}) + ) + + self.assertIn("1 available", str(response.content)) + self.assertEqual(response.status_code, 200) + + def test_product_is_sold_out(self): + product = ProductFactory(stock_amount=1) + + opr1 = OrderProductRelationFactory(product=product, quantity=1) + opr1.order.open = None + opr1.order.save() + + self.client.force_login(self.user) + response = self.client.get( + reverse("shop:product_detail", kwargs={"slug": product.slug}) + ) + + self.assertIn("Sold out.", str(response.content)) + self.assertEqual(response.status_code, 200)