forked from retoor/devplacepy
chore: reorganize test files into domain-specific subdirectories under tests/
Split the monolithic test directory into three tiers (unit, api, e2e) with a path-mirroring directory structure. Added corresponding Makefile targets (test-unit, test-api, test-e2e) and updated all documentation references (CLAUDE.md, README.md, testing-cicd.html, testing-framework.html, testing-make.html) to reflect the new layout and naming conventions.
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
|
||||
import hashlib
|
||||
import time
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from playwright.sync_api import expect
|
||||
from tests.conftest import BASE_URL
|
||||
from devplacepy.database import get_table
|
||||
from devplacepy.utils import hash_password, generate_uid
|
||||
|
||||
|
||||
def test_reset_password_page_loads(page, app_server):
|
||||
page.goto(
|
||||
f"{BASE_URL}/auth/reset-password/sometoken", wait_until="domcontentloaded"
|
||||
)
|
||||
assert page.is_visible("input#password")
|
||||
assert page.is_visible("input#confirm_password")
|
||||
|
||||
|
||||
def test_reset_password_mismatch_shows_error(page, app_server):
|
||||
page.goto(
|
||||
f"{BASE_URL}/auth/reset-password/sometoken", wait_until="domcontentloaded"
|
||||
)
|
||||
page.fill("#password", "abcdef1")
|
||||
page.fill("#confirm_password", "different1")
|
||||
page.click("button:has-text('Reset Password')")
|
||||
page.locator(".auth-error").wait_for(state="visible")
|
||||
|
||||
|
||||
def test_reset_password_full_flow(page, app_server):
|
||||
uname = f"reset_{int(time.time() * 1000)}"
|
||||
email = f"{uname}@t.dev"
|
||||
uid = generate_uid()
|
||||
get_table("users").insert(
|
||||
{
|
||||
"uid": uid,
|
||||
"username": uname,
|
||||
"email": email,
|
||||
"password_hash": hash_password("oldpass123"),
|
||||
"bio": "",
|
||||
"location": "",
|
||||
"git_link": "",
|
||||
"website": "",
|
||||
"role": "Member",
|
||||
"is_active": True,
|
||||
"level": 1,
|
||||
"xp": 0,
|
||||
"stars": 0,
|
||||
"created_at": datetime.now(timezone.utc).isoformat(),
|
||||
}
|
||||
)
|
||||
token = f"tok{uid[:8]}"
|
||||
get_table("password_resets").insert(
|
||||
{
|
||||
"uid": generate_uid(),
|
||||
"user_uid": uid,
|
||||
"token": hashlib.sha256(token.encode()).hexdigest(),
|
||||
"expires_at": (datetime.now(timezone.utc) + timedelta(hours=1)).isoformat(),
|
||||
"used": False,
|
||||
"created_at": datetime.now(timezone.utc).isoformat(),
|
||||
}
|
||||
)
|
||||
page.goto(f"{BASE_URL}/auth/reset-password/{token}", wait_until="domcontentloaded")
|
||||
page.fill("#password", "newpass456")
|
||||
page.fill("#confirm_password", "newpass456")
|
||||
page.click("button:has-text('Reset Password')")
|
||||
page.wait_for_url("**/auth/login", wait_until="domcontentloaded")
|
||||
page.fill("#email", email)
|
||||
page.fill("#password", "newpass456")
|
||||
page.click("button:has-text('Sign in')")
|
||||
page.wait_for_url("**/feed", wait_until="domcontentloaded")
|
||||
assert "/feed" in page.url
|
||||
Reference in New Issue
Block a user