Something went wrong. Try again.
Paper Mario atproto mod hosting site starhaven.dev
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293"""The actor profile page: avatar/bio editing, and the mods grid."""
import re
from playwright.sync_api import expect
from helpers import Actor
PROFILE_COLLECTION = "dev.starhaven.actor.profile"
PNG = bytes.fromhex( "89504e470d0a1a0a0000000d494844520000000100000001080600000" "01f15c4890000000a4944415478da6360000002000155009f490c0000" "000049454e44ae426082")
def test_owner_can_set_an_avatar(actor: Actor): actor.login() actor.page.goto(f"{actor.app_url}/{actor.handle}")
actor.page.locator("#avatar-add").set_input_files( files=[{"name": "avatar.png", "mimeType": "image/png", "buffer": PNG}] ) # The src changes from the default avatar to a blob: URL on success. expect(actor.page.locator("#actor-avatar-img")).to_have_attribute( "src", re.compile(r"^blob:"), timeout=10000 )
# The avatar saves immediately — no form submit needed. [profile] = actor.records(PROFILE_COLLECTION) assert profile["value"]["avatar"]["$type"] == "blob"
def test_owner_can_set_a_bio(actor: Actor): actor.login() actor.page.goto(f"{actor.app_url}/{actor.handle}")
actor.page.locator("#description").fill("Hi, I make mods.") with actor.page.expect_response(lambda r: r.request.method == "PATCH") as resp: actor.page.get_by_role("button", name="Save").click() assert resp.value.ok
[profile] = actor.records(PROFILE_COLLECTION) assert profile["value"]["description"] == "Hi, I make mods."
def test_avatar_persists_after_bio_save(actor: Actor): """Setting a bio must not erase a previously-uploaded avatar.""" actor.login() actor.page.goto(f"{actor.app_url}/{actor.handle}")
actor.page.locator("#avatar-add").set_input_files( files=[{"name": "avatar.png", "mimeType": "image/png", "buffer": PNG}] ) expect(actor.page.locator("#actor-avatar-img")).to_have_attribute( "src", re.compile(r"^blob:"), timeout=10000 )
actor.page.locator("#description").fill("Still has avatar") with actor.page.expect_response(lambda r: r.request.method == "PATCH") as resp: actor.page.get_by_role("button", name="Save").click() assert resp.value.ok
[profile] = actor.records(PROFILE_COLLECTION) assert profile["value"]["avatar"]["$type"] == "blob" assert profile["value"]["description"] == "Still has avatar"
def test_a_visitor_sees_no_edit_controls(actor: Actor): actor.login() actor.page.goto(f"{actor.app_url}/{actor.handle}") actor.page.locator("#description").fill("My bio") with actor.page.expect_response(lambda r: r.request.method == "PATCH") as resp: actor.page.get_by_role("button", name="Save").click() assert resp.value.ok actor.page.wait_for_load_state("load") # wait for HX-Redirect navigation to finish actor.page.context.clear_cookies()
actor.page.goto(f"{actor.app_url}/{actor.handle}") expect(actor.page.get_by_text("My bio")).to_be_visible() expect(actor.page.locator("#avatar-add")).to_have_count(0) expect(actor.page.locator("#profile-form")).to_have_count(0)
def test_the_actors_mods_show_in_a_grid_like_search(actor: Actor): actor.login() actor.create_mod("master-quest", title="Master Quest")
actor.page.goto(f"{actor.app_url}/{actor.handle}") expect(actor.page.locator("ul.search-results")).to_be_visible() expect(actor.page.get_by_role("link", name="Master Quest")).to_be_visible()