test sold out items in eboutic

This commit is contained in:
imperosol
2026-05-23 11:55:01 +02:00
parent 140d1ec81f
commit db945d3498
3 changed files with 47 additions and 12 deletions
+3 -1
View File
@@ -371,7 +371,9 @@ class ProductQuerySet(models.QuerySet):
nb_basket_items_subquery = Subquery( nb_basket_items_subquery = Subquery(
BasketItem.objects.filter( BasketItem.objects.filter(
product_id=OuterRef("id"), product_id=OuterRef("id"),
basket__date__gt=now() - settings.SITH_EBOUTIC_BASKET_TIMEOUT, basket__date__gt=now()
- settings.SITH_EBOUTIC_BASKET_TIMEOUT
- settings.SITH_EBOUTIC_ETRANSACTION_TIMEOUT,
) )
.values("product_id") .values("product_id")
.annotate(res=Sum("quantity")) .annotate(res=Sum("quantity"))
+3 -1
View File
@@ -276,7 +276,9 @@ class TestProductClicLimit(TestCase):
item = BasketItem.objects.filter(product=self.products[1])[0] item = BasketItem.objects.filter(product=self.products[1])[0]
item.basket = baker.make( item.basket = baker.make(
Basket, Basket,
date=now() - settings.SITH_EBOUTIC_BASKET_TIMEOUT - timedelta(minutes=1), date=now()
- settings.SITH_EBOUTIC_BASKET_TIMEOUT
- settings.SITH_EBOUTIC_ETRANSACTION_TIMEOUT,
) )
item.save() item.save()
assert list(self.qs.under_clic_limit()) == self.products[1:] assert list(self.qs.under_clic_limit()) == self.products[1:]
+41 -10
View File
@@ -1,16 +1,19 @@
import re import re
from datetime import datetime, timezone from datetime import datetime, timezone
import freezegun
import pytest import pytest
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from django.conf import settings
from django.http import HttpResponse from django.http import HttpResponse
from django.test import TestCase from django.test import TestCase
from django.test.client import Client from django.test.client import Client
from django.urls import reverse from django.urls import reverse
from django.utils.timezone import localdate from django.utils.timezone import localdate, now
from model_bakery import baker from model_bakery import baker
from pytest_django.asserts import assertRedirects from pytest_django.asserts import assertRedirects
import eboutic.models
from core.baker_recipes import subscriber_user from core.baker_recipes import subscriber_user
from core.models import Group, User from core.models import Group, User
from counter.baker_recipes import ( from counter.baker_recipes import (
@@ -235,17 +238,45 @@ class TestEboutic(TestCase):
def test_add_forbidden_product(self): def test_add_forbidden_product(self):
self.client.force_login(self.new_customer) self.client.force_login(self.new_customer)
response = self.submit_basket([BasketItem(self.beer.id, 1)]) for product in self.beer, self.cotiz, self.not_in_counter:
assert response.status_code == 200 response = self.submit_basket([BasketItem(product.id, 1)])
assert Basket.objects.first() is None assert response.status_code == 200
assert not Basket.objects.exists()
response = self.submit_basket([BasketItem(self.cotiz.id, 1)]) def test_sold_out_product(self):
sold_out = product_recipe.make(
clic_limit=3, counters=[self.eboutic], product_type=baker.make(ProductType)
)
price = price_recipe.make(product=sold_out, groups=[self.group_cotiz], amount=0)
sale_recipe.make(
product=sold_out,
customer=self.subscriber.customer,
unit_price=0,
quantity=1,
)
baker.make(
eboutic.models.BasketItem,
basket=baker.make(Basket),
product=sold_out,
quantity=2,
)
self.client.force_login(self.subscriber)
response = self.submit_basket([BasketItem(price.id, 1)])
assert response.status_code == 200 assert response.status_code == 200
assert Basket.objects.first() is None assert Basket.objects.count() == 1
with freezegun.freeze_time(
response = self.submit_basket([BasketItem(self.not_in_counter.id, 1)]) now()
assert response.status_code == 200 + settings.SITH_EBOUTIC_BASKET_TIMEOUT
assert Basket.objects.first() is None + settings.SITH_EBOUTIC_ETRANSACTION_TIMEOUT
):
# after a while, unpaid basket items should expire and make the
# product available again.
response = self.submit_basket([BasketItem(price.id, 1)])
assertRedirects(
response,
reverse("eboutic:checkout", kwargs={"basket_id": Basket.objects.last().id}),
)
assert Basket.objects.count() == 2
def test_create_basket(self): def test_create_basket(self):
self.client.force_login(self.new_customer) self.client.force_login(self.new_customer)