Add personal notes, DeepSearch history, backup offload, and gateway auth throttling
DevPlace CI / test (push) Failing after 28m20s

Also streamline the top navigation: drop the Tools dropdown, make Quizzes
and Battles icon-only entries, and remove the Workspace, Containers and
Editor entry points from the project detail page.
This commit is contained in:
2026-09-12 20:32:31 +02:00
parent c4f7d01b2d
commit cae139ead9
158 changed files with 6156 additions and 377 deletions
+33
View File
@@ -37,6 +37,39 @@ def _upload_uploads(s, name="a.png"):
return r.json()["uid"]
JSON_search = {"Accept": "application/json"}
def test_search_recipients_includes_avatar_seed_for_custom_seed(app_server):
alice = _session_uploads()
bob, bob_name = _user_uploads("bob")
r = bob.post(
f"{BASE_URL}/profile/{bob_name}/regenerate-avatar",
headers=JSON_search,
)
assert r.status_code == 200, r.text[:300]
seed = r.json()["data"]["avatar_seed"]
assert seed
found = alice.get(f"{BASE_URL}/messages/search", params={"q": bob_name}).json()[
"results"
]
match = next(x for x in found if x["username"] == bob_name)
assert match["avatar_seed"] == seed
def test_search_recipients_avatar_seed_null_without_custom_seed(app_server):
alice = _session_uploads()
bob, bob_name = _user_uploads("bob")
found = alice.get(f"{BASE_URL}/messages/search", params={"q": bob_name}).json()[
"results"
]
match = next(x for x in found if x["username"] == bob_name)
assert match.get("avatar_seed") is None
def test_message_links_multiple_attachments(app_server):
alice = _session_uploads()
bob, bob_name = _user_uploads("bob")
+50
View File
@@ -207,6 +207,56 @@ def test_ws_sync_replays_messages_since(app_server):
asyncio.run(run())
def test_ws_active_marker_suppresses_message_notification(app_server):
sender_session, sender_name = _member()
receiver_session, receiver_name = _member()
sender_uid = _db_user(sender_name)["uid"]
receiver_uid = _db_user(receiver_name)["uid"]
async def run():
async with websockets.connect(
WS_URL, additional_headers=_cookie_header(receiver_session)
) as receiver_ws:
await _recv_until(receiver_ws, "ready")
await receiver_ws.send(
json.dumps({"type": "active", "with_uid": sender_uid})
)
asyncio.run(run())
resp = sender_session.post(
f"{BASE_URL}/messages/send",
headers={"Accept": "application/json"},
data={"content": "are you watching this", "receiver_uid": receiver_uid},
)
assert resp.status_code == 200
refresh_snapshot()
notifications = list(
get_table("notifications").find(user_uid=receiver_uid, type="message")
)
assert notifications == []
def test_ws_without_active_marker_still_notifies(app_server):
sender_session, _ = _member()
receiver_session, receiver_name = _member()
receiver_uid = _db_user(receiver_name)["uid"]
resp = sender_session.post(
f"{BASE_URL}/messages/send",
headers={"Accept": "application/json"},
data={"content": "hello without watching", "receiver_uid": receiver_uid},
)
assert resp.status_code == 200
refresh_snapshot()
notifications = list(
get_table("notifications").find(user_uid=receiver_uid, type="message")
)
assert len(notifications) == 1
def test_ws_ping_and_second_send_keep_the_socket_open(app_server):
sender_session, _ = _member()
receiver_session, receiver_name = _member()