import json from datetime import timedelta from django.test import TestCase from django.utils import timezone from .testcases import BdATestHelpers, BdAViewTestCaseMixin class InscriptionViewTestCase(BdATestHelpers, BdAViewTestCaseMixin, TestCase): url_name = "bda-tirage-inscription" http_methods = ["GET", "POST"] 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): return "/bda/inscription/{}".format(self.tirage.id) class PlacesViewTestCase(BdATestHelpers, BdAViewTestCaseMixin, TestCase): url_name = "bda-places-attribuees" 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): return "/bda/places/{}".format(self.tirage.id) class EtatPlacesViewTestCase(BdATestHelpers, BdAViewTestCaseMixin, TestCase): url_name = "bda-etat-places" 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): return "/bda/etat-places/{}".format(self.tirage.id) 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 @property def url_kwargs(self): return {"tirage_id": self.tirage.id} @property def url_expected(self): return "/bda/tirage/{}".format(self.tirage.id) def test_perform_tirage_disabled(self): # Cannot be performed if disabled self.tirage.enable_do_tirage = False self.tirage.save() resp = self.client.get(self.url) self.assertTemplateUsed(resp, "tirage-failed.html") def test_perform_tirage_opened_registrations(self): # 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() resp = self.client.get(self.url) self.assertTemplateUsed(resp, "tirage-failed.html") def test_perform_tirage(self): # Otherwise, perform the tirage self.tirage.enable_do_tirage = True self.tirage.fermeture = timezone.now() self.tirage.save() resp = self.client.get(self.url) self.assertTemplateNotUsed(resp, "tirage-failed.html") 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): return "/bda/spectacles/{}".format(self.tirage.id) class SpectacleViewTestCase(BdATestHelpers, BdAViewTestCaseMixin, TestCase): url_name = "bda-spectacle" 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): return "/bda/spectacles/{}/{}".format(self.tirage.id, self.show1.id) 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): return "/bda/spectacles/unpaid/{}".format(self.tirage.id) 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): return "/bda/mails-rappel/{}".format(self.show1.id) def test_post(self): self.require_custommails() resp = self.client.post(self.url) self.assertEqual(200, resp.status_code) # TODO: check that emails are sent class CatalogueViewTestCase(BdATestHelpers, BdAViewTestCaseMixin, TestCase): auth_user = None auth_forbidden = [] bda_testdata = True def test_api_list(self): url_list = "/bda/catalogue/list" resp = self.client.get(url_list) self.assertJSONEqual( resp.content.decode("utf-8"), [{"id": self.tirage.id, "title": self.tirage.title}], ) def test_api_details(self): url_details = "/bda/catalogue/details?id={}".format(self.tirage.id) resp = self.client.get(url_details) self.assertJSONEqual( resp.content.decode("utf-8"), { "categories": [{"id": self.category.id, "name": self.category.name}], "locations": [{"id": self.location.id, "name": self.location.name}], }, ) def test_api_descriptions(self): url_descriptions = "/bda/catalogue/descriptions?id={}".format(self.tirage.id) resp = self.client.get(url_descriptions) 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}, {("foo", 0, 42), ("bar", 1, 142), ("baz", 2, 242)}, ) class TestBdaRevente: pass # TODO