116 lines
3.8 KiB
Python
Raw Normal View History

# retoor <retoor@molodetz.nl>
import time
import requests
from playwright.sync_api import expect
from devplacepy.database import get_setting, get_table, refresh_snapshot, set_setting
from devplacepy.utils import clear_user_cache
from tests.conftest import BASE_URL
JSON = {"Accept": "application/json"}
def _seed_post(user):
session = requests.Session()
session.post(
f"{BASE_URL}/auth/login",
data={"email": user["email"], "password": user["password"]},
headers=JSON,
)
session.post(
f"{BASE_URL}/posts/create",
data={
"title": "Terms gate fixture post",
"content": "A post that exists so the vote control is present on the feed.",
},
headers=JSON,
)
def _accepted_version(username):
refresh_snapshot()
row = get_table("users").find_one(username=username)
return (row or {}).get("terms_version") or ""
def _restore_accepted_version(username, version):
refresh_snapshot()
row = get_table("users").find_one(username=username)
if not row:
return
get_table("users").update({"uid": row["uid"], "terms_version": version}, ["uid"])
clear_user_cache(row["uid"])
def _open_gate_dialog(page):
for _ in range(40):
page.locator(".post-card .vote-up").first.click()
dialog = page.locator(".dialog-overlay.visible")
try:
dialog.wait_for(state="visible", timeout=1500)
return dialog
except Exception:
time.sleep(0.5)
return None
def test_the_gate_dialog_accepts_the_terms_and_replays_the_action(alice, seeded_db):
page, _ = alice
username = seeded_db["alice"]["username"]
_seed_post(seeded_db["alice"])
original = get_setting("terms_version", "1") or "1"
accepted_before = _accepted_version(username)
bumped = f"{original}-e2eaccept"
set_setting("terms_version", bumped)
try:
page.goto(f"{BASE_URL}/feed", wait_until="domcontentloaded")
page.locator(".post-card").first.wait_for(state="visible", timeout=10000)
dialog = _open_gate_dialog(page)
assert dialog is not None, "the terms gate dialog never appeared"
expect(page.locator(".dialog-title")).to_have_text("Terms of Service")
expect(page.locator(".dialog-links a")).to_have_count(3)
expect(page.locator(".dialog-confirm")).to_have_text("Accept and continue")
assert _accepted_version(username) != bumped
page.locator(".dialog-confirm").click()
page.locator(".dialog-overlay.visible").wait_for(state="hidden", timeout=10000)
recorded = ""
for _ in range(40):
recorded = _accepted_version(username)
if recorded == bumped:
break
time.sleep(0.5)
assert recorded == bumped
finally:
set_setting("terms_version", original)
_restore_accepted_version(username, accepted_before)
def test_declining_the_gate_dialog_records_no_acceptance(alice, seeded_db):
page, _ = alice
username = seeded_db["alice"]["username"]
_seed_post(seeded_db["alice"])
original = get_setting("terms_version", "1") or "1"
accepted_before = _accepted_version(username)
bumped = f"{original}-e2edecline"
set_setting("terms_version", bumped)
try:
page.goto(f"{BASE_URL}/feed", wait_until="domcontentloaded")
page.locator(".post-card").first.wait_for(state="visible", timeout=10000)
dialog = _open_gate_dialog(page)
assert dialog is not None, "the terms gate dialog never appeared"
page.locator(".dialog-cancel").click()
page.locator(".dialog-overlay.visible").wait_for(state="hidden", timeout=10000)
assert _accepted_version(username) != bumped
finally:
set_setting("terms_version", original)
_restore_accepted_version(username, accepted_before)