feat(v1): add basic backend and frontend

This commit is contained in:
2026-07-09 00:37:41 +03:30
parent d9eedb3d8e
commit ae240e7ac1
54 changed files with 5829 additions and 0 deletions

View File

@@ -0,0 +1,64 @@
import tempfile
from io import BytesIO
from pathlib import Path
from unittest.mock import patch
from django.core.files.uploadedfile import SimpleUploadedFile
from django.test import TestCase, override_settings
from PIL import Image
from rest_framework.test import APIClient
def png_upload(color=(32, 64, 128), size=(4, 4), name="sample.png"):
buffer = BytesIO()
Image.new("RGB", size, color).save(buffer, format="PNG")
return SimpleUploadedFile(name, buffer.getvalue(), content_type="image/png")
class ApiTests(TestCase):
def setUp(self):
self.tmp = tempfile.TemporaryDirectory()
self.override = override_settings(MEDIA_ROOT=Path(self.tmp.name), IMAGE_SESSION_TTL_HOURS=1)
self.override.enable()
self.client = APIClient()
def tearDown(self):
self.override.disable()
self.tmp.cleanup()
def test_upload_and_process(self):
upload = self.client.post("/api/images/", {"image": png_upload()}, format="multipart")
self.assertEqual(upload.status_code, 201)
session_id = upload.data["session_id"]
self.assertEqual(len(upload.data["original_histogram"]), 256)
processed = self.client.post(
"/api/process/",
{"session_id": session_id, "operation": "gamma", "params": {"gamma": 1, "c": 1}},
format="json",
)
self.assertEqual(processed.status_code, 200)
self.assertEqual(len(processed.data["processed_histogram"]), 256)
self.assertTrue(processed.data["image_data"].startswith("data:image/png;base64,"))
def test_invalid_kernel_rejected(self):
upload = self.client.post("/api/images/", {"image": png_upload()}, format="multipart")
processed = self.client.post(
"/api/process/",
{"session_id": upload.data["session_id"], "operation": "median_filter", "params": {"size": 4}},
format="json",
)
self.assertEqual(processed.status_code, 400)
@patch("processing.services.run_batch_job.delay")
def test_batch_returns_job_id(self, delay):
first = self.client.post("/api/images/", {"image": png_upload(name="a.png")}, format="multipart")
second = self.client.post("/api/images/", {"image": png_upload(color=(96, 96, 96), name="b.png")}, format="multipart")
response = self.client.post(
"/api/batch/",
{"operation": "average", "session_ids": [first.data["session_id"], second.data["session_id"]]},
format="json",
)
self.assertEqual(response.status_code, 202)
self.assertIn("job_id", response.data)
delay.assert_called_once()