- Freunde (freunde.py, Tabelle friendships): suchen, anfragen, annehmen, ablehnen, entfernen; neue Seite "Freunde" im Menü - Vorratslisten und Kanban-Projekte immer privat: sichtbar für Ersteller und Mitglieder; teilen nur mit Freunden (Admins: mit allen); Kanban-Mitglieder (Tabelle kanban_project_members), Bearbeiter nur aus dem Projekt, ausgetretene Mitglieder verlieren ihre Zuteilung - Artikel: lesen alle; bearbeiten Autor, Mitarbeitende verknüpfter Kanban-Projekte und Admins; verknüpfen nur bearbeitbare Artikel (sonst ließen sich Rechte erschleichen); Board-Liste auf der Artikelseite zeigt nur sichtbare Boards - Administratoren sehen und bearbeiten alles - Reisen: Städte nur von Freunden (Admins: alle); "Reiserouten zeigen" zeichnet die Strecken der Kilometer-Rechnung als Bögen - Migration Schritt 6: bisher gemeinsame Listen und alle Projekte bekommen die vorhandenen Konten als Mitglieder, ohne Ersteller → erster Admin; erste Liste einer neuen Installation gehört dem ersten Konto - Tests: test_freunde.py, test_zugriff.py, bestehende auf Privat-Modell umgestellt Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
60 lines
1.9 KiB
Python
60 lines
1.9 KiB
Python
"""Gemeinsame Test-Hilfen: jede Test-Funktion bekommt eine frische, leere Datenbank.
|
|
|
|
Die App liest den Datenordner beim Import; deshalb zeigt P42_DATA_DIR schon vorher auf einen
|
|
Wegwerf-Ordner. Pro Test wird db.DB_FILE auf eine neue Datei umgebogen und das Schema angelegt.
|
|
Hintergrund-Aufgaben (lifespan) laufen nicht, weil TestClient ohne "with" benutzt wird.
|
|
"""
|
|
import os
|
|
import sys
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
os.environ["P42_DATA_DIR"] = tempfile.mkdtemp(prefix="p42-test-")
|
|
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
|
|
|
|
import pytest # noqa: E402
|
|
from fastapi.testclient import TestClient # noqa: E402
|
|
|
|
from app import auth, db # noqa: E402
|
|
from app.main import app # noqa: E402
|
|
|
|
PASSWORD = "passwort123"
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def fresh_db(tmp_path, monkeypatch):
|
|
monkeypatch.setattr(db, "DB_FILE", tmp_path / "p42.db")
|
|
auth._failures.clear()
|
|
db.init()
|
|
return tmp_path / "p42.db"
|
|
|
|
|
|
@pytest.fixture
|
|
def conn(fresh_db):
|
|
c = db.connect()
|
|
yield c
|
|
c.close()
|
|
|
|
|
|
@pytest.fixture
|
|
def login():
|
|
"""login("anna", admin=True) → angemeldeter TestClient mit .user (id, name)."""
|
|
def make(username: str, admin: bool = False) -> TestClient:
|
|
with db.transaction() as c:
|
|
user_id = auth._create_user(c, username, username.capitalize(), PASSWORD, admin)
|
|
client = TestClient(app)
|
|
res = client.post("/api/auth/login", json={"username": username, "password": PASSWORD})
|
|
assert res.status_code == 200, res.text
|
|
client.user = {"id": user_id, "name": username.capitalize()}
|
|
return client
|
|
return make
|
|
|
|
|
|
@pytest.fixture
|
|
def befriend():
|
|
"""befriend(anna, ben): Freundschaftsanfrage + Annahme."""
|
|
def make(a: TestClient, b: TestClient) -> None:
|
|
a.post(f"/api/freunde/{b.user['id']}")
|
|
assert b.post(f"/api/freunde/{a.user['id']}").json()["friends"]
|
|
return make
|