2018-01-06 12:13:15 +01:00
|
|
|
import json
|
|
|
|
from datetime import timedelta
|
2019-10-06 10:57:15 +02:00
|
|
|
from unittest import mock
|
2018-01-06 12:13:15 +01:00
|
|
|
|
2019-10-06 10:57:15 +02:00
|
|
|
from django.contrib.auth import get_user_model
|
|
|
|
from django.test import Client, TestCase
|
|
|
|
from django.urls import reverse
|
2018-10-28 18:35:11 +01:00
|
|
|
from django.utils import formats, timezone
|
2018-01-06 12:13:15 +01:00
|
|
|
|
2019-10-06 10:57:15 +02:00
|
|
|
from ..models import Participant, Tirage
|
2020-05-11 00:19:43 +02:00
|
|
|
from .mixins import BdATestHelpers, BdAViewTestCaseMixin
|
2018-01-06 12:13:15 +01:00
|
|
|
|
2019-10-06 10:57:15 +02:00
|
|
|
User = get_user_model()
|
|
|
|
|
2018-01-06 12:13:15 +01:00
|
|
|
|
2018-10-28 14:31:10 +01:00
|
|
|
class InscriptionViewTestCase(BdATestHelpers, BdAViewTestCaseMixin, TestCase):
|
|
|
|
url_name = "bda-tirage-inscription"
|
2018-01-06 12:13:15 +01:00
|
|
|
|
2018-10-28 14:31:10 +01:00
|
|
|
http_methods = ["GET", "POST"]
|
2018-01-06 12:13:15 +01:00
|
|
|
|
2018-10-28 14:31:10 +01:00
|
|
|
auth_user = "bda_member"
|
|
|
|
auth_forbidden = [None, "bda_other"]
|
2018-01-06 12:13:15 +01:00
|
|
|
|
2018-10-28 14:31:10 +01:00
|
|
|
bda_testdata = True
|
2018-01-06 12:13:15 +01:00
|
|
|
|
2018-10-28 14:31:10 +01:00
|
|
|
@property
|
|
|
|
def url_kwargs(self):
|
|
|
|
return {"tirage_id": self.tirage.id}
|
2018-01-06 12:13:15 +01:00
|
|
|
|
2018-10-28 14:31:10 +01:00
|
|
|
@property
|
|
|
|
def url_expected(self):
|
2020-08-30 18:49:22 +02:00
|
|
|
return "/gestion/bda/inscription/{}".format(self.tirage.id)
|
2018-01-06 12:13:15 +01:00
|
|
|
|
2018-10-28 18:35:11 +01:00
|
|
|
def test_get_opened(self):
|
|
|
|
self.tirage.ouverture = timezone.now() - timedelta(days=1)
|
|
|
|
self.tirage.fermeture = timezone.now() + timedelta(days=1)
|
|
|
|
self.tirage.save()
|
|
|
|
|
|
|
|
resp = self.client.get(self.url)
|
|
|
|
|
|
|
|
self.assertEqual(resp.status_code, 200)
|
|
|
|
self.assertFalse(resp.context["messages"])
|
|
|
|
|
|
|
|
def test_get_closed_future(self):
|
|
|
|
self.tirage.ouverture = timezone.now() + timedelta(days=1)
|
|
|
|
self.tirage.fermeture = timezone.now() + timedelta(days=2)
|
|
|
|
self.tirage.save()
|
|
|
|
|
|
|
|
resp = self.client.get(self.url)
|
|
|
|
|
|
|
|
self.assertEqual(resp.status_code, 200)
|
|
|
|
self.assertIn(
|
|
|
|
"Le tirage n'est pas encore ouvert : ouverture le {}".format(
|
|
|
|
formats.localize(timezone.template_localtime(self.tirage.ouverture))
|
|
|
|
),
|
|
|
|
[str(msg) for msg in resp.context["messages"]],
|
|
|
|
)
|
|
|
|
|
|
|
|
def test_get_closed_past(self):
|
|
|
|
self.tirage.ouverture = timezone.now() - timedelta(days=2)
|
|
|
|
self.tirage.fermeture = timezone.now() - timedelta(days=1)
|
|
|
|
self.tirage.save()
|
|
|
|
|
|
|
|
resp = self.client.get(self.url)
|
|
|
|
|
|
|
|
self.assertEqual(resp.status_code, 200)
|
|
|
|
self.assertIn(
|
|
|
|
" C'est fini : tirage au sort dans la journée !",
|
|
|
|
[str(msg) for msg in resp.context["messages"]],
|
|
|
|
)
|
|
|
|
|
|
|
|
def get_base_post_data(self):
|
|
|
|
return {
|
|
|
|
"choixspectacle_set-TOTAL_FORMS": "3",
|
|
|
|
"choixspectacle_set-INITIAL_FORMS": "0",
|
|
|
|
"choixspectacle_set-MIN_NUM_FORMS": "0",
|
|
|
|
"choixspectacle_set-MAX_NUM_FORMS": "1000",
|
|
|
|
}
|
|
|
|
|
|
|
|
base_post_data = property(get_base_post_data)
|
|
|
|
|
|
|
|
def test_post(self):
|
|
|
|
self.tirage.ouverture = timezone.now() - timedelta(days=1)
|
|
|
|
self.tirage.fermeture = timezone.now() + timedelta(days=1)
|
|
|
|
self.tirage.save()
|
|
|
|
|
|
|
|
data = dict(
|
|
|
|
self.base_post_data,
|
|
|
|
**{
|
|
|
|
"choixspectacle_set-TOTAL_FORMS": "2",
|
|
|
|
"choixspectacle_set-0-id": "",
|
|
|
|
"choixspectacle_set-0-participant": "",
|
|
|
|
"choixspectacle_set-0-spectacle": str(self.show1.pk),
|
|
|
|
"choixspectacle_set-0-double_choice": "1",
|
|
|
|
"choixspectacle_set-0-priority": "2",
|
|
|
|
"choixspectacle_set-1-id": "",
|
|
|
|
"choixspectacle_set-1-participant": "",
|
|
|
|
"choixspectacle_set-1-spectacle": str(self.show2.pk),
|
|
|
|
"choixspectacle_set-1-double_choice": "autoquit",
|
|
|
|
"choixspectacle_set-1-priority": "1",
|
|
|
|
}
|
|
|
|
)
|
|
|
|
resp = self.client.post(self.url, data)
|
|
|
|
|
|
|
|
self.assertEqual(resp.status_code, 200)
|
|
|
|
self.assertIn(
|
|
|
|
"Votre inscription a été mise à jour avec succès !",
|
|
|
|
[str(msg) for msg in resp.context["messages"]],
|
|
|
|
)
|
|
|
|
participant = Participant.objects.get(
|
|
|
|
user=self.users["bda_member"], tirage=self.tirage
|
|
|
|
)
|
|
|
|
self.assertSetEqual(
|
|
|
|
set(
|
|
|
|
participant.choixspectacle_set.values_list(
|
|
|
|
"priority", "spectacle_id", "double_choice"
|
|
|
|
)
|
|
|
|
),
|
|
|
|
{(1, self.show2.pk, "autoquit"), (2, self.show1.pk, "1")},
|
|
|
|
)
|
|
|
|
|
|
|
|
def test_post_state_changed(self):
|
|
|
|
self.tirage.ouverture = timezone.now() - timedelta(days=1)
|
|
|
|
self.tirage.fermeture = timezone.now() + timedelta(days=1)
|
|
|
|
self.tirage.save()
|
|
|
|
|
|
|
|
data = {"dbstate": "different"}
|
|
|
|
resp = self.client.post(self.url, data)
|
|
|
|
|
|
|
|
self.assertEqual(resp.status_code, 200)
|
|
|
|
self.assertIn(
|
|
|
|
"Impossible d'enregistrer vos modifications : vous avez apporté d'autres "
|
|
|
|
"modifications entre temps.",
|
|
|
|
[str(msg) for msg in resp.context["messages"]],
|
|
|
|
)
|
|
|
|
|
2018-01-06 12:13:15 +01:00
|
|
|
|
2018-10-28 14:31:10 +01:00
|
|
|
class PlacesViewTestCase(BdATestHelpers, BdAViewTestCaseMixin, TestCase):
|
|
|
|
url_name = "bda-places-attribuees"
|
2018-01-06 12:13:15 +01:00
|
|
|
|
2018-10-28 14:31:10 +01:00
|
|
|
auth_user = "bda_member"
|
|
|
|
auth_forbidden = [None, "bda_other"]
|
2018-01-06 12:13:15 +01:00
|
|
|
|
2018-10-28 14:31:10 +01:00
|
|
|
bda_testdata = True
|
2018-01-06 12:13:15 +01:00
|
|
|
|
2018-10-28 14:31:10 +01:00
|
|
|
@property
|
|
|
|
def url_kwargs(self):
|
|
|
|
return {"tirage_id": self.tirage.id}
|
2018-01-06 12:13:15 +01:00
|
|
|
|
2018-10-28 14:31:10 +01:00
|
|
|
@property
|
|
|
|
def url_expected(self):
|
2020-08-30 18:49:22 +02:00
|
|
|
return "/gestion/bda/places/{}".format(self.tirage.id)
|
2018-01-06 12:13:15 +01:00
|
|
|
|
|
|
|
|
2018-10-28 14:31:10 +01:00
|
|
|
class EtatPlacesViewTestCase(BdATestHelpers, BdAViewTestCaseMixin, TestCase):
|
|
|
|
url_name = "bda-etat-places"
|
2018-01-06 12:13:15 +01:00
|
|
|
|
2018-10-28 14:31:10 +01:00
|
|
|
auth_user = "bda_member"
|
|
|
|
auth_forbidden = [None, "bda_other"]
|
|
|
|
|
|
|
|
bda_testdata = True
|
|
|
|
|
|
|
|
@property
|
|
|
|
def url_kwargs(self):
|
|
|
|
return {"tirage_id": self.tirage.id}
|
|
|
|
|
|
|
|
@property
|
|
|
|
def url_expected(self):
|
2020-08-30 18:49:22 +02:00
|
|
|
return "/gestion/bda/etat-places/{}".format(self.tirage.id)
|
2018-10-28 14:31:10 +01:00
|
|
|
|
|
|
|
|
|
|
|
class TirageViewTestCase(BdATestHelpers, BdAViewTestCaseMixin, TestCase):
|
|
|
|
url_name = "bda-tirage"
|
|
|
|
|
|
|
|
http_methods = ["GET", "POST"]
|
|
|
|
|
|
|
|
auth_user = "bda_staff"
|
|
|
|
auth_forbidden = [None, "bda_other", "bda_member"]
|
|
|
|
|
|
|
|
bda_testdata = True
|
2018-01-06 12:13:15 +01:00
|
|
|
|
2018-10-28 14:31:10 +01:00
|
|
|
@property
|
|
|
|
def url_kwargs(self):
|
|
|
|
return {"tirage_id": self.tirage.id}
|
|
|
|
|
|
|
|
@property
|
|
|
|
def url_expected(self):
|
2020-08-30 18:49:22 +02:00
|
|
|
return "/gestion/bda/tirage/{}".format(self.tirage.id)
|
2018-10-28 14:31:10 +01:00
|
|
|
|
|
|
|
def test_perform_tirage_disabled(self):
|
2018-01-06 12:13:15 +01:00
|
|
|
# Cannot be performed if disabled
|
|
|
|
self.tirage.enable_do_tirage = False
|
|
|
|
self.tirage.save()
|
2018-10-28 14:31:10 +01:00
|
|
|
resp = self.client.get(self.url)
|
2018-01-06 12:13:15 +01:00
|
|
|
self.assertTemplateUsed(resp, "tirage-failed.html")
|
2018-10-28 14:31:10 +01:00
|
|
|
|
|
|
|
def test_perform_tirage_opened_registrations(self):
|
2018-01-06 12:13:15 +01:00
|
|
|
# Cannot be performed if registrations are still open
|
|
|
|
self.tirage.enable_do_tirage = True
|
|
|
|
self.tirage.fermeture = timezone.now() + timedelta(seconds=3600)
|
|
|
|
self.tirage.save()
|
2018-10-28 14:31:10 +01:00
|
|
|
resp = self.client.get(self.url)
|
2018-01-06 12:13:15 +01:00
|
|
|
self.assertTemplateUsed(resp, "tirage-failed.html")
|
2018-10-28 14:31:10 +01:00
|
|
|
|
|
|
|
def test_perform_tirage(self):
|
2018-01-06 12:13:15 +01:00
|
|
|
# Otherwise, perform the tirage
|
2018-10-28 14:31:10 +01:00
|
|
|
self.tirage.enable_do_tirage = True
|
2018-01-06 12:13:15 +01:00
|
|
|
self.tirage.fermeture = timezone.now()
|
|
|
|
self.tirage.save()
|
2018-10-28 14:31:10 +01:00
|
|
|
resp = self.client.get(self.url)
|
2018-01-06 12:13:15 +01:00
|
|
|
self.assertTemplateNotUsed(resp, "tirage-failed.html")
|
|
|
|
|
|
|
|
|
2018-10-28 14:31:10 +01:00
|
|
|
class SpectacleListViewTestCase(BdATestHelpers, BdAViewTestCaseMixin, TestCase):
|
|
|
|
url_name = "bda-liste-spectacles"
|
|
|
|
|
|
|
|
auth_user = "bda_staff"
|
|
|
|
auth_forbidden = [None, "bda_other", "bda_member"]
|
|
|
|
|
|
|
|
bda_testdata = True
|
|
|
|
|
|
|
|
@property
|
|
|
|
def url_kwargs(self):
|
|
|
|
return {"tirage_id": self.tirage.id}
|
|
|
|
|
|
|
|
@property
|
|
|
|
def url_expected(self):
|
2020-08-30 18:49:22 +02:00
|
|
|
return "/gestion/bda/spectacles/{}".format(self.tirage.id)
|
2018-10-28 14:31:10 +01:00
|
|
|
|
2018-01-06 12:13:15 +01:00
|
|
|
|
2018-10-28 14:31:10 +01:00
|
|
|
class SpectacleViewTestCase(BdATestHelpers, BdAViewTestCaseMixin, TestCase):
|
|
|
|
url_name = "bda-spectacle"
|
2018-01-06 12:13:15 +01:00
|
|
|
|
2018-10-28 14:31:10 +01:00
|
|
|
auth_user = "bda_staff"
|
|
|
|
auth_forbidden = [None, "bda_other", "bda_member"]
|
|
|
|
|
|
|
|
bda_testdata = True
|
|
|
|
|
|
|
|
@property
|
|
|
|
def url_kwargs(self):
|
|
|
|
return {"tirage_id": self.tirage.id, "spectacle_id": self.show1.id}
|
|
|
|
|
|
|
|
@property
|
|
|
|
def url_expected(self):
|
2020-08-30 18:49:22 +02:00
|
|
|
return "/gestion/bda/spectacles/{}/{}".format(self.tirage.id, self.show1.id)
|
2018-10-28 14:31:10 +01:00
|
|
|
|
|
|
|
|
|
|
|
class UnpaidViewTestCase(BdATestHelpers, BdAViewTestCaseMixin, TestCase):
|
|
|
|
url_name = "bda-unpaid"
|
|
|
|
|
|
|
|
auth_user = "bda_staff"
|
|
|
|
auth_forbidden = [None, "bda_other", "bda_member"]
|
|
|
|
|
|
|
|
bda_testdata = True
|
|
|
|
|
|
|
|
@property
|
|
|
|
def url_kwargs(self):
|
|
|
|
return {"tirage_id": self.tirage.id}
|
|
|
|
|
|
|
|
@property
|
|
|
|
def url_expected(self):
|
2020-08-30 18:49:22 +02:00
|
|
|
return "/gestion/bda/spectacles/unpaid/{}".format(self.tirage.id)
|
2018-10-28 14:31:10 +01:00
|
|
|
|
|
|
|
|
|
|
|
class SendRemindersViewTestCase(BdATestHelpers, BdAViewTestCaseMixin, TestCase):
|
|
|
|
url_name = "bda-rappels"
|
|
|
|
|
|
|
|
auth_user = "bda_staff"
|
|
|
|
auth_forbidden = [None, "bda_other", "bda_member"]
|
|
|
|
|
|
|
|
bda_testdata = True
|
|
|
|
|
|
|
|
@property
|
|
|
|
def url_kwargs(self):
|
|
|
|
return {"spectacle_id": self.show1.id}
|
|
|
|
|
|
|
|
@property
|
|
|
|
def url_expected(self):
|
2020-08-30 18:49:22 +02:00
|
|
|
return "/gestion/bda/mails-rappel/{}".format(self.show1.id)
|
2018-10-28 14:31:10 +01:00
|
|
|
|
|
|
|
def test_post(self):
|
|
|
|
resp = self.client.post(self.url)
|
2018-01-06 12:13:15 +01:00
|
|
|
self.assertEqual(200, resp.status_code)
|
|
|
|
# TODO: check that emails are sent
|
|
|
|
|
|
|
|
|
2018-10-28 14:31:10 +01:00
|
|
|
class CatalogueViewTestCase(BdATestHelpers, BdAViewTestCaseMixin, TestCase):
|
|
|
|
auth_user = None
|
|
|
|
auth_forbidden = []
|
2018-01-06 12:13:15 +01:00
|
|
|
|
2018-10-28 14:31:10 +01:00
|
|
|
bda_testdata = True
|
2018-01-06 12:13:15 +01:00
|
|
|
|
2018-10-28 14:31:10 +01:00
|
|
|
def test_api_list(self):
|
2020-08-30 18:49:22 +02:00
|
|
|
url_list = "/gestion/bda/catalogue/list"
|
2018-10-28 14:31:10 +01:00
|
|
|
resp = self.client.get(url_list)
|
2018-01-06 12:13:15 +01:00
|
|
|
self.assertJSONEqual(
|
|
|
|
resp.content.decode("utf-8"),
|
2018-10-06 12:35:49 +02:00
|
|
|
[{"id": self.tirage.id, "title": self.tirage.title}],
|
2018-01-06 12:13:15 +01:00
|
|
|
)
|
|
|
|
|
2018-10-28 14:31:10 +01:00
|
|
|
def test_api_details(self):
|
2020-08-30 18:49:22 +02:00
|
|
|
url_details = "/gestion/bda/catalogue/details?id={}".format(self.tirage.id)
|
2018-10-28 14:31:10 +01:00
|
|
|
resp = self.client.get(url_details)
|
2018-01-06 12:13:15 +01:00
|
|
|
self.assertJSONEqual(
|
|
|
|
resp.content.decode("utf-8"),
|
|
|
|
{
|
2018-10-06 12:35:49 +02:00
|
|
|
"categories": [{"id": self.category.id, "name": self.category.name}],
|
|
|
|
"locations": [{"id": self.location.id, "name": self.location.name}],
|
|
|
|
},
|
2018-01-06 12:13:15 +01:00
|
|
|
)
|
|
|
|
|
2018-10-28 14:31:10 +01:00
|
|
|
def test_api_descriptions(self):
|
2020-08-30 18:49:22 +02:00
|
|
|
url_descriptions = "/gestion/bda/catalogue/descriptions?id={}".format(
|
|
|
|
self.tirage.id
|
|
|
|
)
|
2018-10-28 14:31:10 +01:00
|
|
|
resp = self.client.get(url_descriptions)
|
2018-01-06 12:13:15 +01:00
|
|
|
raw = resp.content.decode("utf-8")
|
|
|
|
try:
|
|
|
|
results = json.loads(raw)
|
|
|
|
except ValueError:
|
|
|
|
self.fail("Not valid JSON: {}".format(raw))
|
|
|
|
self.assertEqual(len(results), 3)
|
|
|
|
self.assertEqual(
|
|
|
|
{(s["title"], s["price"], s["slots"]) for s in results},
|
2018-10-06 12:35:49 +02:00
|
|
|
{("foo", 0, 42), ("bar", 1, 142), ("baz", 2, 242)},
|
2018-01-06 12:13:15 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
|
2019-10-06 10:57:15 +02:00
|
|
|
# ----- BdA Revente --------------------------------------- #
|
|
|
|
|
|
|
|
|
|
|
|
def make_participant(name: str, tirage: Tirage) -> User:
|
|
|
|
user = User.objects.create_user(username=name, password=name)
|
|
|
|
user.profile.is_cof = True
|
|
|
|
user.profile.save()
|
|
|
|
Participant.objects.create(user=user, tirage=tirage)
|
|
|
|
return user
|
|
|
|
|
|
|
|
|
|
|
|
class TestReventeManageTest(TestCase):
|
|
|
|
def setUp(self):
|
|
|
|
self.tirage = Tirage.objects.create(
|
|
|
|
title="tirage1",
|
|
|
|
ouverture=timezone.now(),
|
|
|
|
fermeture=timezone.now() + timedelta(days=90),
|
|
|
|
)
|
|
|
|
self.user = make_participant("toto", self.tirage)
|
|
|
|
self.url = reverse("bda-revente-manage", args=[self.tirage.id])
|
|
|
|
|
|
|
|
# Signals handlers on login/logout send messages.
|
|
|
|
# Due to the way the Django' test Client performs login, this raise an
|
|
|
|
# error. As workaround, we mock the Django' messages module.
|
|
|
|
patcher_messages = mock.patch("gestioncof.signals.messages")
|
|
|
|
patcher_messages.start()
|
|
|
|
self.addCleanup(patcher_messages.stop)
|
|
|
|
|
|
|
|
def test_can_get(self):
|
|
|
|
client = Client()
|
|
|
|
client.force_login(self.user)
|
|
|
|
r = client.get(self.url)
|
|
|
|
self.assertEqual(r.status_code, 200)
|
|
|
|
|
|
|
|
|
2018-01-06 12:13:15 +01:00
|
|
|
class TestBdaRevente:
|
|
|
|
pass
|
|
|
|
# TODO
|