From 2a9345635024edc9b87f6344aa1059f48f2fa841 Mon Sep 17 00:00:00 2001 From: Greg Burri Date: Wed, 7 May 2025 15:24:28 +0200 Subject: [PATCH] Enhance sign up test --- Cargo.lock | 35 +++++++++++----- backend/Cargo.toml | 1 + backend/src/lib.rs | 2 +- backend/tests/http.rs | 94 +++++++++++++++++++++++++++++++++---------- 4 files changed, 98 insertions(+), 34 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f0e7b63..c089e11 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -348,9 +348,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", "cfg-if", @@ -1736,7 +1736,7 @@ dependencies = [ "tokio", "tokio-rustls", "url", - "webpki-roots", + "webpki-roots 0.26.11", ] [[package]] @@ -1747,9 +1747,9 @@ checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libm" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25169bd5913a4b437588a7e3d127cd6e90127b60e0ffbd834a38f1599e016b8" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libsqlite3-sys" @@ -2422,6 +2422,7 @@ dependencies = [ "rand 0.9.1", "rand_core 0.9.3", "ron", + "scanf", "scraper", "serde", "sqlx", @@ -2601,9 +2602,12 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] [[package]] name = "rustls-webpki" @@ -3820,9 +3824,18 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.10" +version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37493cadf42a2a939ed404698ded7fb378bf301b5011f973361779a3a74f8c93" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.0", +] + +[[package]] +name = "webpki-roots" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" dependencies = [ "rustls-pki-types", ] @@ -4077,9 +4090,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9fb597c990f03753e08d3c29efbfcf2019a003b4bf4ba19225c158e1549f0f3" +checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" dependencies = [ "memchr", ] diff --git a/backend/Cargo.toml b/backend/Cargo.toml index d627ad1..6160daf 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -56,3 +56,4 @@ axum-test = "17" cookie = "0.18" scraper = "0.23" mockall = "0.13" +scanf = "1.2" diff --git a/backend/src/lib.rs b/backend/src/lib.rs index 4380fe8..33fe17c 100644 --- a/backend/src/lib.rs +++ b/backend/src/lib.rs @@ -4,11 +4,11 @@ pub mod consts; pub mod data; pub mod email; pub mod log; +pub mod translation; mod hash; mod html_templates; mod ron_extractor; mod ron_utils; mod services; -mod translation; mod utils; diff --git a/backend/tests/http.rs b/backend/tests/http.rs index 61a3d48..9d31fb6 100644 --- a/backend/tests/http.rs +++ b/backend/tests/http.rs @@ -2,7 +2,6 @@ use std::{error::Error, sync::Arc}; use axum_test::TestServer; use cookie::Cookie; -use mockall::predicate; use scraper::{ElementRef, Html, Selector}; use recipes::{app, email}; @@ -26,7 +25,9 @@ async fn homepage() -> Result<(), Box> { response.assert_status_ok(); let document = Html::parse_document(&response.text()); - assert_eq!(document.errors.len(), 0); + if !document.errors.is_empty() { + panic!("{:?}", document.errors); + } let first_recipe_title = Selector::parse("#recipes-list .recipes-list-public .recipe-item").unwrap(); @@ -53,7 +54,9 @@ async fn recipe_view() -> Result<(), Box> { response.assert_status_ok(); let document = Html::parse_document(&response.text()); - assert_eq!(document.errors.len(), 0); + if !document.errors.is_empty() { + panic!("{:?}", document.errors); + } let recipe_title = Selector::parse("#recipe-view .recipe-title").unwrap(); let elements: Vec = document.select(&recipe_title).collect(); @@ -82,7 +85,9 @@ async fn user_edit() -> Result<(), Box> { response.assert_status_ok(); let document = Html::parse_document(&response.text()); - assert_eq!(document.errors.len(), 0); + if !document.errors.is_empty() { + panic!("{:?}", document.errors); + } let user_email = Selector::parse("#input-email").unwrap(); let elements: Vec = document.select(&user_email).collect(); @@ -104,36 +109,81 @@ pub struct SignUpFormData { #[tokio::test] async fn sign_up() -> Result<(), Box> { + use scanf::sscanf; + use std::{cell::RefCell, rc::Rc}; + // Arrange. + let validation_url: Rc> = Rc::new(RefCell::new(String::new())); + + let validation_url_clone = validation_url.clone(); let mut mock_email_service = utils::mock_email::MockEmailService::new(); mock_email_service .expect_send_email() - .with( - predicate::eq("president@spaceball.planet"), - predicate::always(), - predicate::always(), - ) + .withf_st(move |email, _title, message| { + sscanf!( + message, + "Follow this link to confirm your inscription, http://127.0.0.1:8000{}", + *validation_url_clone.borrow_mut() + ) + .unwrap(); + println!("{}", message); + email == "president@spaceball.planet" + }) .times(1) .returning(|_email, _title, _message| Ok(())); let state = utils::common_state_with_email_service(Arc::new(mock_email_service)).await?; let server = TestServer::new(app::make_service(state))?; - // Act. - let response = server - .post("/signup") - .form(&SignUpFormData { - email: "president@spaceball.planet".into(), - password_1: "12345678".into(), - password_2: "12345678".into(), - }) - .await; + let tr = recipes::translation::Tr::new("en"); - // Assert. - response.assert_status_ok(); + // Sign up page. + { + // Act. + let response = server + .post("/signup") + .form(&SignUpFormData { + email: "president@spaceball.planet".into(), + password_1: "12345678".into(), + password_2: "12345678".into(), + }) + .await; - let document = Html::parse_document(&response.text()); - assert_eq!(document.errors.len(), 0); + // Assert. + response.assert_status_ok(); + let document = Html::parse_document(&response.text()); + if !document.errors.is_empty() { + panic!("{:?}", document.errors); + } + + let message_selector = Selector::parse("#message").unwrap(); + let element = document.select(&message_selector).next().unwrap(); + assert_eq!( + element.inner_html(), + tr.t(common::translation::Sentence::SignUpEmailSent) + ); + } + + // Validation page. + { + // Act. + let response = server.get(&validation_url.borrow()); + let response = response.await; + + // Assert. + response.assert_status_ok(); + let document = Html::parse_document(&response.text()); + if !document.errors.is_empty() { + panic!("{:?}", document.errors); + } + + let message_selector = Selector::parse("#message").unwrap(); + let element = document.select(&message_selector).next().unwrap(); + assert_eq!( + element.inner_html(), + tr.t(common::translation::Sentence::SignUpEmailValidationSuccess) + ); + } Ok(()) }