Ctrl K
ComunidadGuías…

tests/e2e/roaster_tests.rs

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
use thirtyfour::prelude::*;

use crate::helpers::auth::authenticate_browser;
use crate::helpers::browser::BrowserSession;
use crate::helpers::forms::{fill_input, submit_visible_form};
use crate::helpers::server_helpers::spawn_app_with_auth;
use crate::helpers::wait::{wait_for_element, wait_for_url_contains, wait_for_visible};

#[tokio::test]
async fn create_roaster_submit_tracks_required_and_malformed_fields() {
    let app = spawn_app_with_auth().await;
    let session = BrowserSession::new(&app.address).await.unwrap();
    authenticate_browser(&session, &app).await.unwrap();
    session.goto("/add").await.unwrap();

    let submit = "form[action='/api/v1/roasters'] button[type='submit']";
    wait_for_element(&session.driver, &format!("{submit}:disabled"))
        .await
        .unwrap();
    fill_input(&session.driver, "name", "   ").await.unwrap();
    fill_input(&session.driver, "country", "United Kingdom")
        .await
        .unwrap();
    wait_for_element(&session.driver, &format!("{submit}:disabled"))
        .await
        .unwrap();

    fill_input(&session.driver, "name", "Valid Roaster")
        .await
        .unwrap();
    wait_for_element(&session.driver, &format!("{submit}:not(:disabled)"))
        .await
        .unwrap();
    fill_input(&session.driver, "homepage", "not a URL")
        .await
        .unwrap();
    wait_for_element(&session.driver, &format!("{submit}:disabled"))
        .await
        .unwrap();
    fill_input(&session.driver, "homepage", "https://example.com")
        .await
        .unwrap();
    wait_for_element(&session.driver, &format!("{submit}:not(:disabled)"))
        .await
        .unwrap();
    session.quit().await;
}

#[tokio::test]
async fn create_roaster_via_add_page() {
    let app = spawn_app_with_auth().await;
    let session = BrowserSession::new(&app.address).await.unwrap();
    authenticate_browser(&session, &app).await.unwrap();

    // Navigate to /add — roaster tab is the default
    session.goto("/add").await.unwrap();

    // Wait for Datastar to initialize and show the roaster form
    wait_for_visible(&session.driver, "input[name='name']")
        .await
        .unwrap();

    // Fill the roaster form
    fill_input(&session.driver, "name", "E2E Test Roasters")
        .await
        .unwrap();
    fill_input(&session.driver, "country", "United Kingdom")
        .await
        .unwrap();

    // Submit — standard method=post, redirects to detail page
    submit_visible_form(&session.driver).await.unwrap();

    // Should redirect to the roaster detail page
    wait_for_url_contains(&session.driver, "/roasters/")
        .await
        .unwrap();

    // Verify the detail page shows the roaster name
    let heading = session.driver.find(By::Css("h1")).await.unwrap();
    let heading_text = heading.text().await.unwrap();
    assert_eq!(heading_text, "E2E Test Roasters");

    // Navigate to the data page and verify the roaster appears in the list
    session.goto("/data?type=roasters").await.unwrap();

    let body = session.driver.find(By::Css("body")).await.unwrap();
    let body_text = body.text().await.unwrap();
    assert!(
        body_text.contains("E2E Test Roasters"),
        "Roaster should appear in the data list"
    );

    session.quit().await;
}

#[tokio::test]
async fn create_roaster_back_restores_submit_button() {
    let app = spawn_app_with_auth().await;
    let session = BrowserSession::new(&app.address).await.unwrap();
    authenticate_browser(&session, &app).await.unwrap();
    session.goto("/add").await.unwrap();

    fill_input(&session.driver, "name", "Before Back Roasters")
        .await
        .unwrap();
    fill_input(&session.driver, "country", "United Kingdom")
        .await
        .unwrap();
    let submit = "form[action='/api/v1/roasters'] button[type='submit']";
    wait_for_element(&session.driver, &format!("{submit}:not(:disabled)"))
        .await
        .unwrap();
    submit_visible_form(&session.driver).await.unwrap();
    wait_for_url_contains(&session.driver, "/roasters/")
        .await
        .unwrap();

    session.driver.back().await.unwrap();
    wait_for_url_contains(&session.driver, "/add")
        .await
        .unwrap();
    wait_for_element(&session.driver, &format!("{submit}:not(:disabled)"))
        .await
        .unwrap();
    let form = session
        .driver
        .find(By::Css("form[action='/api/v1/roasters']"))
        .await
        .unwrap();
    assert_ne!(
        form.attr("data-validation-submitting")
            .await
            .unwrap()
            .as_deref(),
        Some("true")
    );

    fill_input(&session.driver, "name", "After Back Roasters")
        .await
        .unwrap();
    submit_visible_form(&session.driver).await.unwrap();
    wait_for_url_contains(&session.driver, "/roasters/after-back-roasters")
        .await
        .unwrap();
    session.quit().await;
}

#[tokio::test]
async fn create_roaster_with_all_fields() {
    let app = spawn_app_with_auth().await;
    let session = BrowserSession::new(&app.address).await.unwrap();
    authenticate_browser(&session, &app).await.unwrap();

    session.goto("/add").await.unwrap();

    wait_for_visible(&session.driver, "input[name='name']")
        .await
        .unwrap();

    fill_input(&session.driver, "name", "Full Detail Roasters")
        .await
        .unwrap();
    fill_input(&session.driver, "country", "Ethiopia")
        .await
        .unwrap();
    fill_input(&session.driver, "city", "Addis Ababa")
        .await
        .unwrap();
    fill_input(&session.driver, "homepage", "https://example.coffee")
        .await
        .unwrap();

    submit_visible_form(&session.driver).await.unwrap();

    wait_for_url_contains(&session.driver, "/roasters/")
        .await
        .unwrap();

    // Verify detail page shows country and city
    let body = session.driver.find(By::Css("body")).await.unwrap();
    let body_text = body.text().await.unwrap();
    assert!(body_text.contains("Full Detail Roasters"));
    assert!(body_text.contains("Ethiopia"));
    assert!(body_text.contains("Addis Ababa"));

    session.quit().await;
}