|
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
|