chore: enforce ruff lint and format standards across backend
This commit is contained in:
parent
a8e312a4f8
commit
a6cc585dd0
39 changed files with 459 additions and 559 deletions
|
|
@ -50,7 +50,9 @@ async def _login(client, session, email, role="member"):
|
|||
|
||||
|
||||
async def test_request_approve_consume_me_logout(client, session):
|
||||
assert (await client.post("/api/auth/admin-bootstrap", json={"email": ADMIN})).status_code == 201
|
||||
assert (
|
||||
await client.post("/api/auth/admin-bootstrap", json={"email": ADMIN})
|
||||
).status_code == 201
|
||||
admin = await _login(client, session, ADMIN, role="admin")
|
||||
assert admin["role"] == "admin"
|
||||
|
||||
|
|
@ -103,9 +105,7 @@ async def test_token_expiry_boundary(client, session):
|
|||
user = _get_or_make_user(session, MEMBER)
|
||||
token = service.issue_magic_token(session, user)
|
||||
record = session.exec(
|
||||
select(MagicLinkToken).where(
|
||||
MagicLinkToken.token_hash == service.hash_token(token)
|
||||
)
|
||||
select(MagicLinkToken).where(MagicLinkToken.token_hash == service.hash_token(token))
|
||||
).one()
|
||||
record.expires_at = service.utcnow() - timedelta(seconds=1)
|
||||
session.add(record)
|
||||
|
|
@ -145,9 +145,7 @@ async def test_admin_only_endpoints(client, session):
|
|||
async with AsyncClient(transport=transport, base_url="http://test") as anon:
|
||||
assert (await anon.get("/api/access/requests")).status_code == 401
|
||||
assert (
|
||||
await anon.post(
|
||||
f"/api/access/requests/{created.json()['id']}/approve"
|
||||
)
|
||||
await anon.post(f"/api/access/requests/{created.json()['id']}/approve")
|
||||
).status_code == 401
|
||||
assert (await anon.get("/api/auth/me")).status_code == 401
|
||||
|
||||
|
|
@ -156,9 +154,7 @@ async def test_approve_unknown_and_double_decide(client, session):
|
|||
await client.post("/api/auth/admin-bootstrap", json={"email": ADMIN})
|
||||
await _login(client, session, ADMIN, role="admin")
|
||||
|
||||
assert (
|
||||
await client.post(f"/api/access/requests/{uuid4()}/approve")
|
||||
).status_code == 404
|
||||
assert (await client.post(f"/api/access/requests/{uuid4()}/approve")).status_code == 404
|
||||
|
||||
created = await client.post(
|
||||
"/api/access/requests",
|
||||
|
|
@ -246,9 +242,7 @@ def test_magic_link_delivery_failure_returns_false(monkeypatch):
|
|||
monkeypatch.setattr(settings, "smtp_host", "dummy")
|
||||
_broken_smtp(monkeypatch)
|
||||
assert mail.send_magic_link("a@example.com", "http://x/login?token=t") is False
|
||||
assert (
|
||||
mail.send_access_notification("req-1", "A", "a@example.com") is False
|
||||
)
|
||||
assert mail.send_access_notification("req-1", "A", "a@example.com") is False
|
||||
|
||||
|
||||
async def test_approve_survives_delivery_failure(client, session, monkeypatch):
|
||||
|
|
@ -261,9 +255,7 @@ async def test_approve_survives_delivery_failure(client, session, monkeypatch):
|
|||
json={"name": "M", "email": "m@example.com", "reason": ""},
|
||||
)
|
||||
assert created.status_code == 201, created.text
|
||||
approved = await client.post(
|
||||
f"/api/access/requests/{created.json()['id']}/approve"
|
||||
)
|
||||
approved = await client.post(f"/api/access/requests/{created.json()['id']}/approve")
|
||||
assert approved.status_code == 200, approved.text
|
||||
body = approved.json()
|
||||
assert body["request"]["status"] == "approved"
|
||||
|
|
@ -272,9 +264,7 @@ async def test_approve_survives_delivery_failure(client, session, monkeypatch):
|
|||
|
||||
async def test_magic_request_for_known_user(client, session):
|
||||
_get_or_make_user(session, MEMBER)
|
||||
response = await client.post(
|
||||
"/api/auth/magic/request", json={"email": MEMBER}
|
||||
)
|
||||
response = await client.post("/api/auth/magic/request", json={"email": MEMBER})
|
||||
assert response.status_code == 200, response.text
|
||||
body = response.json()
|
||||
assert body["message"] == "login link sent"
|
||||
|
|
@ -282,24 +272,19 @@ async def test_magic_request_for_known_user(client, session):
|
|||
assert "token" not in response.text
|
||||
tokens = session.exec(
|
||||
select(MagicLinkToken).where(
|
||||
MagicLinkToken.user_id
|
||||
== service.get_user_by_email(session, MEMBER).id
|
||||
MagicLinkToken.user_id == service.get_user_by_email(session, MEMBER).id
|
||||
)
|
||||
).all()
|
||||
assert len(tokens) == 1
|
||||
|
||||
|
||||
async def test_magic_request_unknown_email_403(client):
|
||||
response = await client.post(
|
||||
"/api/auth/magic/request", json={"email": "stranger@example.com"}
|
||||
)
|
||||
response = await client.post("/api/auth/magic/request", json={"email": "stranger@example.com"})
|
||||
assert response.status_code == 403
|
||||
|
||||
|
||||
async def test_magic_request_admin_email_creates_admin(client, session):
|
||||
response = await client.post(
|
||||
"/api/auth/magic/request", json={"email": ADMIN}
|
||||
)
|
||||
response = await client.post("/api/auth/magic/request", json={"email": ADMIN})
|
||||
assert response.status_code == 200, response.text
|
||||
user = service.get_user_by_email(session, ADMIN)
|
||||
assert user is not None and user.role == "admin"
|
||||
|
|
@ -308,13 +293,9 @@ async def test_magic_request_admin_email_creates_admin(client, session):
|
|||
async def test_magic_request_rate_limit(client, session):
|
||||
_get_or_make_user(session, MEMBER)
|
||||
for _ in range(service.MAGIC_LINKS_PER_EMAIL_PER_HOUR):
|
||||
response = await client.post(
|
||||
"/api/auth/magic/request", json={"email": MEMBER}
|
||||
)
|
||||
response = await client.post("/api/auth/magic/request", json={"email": MEMBER})
|
||||
assert response.status_code == 200, response.text
|
||||
limited = await client.post(
|
||||
"/api/auth/magic/request", json={"email": MEMBER}
|
||||
)
|
||||
limited = await client.post("/api/auth/magic/request", json={"email": MEMBER})
|
||||
assert limited.status_code == 429
|
||||
|
||||
|
||||
|
|
@ -331,9 +312,7 @@ def test_magic_link_mail_has_clickable_branded_html(monkeypatch):
|
|||
button_url="http://localhost:3000/login?token=GEHEIM",
|
||||
note="Gültig 15 Minuten.",
|
||||
)
|
||||
html_part = next(
|
||||
p for p in message.walk() if p.get_content_type() == "text/html"
|
||||
)
|
||||
html_part = next(p for p in message.walk() if p.get_content_type() == "text/html")
|
||||
html = html_part.get_content()
|
||||
# Button = anchor with href around the label; token never in text-only form.
|
||||
assert '<a href="http://localhost:3000/login?token=GEHEIM"' in html
|
||||
|
|
@ -343,7 +322,5 @@ def test_magic_link_mail_has_clickable_branded_html(monkeypatch):
|
|||
# Multipart: plain-text fallback keeps the raw link.
|
||||
parts = [p.get_content_type() for p in message.walk()]
|
||||
assert "text/plain" in parts and "text/html" in parts
|
||||
plain = next(
|
||||
p.get_content() for p in message.walk() if p.get_content_type() == "text/plain"
|
||||
)
|
||||
plain = next(p.get_content() for p in message.walk() if p.get_content_type() == "text/plain")
|
||||
assert "http://localhost:3000/login?token=GEHEIM" in plain
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue