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.
136 lines
4.8 KiB
Rust
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;
|
|
}
|