recipes/backend/tests/http.rs

94 lines
2.9 KiB
Rust

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<dyn Error>> {
// 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<ElementRef> = 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<dyn Error>> {
// 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<ElementRef> = 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<dyn Error>> {
// 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<ElementRef> = document.select(&user_email).collect();
assert_eq!(elements.len(), 1);
assert_eq!(
elements[0].attr("value").unwrap(),
"president@spaceball.planet"
);
Ok(())
}