from datetime import timedelta from django.core.exceptions import ImproperlyConfigured from django.test import TestCase from games.models import Game from submissions.models import Submission from .models import Event from .scoping import current_event class EventScopedManagerTests(TestCase): def setUp(self): self.event_a = Event.objects.create(name="Event A", path="event-a") self.event_b = Event.objects.create(name="Event B", path="event-b") self.game = Game.objects.create(name="Test Game", path="test-game") self.submission_a = Submission.objects.create( event=self.event_a, game=self.game ) self.submission_b = Submission.objects.create( event=self.event_b, game=self.game ) def test_for_event_raises_outside_event_context(self): with self.assertRaises(ImproperlyConfigured): list(Submission.for_event.all()) def test_for_event_filters_to_current_event(self): token = current_event.set(self.event_a) try: results = list(Submission.for_event.all()) finally: current_event.reset(token) self.assertEqual(results, [self.submission_a]) class EventAvailabilityTests(TestCase): def setUp(self): from accounts.models import CustomUser self.hidden = Event.objects.create( name="Hidden", path="hidden", is_available=False ) self.user = CustomUser.objects.create_user(username="user", password="x") self.staff = CustomUser.objects.create_user( username="staff", password="x", is_staff=True ) def test_unavailable_event_is_404_for_regular_user(self): self.client.force_login(self.user) response = self.client.get(f"/{self.hidden.path}/market") self.assertEqual(response.status_code, 404) def test_unavailable_event_is_visible_to_staff(self): self.client.force_login(self.staff) response = self.client.get(f"/{self.hidden.path}/market") self.assertEqual(response.status_code, 200) def test_available_to_filters_for_regular_user_only(self): self.assertNotIn(self.hidden, Event.objects.available_to(self.user)) self.assertIn(self.hidden, Event.objects.available_to(self.staff)) def test_home_prefers_available_event_for_staff(self): available = Event.objects.create(name="Open", path="open") Event.objects.filter(pk=self.hidden.pk).update( created_at=available.created_at + timedelta(days=1) ) self.client.force_login(self.staff) response = self.client.get("/") self.assertRedirects( response, f"/{available.path}/", fetch_redirect_response=False )