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