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