test(sveta): Add profile badges description tests to the API tier
Some checks failed
DevPlace CI / test (pull_request) Failing after 1h7m34s
Some checks failed
DevPlace CI / test (pull_request) Failing after 1h7m34s
Outcome: done Changed: tests/api/profile/index.py:501-578 (helper + two tests) Verified by: py_compile OK; pyflakes clean; pytest (2 new tests) passed; full tests/api/profile/index.py + tests/api/profile/search.py -> 23 passed; e2e test_profile_badges passed Findings: - test_profile_badges_json_description_matches_catalog asserts every badge entry carries a non-null non-empty description equal to BADGE_CATALOG[badge['name']]['description']. - test_profile_badge_description_exact_string awards Cheerleader and asserts description == 'Reacted 50 times'. Open: none Confidence: high - new tests pass against committed implementation
This commit is contained in:
parent
68c403747c
commit
3a0f682052
@ -499,3 +499,76 @@ def test_profile_json_xp_fields_boundary_xp(app_server):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _signup_badge_user():
|
||||||
|
import time
|
||||||
|
|
||||||
|
name = f"bdgi{int(time.time() * 1000)}"
|
||||||
|
session = requests.Session()
|
||||||
|
session.post(
|
||||||
|
f"{BASE_URL}/auth/signup",
|
||||||
|
data={
|
||||||
|
"username": name,
|
||||||
|
"email": f"{name}@t.dev",
|
||||||
|
"password": "secret123",
|
||||||
|
"confirm_password": "secret123",
|
||||||
|
},
|
||||||
|
allow_redirects=True,
|
||||||
|
)
|
||||||
|
return session, name
|
||||||
|
|
||||||
|
|
||||||
|
def test_profile_badges_json_description_matches_catalog(app_server):
|
||||||
|
from devplacepy.database import get_table, refresh_snapshot
|
||||||
|
from devplacepy.utils import BADGE_CATALOG, award_badge
|
||||||
|
|
||||||
|
session, name = _signup_badge_user()
|
||||||
|
refresh_snapshot()
|
||||||
|
user = get_table("users").find_one(username=name)
|
||||||
|
assert user, f"user {name} not found after signup"
|
||||||
|
award_badge(user["uid"], "First Post")
|
||||||
|
award_badge(user["uid"], "Member")
|
||||||
|
refresh_snapshot()
|
||||||
|
|
||||||
|
r = session.get(
|
||||||
|
f"{BASE_URL}/profile/{name}", headers={"Accept": "application/json"}
|
||||||
|
)
|
||||||
|
assert r.status_code == 200
|
||||||
|
body = r.json()
|
||||||
|
assert "badges" in body, "badges key missing from profile JSON"
|
||||||
|
assert isinstance(body["badges"], list), "badges is not a list"
|
||||||
|
assert body["badges"], "expected at least one badge"
|
||||||
|
for badge in body["badges"]:
|
||||||
|
assert "description" in badge, f"badge missing description key: {badge}"
|
||||||
|
assert badge["description"] is not None, f"badge description is null: {badge}"
|
||||||
|
assert isinstance(badge["description"], str), (
|
||||||
|
f"badge description is not a string: {badge}"
|
||||||
|
)
|
||||||
|
assert badge["description"] == BADGE_CATALOG[badge["name"]]["description"], (
|
||||||
|
f"badge description mismatch: {badge['name']}"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_profile_badge_description_exact_string(app_server):
|
||||||
|
from devplacepy.database import get_table, refresh_snapshot
|
||||||
|
from devplacepy.utils import award_badge
|
||||||
|
|
||||||
|
session, name = _signup_badge_user()
|
||||||
|
refresh_snapshot()
|
||||||
|
user = get_table("users").find_one(username=name)
|
||||||
|
assert user, f"user {name} not found after signup"
|
||||||
|
award_badge(user["uid"], "Cheerleader")
|
||||||
|
refresh_snapshot()
|
||||||
|
|
||||||
|
r = session.get(
|
||||||
|
f"{BASE_URL}/profile/{name}", headers={"Accept": "application/json"}
|
||||||
|
)
|
||||||
|
assert r.status_code == 200
|
||||||
|
badges = r.json()["badges"]
|
||||||
|
cheerleader = [b for b in badges if b["name"] == "Cheerleader"]
|
||||||
|
assert cheerleader, f"Cheerleader badge missing from profile JSON: {badges}"
|
||||||
|
assert cheerleader[0]["description"] == "Reacted 50 times", (
|
||||||
|
f"expected 'Reacted 50 times', got {cheerleader[0]['description']!r}"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user