forked from retoor/devplacepy
- Add `/block`, `/mute` endpoints with block/unblock and mute/unmute functionality in `routers/relations.py`, hiding blocked users' content everywhere except their own profile while muting only suppresses notifications - Introduce `devplace emoji-sync` CLI command to regenerate `static/js/emoji-shortcodes.js` from the emoji library, documented in `CLAUDE.md` and wired in `cli.py` - Create `get_blocked_uids()` database helper and apply it in `content.py` `load_detail()` to filter blocked users' posts from detail views - Implement `_uid_index()` and `_drop_index()` helpers in `database.py` for unique uid indexes across tables, with `user_relations` added to `SOFT_DELETE_TABLES` - Document new routes in `AGENTS.md` and `README.md`, including emoji shortcodes rendering behavior distinct from the emoji picker
87 lines
2.4 KiB
Python
87 lines
2.4 KiB
Python
# retoor <retoor@molodetz.nl>
|
|
|
|
from datetime import datetime, timezone
|
|
|
|
import pytest
|
|
from fastapi.testclient import TestClient
|
|
|
|
from devplacepy.database import get_table, purge, refresh_snapshot
|
|
from devplacepy.main import app
|
|
from devplacepy.services.manager import service_manager
|
|
from devplacepy.utils import generate_uid
|
|
|
|
|
|
def _seed_schema():
|
|
now = datetime.now(timezone.utc).isoformat()
|
|
users = get_table("users")
|
|
if "username" not in users.columns:
|
|
users.insert(
|
|
{
|
|
"uid": generate_uid(),
|
|
"username": "dbapi_seed",
|
|
"email": "seed@dbapi.test",
|
|
"role": "Member",
|
|
"xp": 0,
|
|
"level": 1,
|
|
"created_at": now,
|
|
}
|
|
)
|
|
bookmarks = get_table("bookmarks")
|
|
if "user_uid" not in bookmarks.columns:
|
|
seed = generate_uid()
|
|
bookmarks.insert(
|
|
{
|
|
"uid": seed,
|
|
"user_uid": "_seedcols",
|
|
"target_type": "post",
|
|
"target_uid": "_s",
|
|
"created_at": now,
|
|
"deleted_at": None,
|
|
"deleted_by": None,
|
|
}
|
|
)
|
|
purge("bookmarks", uid=seed)
|
|
refresh_snapshot()
|
|
|
|
|
|
@pytest.fixture(scope="module")
|
|
def client():
|
|
with TestClient(app) as test_client:
|
|
service_manager.set_lock_owner(True)
|
|
_seed_schema()
|
|
yield test_client
|
|
service_manager.set_lock_owner(False)
|
|
|
|
|
|
@pytest.fixture
|
|
def auth(client):
|
|
from devplacepy.database import get_primary_admin_uid, invalidate_admins_cache
|
|
from devplacepy.utils import clear_user_cache
|
|
|
|
users = get_table("users")
|
|
uid = get_primary_admin_uid()
|
|
if uid is None:
|
|
uid = generate_uid()
|
|
users.insert(
|
|
{
|
|
"uid": uid,
|
|
"username": f"dbapi_admin_{uid[:8]}",
|
|
"email": f"{uid[:8]}@dbapi.test",
|
|
"role": "Admin",
|
|
"api_key": f"dbapikey_{uid}",
|
|
"xp": 0,
|
|
"level": 1,
|
|
"created_at": datetime.now(timezone.utc).isoformat(),
|
|
}
|
|
)
|
|
invalidate_admins_cache()
|
|
refresh_snapshot()
|
|
admin = users.find_one(uid=uid)
|
|
key = admin.get("api_key")
|
|
if not key:
|
|
key = f"dbapikey_{uid}"
|
|
users.update({"uid": uid, "api_key": key}, ["uid"])
|
|
clear_user_cache(uid)
|
|
refresh_snapshot()
|
|
return {"X-API-KEY": key}
|