forked from retoor/devplacepy
ticket #150 attempt 1
This commit is contained in:
@@ -1,10 +1,12 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
|
||||
import time
|
||||
from datetime import datetime, timezone
|
||||
import pytest
|
||||
import requests
|
||||
from tests.conftest import BASE_URL
|
||||
from devplacepy.database import get_table, refresh_snapshot, set_setting
|
||||
from devplacepy.utils import generate_uid, make_combined_slug
|
||||
|
||||
_counter_dr = [0]
|
||||
|
||||
@@ -46,10 +48,13 @@ def _register(password="secret123"):
|
||||
raise AssertionError("registration did not open")
|
||||
|
||||
|
||||
def _create_rant(params, text="this is a devrant rant body", tags="dev,test"):
|
||||
def _create_rant(params, text="this is a devrant rant body", tags="dev,test", project_uid=None):
|
||||
data = {**params, "rant": text, "tags": tags}
|
||||
if project_uid:
|
||||
data["project_uid"] = project_uid
|
||||
r = requests.post(
|
||||
f"{BASE_URL}/api/devrant/rants",
|
||||
data={**params, "rant": text, "tags": tags},
|
||||
data=data,
|
||||
)
|
||||
return r
|
||||
|
||||
@@ -235,3 +240,43 @@ def test_search_returns_results_shape(app_server):
|
||||
r = requests.get(f"{BASE_URL}/api/devrant/search", params={"term": "uniquesearchtoken"})
|
||||
assert r.json()["success"] is True
|
||||
assert isinstance(r.json()["results"], list)
|
||||
|
||||
|
||||
def test_rant_serialization_includes_project(app_server):
|
||||
name, params = _register()
|
||||
refresh_snapshot()
|
||||
user = get_table("users").find_one(username=name)
|
||||
uid = user["uid"]
|
||||
project_uid = generate_uid()
|
||||
slug = make_combined_slug("project-for-rant", project_uid)
|
||||
projects = get_table("projects")
|
||||
projects.insert({
|
||||
"uid": project_uid,
|
||||
"user_uid": uid,
|
||||
"slug": slug,
|
||||
"title": "Project For Rant",
|
||||
"description": "project linked to a rant",
|
||||
"project_type": "software",
|
||||
"status": "In Development",
|
||||
"stars": 0,
|
||||
"created_at": datetime.now(timezone.utc).isoformat(),
|
||||
"deleted_at": None,
|
||||
"deleted_by": None,
|
||||
})
|
||||
refresh_snapshot()
|
||||
rant_id = _create_rant(
|
||||
params,
|
||||
text="rant with a project link here",
|
||||
tags="dev",
|
||||
project_uid=project_uid,
|
||||
).json()["rant_id"]
|
||||
refresh_snapshot()
|
||||
rant = requests.get(
|
||||
f"{BASE_URL}/api/devrant/rants/{rant_id}",
|
||||
params=params,
|
||||
).json()["rant"]
|
||||
assert rant.get("project_uid") == project_uid
|
||||
assert rant.get("project") is not None
|
||||
assert rant["project"]["uid"] == project_uid
|
||||
assert rant["project"]["name"] == "Project For Rant"
|
||||
assert "/projects/" in rant["project"]["url"]
|
||||
|
||||
@@ -716,3 +716,69 @@ def test_short_post_content_rejected(app_server):
|
||||
allow_redirects=False,
|
||||
)
|
||||
assert "/posts/" not in (r.headers.get("location") or "")
|
||||
|
||||
|
||||
def _new_project(session):
|
||||
return session.post(
|
||||
f"{BASE_URL}/projects/create",
|
||||
headers=JSON_audit_log,
|
||||
data={
|
||||
"title": _unique("aupj"),
|
||||
"description": "project for linked post test",
|
||||
"project_type": "software",
|
||||
"status": "In Development",
|
||||
"platforms": "",
|
||||
},
|
||||
).json()["data"]
|
||||
|
||||
|
||||
def test_post_detail_includes_project_when_linked(app_server):
|
||||
s, _ = _member()
|
||||
project = _new_project(s)
|
||||
project_uid = project["uid"]
|
||||
created = s.post(
|
||||
f"{BASE_URL}/posts/create",
|
||||
headers=JSON_audit_log,
|
||||
data={
|
||||
"title": _unique("aupjpost"),
|
||||
"content": "this post is linked to a project",
|
||||
"topic": "devlog",
|
||||
"project_uid": project_uid,
|
||||
},
|
||||
).json()["data"]
|
||||
slug = created["slug"]
|
||||
detail = s.get(
|
||||
f"{BASE_URL}/posts/{slug}",
|
||||
headers=JSON_audit_log,
|
||||
).json()
|
||||
assert detail.get("project_link") is not None, "linked project must appear in post detail"
|
||||
assert detail["project_link"]["uid"] == project_uid
|
||||
assert detail["project_link"]["name"] is not None
|
||||
assert "/projects/" in detail["project_link"]["url"]
|
||||
|
||||
|
||||
def test_feed_includes_project_when_linked(app_server):
|
||||
s, _ = _member()
|
||||
project = _new_project(s)
|
||||
project_uid = project["uid"]
|
||||
s.post(
|
||||
f"{BASE_URL}/posts/create",
|
||||
headers=JSON_audit_log,
|
||||
data={
|
||||
"title": _unique("aupjfeed"),
|
||||
"content": "this post appears in feed with a project link",
|
||||
"topic": "devlog",
|
||||
"project_uid": project_uid,
|
||||
},
|
||||
)
|
||||
feed = s.get(
|
||||
f"{BASE_URL}/feed",
|
||||
headers=JSON_audit_log,
|
||||
).json()
|
||||
found = False
|
||||
for item in feed["posts"]:
|
||||
if item.get("project_link") is not None and item["project_link"]["uid"] == project_uid:
|
||||
found = True
|
||||
assert "/projects/" in item["project_link"]["url"]
|
||||
break
|
||||
assert found, "feed must include project info for linked posts"
|
||||
|
||||
Reference in New Issue
Block a user