test_octoeverywhere_images.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. """Oversized Gadget snapshots are reduced without changing ordinary frames."""
  2. from io import BytesIO
  3. import pytest
  4. from PIL import Image
  5. from backend.app.services.octoeverywhere_images import INVALID_IMAGE_MESSAGE, MAX_IMAGE_BYTES, prepare_frame
  6. @pytest.fixture(scope="module")
  7. def oversized_jpeg():
  8. with Image.effect_noise((3072, 2304), 100).convert("RGB") as image:
  9. output = BytesIO()
  10. exif = Image.Exif()
  11. exif[274] = 6 # The camera image should be displayed rotated clockwise.
  12. image.save(output, format="JPEG", quality=100, subsampling=0, exif=exif)
  13. frame = output.getvalue()
  14. assert len(frame) > MAX_IMAGE_BYTES
  15. return frame
  16. @pytest.mark.parametrize("size", [100, MAX_IMAGE_BYTES])
  17. def test_normal_frames_pass_through_without_decoding(size):
  18. # Deliberately not a valid JPEG: the size fast path must not decode it.
  19. frame = b"x" * size
  20. assert prepare_frame(frame) is frame
  21. def test_oversized_jpeg_is_valid_bounded_and_preserves_orientation(oversized_jpeg):
  22. prepared = prepare_frame(oversized_jpeg)
  23. assert 0 < len(prepared) <= MAX_IMAGE_BYTES
  24. with Image.open(BytesIO(prepared)) as image:
  25. image.load()
  26. assert image.format == "JPEG"
  27. assert image.mode == "RGB"
  28. assert image.width < image.height
  29. assert max(image.size) <= 2048
  30. assert image.getexif().get(274, 1) == 1
  31. def test_invalid_oversized_frame_returns_safe_error():
  32. frame = b"private-camera-data" * (MAX_IMAGE_BYTES // len(b"private-camera-data") + 1)
  33. with pytest.raises(ValueError, match=f"^{INVALID_IMAGE_MESSAGE}$") as error:
  34. prepare_frame(frame)
  35. assert "private-camera-data" not in str(error.value)
  36. assert error.value.__cause__ is None