from datetime import datetime, timezone
from devplacepy.database import (
get_table,
get_users_by_uids,
get_vote_counts,
get_user_votes,
get_comment_counts_by_post_uids,
resolve_by_slug,
get_user_stars,
get_user_rank,
build_pagination,
)
from devplacepy.utils import generate_uid
def _now():
return datetime.now(timezone.utc).isoformat()
def _user():
uid = generate_uid()
get_table("users").insert({
"uid": uid, "username": f"dbh_{uid[:8]}", "email": f"{uid[:8]}@t.dev",
"created_at": _now(),
})
return uid
def _post(owner, **extra):
uid = generate_uid()
get_table("posts").insert({
"uid": uid, "user_uid": owner, "slug": f"{uid[:8]}-post",
"title": None, "content": "db helper post body", "topic": "random",
"project_uid": None, "image": None, "stars": 0, "created_at": _now(),
**extra,
})
return uid
def test_get_users_by_uids_dedupes(local_db):
a, b = generate_uid(), generate_uid()
users = get_table("users")
users.insert({"uid": a, "username": f"u_{a[:6]}", "created_at": _now()})
users.insert({"uid": b, "username": f"u_{b[:6]}", "created_at": _now()})
result = get_users_by_uids([a, b, a])
assert set(result.keys()) == {a, b}
def test_get_vote_counts_groups_up_and_down(local_db):
target = generate_uid()
votes = get_table("votes")
for value in (1, 1, -1):
votes.insert({
"uid": generate_uid(), "user_uid": generate_uid(),
"target_uid": target, "target_type": "post", "value": value,
"created_at": _now(),
})
ups, downs = get_vote_counts([target])
assert ups[target] == 2
assert downs[target] == 1
def test_get_user_votes_returns_user_value(local_db):
target = generate_uid()
user = generate_uid()
get_table("votes").insert({
"uid": generate_uid(), "user_uid": user,
"target_uid": target, "target_type": "post", "value": 1, "created_at": _now(),
})
assert get_user_votes(user, [target]) == {target: 1}
def test_get_comment_counts_by_post_uids(local_db):
post = generate_uid()
comments = get_table("comments")
for _ in range(2):
comments.insert({
"uid": generate_uid(), "user_uid": generate_uid(),
"target_type": "post", "target_uid": post, "content": "hi", "created_at": _now(),
})
assert get_comment_counts_by_post_uids([post]) == {post: 2}
def test_resolve_by_slug_finds_by_slug_or_uid(local_db):
owner = _user()
uid = _post(owner)
posts = get_table("posts")
slug = posts.find_one(uid=uid)["slug"]
assert resolve_by_slug(posts, slug)["uid"] == uid
assert resolve_by_slug(posts, uid)["uid"] == uid
assert resolve_by_slug(posts, "missing-slug-xyz") is None
def test_get_user_stars_sums_content_stars(local_db):
user = _user()
_post(user, stars=7)
assert get_user_stars(user) == 7
def test_get_user_rank_unknown_user_is_none(local_db):
assert get_user_rank(generate_uid()) is None
def test_build_pagination_metadata():
first = build_pagination(1, 100, 25)
assert first["total_pages"] == 4
assert first["has_prev"] is False
assert first["has_next"] is True
middle = build_pagination(2, 100, 25)
assert middle["has_prev"] is True
assert middle["has_next"] is True
clamped = build_pagination(99, 10, 25)
assert clamped["page"] == 1
assert clamped["total_pages"] == 1