from playwright.sync_api import Page, expect from sqlalchemy import select from fietsboek import models def add_journey(playwright_helper, dbaccess, title): """Adds a journey for testing purposes. Returns the journey ID.""" t_1 = playwright_helper.add_track(None, "Teasi_1.gpx.gz", "trayectoria uno") t_2 = playwright_helper.add_track(None, "MyTourbook_1.gpx.gz", "trayectoria dos") with dbaccess: journey = models.Journey( owner=playwright_helper.john_doe(), title=title, description="You saw sirens?", visibility=models.journey.Visibility.PUBLIC, ) dbaccess.add(journey) dbaccess.flush() journey.set_track_ids([t_1.id, t_2.id]) dbaccess.commit() dbaccess.refresh(journey, ["id"]) dbaccess.expunge(journey) playwright_helper.data_manager.initialize_journey(journey.id) return journey.id def test_journey_list(page: Page, playwright_helper, dbaccess): playwright_helper.login() add_journey(playwright_helper, dbaccess, title="Our Journey") page.goto("/journey/") expect(page.locator("h5", has_text="Our Journey")).to_be_visible() expect(page.locator("li", has_text="trayectoria uno")).to_be_visible() expect(page.locator("li", has_text="trayectoria dos")).to_be_visible() def test_journey_new(page: Page, playwright_helper, dbaccess): playwright_helper.login() playwright_helper.add_track(None, "Teasi_1.gpx.gz", "trayectoria uno") playwright_helper.add_track(None, "MyTourbook_1.gpx.gz", "trayectoria dos") playwright_helper.add_track(None, "MyTourbook_1.gpx.gz", "trayectoria tres") page.goto("/journey/") page.get_by_text("New journey").click() page.get_by_label("Title").fill("My Odyssey") page.get_by_label("Description").fill("I saw sirens!") page.locator("#trackSearch").fill("uno") page.locator("#trackSearchButton").click() page.locator(".track-query-response button").click() page.locator("#trackSearch").fill("dos") page.locator("#trackSearchButton").click() page.locator(".track-query-response button").click() page.locator("#trackSearch").fill("tres") page.locator("#trackSearchButton").click() page.locator(".track-query-response button").click() page.locator(".journey-track", has_text="tres").locator(".btn").click() page.locator(".btn", has_text="Save").click() expect(page.locator("h1", has_text="My Odyssey")).to_be_visible() expect(page.locator("h5", has_text="trayectoria uno")).to_be_visible() expect(page.locator("h5", has_text="trayectoria dos")).to_be_visible() journey = dbaccess.execute(select(models.Journey).filter_by(title="My Odyssey")).scalar_one() assert journey.title == "My Odyssey" assert journey.description == "I saw sirens!" assert len(journey.tracks) == 2 assert journey.tracks[0].title == "trayectoria uno" assert journey.tracks[1].title == "trayectoria dos" def test_journey_new_empty_title(page: Page, playwright_helper): playwright_helper.login() playwright_helper.add_track(None, "Teasi_1.gpx.gz", "trayectoria uno") page.goto("/journey/") page.get_by_text("New journey").click() page.locator("#trackSearch").fill("uno") page.locator("#trackSearchButton").click() page.locator(".track-query-response button").click() page.locator(".btn", has_text="Save").click() expect(page.locator(".invalid-feedback", has_text="A title is required")).to_be_visible() def test_journey_new_no_tracks(page: Page, playwright_helper): playwright_helper.login() page.goto("/journey/") page.get_by_text("New journey").click() page.get_by_label("Title").fill("A title is there!") page.locator(".btn", has_text="Save").click() expect(page.locator(".invalid-feedback", has_text="A journey must have at least one track"))\ .to_be_visible() def test_journey_edit(page: Page, playwright_helper, dbaccess): playwright_helper.login() journey_id = add_journey(playwright_helper, dbaccess, title="Your Odyssey") page.goto(f"/journey/{journey_id}/") expect(page.locator("h1", has_text="Your Odyssey")).to_be_visible() page.locator("a", has_text="Edit").click() page.get_by_label("Title").fill("Their Odyssey") page.get_by_label("Description").fill("Where is Homer?") expect(page.locator(".track-title", has_text="trayectoria uno")).to_be_visible() page.locator(".journey-track", has_text="uno").locator(".btn").click() expect(page.locator(".track-title", has_text="trayectoria uno")).not_to_be_visible() page.locator(".btn", has_text="Save").click() expect(page.locator("h1", has_text="Their Odyssey")).to_be_visible() expect(page.locator("h5", has_text="trayectoria uno")).not_to_be_visible() expect(page.locator("h5", has_text="trayectoria dos")).to_be_visible() journey = dbaccess.execute(select(models.Journey).filter_by(title="Their Odyssey")).scalar_one() assert journey.title == "Their Odyssey" assert journey.description == "Where is Homer?" assert len(journey.tracks) == 1 assert journey.tracks[0].title == "trayectoria dos" def test_journey_reorder(page: Page, playwright_helper, dbaccess): playwright_helper.login() journey_id = add_journey(playwright_helper, dbaccess, title="Her Journey") page.goto(f"/journey/{journey_id}/edit") expect(page.locator("h1", has_text="Her Journey")).to_be_visible() page.locator(".track-title", has_text="trayectoria uno").drag_to( page.locator(".track-title", has_text="trayectoria dos"), target_position={"x": 10, "y": 20}, ) page.locator(".btn", has_text="Save").click() expect(page.locator("h1", has_text="Her Journey")).to_be_visible() journey = dbaccess.execute(select(models.Journey).filter_by(id=journey_id)).scalar_one() assert len(journey.tracks) == 2 assert journey.tracks[0].title == "trayectoria dos" assert journey.tracks[1].title == "trayectoria uno"