mirror of
https://framagit.org/la-chariotte/la-chariotte.git
synced 2025-05-01 03:12:26 +02:00
ordering test files
This commit is contained in:
parent
7e6f5ca158
commit
eaa365dccd
4 changed files with 417 additions and 378 deletions
|
@ -1,3 +1,4 @@
|
|||
# fmt: off
|
||||
import datetime
|
||||
|
||||
import pytest
|
||||
|
@ -6,56 +7,13 @@ from django.urls import reverse
|
|||
from django.utils import timezone
|
||||
|
||||
from la_chariotte.order import models
|
||||
from la_chariotte.order.tests.utils import (create_grouped_order,
|
||||
order_items_in_grouped_order)
|
||||
|
||||
# fmt: on
|
||||
pytestmark = pytest.mark.django_db
|
||||
|
||||
|
||||
def create_grouped_order(
|
||||
days_before_delivery_date, days_before_deadline, name, orga_user
|
||||
):
|
||||
"""
|
||||
Creates a grouped order.
|
||||
"""
|
||||
date = timezone.now().date() + datetime.timedelta(days=days_before_delivery_date)
|
||||
deadline = timezone.now() + datetime.timedelta(days=days_before_deadline)
|
||||
return models.GroupedOrder.objects.create(
|
||||
name=name, orga=orga_user, delivery_date=date, deadline=deadline
|
||||
)
|
||||
|
||||
|
||||
def order_items_in_grouped_order(grouped_order):
|
||||
"""Creates 2 OrderedItems and orders in the given grouped order. Returns the order"""
|
||||
item_1 = grouped_order.item_set.create(name="test item", price="2")
|
||||
item_2 = grouped_order.item_set.create(name="test item 2", price="9")
|
||||
author_1 = models.OrderAuthor.objects.create(
|
||||
first_name="bob", last_name="lescargot", phone="000", email="bob@escargot.fr"
|
||||
)
|
||||
author_2 = models.OrderAuthor.objects.create(
|
||||
first_name="bob", last_name="alescargot", phone="000", email="bob2@escargot.fr"
|
||||
)
|
||||
author_3 = models.OrderAuthor.objects.create(
|
||||
first_name="bobby",
|
||||
last_name="alescargot",
|
||||
phone="000",
|
||||
email="bob3@escargot.fr",
|
||||
)
|
||||
order = grouped_order.order_set.create(author=author_1)
|
||||
order_2 = grouped_order.order_set.create(author=author_2)
|
||||
order_3 = grouped_order.order_set.create(author=author_3)
|
||||
models.OrderedItem.objects.create(order=order, item=item_1, nb=3)
|
||||
models.OrderedItem.objects.create(order=order, item=item_2, nb=2)
|
||||
models.OrderedItem.objects.create(order=order_2, item=item_1, nb=1)
|
||||
models.OrderedItem.objects.create(order=order_3, item=item_2, nb=1)
|
||||
item_1.compute_ordered_nb()
|
||||
item_2.compute_ordered_nb()
|
||||
order.compute_order_price()
|
||||
order_2.compute_order_price()
|
||||
order_3.compute_order_price()
|
||||
grouped_order.compute_total_price()
|
||||
grouped_order.save()
|
||||
return order
|
||||
|
||||
|
||||
class TestGroupedOrderIndexView:
|
||||
def test_anonymous_user_redirection(self, client):
|
||||
"""
|
||||
|
@ -805,267 +763,6 @@ class TestGroupedOrderOverview:
|
|||
assert "Cette commande groupée est terminée" in response.content.decode()
|
||||
|
||||
|
||||
class TestOrder:
|
||||
def test_order_deadline_passed(self, client, other_user):
|
||||
"""A user orders when the deadline is passed. They get a 403 error"""
|
||||
grouped_order = create_grouped_order(
|
||||
days_before_delivery_date=5,
|
||||
days_before_deadline=-1,
|
||||
name="gr order test",
|
||||
orga_user=other_user,
|
||||
)
|
||||
item = models.Item.objects.create(
|
||||
name="test item 1", grouped_order=grouped_order, price=2
|
||||
)
|
||||
|
||||
# some items are ordered
|
||||
order_url = reverse(
|
||||
"order:order",
|
||||
kwargs={
|
||||
"grouped_order_id": grouped_order.pk,
|
||||
},
|
||||
)
|
||||
response = client.post(
|
||||
order_url,
|
||||
{
|
||||
f"quantity_{item.pk}": [4, 0],
|
||||
"first_name": "Prénom",
|
||||
"last_name": "Nom",
|
||||
"phone": "0645632569",
|
||||
"email": "test@mail.fr",
|
||||
"note": "",
|
||||
},
|
||||
)
|
||||
assert response.status_code == 403
|
||||
|
||||
def test_order_deadline_passed__orga(self, client_log):
|
||||
"""The orga user orders when the deadline is passed, but the delivery is to come. It works"""
|
||||
|
||||
grouped_order = create_grouped_order(
|
||||
days_before_delivery_date=5,
|
||||
days_before_deadline=-1,
|
||||
name="gr order test",
|
||||
orga_user=auth.get_user(client_log),
|
||||
)
|
||||
item = models.Item.objects.create(
|
||||
name="test item 1", grouped_order=grouped_order, price=2
|
||||
)
|
||||
|
||||
# some items are ordered
|
||||
order_url = reverse(
|
||||
"order:order",
|
||||
kwargs={
|
||||
"grouped_order_id": grouped_order.pk,
|
||||
},
|
||||
)
|
||||
response = client_log.post(
|
||||
order_url,
|
||||
{
|
||||
f"quantity_{item.pk}": [4, 0],
|
||||
"first_name": "Prénom",
|
||||
"last_name": "Nom",
|
||||
"phone": "0645632569",
|
||||
"email": "test@mail.fr",
|
||||
"note": "",
|
||||
},
|
||||
)
|
||||
assert response.status_code == 302
|
||||
|
||||
def test_order_delivery_passed__orga(self, client_log):
|
||||
"""The orga user orders when the deadline and the delivery are passed. The get a 403 error"""
|
||||
|
||||
grouped_order = create_grouped_order(
|
||||
days_before_delivery_date=-2,
|
||||
days_before_deadline=-4,
|
||||
name="gr order test",
|
||||
orga_user=auth.get_user(client_log),
|
||||
)
|
||||
item = models.Item.objects.create(
|
||||
name="test item 1", grouped_order=grouped_order, price=2
|
||||
)
|
||||
|
||||
# some items are ordered
|
||||
order_url = reverse(
|
||||
"order:order",
|
||||
kwargs={
|
||||
"grouped_order_id": grouped_order.pk,
|
||||
},
|
||||
)
|
||||
response = client_log.post(
|
||||
order_url,
|
||||
{
|
||||
f"quantity_{item.pk}": [4, 0],
|
||||
"first_name": "Prénom",
|
||||
"last_name": "Nom",
|
||||
"phone": "0645632569",
|
||||
"email": "test@mail.fr",
|
||||
"note": "",
|
||||
},
|
||||
)
|
||||
assert response.status_code == 403
|
||||
|
||||
def test_order_too_many_items_ordered(self, client, other_user):
|
||||
"""If a user orderd more articles than what is available,
|
||||
the form is displayed again with an error.
|
||||
The OrderedItems, OrderAuthor and Order are deleted."""
|
||||
grouped_order = create_grouped_order(
|
||||
days_before_delivery_date=5,
|
||||
days_before_deadline=2,
|
||||
name="gr order test",
|
||||
orga_user=other_user,
|
||||
)
|
||||
item = models.Item.objects.create(
|
||||
name="test item 1", grouped_order=grouped_order, price=1
|
||||
)
|
||||
item2 = models.Item.objects.create(
|
||||
name="test item 2", grouped_order=grouped_order, price=5, max_limit=20
|
||||
)
|
||||
detail_url = reverse(
|
||||
"order:grouped_order_detail",
|
||||
kwargs={
|
||||
"pk": grouped_order.pk,
|
||||
},
|
||||
)
|
||||
response = client.get(detail_url)
|
||||
assert response.status_code == 200
|
||||
assert "test item" in response.content.decode()
|
||||
assert "gr order test" in response.content.decode()
|
||||
assert item.ordered_nb == 0
|
||||
assert item2.ordered_nb == 0
|
||||
order_url = reverse(
|
||||
"order:order",
|
||||
kwargs={
|
||||
"grouped_order_id": grouped_order.pk,
|
||||
},
|
||||
)
|
||||
response = client.post(
|
||||
order_url,
|
||||
{
|
||||
f"quantity_{item.pk}": [0, 4],
|
||||
f"quantity_{item2.pk}": [0, 25],
|
||||
"first_name": "Prénom",
|
||||
"last_name": "Nom",
|
||||
"phone": "0645632569",
|
||||
"email": "test@mail.fr",
|
||||
"note": "",
|
||||
},
|
||||
)
|
||||
assert response.status_code == 200
|
||||
assert (
|
||||
response.context["error_message"]
|
||||
== "Trop de test item 2 commandés pour la quantité disponible"
|
||||
)
|
||||
item.refresh_from_db()
|
||||
item2.refresh_from_db()
|
||||
assert item.ordered_nb == 0
|
||||
assert item2.ordered_nb == 0
|
||||
assert not models.OrderAuthor.objects.first()
|
||||
assert not models.Order.objects.first()
|
||||
assert not models.OrderedItem.objects.first()
|
||||
|
||||
def test_negative_nb_ordered(self, client, other_user):
|
||||
"""If a user orders a negative nb of articles for an item,
|
||||
we consider they ordered 0.
|
||||
(but it is also blocked by fronted)"""
|
||||
grouped_order = create_grouped_order(
|
||||
days_before_delivery_date=5,
|
||||
days_before_deadline=2,
|
||||
name="gr order test",
|
||||
orga_user=other_user,
|
||||
)
|
||||
item = models.Item.objects.create(
|
||||
name="test item 1", grouped_order=grouped_order, price=1
|
||||
)
|
||||
item2 = models.Item.objects.create(
|
||||
name="test item 2", grouped_order=grouped_order, price=5, max_limit=20
|
||||
)
|
||||
detail_url = reverse(
|
||||
"order:grouped_order_detail",
|
||||
kwargs={
|
||||
"pk": grouped_order.pk,
|
||||
},
|
||||
)
|
||||
response = client.get(detail_url)
|
||||
assert response.status_code == 200
|
||||
assert "test item" in response.content.decode()
|
||||
assert "gr order test" in response.content.decode()
|
||||
assert item.ordered_nb == 0
|
||||
assert item2.ordered_nb == 0
|
||||
order_url = reverse(
|
||||
"order:order",
|
||||
kwargs={
|
||||
"grouped_order_id": grouped_order.pk,
|
||||
},
|
||||
)
|
||||
response = client.post(
|
||||
order_url,
|
||||
{
|
||||
f"quantity_{item.pk}": [4, 0],
|
||||
f"quantity_{item2.pk}": [-2, 0],
|
||||
"first_name": "Prénom",
|
||||
"last_name": "Nom",
|
||||
"phone": "0645632569",
|
||||
"email": "test@mail.fr",
|
||||
"note": "",
|
||||
},
|
||||
)
|
||||
assert response.status_code == 302
|
||||
order = models.Order.objects.get(grouped_order=grouped_order.pk)
|
||||
assert response.url == reverse(
|
||||
"order:order_confirm",
|
||||
kwargs={
|
||||
"grouped_order_id": grouped_order.pk,
|
||||
"pk": order.pk,
|
||||
},
|
||||
)
|
||||
item.refresh_from_db()
|
||||
item2.refresh_from_db()
|
||||
assert models.OrderAuthor.objects.first().first_name == "Prénom"
|
||||
assert models.OrderAuthor.objects.first().email == "test@mail.fr"
|
||||
assert models.OrderAuthor.objects.first().phone == "0645632569"
|
||||
assert item.ordered_nb == 4
|
||||
assert item2.ordered_nb == 0
|
||||
assert order.ordered_items.count() == 1
|
||||
|
||||
def test_delete_order(self, client_log):
|
||||
"""The orga user deletes an order. The grouped order is updated"""
|
||||
grouped_order = create_grouped_order(
|
||||
days_before_delivery_date=5,
|
||||
days_before_deadline=2,
|
||||
name="gr order test",
|
||||
orga_user=auth.get_user(client_log),
|
||||
)
|
||||
order = order_items_in_grouped_order(grouped_order)
|
||||
author = order.author
|
||||
order_price = order.price
|
||||
item = order.ordered_items.first().item
|
||||
assert (
|
||||
models.OrderedItem.objects.all().count() == 4
|
||||
) # 4 orderedItem, 2 are in the order 'order'
|
||||
assert grouped_order.order_set.all().count() == 3
|
||||
assert grouped_order.total_price == 35
|
||||
assert item.ordered_nb == 4
|
||||
delete_url = reverse(
|
||||
"order:order_delete",
|
||||
kwargs={"grouped_order_id": grouped_order.id, "pk": order.id},
|
||||
)
|
||||
response = client_log.post(delete_url)
|
||||
assert response.status_code == 302
|
||||
assert response.url == reverse(
|
||||
"order:grouped_order_overview",
|
||||
kwargs={
|
||||
"pk": grouped_order.pk,
|
||||
},
|
||||
)
|
||||
client_log.get(response.url)
|
||||
grouped_order.refresh_from_db()
|
||||
item.refresh_from_db()
|
||||
assert models.OrderedItem.objects.all().count() == 2
|
||||
assert grouped_order.order_set.all().count() == 2
|
||||
assert grouped_order.total_price == 35 - order_price
|
||||
assert item.ordered_nb == 1
|
||||
|
||||
|
||||
class TestGroupedOrderCreateView:
|
||||
def test_create_grouped_order(self, client_log):
|
||||
"""
|
||||
|
@ -1510,77 +1207,6 @@ class TestGroupedOrderDuplicateView:
|
|||
assert models.GroupedOrder.objects.count() == 1
|
||||
|
||||
|
||||
class TestItemCreateView:
|
||||
def test_create_item(self, client_log):
|
||||
"""A user that has created a grouped order adds an item to it."""
|
||||
grouped_order = create_grouped_order(
|
||||
days_before_delivery_date=5,
|
||||
days_before_deadline=2,
|
||||
name="gr order test",
|
||||
orga_user=auth.get_user(client_log),
|
||||
)
|
||||
create_item_view_url = reverse(
|
||||
"order:item_create",
|
||||
kwargs={
|
||||
"pk": grouped_order.pk,
|
||||
},
|
||||
)
|
||||
response = client_log.post(
|
||||
create_item_view_url, {"name": "titre item", "price": 2}
|
||||
)
|
||||
assert response.status_code == 302
|
||||
assert response.url == reverse(
|
||||
"order:manage_items",
|
||||
kwargs={
|
||||
"pk": grouped_order.pk,
|
||||
},
|
||||
)
|
||||
assert models.Item.objects.first().name == "titre item"
|
||||
response = client_log.get(response.url)
|
||||
assert "titre item" in response.content.decode()
|
||||
|
||||
def test_create_item__anonymous_user(self, client, other_user):
|
||||
"""
|
||||
A user that is not logged cannot create an item. They get a redirected to loginview.
|
||||
"""
|
||||
grouped_order = create_grouped_order(
|
||||
days_before_delivery_date=5,
|
||||
days_before_deadline=2,
|
||||
name="gr order test",
|
||||
orga_user=other_user,
|
||||
)
|
||||
create_item_view_url = reverse(
|
||||
"order:item_create",
|
||||
kwargs={
|
||||
"pk": grouped_order.pk,
|
||||
},
|
||||
)
|
||||
response = client.post(create_item_view_url, {"name": "titre item"})
|
||||
assert response.status_code == 302
|
||||
assert (
|
||||
response.url == f"{reverse('accounts:login')}?next={create_item_view_url}"
|
||||
)
|
||||
|
||||
def test_create_item__not_orga(self, client_log, other_user):
|
||||
"""
|
||||
A user that is not orga cannot create an item. They get a 403 error.
|
||||
"""
|
||||
grouped_order = create_grouped_order(
|
||||
days_before_delivery_date=5,
|
||||
days_before_deadline=2,
|
||||
name="gr order test",
|
||||
orga_user=other_user,
|
||||
)
|
||||
create_item_view_url = reverse(
|
||||
"order:item_create",
|
||||
kwargs={
|
||||
"pk": grouped_order.pk,
|
||||
},
|
||||
)
|
||||
response = client_log.post(create_item_view_url, {"name": "titre item"})
|
||||
assert response.status_code == 403
|
||||
|
||||
|
||||
class TestGroupedOrderSheetView:
|
||||
def test_get__not_orga(self, client_log, other_user):
|
||||
"""A user that is not organizer of the GO accesses the sheet view.
|
82
la_chariotte/order/tests/test_views/test_views_item.py
Normal file
82
la_chariotte/order/tests/test_views/test_views_item.py
Normal file
|
@ -0,0 +1,82 @@
|
|||
import datetime
|
||||
|
||||
import pytest
|
||||
from django.contrib import auth
|
||||
from django.urls import reverse
|
||||
from django.utils import timezone
|
||||
|
||||
from la_chariotte.order import models
|
||||
from la_chariotte.order.tests.utils import create_grouped_order
|
||||
|
||||
pytestmark = pytest.mark.django_db
|
||||
|
||||
|
||||
class TestItemCreateView:
|
||||
def test_create_item(self, client_log):
|
||||
"""A user that has created a grouped order adds an item to it."""
|
||||
grouped_order = create_grouped_order(
|
||||
days_before_delivery_date=5,
|
||||
days_before_deadline=2,
|
||||
name="gr order test",
|
||||
orga_user=auth.get_user(client_log),
|
||||
)
|
||||
create_item_view_url = reverse(
|
||||
"order:item_create",
|
||||
kwargs={
|
||||
"pk": grouped_order.pk,
|
||||
},
|
||||
)
|
||||
response = client_log.post(
|
||||
create_item_view_url, {"name": "titre item", "price": 2}
|
||||
)
|
||||
assert response.status_code == 302
|
||||
assert response.url == reverse(
|
||||
"order:manage_items",
|
||||
kwargs={
|
||||
"pk": grouped_order.pk,
|
||||
},
|
||||
)
|
||||
assert models.Item.objects.first().name == "titre item"
|
||||
response = client_log.get(response.url)
|
||||
assert "titre item" in response.content.decode()
|
||||
|
||||
def test_create_item__anonymous_user(self, client, other_user):
|
||||
"""
|
||||
A user that is not logged cannot create an item. They get a redirected to loginview.
|
||||
"""
|
||||
grouped_order = create_grouped_order(
|
||||
days_before_delivery_date=5,
|
||||
days_before_deadline=2,
|
||||
name="gr order test",
|
||||
orga_user=other_user,
|
||||
)
|
||||
create_item_view_url = reverse(
|
||||
"order:item_create",
|
||||
kwargs={
|
||||
"pk": grouped_order.pk,
|
||||
},
|
||||
)
|
||||
response = client.post(create_item_view_url, {"name": "titre item"})
|
||||
assert response.status_code == 302
|
||||
assert (
|
||||
response.url == f"{reverse('accounts:login')}?next={create_item_view_url}"
|
||||
)
|
||||
|
||||
def test_create_item__not_orga(self, client_log, other_user):
|
||||
"""
|
||||
A user that is not orga cannot create an item. They get a 403 error.
|
||||
"""
|
||||
grouped_order = create_grouped_order(
|
||||
days_before_delivery_date=5,
|
||||
days_before_deadline=2,
|
||||
name="gr order test",
|
||||
orga_user=other_user,
|
||||
)
|
||||
create_item_view_url = reverse(
|
||||
"order:item_create",
|
||||
kwargs={
|
||||
"pk": grouped_order.pk,
|
||||
},
|
||||
)
|
||||
response = client_log.post(create_item_view_url, {"name": "titre item"})
|
||||
assert response.status_code == 403
|
275
la_chariotte/order/tests/test_views/test_views_order.py
Normal file
275
la_chariotte/order/tests/test_views/test_views_order.py
Normal file
|
@ -0,0 +1,275 @@
|
|||
# fmt: off
|
||||
import datetime
|
||||
|
||||
import pytest
|
||||
from django.contrib import auth
|
||||
from django.urls import reverse
|
||||
from django.utils import timezone
|
||||
|
||||
from la_chariotte.order import models
|
||||
from la_chariotte.order.tests.utils import (create_grouped_order,
|
||||
order_items_in_grouped_order)
|
||||
|
||||
# fmt: on
|
||||
pytestmark = pytest.mark.django_db
|
||||
|
||||
|
||||
class TestOrder:
|
||||
def test_order_deadline_passed(self, client, other_user):
|
||||
"""A user orders when the deadline is passed. They get a 403 error"""
|
||||
grouped_order = create_grouped_order(
|
||||
days_before_delivery_date=5,
|
||||
days_before_deadline=-1,
|
||||
name="gr order test",
|
||||
orga_user=other_user,
|
||||
)
|
||||
item = models.Item.objects.create(
|
||||
name="test item 1", grouped_order=grouped_order, price=2
|
||||
)
|
||||
|
||||
# some items are ordered
|
||||
order_url = reverse(
|
||||
"order:order",
|
||||
kwargs={
|
||||
"grouped_order_id": grouped_order.pk,
|
||||
},
|
||||
)
|
||||
response = client.post(
|
||||
order_url,
|
||||
{
|
||||
f"quantity_{item.pk}": [4, 0],
|
||||
"first_name": "Prénom",
|
||||
"last_name": "Nom",
|
||||
"phone": "0645632569",
|
||||
"email": "test@mail.fr",
|
||||
"note": "",
|
||||
},
|
||||
)
|
||||
assert response.status_code == 403
|
||||
|
||||
def test_order_deadline_passed__orga(self, client_log):
|
||||
"""The orga user orders when the deadline is passed, but the delivery is to come. It works"""
|
||||
|
||||
grouped_order = create_grouped_order(
|
||||
days_before_delivery_date=5,
|
||||
days_before_deadline=-1,
|
||||
name="gr order test",
|
||||
orga_user=auth.get_user(client_log),
|
||||
)
|
||||
item = models.Item.objects.create(
|
||||
name="test item 1", grouped_order=grouped_order, price=2
|
||||
)
|
||||
|
||||
# some items are ordered
|
||||
order_url = reverse(
|
||||
"order:order",
|
||||
kwargs={
|
||||
"grouped_order_id": grouped_order.pk,
|
||||
},
|
||||
)
|
||||
response = client_log.post(
|
||||
order_url,
|
||||
{
|
||||
f"quantity_{item.pk}": [4, 0],
|
||||
"first_name": "Prénom",
|
||||
"last_name": "Nom",
|
||||
"phone": "0645632569",
|
||||
"email": "test@mail.fr",
|
||||
"note": "",
|
||||
},
|
||||
)
|
||||
assert response.status_code == 302
|
||||
|
||||
def test_order_delivery_passed__orga(self, client_log):
|
||||
"""The orga user orders when the deadline and the delivery are passed. The get a 403 error"""
|
||||
|
||||
grouped_order = create_grouped_order(
|
||||
days_before_delivery_date=-2,
|
||||
days_before_deadline=-4,
|
||||
name="gr order test",
|
||||
orga_user=auth.get_user(client_log),
|
||||
)
|
||||
item = models.Item.objects.create(
|
||||
name="test item 1", grouped_order=grouped_order, price=2
|
||||
)
|
||||
|
||||
# some items are ordered
|
||||
order_url = reverse(
|
||||
"order:order",
|
||||
kwargs={
|
||||
"grouped_order_id": grouped_order.pk,
|
||||
},
|
||||
)
|
||||
response = client_log.post(
|
||||
order_url,
|
||||
{
|
||||
f"quantity_{item.pk}": [4, 0],
|
||||
"first_name": "Prénom",
|
||||
"last_name": "Nom",
|
||||
"phone": "0645632569",
|
||||
"email": "test@mail.fr",
|
||||
"note": "",
|
||||
},
|
||||
)
|
||||
assert response.status_code == 403
|
||||
|
||||
def test_order_too_many_items_ordered(self, client, other_user):
|
||||
"""If a user orderd more articles than what is available,
|
||||
the form is displayed again with an error.
|
||||
The OrderedItems, OrderAuthor and Order are deleted."""
|
||||
grouped_order = create_grouped_order(
|
||||
days_before_delivery_date=5,
|
||||
days_before_deadline=2,
|
||||
name="gr order test",
|
||||
orga_user=other_user,
|
||||
)
|
||||
item = models.Item.objects.create(
|
||||
name="test item 1", grouped_order=grouped_order, price=1
|
||||
)
|
||||
item2 = models.Item.objects.create(
|
||||
name="test item 2", grouped_order=grouped_order, price=5, max_limit=20
|
||||
)
|
||||
detail_url = reverse(
|
||||
"order:grouped_order_detail",
|
||||
kwargs={
|
||||
"pk": grouped_order.pk,
|
||||
},
|
||||
)
|
||||
response = client.get(detail_url)
|
||||
assert response.status_code == 200
|
||||
assert "test item" in response.content.decode()
|
||||
assert "gr order test" in response.content.decode()
|
||||
assert item.ordered_nb == 0
|
||||
assert item2.ordered_nb == 0
|
||||
order_url = reverse(
|
||||
"order:order",
|
||||
kwargs={
|
||||
"grouped_order_id": grouped_order.pk,
|
||||
},
|
||||
)
|
||||
response = client.post(
|
||||
order_url,
|
||||
{
|
||||
f"quantity_{item.pk}": [0, 4],
|
||||
f"quantity_{item2.pk}": [0, 25],
|
||||
"first_name": "Prénom",
|
||||
"last_name": "Nom",
|
||||
"phone": "0645632569",
|
||||
"email": "test@mail.fr",
|
||||
"note": "",
|
||||
},
|
||||
)
|
||||
assert response.status_code == 200
|
||||
assert (
|
||||
response.context["error_message"]
|
||||
== "Trop de test item 2 commandés pour la quantité disponible"
|
||||
)
|
||||
item.refresh_from_db()
|
||||
item2.refresh_from_db()
|
||||
assert item.ordered_nb == 0
|
||||
assert item2.ordered_nb == 0
|
||||
assert not models.OrderAuthor.objects.first()
|
||||
assert not models.Order.objects.first()
|
||||
assert not models.OrderedItem.objects.first()
|
||||
|
||||
def test_negative_nb_ordered(self, client, other_user):
|
||||
"""If a user orders a negative nb of articles for an item,
|
||||
we consider they ordered 0.
|
||||
(but it is also blocked by fronted)"""
|
||||
grouped_order = create_grouped_order(
|
||||
days_before_delivery_date=5,
|
||||
days_before_deadline=2,
|
||||
name="gr order test",
|
||||
orga_user=other_user,
|
||||
)
|
||||
item = models.Item.objects.create(
|
||||
name="test item 1", grouped_order=grouped_order, price=1
|
||||
)
|
||||
item2 = models.Item.objects.create(
|
||||
name="test item 2", grouped_order=grouped_order, price=5, max_limit=20
|
||||
)
|
||||
detail_url = reverse(
|
||||
"order:grouped_order_detail",
|
||||
kwargs={
|
||||
"pk": grouped_order.pk,
|
||||
},
|
||||
)
|
||||
response = client.get(detail_url)
|
||||
assert response.status_code == 200
|
||||
assert "test item" in response.content.decode()
|
||||
assert "gr order test" in response.content.decode()
|
||||
assert item.ordered_nb == 0
|
||||
assert item2.ordered_nb == 0
|
||||
order_url = reverse(
|
||||
"order:order",
|
||||
kwargs={
|
||||
"grouped_order_id": grouped_order.pk,
|
||||
},
|
||||
)
|
||||
response = client.post(
|
||||
order_url,
|
||||
{
|
||||
f"quantity_{item.pk}": [4, 0],
|
||||
f"quantity_{item2.pk}": [-2, 0],
|
||||
"first_name": "Prénom",
|
||||
"last_name": "Nom",
|
||||
"phone": "0645632569",
|
||||
"email": "test@mail.fr",
|
||||
"note": "",
|
||||
},
|
||||
)
|
||||
assert response.status_code == 302
|
||||
order = models.Order.objects.get(grouped_order=grouped_order.pk)
|
||||
assert response.url == reverse(
|
||||
"order:order_confirm",
|
||||
kwargs={
|
||||
"grouped_order_id": grouped_order.pk,
|
||||
"pk": order.pk,
|
||||
},
|
||||
)
|
||||
item.refresh_from_db()
|
||||
item2.refresh_from_db()
|
||||
assert models.OrderAuthor.objects.first().first_name == "Prénom"
|
||||
assert models.OrderAuthor.objects.first().email == "test@mail.fr"
|
||||
assert models.OrderAuthor.objects.first().phone == "0645632569"
|
||||
assert item.ordered_nb == 4
|
||||
assert item2.ordered_nb == 0
|
||||
assert order.ordered_items.count() == 1
|
||||
|
||||
def test_delete_order(self, client_log):
|
||||
"""The orga user deletes an order. The grouped order is updated"""
|
||||
grouped_order = create_grouped_order(
|
||||
days_before_delivery_date=5,
|
||||
days_before_deadline=2,
|
||||
name="gr order test",
|
||||
orga_user=auth.get_user(client_log),
|
||||
)
|
||||
order = order_items_in_grouped_order(grouped_order)
|
||||
author = order.author
|
||||
order_price = order.price
|
||||
item = order.ordered_items.first().item
|
||||
assert (
|
||||
models.OrderedItem.objects.all().count() == 4
|
||||
) # 4 orderedItem, 2 are in the order 'order'
|
||||
assert grouped_order.order_set.all().count() == 3
|
||||
assert grouped_order.total_price == 35
|
||||
assert item.ordered_nb == 4
|
||||
delete_url = reverse(
|
||||
"order:order_delete",
|
||||
kwargs={"grouped_order_id": grouped_order.id, "pk": order.id},
|
||||
)
|
||||
response = client_log.post(delete_url)
|
||||
assert response.status_code == 302
|
||||
assert response.url == reverse(
|
||||
"order:grouped_order_overview",
|
||||
kwargs={
|
||||
"pk": grouped_order.pk,
|
||||
},
|
||||
)
|
||||
client_log.get(response.url)
|
||||
grouped_order.refresh_from_db()
|
||||
item.refresh_from_db()
|
||||
assert models.OrderedItem.objects.all().count() == 2
|
||||
assert grouped_order.order_set.all().count() == 2
|
||||
assert grouped_order.total_price == 35 - order_price
|
||||
assert item.ordered_nb == 1
|
56
la_chariotte/order/tests/utils.py
Normal file
56
la_chariotte/order/tests/utils.py
Normal file
|
@ -0,0 +1,56 @@
|
|||
import datetime
|
||||
|
||||
import pytest
|
||||
from django.contrib import auth
|
||||
from django.urls import reverse
|
||||
from django.utils import timezone
|
||||
|
||||
from la_chariotte.order import models
|
||||
|
||||
pytestmark = pytest.mark.django_db
|
||||
|
||||
|
||||
def create_grouped_order(
|
||||
days_before_delivery_date, days_before_deadline, name, orga_user
|
||||
):
|
||||
"""
|
||||
Creates a grouped order.
|
||||
"""
|
||||
date = timezone.now().date() + datetime.timedelta(days=days_before_delivery_date)
|
||||
deadline = timezone.now() + datetime.timedelta(days=days_before_deadline)
|
||||
return models.GroupedOrder.objects.create(
|
||||
name=name, orga=orga_user, delivery_date=date, deadline=deadline
|
||||
)
|
||||
|
||||
|
||||
def order_items_in_grouped_order(grouped_order):
|
||||
"""Creates 2 OrderedItems and orders in the given grouped order. Returns the order"""
|
||||
item_1 = grouped_order.item_set.create(name="test item", price="2")
|
||||
item_2 = grouped_order.item_set.create(name="test item 2", price="9")
|
||||
author_1 = models.OrderAuthor.objects.create(
|
||||
first_name="bob", last_name="lescargot", phone="000", email="bob@escargot.fr"
|
||||
)
|
||||
author_2 = models.OrderAuthor.objects.create(
|
||||
first_name="bob", last_name="alescargot", phone="000", email="bob2@escargot.fr"
|
||||
)
|
||||
author_3 = models.OrderAuthor.objects.create(
|
||||
first_name="bobby",
|
||||
last_name="alescargot",
|
||||
phone="000",
|
||||
email="bob3@escargot.fr",
|
||||
)
|
||||
order = grouped_order.order_set.create(author=author_1)
|
||||
order_2 = grouped_order.order_set.create(author=author_2)
|
||||
order_3 = grouped_order.order_set.create(author=author_3)
|
||||
models.OrderedItem.objects.create(order=order, item=item_1, nb=3)
|
||||
models.OrderedItem.objects.create(order=order, item=item_2, nb=2)
|
||||
models.OrderedItem.objects.create(order=order_2, item=item_1, nb=1)
|
||||
models.OrderedItem.objects.create(order=order_3, item=item_2, nb=1)
|
||||
item_1.compute_ordered_nb()
|
||||
item_2.compute_ordered_nb()
|
||||
order.compute_order_price()
|
||||
order_2.compute_order_price()
|
||||
order_3.compute_order_price()
|
||||
grouped_order.compute_total_price()
|
||||
grouped_order.save()
|
||||
return order
|
Loading…
Reference in a new issue