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 = models.OrderAuthor.objects.create( first_name="bob", last_name="lescargot", phone="000", email="bob@escargot.fr" ) order = grouped_order.order_set.create(author=author) models.OrderedItem.objects.create(order=order, item=item_1, nb=3) models.OrderedItem.objects.create(order=order, item=item_2, nb=2) item_1.compute_ordered_nb() item_2.compute_ordered_nb() order.compute_order_price() grouped_order.compute_total_price() grouped_order.save() return order 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("accounts: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 "Anciennes commandes" 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 "Anciennes commandes" 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 "Anciennes commandes" 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 models.Order with an 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 = models.Item.objects.create( name="test item 1", grouped_order=grouped_order, price=1, max_limit=20 ) item2 = models.Item.objects.create( name="test item 2", grouped_order=grouped_order, price=5 ) item3 = models.Item.objects.create( name="test item 3", grouped_order=grouped_order, price=5 ) 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 "20 disponibles" in response.content.decode() assert item.ordered_nb == 0 assert item2.ordered_nb == 0 assert item3.ordered_nb == 0 assert models.OrderedItem.objects.count() == 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}": [1, 0], f"quantity_{item3.pk}": [0, 0], "first_name": "Prénom", "last_name": "Nom", "phone": "0645632569", "email": "test@mail.fr", }, ) 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 == 1 order = models.Order.objects.first() assert order.ordered_items.count() == 2 assert order.articles_nb == 5 assert order.price == 9 assert item.get_remaining_nb() == 16 # OrderedItems are not created when the ordered quantity is 0 assert models.OrderedItem.objects.count() == 2 def test_order_item__no_articles_ordered(self, client, other_user): """ From the OrderDetailView, we order without having changed any item quantity. An error is raised. The order is 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 ) 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, { f"quantity_{item.pk}": [0, 0], "first_name": "Prénom", "last_name": "Nom", "phone": "0645632569", "email": "test@mail.fr", }, ) assert response.status_code == 200 assert ( response.context["error_message"] == "Veuillez commander au moins un produit" ) assert not models.Order.objects.first() assert not models.OrderAuthor.objects.first() def test_deadline_passed(self, client, other_user): """ If the deadline is passed, the user sees a message but cannot order """ 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=1 ) item2 = models.Item.objects.create( name="test item 2", grouped_order=grouped_order, price=5 ) 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" not in response.content.decode() assert "gr order test" in response.content.decode() assert "La période de commande est terminée" in response.content.decode() def test_delivery_passed(self, client, other_user): """ If the delivery date is passed, the user sees a message but cannot order """ grouped_order = create_grouped_order( days_before_delivery_date=-1, 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 ) 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" not in response.content.decode() assert "gr order test" in response.content.decode() assert "Cette commande groupée est terminée" in response.content.decode() def test_order_too_many_items(self, client, other_user): """a user orders more items than what is available. They get an error""" 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, max_limit=1 ) 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, { f"quantity_{item.pk}": [2, 0], "first_name": "Prénom", "last_name": "Nom", "phone": "0645632569", "email": "test@mail.fr", }, ) assert response.status_code == 200 assert ( response.context["error_message"] == "Trop de test item 1 commandés pour la quantité disponible" ) assert not models.Order.objects.first() assert not models.OrderAuthor.objects.first() def test_order_no_item_available(self, client, other_user): """a user an item that is not available. They get an error""" 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, max_limit=0 ) 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, { f"quantity_{item.pk}": [0, 1], "first_name": "Prénom", "last_name": "Nom", "phone": "0645632569", "email": "test@mail.fr", }, ) assert response.status_code == 200 assert ( response.context["error_message"] == "Trop de test item 1 commandés pour la quantité disponible" ) assert not models.Order.objects.first() assert not models.OrderAuthor.objects.first() def test_order_no_item_available_anymore(self, client, other_user): """a user an item that is not available anymore. They get an error""" 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, max_limit=2 ) 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, { f"quantity_{item.pk}": [2, 0], "first_name": "Prénom", "last_name": "Nom", "phone": "0645632569", "email": "test@mail.fr", }, ) assert response.status_code == 302 # success : first order response = client.post( order_url, { f"quantity_{item.pk}": [1, 0], "first_name": "Prénom", "last_name": "Nom", "phone": "0645632569", "email": "test@mail.fr", }, ) assert response.status_code == 200 # error assert ( response.context["error_message"] == "Trop de test item 1 commandés pour la quantité disponible" ) def test_order_item_no_ordered_item_created_for_empty_order( self, client, other_user ): """ when a user does not order all items, those that are not ordered don't have a related OrderedItem """ 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, max_limit=20 ) item2 = models.Item.objects.create( name="test item 2", grouped_order=grouped_order, price=5 ) 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 "20 disponibles" 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}": [0, 0], "first_name": "Prénom", "last_name": "Nom", "phone": "0645632569", "email": "test@mail.fr", }, ) 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 order = models.Order.objects.first() assert order.ordered_items.count() == 1 assert models.OrderedItem.objects.filter(item=item2.pk).count() == 0 assert order.articles_nb == 4 assert order.price == 4 assert item.get_remaining_nb() == 16 class TestGroupedOrderOverview: def test_get_overview(self, client_log): """ From the OrderDetailView, we order an item using the order form, and it creates an models.Order with an Ordered_item inside """ 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), ) item = models.Item.objects.create( name="test item 1", grouped_order=grouped_order, price=2 ) overview_url = reverse( "order:grouped_order_overview", kwargs={ "pk": grouped_order.pk, }, ) # some items are ordered order_url = reverse( "order:order", kwargs={ "grouped_order_id": grouped_order.pk, }, ) client_log.post( order_url, { f"quantity_{item.pk}": [4, 0], "first_name": "Prénom", "last_name": "Nom", "phone": "0645632569", "email": "test@mail.fr", }, ) response = client_log.get(overview_url) assert response.status_code == 200 assert "test item" in response.content.decode() assert "gr order test" in response.content.decode() item.refresh_from_db() assert item.get_total_price() == 8 assert "8" in response.content.decode() def test_user_not_logged_redirect(self, client, other_user): """ A user that is not logged cannot see the GroupedOrderOverview. 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_overview", 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("accounts:login")) assert response.url.endswith( reverse( "order:grouped_order_overview", 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 GroupedOrderOverview. 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_overview", kwargs={ "pk": grouped_order.pk, }, ) response = client_log.get(orga_view_url) assert response.status_code == 403 def test_deadline_passed(self, client_log): """ If the deadline is passed, the user sees a message but cannot share link """ 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=1 ) item2 = models.Item.objects.create( name="test item 2", grouped_order=grouped_order, price=5 ) orga_view_url = reverse( "order:grouped_order_overview", kwargs={ "pk": grouped_order.pk, }, ) response = client_log.get(orga_view_url) assert response.status_code == 200 assert "Pour partager cette commande" not in response.content.decode() assert "gr order test" in response.content.decode() assert "La période de commande est terminée" in response.content.decode() def test_delivery_passed(self, client_log): """ If the delivery date is passed, the user sees a message but cannot share link """ grouped_order = create_grouped_order( days_before_delivery_date=-1, days_before_deadline=-2, 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=1 ) item2 = models.Item.objects.create( name="test item 2", grouped_order=grouped_order, price=5 ) orga_view_url = reverse( "order:grouped_order_overview", kwargs={ "pk": grouped_order.pk, }, ) response = client_log.get(orga_view_url) assert response.status_code == 200 assert "Pour partager cette commande" not in response.content.decode() assert "gr order test" in response.content.decode() 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", }, ) 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", }, ) 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", }, ) 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 class TestGroupedOrderCreateView: def test_create_grouped_order(self, client_log): """ A logged user gets the grouped order creation page, and creates a grouped order. They are redirected to the manage items page. """ assert models.GroupedOrder.objects.count() == 0 create_gorder_url = reverse("order:create_grouped_order") response = client_log.get(create_gorder_url) assert response.status_code == 200 date = timezone.now().date() + datetime.timedelta(days=42) deadline = timezone.now() + datetime.timedelta(days=32) response = client_log.post( create_gorder_url, {"name": "titre test", "deadline": deadline, "delivery_date": date}, ) assert response.status_code == 302 assert response.url.endswith("gerer-produits") assert models.GroupedOrder.objects.count() == 1 def test_create_grouped_order__anonymous_user(self, client): create_gorder_url = reverse("order:create_grouped_order") response = client.get(create_gorder_url) assert response.status_code == 302 assert response.url.startswith(reverse("accounts:login")) assert response.url.endswith( reverse( "order:create_grouped_order", ) ) class TestGroupedOrderUpdateView: def test_update_grouped_order(self, client_log): """ The grouped order orga updates a grouped order updates an incoming grouped order. """ 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), ) assert models.GroupedOrder.objects.count() == 1 assert models.GroupedOrder.objects.first().name == "gr order test" assert models.GroupedOrder.objects.first().place == None # get the update form update_grouped_order_url = reverse( "order:update_grouped_order", kwargs={"pk": grouped_order.pk} ) response = client_log.get(update_grouped_order_url) assert response.status_code == 200 # post the update form date = timezone.now().date() + datetime.timedelta(days=42) deadline = timezone.now() + datetime.timedelta(days=32) response = client_log.post( update_grouped_order_url, { "name": "titre test modifié", "deadline": deadline, "delivery_date": date, "place": "quelque part", }, ) assert response.status_code == 302 assert response.url.endswith("gerer-produits") assert models.GroupedOrder.objects.count() == 1 assert models.GroupedOrder.objects.first().name == "titre test modifié" assert models.GroupedOrder.objects.first().place == "quelque part" def test_update_grouped_order__delivery_date_passed(self, client_log): """ The grouped order orga updates a grouped order. They can put an old delivery date. """ 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), ) assert models.GroupedOrder.objects.count() == 1 assert models.GroupedOrder.objects.first().name == "gr order test" assert models.GroupedOrder.objects.first().place == None # get the update form update_grouped_order_url = reverse( "order:update_grouped_order", kwargs={"pk": grouped_order.pk} ) response = client_log.get(update_grouped_order_url) assert response.status_code == 200 # post the update form date = timezone.now().date() + datetime.timedelta(days=-1) deadline = timezone.now() + datetime.timedelta(days=-3) response = client_log.post( update_grouped_order_url, { "name": "titre test modifié", "deadline": deadline, "delivery_date": date, "place": "quelque part", }, ) assert response.status_code == 302 assert response.url.endswith("gerer-produits") assert models.GroupedOrder.objects.count() == 1 assert models.GroupedOrder.objects.first().name == "titre test modifié" assert models.GroupedOrder.objects.first().place == "quelque part" def test_update_grouped_order__not_orga(self, client_log, other_user): """A user that is not organiszer of the GO accesses update page. 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, ) # get the update form update_grouped_order_url = reverse( "order:update_grouped_order", kwargs={"pk": grouped_order.pk} ) response = client_log.get(update_grouped_order_url) assert response.status_code == 403 def test_update_grouped_order__anonymous(self, client, other_user): """An anonymous user accesses the update_page. They get redirected to login page""" grouped_order = create_grouped_order( days_before_delivery_date=5, days_before_deadline=2, name="gr order test", orga_user=other_user, ) # get the update form update_grouped_order_url = reverse( "order:update_grouped_order", kwargs={"pk": grouped_order.pk} ) response = client.get(update_grouped_order_url) assert response.status_code == 302 assert ( response.url == f"{reverse('accounts:login')}?next={update_grouped_order_url}" ) class TestGroupedOrderAddItemsView: def test_get_manage_items__user_not_orga(self, client_log, other_user): """ A user that is not orga cannot see the GroupedOrderAddItemsView. 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, ) add_items_view_url = reverse( "order:manage_items", kwargs={ "pk": grouped_order.pk, }, ) response = client_log.get(add_items_view_url) assert response.status_code == 403 def test_get_manage_items__anonymous_user(self, client, other_user): """ A user that is not logged cannot see the GroupedOrderOverview. 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, ) add_items_view_url = reverse( "order:manage_items", kwargs={ "pk": grouped_order.pk, }, ) assert auth.get_user(client).is_anonymous response = client.get(add_items_view_url) assert response.status_code == 302 assert response.url.startswith(reverse("accounts:login")) assert response.url.endswith( reverse( "order:manage_items", kwargs={ "pk": grouped_order.pk, }, ) ) def test_delete_item(self, client_log): """ A user on the manage item page creates and then deletes an item """ assert models.GroupedOrder.objects.count() == 0 create_gorder_url = reverse("order:create_grouped_order") response = client_log.get(create_gorder_url) assert response.status_code == 200 date = timezone.now().date() + datetime.timedelta(days=42) deadline = timezone.now() + datetime.timedelta(days=32) response = client_log.post( create_gorder_url, {"name": "titre test", "deadline": deadline, "delivery_date": date}, ) assert response.status_code == 302 assert response.url.endswith("gerer-produits") assert models.GroupedOrder.objects.count() == 1 # Create an item grouped_order = models.GroupedOrder.objects.first() create_item_url = reverse("order:item_create", args=[grouped_order.id]) response = client_log.post(create_item_url, {"name": "Pain test", "price": "2"}) response.status_code == 302 response.url == reverse("order:manage_items", args=[grouped_order.pk]) assert grouped_order.item_set.count() == 1 # Delete the item item = grouped_order.item_set.first() delete_item_url = reverse("order:item_delete", args=[grouped_order.id, item.id]) response = client_log.post(delete_item_url) assert response.status_code == 302 assert response.url == reverse("order:manage_items", args=[grouped_order.pk]) assert grouped_order.item_set.count() == 0 def test_create_or_delete_item__not_orga(self, client_log, other_user): """ A user that is not orga delete or create an item 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, ) # Create an item grouped_order = models.GroupedOrder.objects.first() create_item_url = reverse("order:item_create", args=[grouped_order.id]) response = client_log.post(create_item_url, {"name": "Pain test", "price": "2"}) response.status_code == 403 assert grouped_order.item_set.count() == 0 # Delete an item item = grouped_order.item_set.create(name="Pain test", price="2") assert grouped_order.item_set.count() == 1 delete_item_url = reverse("order:item_delete", args=[grouped_order.id, item.id]) response = client_log.post(delete_item_url) assert response.status_code == 403 assert grouped_order.item_set.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 organiszer of the GO accesses the sheet view. 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, ) generate_sheet_url = reverse( "order:grouped_order_sheet", kwargs={ "pk": grouped_order.pk, }, ) response = client_log.get(generate_sheet_url) assert response.status_code == 403 def test_get__anonymous(self, client, other_user): """An anonymous user accesses the sheet view. They get redirected to login page""" grouped_order = create_grouped_order( days_before_delivery_date=5, days_before_deadline=2, name="gr order test", orga_user=other_user, ) generate_sheet_url = reverse( "order:grouped_order_sheet", kwargs={ "pk": grouped_order.pk, }, ) response = client.get(generate_sheet_url) assert response.status_code == 302 assert response.url == f"{reverse('accounts:login')}?next={generate_sheet_url}" def test_get_pdf_sheet(self, client_log, other_user): """The orga of the grouped models.Order accesses the pdf sheet""" 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), ) generate_sheet_url = reverse( "order:grouped_order_sheet", kwargs={ "pk": grouped_order.pk, }, ) response = client_log.get(generate_sheet_url) assert response.status_code == 200 assert response.context["name"] == "gr order test" assert response.context["delivery_date"] == grouped_order.delivery_date assert response.context["items"].count() == 0 order = order_items_in_grouped_order(grouped_order) response = client_log.get(generate_sheet_url) assert response.status_code == 200 assert response.context["name"] == "gr order test" assert response.context["delivery_date"] == grouped_order.delivery_date assert response.context["items"].count() == 2 assert response.context["orders_dict"][order] == [3, 2] assert response.context["total_price"] == 24 class TestExportGroupedOrderEmailAddressesToCSVView: def test_user_not_logged_redirect(self, client, other_user): """ A user that is not logged access the email list. 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, ) email_list_view_url = reverse( "order:email_list", kwargs={ "grouped_order_id": grouped_order.pk, }, ) assert auth.get_user(client).is_anonymous response = client.get(email_list_view_url) assert response.status_code == 302 assert response.url.startswith(reverse("accounts:login")) assert response.url.endswith(email_list_view_url) def test_user_not_orga_forbidden(self, client_log, other_user): """ A user that is not orga cannot access the email list. 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, ) email_list_view_url = reverse( "order:email_list", kwargs={ "grouped_order_id": grouped_order.pk, }, ) response = client_log.get(email_list_view_url) assert response.status_code == 403 def test_email_addresses(self, client_log, other_user): """ The grouped order orga accesses the email addresses list """ 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), ) email_list_view_url = reverse( "order:email_list", kwargs={ "grouped_order_id": grouped_order.pk, }, ) response = client_log.get(email_list_view_url) assert response.status_code == 200 assert response.content.decode() == "\r\n" email = order_items_in_grouped_order(grouped_order).author.email response = client_log.get(email_list_view_url) assert response.status_code == 200 assert email in response.content.decode()