feat: add final.png export
This commit is contained in:
@@ -1,9 +1,11 @@
|
||||
from datetime import timedelta
|
||||
from io import BytesIO
|
||||
from unittest import mock
|
||||
|
||||
from django.core.cache import cache
|
||||
from django.test import TestCase, override_settings
|
||||
from django.utils import timezone
|
||||
from PIL import Image
|
||||
|
||||
from accounts.models import CustomUser
|
||||
from events.models import Event
|
||||
@@ -15,6 +17,7 @@ from .wire import to_epoch_ms
|
||||
|
||||
URL = "/api/events/event/place/stats"
|
||||
CANVAS_URL = "/api/events/event/place/canvas"
|
||||
FINAL_URL = "/api/events/event/place/final.png"
|
||||
LOCMEM_CACHE = {"default": {"BACKEND": "django.core.cache.backends.locmem.LocMemCache"}}
|
||||
|
||||
|
||||
@@ -94,6 +97,45 @@ class PlaceStatsTests(TestCase):
|
||||
self.assertEqual(sum(row["placements"] for row in data["per_hour"]), 5)
|
||||
|
||||
|
||||
@mock.patch("place.export.read_canvas")
|
||||
class FinalPngTests(TestCase):
|
||||
def setUp(self):
|
||||
self.event = Event.objects.create(name="Event", path="event")
|
||||
place = Game.objects.create(name="Place", path="place", custom_path=True)
|
||||
EventGame.objects.create(event=self.event, game=place)
|
||||
PlaceSettings.objects.create(
|
||||
event=self.event,
|
||||
width=2,
|
||||
height=1,
|
||||
# Ended, the real board is still exported
|
||||
placement_ends_at=timezone.now() - timedelta(hours=1),
|
||||
)
|
||||
self.alice = CustomUser.objects.create_user(username="alice", password="x")
|
||||
self.admin = CustomUser.objects.create_user(
|
||||
username="admin", password="x", is_staff=True
|
||||
)
|
||||
|
||||
def test_requires_staff(self, _):
|
||||
self.client.force_login(self.alice)
|
||||
|
||||
response = self.client.get(FINAL_URL)
|
||||
|
||||
self.assertEqual(response.status_code, 401)
|
||||
|
||||
def test_final_png(self, read_canvas):
|
||||
# Short canvas, Redis only padded up to the last written pixel
|
||||
read_canvas.return_value = bytes([5])
|
||||
self.client.force_login(self.admin)
|
||||
|
||||
response = self.client.get(FINAL_URL)
|
||||
|
||||
self.assertEqual(response["Content-Type"], "image/png")
|
||||
image = Image.open(BytesIO(response.content))
|
||||
self.assertEqual(image.size, (16, 8))
|
||||
self.assertEqual(image.getpixel((0, 0)), (229, 0, 0))
|
||||
self.assertEqual(image.getpixel((15, 0)), (255, 255, 255))
|
||||
|
||||
|
||||
@override_settings(CACHES=LOCMEM_CACHE)
|
||||
@mock.patch("place.signals.rebuild_canvas_from_history")
|
||||
class PlacementEndTests(TestCase):
|
||||
|
||||
Reference in New Issue
Block a user