|
import time
|
|
from datetime import datetime, timezone
|
|
|
|
import requests
|
|
|
|
from tests.conftest import BASE_URL
|
|
from devplacepy.database import get_table
|
|
from devplacepy.utils import generate_uid
|
|
|
|
_counter = [0]
|
|
AJAX = {"X-Requested-With": "fetch"}
|
|
|
|
|
|
def _session():
|
|
_counter[0] += 1
|
|
name = f"bkm{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 _make_post(owner_uid, title):
|
|
uid = generate_uid()
|
|
get_table("posts").insert({
|
|
"uid": uid, "user_uid": owner_uid, "slug": f"{uid[:8]}-bookmark-post",
|
|
"title": title, "content": "bookmark target content", "topic": "random",
|
|
"project_uid": None, "image": None, "stars": 0,
|
|
"created_at": datetime.now(timezone.utc).isoformat(),
|
|
})
|
|
return uid
|
|
|
|
|
|
def _make_gist(owner_uid, title):
|
|
uid = generate_uid()
|
|
get_table("gists").insert({
|
|
"uid": uid, "user_uid": owner_uid, "slug": f"{uid[:8]}-bookmark-gist",
|
|
"title": title, "description": None, "source_code": "print('x')",
|
|
"language": "python", "stars": 0,
|
|
"created_at": datetime.now(timezone.utc).isoformat(),
|
|
})
|
|
return uid
|
|
|
|
|
|
def test_bookmark_toggle_on(app_server):
|
|
s, name = _session()
|
|
post_uid = _make_post(_uid(name), "Bookmark toggle on")
|
|
r = s.post(f"{BASE_URL}/bookmarks/post/{post_uid}", headers=AJAX)
|
|
assert r.json() == {"saved": True}
|
|
assert get_table("bookmarks").count(user_uid=_uid(name), target_uid=post_uid) == 1
|
|
|
|
|
|
def test_bookmark_toggle_off(app_server):
|
|
s, name = _session()
|
|
post_uid = _make_post(_uid(name), "Bookmark toggle off")
|
|
s.post(f"{BASE_URL}/bookmarks/post/{post_uid}", headers=AJAX)
|
|
r = s.post(f"{BASE_URL}/bookmarks/post/{post_uid}", headers=AJAX)
|
|
assert r.json() == {"saved": False}
|
|
assert get_table("bookmarks").count(user_uid=_uid(name), target_uid=post_uid) == 0
|
|
|
|
|
|
def test_saved_page_lists_post_and_gist(app_server):
|
|
s, name = _session()
|
|
owner_uid = _uid(name)
|
|
post_title = f"Saved post {int(time.time() * 1000)}"
|
|
gist_title = f"Saved gist {int(time.time() * 1000)}"
|
|
post_uid = _make_post(owner_uid, post_title)
|
|
gist_uid = _make_gist(owner_uid, gist_title)
|
|
s.post(f"{BASE_URL}/bookmarks/post/{post_uid}", headers=AJAX)
|
|
s.post(f"{BASE_URL}/bookmarks/gist/{gist_uid}", headers=AJAX)
|
|
html = s.get(f"{BASE_URL}/bookmarks/saved").text
|
|
assert post_title in html
|
|
assert gist_title in html
|
|
|
|
|
|
def test_invalid_target_type_returns_400(app_server):
|
|
s, name = _session()
|
|
post_uid = _make_post(_uid(name), "Bad target")
|
|
r = s.post(f"{BASE_URL}/bookmarks/widget/{post_uid}", headers=AJAX)
|
|
assert r.status_code == 400
|
|
|
|
|
|
def test_bookmark_requires_login(app_server):
|
|
owner_s, owner_name = _session()
|
|
post_uid = _make_post(_uid(owner_name), "Needs login")
|
|
anon = requests.Session()
|
|
r = anon.post(f"{BASE_URL}/bookmarks/post/{post_uid}", headers=AJAX, allow_redirects=False)
|
|
assert r.status_code == 303
|
|
assert get_table("bookmarks").count(target_uid=post_uid) == 0
|