|
# retoor <retoor@molodetz.nl>
|
|
|
|
from devplacepy.config import PRESENCE_ONLINE_LIMIT
|
|
from devplacepy.services.presence_relay import ROSTER_TOPIC, roster_payload
|
|
|
|
|
|
def _rows(count):
|
|
return [
|
|
{"uid": f"u{index:03d}", "username": f"user{index:03d}", "avatar_seed": None}
|
|
for index in range(count)
|
|
]
|
|
|
|
|
|
def test_roster_topic_is_the_single_presence_channel():
|
|
assert ROSTER_TOPIC == "public.presence.roster"
|
|
|
|
|
|
def test_payload_only_carries_the_online_set(local_db):
|
|
rows = _rows(4)
|
|
payload = roster_payload(rows, {"u000", "u002"})
|
|
assert payload["online"] == ["u000", "u002"]
|
|
assert [user["uid"] for user in payload["users"]] == ["u000", "u002"]
|
|
assert payload["count"] == 2
|
|
|
|
|
|
def test_dots_and_display_roster_come_from_one_set(local_db):
|
|
rows = _rows(PRESENCE_ONLINE_LIMIT + 7)
|
|
online = {row["uid"] for row in rows}
|
|
payload = roster_payload(rows, online)
|
|
# every online user is authoritative for their avatar dot...
|
|
assert set(payload["online"]) == online
|
|
# ...while the feed's avatar panel stays capped for display
|
|
assert len(payload["users"]) == PRESENCE_ONLINE_LIMIT
|
|
assert payload["count"] == PRESENCE_ONLINE_LIMIT
|
|
assert set(payload["online"]) >= {user["uid"] for user in payload["users"]}
|
|
|
|
|
|
def test_avatar_seed_falls_back_to_username(local_db):
|
|
payload = roster_payload([{"uid": "u1", "username": "ada", "avatar_seed": None}], {"u1"})
|
|
assert payload["users"][0]["avatar_seed"] == "ada"
|
|
|
|
|
|
def test_offline_users_are_absent_everywhere(local_db):
|
|
payload = roster_payload(_rows(3), set())
|
|
assert payload == {"count": 0, "online": [], "users": []}
|