coulomb-social/tests/usecases/test_reichelag_browser.py
tegwick e43f17658a Render private space covers in Spaces list entries
Assistant: codex
Assistant-Model: gpt-6.1-sol
Assistant-Session: 01a11538-05ea-7b63-b3c7-a2df5f38898d
2026-10-07 13:47:12 +02:00

66 lines
3.1 KiB
Python

"""Actual browser user journey against an isolated Django live server."""
import base64
import json
import subprocess
from pathlib import Path
import pytest
from coulomb_social.apps.members.models import Member, User
from coulomb_social.apps.spaces import pageops
from coulomb_social.apps.spaces.models import SpaceMembership
from coulomb_social.apps.spaces.services import create_space, put_space_page
ROOT = Path(__file__).resolve().parents[2]
SCENARIO = ROOT / "tests/usecases/fixtures/reichelag-weekly-call.json"
@pytest.mark.usecase("CSOC-UC-008")
@pytest.mark.browser
@pytest.mark.django_db(transaction=True)
def test_weekly_call_through_real_ui(tmp_path, settings, request):
settings.DEBUG = True
settings.OIDC_ENABLED = False
settings.USER_ENGINE_BASE_URL = ""
settings.FLEX_AUTH_BASE_URL = ""
settings.FORGEJO_BASE_URL = ""
settings.CONTENT_ROOT = str(tmp_path / "content")
settings.STATIC_ROOT = str(tmp_path / "static")
scenario = json.loads(SCENARIO.read_text(encoding="utf-8"))
actors = {}
for role in ("writer", "reader", "outsider"):
subject = scenario[f"{role}_subject"]
actors[role] = Member.objects.create(
user=User.objects.create_user(username=subject), tenant_id=scenario["tenant"],
user_engine_user_id=subject, issuer="https://local.dev/issuer", subject=subject,
)
space = create_space(actors["writer"], title=scenario["space_title"],
slug=scenario["space_slug"], visual=scenario["visual"])
pageops.assets_dir(space.slug).joinpath("cover.png").write_bytes(
base64.b64decode(scenario["visual_base64"])
)
put_space_page(actors["writer"], space, scenario["previous_slug"],
title=scenario["previous_title"], body=scenario["previous_body"],
abstractor=scenario["abstractor"])
pageops.write_page(space.slug, scenario["previous_slug"],
title=scenario["previous_title"], body=scenario["previous_body"],
abstractor=scenario["abstractor"],
visual=scenario["visual"],
extra_meta={"source_id": "synthetic-record"})
SpaceMembership.objects.create(space=space, member=actors["reader"], role="viewer")
server = request.getfixturevalue("live_server")
result = subprocess.run(
["node", str(ROOT / "scripts/test-usecase-browser.mjs"), str(server), str(SCENARIO)],
cwd=ROOT, capture_output=True, text=True, timeout=120,
)
assert result.returncode == 0, result.stdout + result.stderr
# Browser POSTs must persist the new protocol without changing the old one.
assert (pageops.read_page(space.slug, scenario["previous_slug"]).body
== scenario["previous_body"])
assert pageops.read_page(space.slug, scenario["next_slug"]).body == scenario["next_body"]
assert not pageops.read_page(space.slug, scenario["generated_slug"]).exists
assert not pageops.read_page(space.slug, "unauthorized-rename").exists
assert (pageops.read_page(space.slug, scenario["next_slug"]).meta["source_id"]
== "synthetic-record")