All checks were successful
Deploy Development / deploy (push) Successful in 37s
Test Suite / pytest-backend (push) Successful in 25s
Test Suite / lint-backend (push) Successful in 0s
Test Suite / build-frontend (push) Successful in 7s
Test Suite / playwright-tests (push) Successful in 24s
- Added functionality for inline media references in exercise text using `{{exerciseMedia:id}}` syntax, which normalizes to a canonical `<span>` element.
- Updated the frontend to utilize `ExerciseRichTextBlock` for rendering exercise content, allowing for embedded media display.
- Enhanced the Rich Text Editor to support inserting inline media placeholders.
- Version bump to 0.8.60 to reflect these changes in media handling and exercise content management.
52 lines
1.4 KiB
Python
52 lines
1.4 KiB
Python
"""POST /api/exercises: keine Inline-Medien-Platzhalter beim ersten Anlegen (§11)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
|
|
import pytest
|
|
from fastapi.testclient import TestClient
|
|
|
|
os.environ.setdefault("SKIP_DB_MIGRATE", "1")
|
|
|
|
from auth import require_auth
|
|
from main import app
|
|
from tenant_context import TenantContext, get_tenant_context
|
|
|
|
|
|
@pytest.fixture
|
|
def client() -> TestClient:
|
|
return TestClient(app)
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def _clear_overrides() -> None:
|
|
yield
|
|
app.dependency_overrides.pop(require_auth, None)
|
|
app.dependency_overrides.pop(get_tenant_context, None)
|
|
|
|
|
|
def test_post_exercise_rejects_inline_media_placeholder(client: TestClient) -> None:
|
|
app.dependency_overrides[require_auth] = lambda: {"profile_id": 1, "role": "trainer"}
|
|
app.dependency_overrides[get_tenant_context] = lambda: TenantContext(
|
|
profile_id=1,
|
|
global_role="trainer",
|
|
effective_club_id=5,
|
|
club_ids=frozenset({5}),
|
|
memberships=[],
|
|
)
|
|
r = client.post(
|
|
"/api/exercises",
|
|
json={
|
|
"title": "Mit Inline",
|
|
"goal": "<p>Hallo {{exerciseMedia:7}}</p>",
|
|
"execution": "<p>Schritt</p>",
|
|
"visibility": "private",
|
|
"status": "draft",
|
|
},
|
|
headers={"X-Auth-Token": "x"},
|
|
)
|
|
assert r.status_code == 400
|
|
j = r.json()
|
|
assert j.get("detail", {}).get("code") == "INLINE_EXERCISE_MEDIA_ON_CREATE"
|