brewlog/tests/e2e/detail_tests.rs
Jon Seager 7c1fbb99b8
test: add e2e tests for data page, detail pages, bag close, and navigation
Cover tab switching, search, pagination, and sorting on the data list
page. Verify detail page rendering for roasters, roasts, bags, gear,
and cafes. Test the close-bag flow from the detail page. Check that
home, stats, and timeline pages load correctly with data.
2026-02-10 11:09:30 +00:00

136 lines
4.8 KiB
Rust

use thirtyfour::prelude::*;
use crate::helpers::auth::authenticate_browser;
use crate::helpers::browser::BrowserSession;
use crate::helpers::server_helpers::{
create_default_bag, create_default_cafe, create_default_gear, create_default_roast,
create_default_roaster, create_roaster_with_payload, spawn_app_with_auth,
};
use crate::helpers::wait::wait_for_visible;
use brewlog::domain::coffee::roasters::NewRoaster;
#[tokio::test]
async fn roaster_detail_shows_all_fields() {
let app = spawn_app_with_auth().await;
let roaster = create_roaster_with_payload(
&app,
NewRoaster {
name: "Detail Roasters".to_string(),
country: "JP".to_string(),
city: Some("Tokyo".to_string()),
homepage: Some("https://example.com".to_string()),
created_at: None,
},
)
.await;
let session = BrowserSession::new(&app.address).await.unwrap();
authenticate_browser(&session, &app).await.unwrap();
session
.goto(&format!("/roasters/{}", roaster.slug))
.await
.unwrap();
wait_for_visible(&session.driver, "h1").await.unwrap();
let body = session.driver.find(By::Css("body")).await.unwrap();
let text = body.text().await.unwrap();
assert!(text.contains("Detail Roasters"), "Should show roaster name");
assert!(text.contains("JP"), "Should show country code");
assert!(text.contains("Tokyo"), "Should show city");
assert!(text.contains("Visit Website"), "Should show homepage link");
session.quit().await;
}
#[tokio::test]
async fn roast_detail_shows_coffee_info() {
let app = spawn_app_with_auth().await;
let roaster = create_default_roaster(&app).await;
let roast = create_default_roast(&app, roaster.id).await;
let session = BrowserSession::new(&app.address).await.unwrap();
authenticate_browser(&session, &app).await.unwrap();
session
.goto(&format!("/roasters/{}/roasts/{}", roaster.slug, roast.slug))
.await
.unwrap();
wait_for_visible(&session.driver, "h1").await.unwrap();
let body = session.driver.find(By::Css("body")).await.unwrap();
let text = body.text().await.unwrap();
assert!(text.contains("Test Roast"), "Should show roast name");
assert!(text.contains("Ethiopia"), "Should show origin");
assert!(text.contains("Yirgacheffe"), "Should show region");
assert!(text.contains("Washed"), "Should show process");
assert!(text.contains("Blueberry"), "Should show tasting notes");
session.quit().await;
}
#[tokio::test]
async fn bag_detail_shows_status_and_close_button() {
let app = spawn_app_with_auth().await;
let roaster = create_default_roaster(&app).await;
let roast = create_default_roast(&app, roaster.id).await;
let bag = create_default_bag(&app, roast.id).await;
let session = BrowserSession::new(&app.address).await.unwrap();
authenticate_browser(&session, &app).await.unwrap();
session.goto(&format!("/bags/{}", bag.id)).await.unwrap();
wait_for_visible(&session.driver, "h1").await.unwrap();
let body = session.driver.find(By::Css("body")).await.unwrap();
let text = body.text().await.unwrap();
assert!(text.contains("Test Roast"), "Should show roast name");
assert!(text.contains("250"), "Should show bag amount");
// Close Bag button should be visible (bag is open)
assert!(text.contains("Close Bag"), "Should show Close Bag button");
session.quit().await;
}
#[tokio::test]
async fn gear_detail_shows_fields() {
let app = spawn_app_with_auth().await;
let gear = create_default_gear(&app, "grinder", "Comandante", "C40 MK4").await;
let session = BrowserSession::new(&app.address).await.unwrap();
authenticate_browser(&session, &app).await.unwrap();
session.goto(&format!("/gear/{}", gear.id)).await.unwrap();
wait_for_visible(&session.driver, "h1").await.unwrap();
let body = session.driver.find(By::Css("body")).await.unwrap();
let text = body.text().await.unwrap();
assert!(text.contains("Comandante"), "Should show make");
assert!(text.contains("C40 MK4"), "Should show model");
session.quit().await;
}
#[tokio::test]
async fn cafe_detail_shows_location() {
let app = spawn_app_with_auth().await;
let cafe = create_default_cafe(&app).await;
let session = BrowserSession::new(&app.address).await.unwrap();
authenticate_browser(&session, &app).await.unwrap();
session
.goto(&format!("/cafes/{}", cafe.slug))
.await
.unwrap();
wait_for_visible(&session.driver, "h1").await.unwrap();
let body = session.driver.find(By::Css("body")).await.unwrap();
let text = body.text().await.unwrap();
assert!(text.contains("Blue Bottle"), "Should show cafe name");
assert!(text.contains("San Francisco"), "Should show city");
session.quit().await;
}