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