test_content_size_middleware.py
python
sha256:3ff9c9863a9891bdcde71b4a43228f66d0493e38b7cc1d09fe9eb7de774046b2
feat: add repair-commit wire endpoint (API parity with repa…
Opus 4.8
minor
⚠ breaking
1 day ago
| 1 | """Tests for ContentSizeLimitMiddleware (checklist 2.3 — body size cap).""" |
| 2 | from __future__ import annotations |
| 3 | |
| 4 | import pytest |
| 5 | from httpx import AsyncClient |
| 6 | |
| 7 | from musehub.middleware.content_size import API_MAX_BYTES, PUSH_MAX_BYTES |
| 8 | |
| 9 | |
| 10 | async def test_api_request_within_limit_passes( |
| 11 | client: AsyncClient, |
| 12 | ) -> None: |
| 13 | """A body under 10 MB on an API route must not be rejected by the middleware.""" |
| 14 | small_body = b"x" * 1024 # 1 KB |
| 15 | resp = await client.post( |
| 16 | "/api/repos", |
| 17 | content=small_body, |
| 18 | headers={"Content-Type": "application/json", "Content-Length": str(len(small_body))}, |
| 19 | ) |
| 20 | # May be 422 (invalid JSON) or 401 (auth required) — not 413 |
| 21 | assert resp.status_code != 413 |
| 22 | |
| 23 | |
| 24 | async def test_api_request_over_limit_returns_413( |
| 25 | client: AsyncClient, |
| 26 | ) -> None: |
| 27 | """Content-Length over 10 MB on a non-push route must return 413.""" |
| 28 | over_limit = API_MAX_BYTES + 1 |
| 29 | resp = await client.post( |
| 30 | "/api/repos", |
| 31 | headers={"Content-Length": str(over_limit)}, |
| 32 | content=b"", # actual body irrelevant — Content-Length header drives the check |
| 33 | ) |
| 34 | assert resp.status_code == 413 |
| 35 | assert "too large" in resp.json()["detail"].lower() |
| 36 | |
| 37 | |
| 38 | async def test_push_mpack_presign_under_push_limit_not_rejected( |
| 39 | client: AsyncClient, |
| 40 | ) -> None: |
| 41 | """Content-Length under 500 MB on push/mpack-presign must not be rejected.""" |
| 42 | import json |
| 43 | body = json.dumps({"mpack_key": "sha256:" + "a" * 64, "size_bytes": 1024}).encode() |
| 44 | # No auth → will get 401, but that's AFTER the size check — must not be 413 |
| 45 | resp = await client.post( |
| 46 | "/gabriel/my-repo/push/mpack-presign", |
| 47 | content=body, |
| 48 | headers={"Content-Type": "application/json"}, |
| 49 | ) |
| 50 | assert resp.status_code != 413 |
| 51 | |
| 52 | |
| 53 | async def test_push_mpack_presign_over_api_limit_but_under_push_limit_allowed( |
| 54 | client: AsyncClient, |
| 55 | ) -> None: |
| 56 | """A 20 MB Content-Length on push/mpack-presign must NOT return 413 (push limit is 500 MB).""" |
| 57 | over_api_limit = API_MAX_BYTES * 2 # 20 MB — over API limit but under push limit |
| 58 | resp = await client.post( |
| 59 | "/gabriel/my-repo/push/mpack-presign", |
| 60 | headers={"Content-Length": str(over_api_limit)}, |
| 61 | content=b"", |
| 62 | ) |
| 63 | # Should get 401 (no auth) or 422 (bad body) — not 413 |
| 64 | assert resp.status_code != 413 |
| 65 | |
| 66 | |
| 67 | async def test_push_mpack_presign_path_uses_push_limit( |
| 68 | client: AsyncClient, |
| 69 | ) -> None: |
| 70 | """/{owner}/{slug}/push/mpack-presign must use the 500 MB limit, not 10 MB.""" |
| 71 | over_api_limit = API_MAX_BYTES + 1 |
| 72 | resp = await client.post( |
| 73 | "/gabriel/my-repo/push/mpack-presign", |
| 74 | headers={"Content-Length": str(over_api_limit)}, |
| 75 | content=b"", |
| 76 | ) |
| 77 | assert resp.status_code != 413 |
| 78 | |
| 79 | |
| 80 | def test_limits_are_correct_values() -> None: |
| 81 | assert API_MAX_BYTES == 10 * 1024 * 1024 |
| 82 | assert PUSH_MAX_BYTES == 500 * 1024 * 1024 |
File History
1 commit
sha256:3ff9c9863a9891bdcde71b4a43228f66d0493e38b7cc1d09fe9eb7de774046b2
feat: add repair-commit wire endpoint (API parity with repa…
Opus 4.8
minor
⚠
1 day ago