|
import time
|
|
|
|
import requests
|
|
|
|
from tests.conftest import BASE_URL
|
|
from devplacepy.database import get_table
|
|
|
|
_counter = [0]
|
|
|
|
|
|
def _session():
|
|
_counter[0] += 1
|
|
name = f"flw{int(time.time() * 1000)}{_counter[0]}"
|
|
s = requests.Session()
|
|
s.post(f"{BASE_URL}/auth/signup", data={
|
|
"username": name, "email": f"{name}@t.dev",
|
|
"password": "secret123", "confirm_password": "secret123",
|
|
}, allow_redirects=True)
|
|
return s, name
|
|
|
|
|
|
def _uid(username):
|
|
return get_table("users").find_one(username=username)["uid"]
|
|
|
|
|
|
def test_follow_creates_notification_and_awards_xp(app_server):
|
|
s_a, a_name = _session()
|
|
_, b_name = _session()
|
|
a_uid, b_uid = _uid(a_name), _uid(b_name)
|
|
before = get_table("users").find_one(uid=b_uid).get("xp", 0) or 0
|
|
|
|
s_a.post(f"{BASE_URL}/follow/{b_name}", allow_redirects=False)
|
|
|
|
assert get_table("follows").count(follower_uid=a_uid, following_uid=b_uid) == 1
|
|
assert get_table("notifications").count(user_uid=b_uid, type="follow") == 1
|
|
after = get_table("users").find_one(uid=b_uid).get("xp", 0) or 0
|
|
assert after - before == 5
|
|
|
|
|
|
def test_duplicate_follow_is_idempotent(app_server):
|
|
s_a, a_name = _session()
|
|
_, b_name = _session()
|
|
a_uid, b_uid = _uid(a_name), _uid(b_name)
|
|
|
|
s_a.post(f"{BASE_URL}/follow/{b_name}", allow_redirects=False)
|
|
s_a.post(f"{BASE_URL}/follow/{b_name}", allow_redirects=False)
|
|
|
|
assert get_table("follows").count(follower_uid=a_uid, following_uid=b_uid) == 1
|
|
assert get_table("notifications").count(user_uid=b_uid, type="follow") == 1
|
|
|
|
|
|
def test_self_follow_rejected(app_server):
|
|
s_a, a_name = _session()
|
|
a_uid = _uid(a_name)
|
|
s_a.post(f"{BASE_URL}/follow/{a_name}", allow_redirects=False)
|
|
assert get_table("follows").count(follower_uid=a_uid, following_uid=a_uid) == 0
|
|
|
|
|
|
def test_follow_nonexistent_user_redirects(app_server):
|
|
s_a, _ = _session()
|
|
r = s_a.post(f"{BASE_URL}/follow/no_such_user_zzz", allow_redirects=False)
|
|
assert r.status_code == 302
|
|
|
|
|
|
def test_unfollow_removes_follow(app_server):
|
|
s_a, a_name = _session()
|
|
_, b_name = _session()
|
|
a_uid, b_uid = _uid(a_name), _uid(b_name)
|
|
|
|
s_a.post(f"{BASE_URL}/follow/{b_name}", allow_redirects=False)
|
|
s_a.post(f"{BASE_URL}/follow/unfollow/{b_name}", allow_redirects=False)
|
|
assert get_table("follows").count(follower_uid=a_uid, following_uid=b_uid) == 0
|
|
|
|
r = s_a.post(f"{BASE_URL}/follow/unfollow/{b_name}", allow_redirects=False)
|
|
assert r.status_code == 302
|