coulomb-social/tests/usecases/test_communication_browser.py
tegwick 268a9421ff
Some checks failed
Use-case regression gate / usecase-regressions (push) Has been cancelled
Bind loopback communication journeys for WP-0015-T04
Exercise reset, registration and invitation against an isolated issuer
and mailbox. The nodes stay unestablished and do not contact production.

Assistant: grok
Assistant-Session: 01a12cc2-e3b2-77a3-8aef-9cc60e577fee
2026-10-11 23:46:54 +02:00

70 lines
2.7 KiB
Python

"""Isolated issuer, directory and mailbox journey. No production URL or SMTP."""
import subprocess
from pathlib import Path
import pytest
from coulomb_social.apps.members.models import Member, User
from tests.isolated_issuer import CLIENT_ID, TENANT, IsolatedIssuer
ROOT = Path(__file__).resolve().parents[2]
PASSWORD = "synthetic-reset-secret"
@pytest.mark.usecase("CSOC-UC-009")
@pytest.mark.usecase("CSOC-UC-010")
@pytest.mark.usecase("CSOC-UC-011")
@pytest.mark.browser
@pytest.mark.django_db(transaction=True)
def test_isolated_recovery_registration_and_invitation(tmp_path, settings, request):
issuer = IsolatedIssuer()
issuer.start()
try:
settings.DEBUG = True
settings.OIDC_ENABLED = True
settings.OIDC_ISSUER = issuer.base
settings.OIDC_DISCOVERY_URL = ""
settings.OIDC_CLIENT_ID = CLIENT_ID
settings.OIDC_CLIENT_SECRET = ""
settings.OIDC_SCOPES = "openid profile email"
settings.USER_ENGINE_BASE_URL = ""
settings.USER_ENGINE_PROXY_SECRET = ""
settings.FLEX_AUTH_BASE_URL = ""
settings.FORGEJO_BASE_URL = ""
settings.CONTENT_ROOT = str(tmp_path / "content")
settings.NETKINGDOM_REGISTRATION_URL = issuer.base + "/register"
server = request.getfixturevalue("live_server")
redirect = server.url.rstrip("/") + "/auth/callback/"
settings.OIDC_REDIRECT_URI = redirect
issuer.allow_redirect(redirect)
result = subprocess.run(
[
"node",
str(ROOT / "scripts/test-communication-browser.mjs"),
str(server),
issuer.base,
PASSWORD,
],
cwd=ROOT,
capture_output=True,
text=True,
timeout=120,
)
assert result.returncode == 0, result.stdout + result.stderr
assert PASSWORD not in result.stdout
recovered = Member.objects.get(subject="member-recovered")
other = Member.objects.get(subject="member-other")
assert recovered.pk != other.pk
assert recovered.user_id != other.user_id
assert recovered.email == other.email == "member@example.test"
assert recovered.tenant_id == other.tenant_id == TENANT
assert {recovered.issuer, other.issuer} == {issuer.base}
for user in User.objects.all():
assert not user.has_usable_password()
assert PASSWORD not in repr(issuer.password_hashes)
assert any(item["state"] == "consumed" and item["kind"] == "verification"
for item in issuer.messages)
assert sum(item["kind"] == "invitation" for item in issuer.messages) == 2
finally:
issuer.stop()