mirror of
https://framagit.org/la-chariotte/la-chariotte.git
synced 2025-05-01 11:22:24 +02:00
308 lines
11 KiB
Python
308 lines
11 KiB
Python
import datetime
|
|
|
|
import pytest
|
|
from django.contrib import auth
|
|
from django.contrib.auth.models import User
|
|
from django.urls import reverse
|
|
from django.utils import timezone
|
|
|
|
from la_chariotte.order.models import GroupedOrder, Item, Order
|
|
|
|
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 GroupedOrder.objects.create(
|
|
name=name, orga=orga_user, delivery_date=date, deadline=deadline
|
|
)
|
|
|
|
|
|
class TestGroupedOrderIndexView:
|
|
def test_anonymous_user_redirection(self, client):
|
|
"""
|
|
If the user is anonymous, they are redirected to login view
|
|
"""
|
|
assert auth.get_user(client).is_anonymous
|
|
response = client.get(reverse("order:index"))
|
|
assert response.status_code == 302
|
|
assert response.url.startswith(reverse("login"))
|
|
assert response.url.endswith(reverse("order:index"))
|
|
|
|
def test_no_grouped_orders(self, client_log):
|
|
"""
|
|
If no grouped order exist, an appropriate message is displayed
|
|
"""
|
|
response = client_log.get(reverse("order:index"))
|
|
assert response.status_code == 200
|
|
assert "Pas de commande groupée pour l'instant" in response.content.decode()
|
|
assert len(response.context["grouped_order_list"]["old_grouped_orders"]) == 0
|
|
assert (
|
|
len(
|
|
response.context["grouped_order_list"][
|
|
"crossed_deadline_grouped_orders"
|
|
]
|
|
)
|
|
== 0
|
|
)
|
|
assert (
|
|
len(response.context["grouped_order_list"]["incoming_grouped_orders"]) == 0
|
|
)
|
|
|
|
def test_grouped_orders_in_right_section(self, client_log):
|
|
"""
|
|
According to their delivery date and deadline, grouped orders are placed in the correct section : several gr orders
|
|
"""
|
|
future_grouped_order = create_grouped_order(
|
|
days_before_delivery_date=5,
|
|
days_before_deadline=2,
|
|
name="future",
|
|
orga_user=auth.get_user(client_log),
|
|
)
|
|
crossed_deadline_gr_order = create_grouped_order(
|
|
days_before_delivery_date=2,
|
|
days_before_deadline=-1,
|
|
name="crossed deadline",
|
|
orga_user=auth.get_user(client_log),
|
|
)
|
|
old_gr_order = create_grouped_order(
|
|
days_before_delivery_date=-1,
|
|
days_before_deadline=-3,
|
|
name="old",
|
|
orga_user=auth.get_user(client_log),
|
|
)
|
|
response = client_log.get(reverse("order:index"))
|
|
assert response.status_code == 200
|
|
assert "Pas de commande groupée pour l'instant" not in response.content.decode()
|
|
assert "Commandes groupées à venir" in response.content.decode()
|
|
assert "Livraison à venir" in response.content.decode()
|
|
assert "Livraison passée" in response.content.decode()
|
|
assert len(response.context["grouped_order_list"]["old_grouped_orders"]) == 1
|
|
assert (
|
|
len(
|
|
response.context["grouped_order_list"][
|
|
"crossed_deadline_grouped_orders"
|
|
]
|
|
)
|
|
== 1
|
|
)
|
|
assert (
|
|
len(response.context["grouped_order_list"]["incoming_grouped_orders"]) == 1
|
|
)
|
|
assert (
|
|
response.context["grouped_order_list"]["old_grouped_orders"][0]
|
|
== old_gr_order
|
|
)
|
|
assert (
|
|
response.context["grouped_order_list"]["crossed_deadline_grouped_orders"][0]
|
|
== crossed_deadline_gr_order
|
|
)
|
|
assert (
|
|
response.context["grouped_order_list"]["incoming_grouped_orders"][0]
|
|
== future_grouped_order
|
|
)
|
|
|
|
def test_grouped_orders_in_right_section__with_only_old(self, client_log):
|
|
"""
|
|
According to their delivery date and deadline, grouped orders are placed in correct section : only old gr order
|
|
"""
|
|
old_gr_order = create_grouped_order(
|
|
days_before_delivery_date=-1,
|
|
days_before_deadline=-3,
|
|
name="passée",
|
|
orga_user=auth.get_user(client_log),
|
|
)
|
|
response = client_log.get(reverse("order:index"))
|
|
assert response.status_code == 200
|
|
assert "Pas de commande groupée pour l'instant" not in response.content.decode()
|
|
assert "Commandes groupées à venir" not in response.content.decode()
|
|
assert "Livraison à venir" not in response.content.decode()
|
|
assert "Livraison passée" in response.content.decode()
|
|
assert len(response.context["grouped_order_list"]["old_grouped_orders"]) == 1
|
|
assert (
|
|
len(
|
|
response.context["grouped_order_list"][
|
|
"crossed_deadline_grouped_orders"
|
|
]
|
|
)
|
|
== 0
|
|
)
|
|
assert (
|
|
len(response.context["grouped_order_list"]["incoming_grouped_orders"]) == 0
|
|
)
|
|
assert (
|
|
response.context["grouped_order_list"]["old_grouped_orders"][0]
|
|
== old_gr_order
|
|
)
|
|
|
|
def test_grouped_orders_in_right_section__with_only_future(self, client_log):
|
|
"""
|
|
According to their delivery date and deadline, grouped orders are placed in correct section : only incoming gr order
|
|
"""
|
|
future_grouped_order = create_grouped_order(
|
|
days_before_delivery_date=5,
|
|
days_before_deadline=2,
|
|
name="future",
|
|
orga_user=auth.get_user(client_log),
|
|
)
|
|
response = client_log.get(reverse("order:index"))
|
|
assert response.status_code == 200
|
|
assert "Pas de commande groupée pour l'instant" not in response.content.decode()
|
|
assert "Commandes groupées à venir" in response.content.decode()
|
|
assert "Livraison à venir" not in response.content.decode()
|
|
assert "Livraison passée" not in response.content.decode()
|
|
assert len(response.context["grouped_order_list"]["old_grouped_orders"]) == 0
|
|
assert (
|
|
len(
|
|
response.context["grouped_order_list"][
|
|
"crossed_deadline_grouped_orders"
|
|
]
|
|
)
|
|
== 0
|
|
)
|
|
assert (
|
|
len(response.context["grouped_order_list"]["incoming_grouped_orders"]) == 1
|
|
)
|
|
assert (
|
|
response.context["grouped_order_list"]["incoming_grouped_orders"][0]
|
|
== future_grouped_order
|
|
)
|
|
|
|
def test_gr_order_not_organized_by_logged_user(self, client_log, other_user):
|
|
"""
|
|
If the logged user is not the organizer of a grouped order they don't see it on IndexView
|
|
"""
|
|
logged_user = auth.get_user(client_log)
|
|
future_grouped_order = create_grouped_order(
|
|
days_before_delivery_date=5,
|
|
days_before_deadline=2,
|
|
name="future",
|
|
orga_user=other_user,
|
|
)
|
|
assert future_grouped_order.orga is not logged_user
|
|
response = client_log.get(reverse("order:index"))
|
|
assert response.status_code == 200
|
|
assert "Pas de commande groupée pour l'instant" in response.content.decode()
|
|
assert len(response.context["grouped_order_list"]["old_grouped_orders"]) == 0
|
|
assert (
|
|
len(
|
|
response.context["grouped_order_list"][
|
|
"crossed_deadline_grouped_orders"
|
|
]
|
|
)
|
|
== 0
|
|
)
|
|
assert (
|
|
len(response.context["grouped_order_list"]["incoming_grouped_orders"]) == 0
|
|
)
|
|
|
|
|
|
class TestGroupedOrderDetailView:
|
|
def test_order_item(self, client, other_user):
|
|
"""
|
|
From the OrderDetailView, we order an item using the order form, and it creates an Order woth and Ordered_item inside
|
|
"""
|
|
grouped_order = create_grouped_order(
|
|
days_before_delivery_date=5,
|
|
days_before_deadline=2,
|
|
name="gr order test",
|
|
orga_user=other_user,
|
|
)
|
|
item = Item.objects.create(name="test item", grouped_order=grouped_order)
|
|
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
|
|
order_url = reverse(
|
|
"order:order",
|
|
kwargs={
|
|
"grouped_order_id": grouped_order.pk,
|
|
},
|
|
)
|
|
response = client.post(
|
|
order_url,
|
|
{
|
|
"item": item.pk,
|
|
},
|
|
)
|
|
assert response.status_code == 302
|
|
assert response.url == reverse(
|
|
"order:grouped_order_orga",
|
|
kwargs={
|
|
"pk": grouped_order.pk,
|
|
},
|
|
)
|
|
item.refresh_from_db()
|
|
assert item.ordered_nb == 1
|
|
order = Order.objects.first()
|
|
assert order.ordered_items.count() == 1
|
|
|
|
|
|
class TestGroupedOrderOrgaView:
|
|
def test_user_not_logged_redirect(self, client, other_user):
|
|
"""
|
|
A user that is not logged cannot see the GroupedOrderOrgaView. They get redirected to the login view
|
|
"""
|
|
grouped_order = create_grouped_order(
|
|
days_before_delivery_date=5,
|
|
days_before_deadline=2,
|
|
name="gr order test",
|
|
orga_user=other_user,
|
|
)
|
|
orga_view_url = reverse(
|
|
"order:grouped_order_orga",
|
|
kwargs={
|
|
"pk": grouped_order.pk,
|
|
},
|
|
)
|
|
assert auth.get_user(client).is_anonymous
|
|
response = client.get(orga_view_url)
|
|
assert response.status_code == 302
|
|
assert response.url.startswith(reverse("login"))
|
|
assert response.url.endswith(
|
|
reverse(
|
|
"order:grouped_order_orga",
|
|
kwargs={
|
|
"pk": grouped_order.pk,
|
|
},
|
|
)
|
|
)
|
|
|
|
def test_user_not_orga_redirect(self, client_log, other_user):
|
|
"""
|
|
A user that is not orga cannot see the GroupedOrderOrgaView.
|
|
They get a 403 forbidden error
|
|
"""
|
|
grouped_order = create_grouped_order(
|
|
days_before_delivery_date=5,
|
|
days_before_deadline=2,
|
|
name="gr order test",
|
|
orga_user=other_user,
|
|
)
|
|
orga_view_url = reverse(
|
|
"order:grouped_order_orga",
|
|
kwargs={
|
|
"pk": grouped_order.pk,
|
|
},
|
|
)
|
|
detail_view_url = reverse(
|
|
"order:grouped_order_detail",
|
|
kwargs={
|
|
"pk": grouped_order.pk,
|
|
},
|
|
)
|
|
response = client_log.get(orga_view_url)
|
|
assert response.status_code == 403
|