use std::error::Error; use axum_test::TestServer; use cookie::Cookie; use scraper::{ElementRef, Html, Selector}; use recipes::app; mod utils; #[tokio::test] async fn homepage() -> Result<(), Box> { // Arrange. let state = utils::common_state().await?; let user_id = utils::create_user(&state.db_connection, "president@spaceball.planet", "12345").await?; let _recipe_id = utils::create_recipe(&state.db_connection, user_id, "spaghetti").await?; let server = TestServer::new(app::make_service(state))?; // Act. let response = server.get("/").await; // Assert. response.assert_status_ok(); let document = Html::parse_document(&response.text()); assert_eq!(document.errors.len(), 0); let first_recipe_title = Selector::parse("#recipes-list .recipes-list-public .recipe-item").unwrap(); let elements: Vec = document.select(&first_recipe_title).collect(); assert_eq!(elements.len(), 1); assert_eq!(elements[0].inner_html(), "spaghetti"); Ok(()) } #[tokio::test] async fn recipe_view() -> Result<(), Box> { // Arrange. let state = utils::common_state().await?; let user_id = utils::create_user(&state.db_connection, "president@spaceball.planet", "12345").await?; let recipe_id = utils::create_recipe(&state.db_connection, user_id, "spaghetti").await?; let server = TestServer::new(app::make_service(state))?; // Act. let response = server.get(&format!("/recipe/view/{}", recipe_id)).await; // Assert. response.assert_status_ok(); let document = Html::parse_document(&response.text()); assert_eq!(document.errors.len(), 0); let recipe_title = Selector::parse("#recipe-view .recipe-title").unwrap(); let elements: Vec = document.select(&recipe_title).collect(); assert_eq!(elements.len(), 1); assert_eq!(elements[0].inner_html(), "spaghetti"); Ok(()) } #[tokio::test] async fn user_edit() -> Result<(), Box> { // Arrange. let state = utils::common_state().await?; let _user_id = utils::create_user(&state.db_connection, "president@spaceball.planet", "12345").await?; let token = utils::sign_in(&state.db_connection, "president@spaceball.planet", "12345").await?; let server = TestServer::new(app::make_service(state))?; // Act. let response = server .get("/user/edit") .add_cookie(Cookie::new("auth_token", token)) .await; // Assert. response.assert_status_ok(); let document = Html::parse_document(&response.text()); assert_eq!(document.errors.len(), 0); let user_email = Selector::parse("#input-email").unwrap(); let elements: Vec = document.select(&user_email).collect(); assert_eq!(elements.len(), 1); assert_eq!( elements[0].attr("value").unwrap(), "president@spaceball.planet" ); Ok(()) }