forked from retoor/devplacepy
fix: normalize unicode escape sequences and reformat multi-line expressions across codebase
This commit is contained in:
+69
-21
@@ -42,6 +42,7 @@ def run_async(coro):
|
||||
thread.start()
|
||||
thread.join()
|
||||
from devplacepy.database import refresh_snapshot
|
||||
|
||||
refresh_snapshot()
|
||||
if "error" in box:
|
||||
raise box["error"]
|
||||
@@ -51,6 +52,7 @@ def run_async(coro):
|
||||
@pytest.fixture(autouse=True)
|
||||
def _fresh_db_snapshot():
|
||||
from devplacepy.database import refresh_snapshot
|
||||
|
||||
refresh_snapshot()
|
||||
yield
|
||||
|
||||
@@ -76,7 +78,9 @@ def pytest_runtest_makereport(item, call):
|
||||
obj = item.funcargs[name]
|
||||
if name in ("alice", "bob"):
|
||||
obj = obj[0]
|
||||
save_failure_screenshot(obj, item.nodeid.replace("::", "_").replace("/", "_"))
|
||||
save_failure_screenshot(
|
||||
obj, item.nodeid.replace("::", "_").replace("/", "_")
|
||||
)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
@@ -96,8 +100,18 @@ def app_server(test_db_path):
|
||||
env["PYTHONUNBUFFERED"] = "1"
|
||||
log_file = tempfile.NamedTemporaryFile(suffix=f"_server_{PORT}.log", delete=False)
|
||||
proc = subprocess.Popen(
|
||||
[sys.executable, "-m", "uvicorn", "devplacepy.main:app",
|
||||
"--host", "127.0.0.1", "--port", str(PORT), "--log-level", "warning"],
|
||||
[
|
||||
sys.executable,
|
||||
"-m",
|
||||
"uvicorn",
|
||||
"devplacepy.main:app",
|
||||
"--host",
|
||||
"127.0.0.1",
|
||||
"--port",
|
||||
str(PORT),
|
||||
"--log-level",
|
||||
"warning",
|
||||
],
|
||||
cwd=str(PROJECT_ROOT),
|
||||
env=env,
|
||||
stdout=log_file,
|
||||
@@ -115,6 +129,7 @@ def app_server(test_db_path):
|
||||
while time.time() < deadline:
|
||||
try:
|
||||
import urllib.request
|
||||
|
||||
urllib.request.urlopen(f"{BASE_URL}/", timeout=2)
|
||||
break
|
||||
except Exception:
|
||||
@@ -122,21 +137,21 @@ def app_server(test_db_path):
|
||||
if poll is not None:
|
||||
proc.wait()
|
||||
raise RuntimeError(
|
||||
f"Server process died (exit code {poll}). "
|
||||
f"Log:\n{server_log()}"
|
||||
f"Server process died (exit code {poll}). Log:\n{server_log()}"
|
||||
)
|
||||
time.sleep(0.5)
|
||||
else:
|
||||
proc.terminate()
|
||||
proc.wait(timeout=5)
|
||||
raise RuntimeError(
|
||||
f"Server did not start after 30s. "
|
||||
f"Log:\n{server_log()}"
|
||||
)
|
||||
raise RuntimeError(f"Server did not start after 30s. Log:\n{server_log()}")
|
||||
|
||||
from devplacepy.database import get_table as _get_table
|
||||
|
||||
ops_settings = _get_table("site_settings")
|
||||
for key, value in (("rate_limit_per_minute", "1000000"), ("rate_limit_window_seconds", "60")):
|
||||
for key, value in (
|
||||
("rate_limit_per_minute", "1000000"),
|
||||
("rate_limit_window_seconds", "60"),
|
||||
):
|
||||
if not ops_settings.find_one(key=key):
|
||||
ops_settings.insert({"uid": f"test_{key}", "key": key, "value": value})
|
||||
|
||||
@@ -158,21 +173,29 @@ def app_server(test_db_path):
|
||||
@pytest.fixture(scope="session")
|
||||
def playwright_instance():
|
||||
from playwright.sync_api import sync_playwright
|
||||
|
||||
with sync_playwright() as p:
|
||||
yield p
|
||||
|
||||
|
||||
@pytest.fixture(scope="session")
|
||||
def browser(playwright_instance):
|
||||
headless = os.environ.get("PLAYWRIGHT_HEADLESS", "1") == "1"
|
||||
b = playwright_instance.chromium.launch(
|
||||
headless=headless, slow_mo=int(os.environ.get("PLAYWRIGHT_SLOW_MO", "0")), args=["--window-size=1400,900"],
|
||||
headless=headless,
|
||||
slow_mo=int(os.environ.get("PLAYWRIGHT_SLOW_MO", "0")),
|
||||
args=["--window-size=1400,900"],
|
||||
)
|
||||
yield b
|
||||
b.close()
|
||||
|
||||
|
||||
@pytest.fixture(scope="module")
|
||||
def browser_context(browser):
|
||||
ctx = browser.new_context(viewport={"width": 1400, "height": 900}, permissions=["clipboard-read", "clipboard-write"])
|
||||
ctx = browser.new_context(
|
||||
viewport={"width": 1400, "height": 900},
|
||||
permissions=["clipboard-read", "clipboard-write"],
|
||||
)
|
||||
yield ctx
|
||||
ctx.close()
|
||||
|
||||
@@ -186,6 +209,7 @@ def page(browser_context):
|
||||
yield p
|
||||
p.close()
|
||||
|
||||
|
||||
def signup_user(page, user):
|
||||
page.bring_to_front()
|
||||
page.goto(f"{BASE_URL}/auth/signup", wait_until="domcontentloaded")
|
||||
@@ -208,6 +232,7 @@ def login_user(page, user):
|
||||
|
||||
def assert_share_copies(page, expected_fragment):
|
||||
from playwright.sync_api import expect
|
||||
|
||||
share = page.locator("button[data-share]").first
|
||||
share.scroll_into_view_if_needed()
|
||||
share.click()
|
||||
@@ -218,7 +243,9 @@ def assert_share_copies(page, expected_fragment):
|
||||
except Exception:
|
||||
clip = None
|
||||
if clip:
|
||||
assert clip.startswith("http") and expected_fragment in clip, f"clipboard={clip!r}"
|
||||
assert clip.startswith("http") and expected_fragment in clip, (
|
||||
f"clipboard={clip!r}"
|
||||
)
|
||||
|
||||
|
||||
@pytest.fixture(scope="session")
|
||||
@@ -226,15 +253,20 @@ def seeded_db(app_server):
|
||||
"""Create test users once at session level using requests directly."""
|
||||
import urllib.request
|
||||
import urllib.parse
|
||||
|
||||
users = [
|
||||
("alice_test", "alice@test.devplace", "secret123"),
|
||||
("bob_test", "bob@test.devplace", "secret456"),
|
||||
]
|
||||
for username, email, pw in users:
|
||||
data = urllib.parse.urlencode({
|
||||
"username": username, "email": email,
|
||||
"password": pw, "confirm_password": pw,
|
||||
}).encode()
|
||||
data = urllib.parse.urlencode(
|
||||
{
|
||||
"username": username,
|
||||
"email": email,
|
||||
"password": pw,
|
||||
"confirm_password": pw,
|
||||
}
|
||||
).encode()
|
||||
req = urllib.request.Request(
|
||||
f"{BASE_URL}/auth/signup",
|
||||
data=data,
|
||||
@@ -242,8 +274,16 @@ def seeded_db(app_server):
|
||||
)
|
||||
urllib.request.urlopen(req)
|
||||
return {
|
||||
"alice": {"username": "alice_test", "email": "alice@test.devplace", "password": "secret123"},
|
||||
"bob": {"username": "bob_test", "email": "bob@test.devplace", "password": "secret456"},
|
||||
"alice": {
|
||||
"username": "alice_test",
|
||||
"email": "alice@test.devplace",
|
||||
"password": "secret123",
|
||||
},
|
||||
"bob": {
|
||||
"username": "bob_test",
|
||||
"email": "bob@test.devplace",
|
||||
"password": "secret456",
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@@ -255,7 +295,10 @@ def alice(page, seeded_db):
|
||||
|
||||
@pytest.fixture
|
||||
def bob(browser, seeded_db):
|
||||
ctx = browser.new_context(viewport={"width": 1400, "height": 900}, permissions=["clipboard-read", "clipboard-write"])
|
||||
ctx = browser.new_context(
|
||||
viewport={"width": 1400, "height": 900},
|
||||
permissions=["clipboard-read", "clipboard-write"],
|
||||
)
|
||||
p = ctx.new_page()
|
||||
p.set_default_timeout(15000)
|
||||
p.bring_to_front()
|
||||
@@ -267,7 +310,11 @@ def bob(browser, seeded_db):
|
||||
|
||||
@pytest.fixture
|
||||
def mobile_page(browser, seeded_db):
|
||||
ctx = browser.new_context(viewport={"width": 412, "height": 840}, has_touch=True, permissions=["clipboard-read", "clipboard-write"])
|
||||
ctx = browser.new_context(
|
||||
viewport={"width": 412, "height": 840},
|
||||
has_touch=True,
|
||||
permissions=["clipboard-read", "clipboard-write"],
|
||||
)
|
||||
p = ctx.new_page()
|
||||
p.set_default_timeout(15000)
|
||||
p.bring_to_front()
|
||||
@@ -280,5 +327,6 @@ def mobile_page(browser, seeded_db):
|
||||
@pytest.fixture(scope="session")
|
||||
def local_db():
|
||||
from devplacepy.database import init_db, db
|
||||
|
||||
init_db()
|
||||
return db
|
||||
|
||||
Reference in New Issue
Block a user