Something went wrong. Try again.
Paper Mario mod hosting site - AT Protocol appview starhaven.dev
appview
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172"""The homepage: the intro, featured mods, and popular and new ones by game."""
import subprocessfrom pathlib import Path
import requestsfrom conftest import Appviewfrom helpers import Actor, strip_imagesfrom playwright.sync_api import Page, expect
def feature(binary: Path, appview: Appview, *addresses: str) -> None: """Features mods, as whoever runs the server would.""" subprocess.run( [str(binary), "--data-dir", str(appview.database.parent), "feature", *addresses], check=True, )
def test_a_visitor_is_told_what_star_haven_is(page: Page, appview_url: str): page.goto(appview_url)
intro = page.get_by_role("region", name="The home of Paper Mario mods") expect(intro).to_contain_text("silly remixes")
def test_a_signed_in_account_skips_the_intro(actor: Actor): actor.login()
expect(actor.page.get_by_role("heading", name="Popular")).to_be_visible() expect(actor.page.get_by_role("heading", name="The home of Paper Mario mods")).to_have_count(0)
def test_the_featured_mods_are_the_ones_picked( actor: Actor, appview: Appview, starhaven_binary: Path): actor.login() actor.create_mod("master-quest", title="Master Quest") actor.create_mod("black-pit", title="Black Pit") actor.create_mod("not-picked", title="Not Picked") feature( starhaven_binary, appview, f"{appview.url}/{actor.handle}/black-pit", f"{actor.handle}/master-quest", )
actor.page.goto(appview.url) featured = actor.page.get_by_role("region", name="Featured mods") expect(featured.get_by_role("link")).to_have_count(1) expect(featured.get_by_role("link")).to_contain_text("Black Pit")
featured.locator(".featured-title", has_text="Master Quest").click() expect(actor.page).to_have_url(f"{appview.url}/") expect(featured.get_by_role("link")).to_contain_text("Master Quest") featured.get_by_role("link").focus() actor.page.keyboard.press("ArrowLeft") expect(featured.get_by_role("link")).to_contain_text("Black Pit") expect(featured.get_by_role("link")).to_be_focused() expect(featured).not_to_contain_text("Not Picked")
def test_the_carousel_does_not_widen_a_phones_page( browser, actor: Actor, appview: Appview, starhaven_binary: Path): """The slides beside the current one sit off the screen, and a phone zooms out to fit anything that does.""" actor.login() actor.create_mod("master-quest", title="Master Quest") actor.create_mod("black-pit", title="Black Pit") feature( starhaven_binary, appview, f"{actor.handle}/master-quest", f"{actor.handle}/black-pit" )
context = browser.new_context( viewport={"width": 390, "height": 844}, is_mobile=True, has_touch=True ) try: page = context.new_page() page.goto(appview.url) expect(page.locator(".featured-slide-current")).to_be_visible() assert page.evaluate("[innerWidth, visualViewport.scale]") == [390, 1] finally: context.close()
def test_without_scripts_the_first_featured_mod_shows( browser, actor: Actor, appview: Appview, starhaven_binary: Path): actor.login() actor.create_mod("master-quest", title="Master Quest") actor.create_mod("black-pit", title="Black Pit") feature( starhaven_binary, appview, f"{actor.handle}/master-quest", f"{actor.handle}/black-pit" )
context = browser.new_context(java_script_enabled=False) try: page = context.new_page() page.goto(appview.url) featured = page.get_by_role("region", name="Featured mods") expect(featured.get_by_role("link").first).to_contain_text("Master Quest") expect(featured.get_by_role("button", name="Show Black Pit")).to_be_hidden()
# With nothing to move the carousel, the mod beside it opens its page. featured.get_by_role("link", name="Black Pit").click() expect(page).to_have_url(f"{appview.url}/{actor.handle}/black-pit") finally: context.close()
def test_a_mod_without_images_shows_its_game_and_title(actor: Actor, appview: Appview): actor.login() actor.create_mod("master-quest", title="Master Quest") strip_images(appview.database, "master-quest")
actor.page.goto(actor.app_url) card = actor.page.get_by_role("region", name="New").get_by_role("link", name="Master Quest") expect(card.locator(".mod-placeholder")).to_have_text("PM64Master Quest")
def test_a_card_shows_the_mods_description(actor: Actor): actor.login() actor.create_mod("master-quest", title="Master Quest") actor.page.goto(f"{actor.app_url}/{actor.handle}/master-quest/settings") actor.page.get_by_label("Short description").fill("The *hardest* way to play") actor.page.get_by_role("button", name="Save").click()
actor.page.goto(actor.app_url) card = actor.page.get_by_role("region", name="New").get_by_role("link", name="Master Quest") expect(card).to_contain_text("The hardest way to play")
def test_the_lists_show_one_game_at_a_time(actor: Actor): actor.login() actor.create_mod("master-quest", title="Master Quest") actor.create_mod("flipside-pit", title="Flipside Pit", game="Super Paper Mario")
actor.page.goto(actor.app_url) actor.page.get_by_role("link", name="SPM", exact=True).click()
expect(actor.page).to_have_url(f"{actor.app_url}/?game=spm") expect(actor.page.get_by_role("link", name="SPM", exact=True)).to_have_attribute( "aria-current", "true" ) for name in ["Popular", "New"]: section = actor.page.get_by_role("region", name=name) expect(section.get_by_role("link", name="Flipside Pit")).to_be_visible() expect(section.get_by_role("link", name="Master Quest")).to_have_count(0)
actor.page.get_by_role("link", name="See all new mods").click() expect(actor.page).to_have_url(f"{actor.app_url}/mods?sort=new&game=spm") expect(actor.page.get_by_role("heading", name="New SPM mods")).to_be_visible()
def test_popular_counts_this_months_downloads(actor: Actor): actor.login() actor.create_mod("master-quest", title="Master Quest") actor.create_mod("black-pit", title="Black Pit") actor.publish_version("black-pit", "v1.0", "Out now") version = actor.version_record("v1.0") requests.get( version["value"]["deliverable"], headers={"User-Agent": "a browser"}, allow_redirects=False, timeout=10, )
actor.page.goto(actor.app_url) cards = actor.page.get_by_role("region", name="Popular").get_by_role("listitem") expect(cards.first).to_contain_text("Black Pit")