Enhance sign up test
This commit is contained in:
parent
fcadaf855f
commit
2a93456350
4 changed files with 98 additions and 34 deletions
35
Cargo.lock
generated
35
Cargo.lock
generated
|
|
@ -348,9 +348,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "backtrace"
|
name = "backtrace"
|
||||||
version = "0.3.74"
|
version = "0.3.75"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
|
checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"addr2line",
|
"addr2line",
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
|
|
@ -1736,7 +1736,7 @@ dependencies = [
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-rustls",
|
"tokio-rustls",
|
||||||
"url",
|
"url",
|
||||||
"webpki-roots",
|
"webpki-roots 0.26.11",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
@ -1747,9 +1747,9 @@ checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libm"
|
name = "libm"
|
||||||
version = "0.2.14"
|
version = "0.2.15"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a25169bd5913a4b437588a7e3d127cd6e90127b60e0ffbd834a38f1599e016b8"
|
checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libsqlite3-sys"
|
name = "libsqlite3-sys"
|
||||||
|
|
@ -2422,6 +2422,7 @@ dependencies = [
|
||||||
"rand 0.9.1",
|
"rand 0.9.1",
|
||||||
"rand_core 0.9.3",
|
"rand_core 0.9.3",
|
||||||
"ron",
|
"ron",
|
||||||
|
"scanf",
|
||||||
"scraper",
|
"scraper",
|
||||||
"serde",
|
"serde",
|
||||||
"sqlx",
|
"sqlx",
|
||||||
|
|
@ -2601,9 +2602,12 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustls-pki-types"
|
name = "rustls-pki-types"
|
||||||
version = "1.11.0"
|
version = "1.12.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c"
|
checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79"
|
||||||
|
dependencies = [
|
||||||
|
"zeroize",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustls-webpki"
|
name = "rustls-webpki"
|
||||||
|
|
@ -3820,9 +3824,18 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "webpki-roots"
|
name = "webpki-roots"
|
||||||
version = "0.26.10"
|
version = "0.26.11"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
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 = [
|
dependencies = [
|
||||||
"rustls-pki-types",
|
"rustls-pki-types",
|
||||||
]
|
]
|
||||||
|
|
@ -4077,9 +4090,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winnow"
|
name = "winnow"
|
||||||
version = "0.7.9"
|
version = "0.7.10"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d9fb597c990f03753e08d3c29efbfcf2019a003b4bf4ba19225c158e1549f0f3"
|
checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"memchr",
|
"memchr",
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -56,3 +56,4 @@ axum-test = "17"
|
||||||
cookie = "0.18"
|
cookie = "0.18"
|
||||||
scraper = "0.23"
|
scraper = "0.23"
|
||||||
mockall = "0.13"
|
mockall = "0.13"
|
||||||
|
scanf = "1.2"
|
||||||
|
|
|
||||||
|
|
@ -4,11 +4,11 @@ pub mod consts;
|
||||||
pub mod data;
|
pub mod data;
|
||||||
pub mod email;
|
pub mod email;
|
||||||
pub mod log;
|
pub mod log;
|
||||||
|
pub mod translation;
|
||||||
|
|
||||||
mod hash;
|
mod hash;
|
||||||
mod html_templates;
|
mod html_templates;
|
||||||
mod ron_extractor;
|
mod ron_extractor;
|
||||||
mod ron_utils;
|
mod ron_utils;
|
||||||
mod services;
|
mod services;
|
||||||
mod translation;
|
|
||||||
mod utils;
|
mod utils;
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ use std::{error::Error, sync::Arc};
|
||||||
|
|
||||||
use axum_test::TestServer;
|
use axum_test::TestServer;
|
||||||
use cookie::Cookie;
|
use cookie::Cookie;
|
||||||
use mockall::predicate;
|
|
||||||
use scraper::{ElementRef, Html, Selector};
|
use scraper::{ElementRef, Html, Selector};
|
||||||
|
|
||||||
use recipes::{app, email};
|
use recipes::{app, email};
|
||||||
|
|
@ -26,7 +25,9 @@ async fn homepage() -> Result<(), Box<dyn Error>> {
|
||||||
response.assert_status_ok();
|
response.assert_status_ok();
|
||||||
|
|
||||||
let document = Html::parse_document(&response.text());
|
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 =
|
let first_recipe_title =
|
||||||
Selector::parse("#recipes-list .recipes-list-public .recipe-item").unwrap();
|
Selector::parse("#recipes-list .recipes-list-public .recipe-item").unwrap();
|
||||||
|
|
@ -53,7 +54,9 @@ async fn recipe_view() -> Result<(), Box<dyn Error>> {
|
||||||
response.assert_status_ok();
|
response.assert_status_ok();
|
||||||
|
|
||||||
let document = Html::parse_document(&response.text());
|
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 recipe_title = Selector::parse("#recipe-view .recipe-title").unwrap();
|
||||||
let elements: Vec<ElementRef> = document.select(&recipe_title).collect();
|
let elements: Vec<ElementRef> = document.select(&recipe_title).collect();
|
||||||
|
|
@ -82,7 +85,9 @@ async fn user_edit() -> Result<(), Box<dyn Error>> {
|
||||||
response.assert_status_ok();
|
response.assert_status_ok();
|
||||||
|
|
||||||
let document = Html::parse_document(&response.text());
|
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 user_email = Selector::parse("#input-email").unwrap();
|
||||||
let elements: Vec<ElementRef> = document.select(&user_email).collect();
|
let elements: Vec<ElementRef> = document.select(&user_email).collect();
|
||||||
|
|
@ -104,36 +109,81 @@ pub struct SignUpFormData {
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn sign_up() -> Result<(), Box<dyn Error>> {
|
async fn sign_up() -> Result<(), Box<dyn Error>> {
|
||||||
|
use scanf::sscanf;
|
||||||
|
use std::{cell::RefCell, rc::Rc};
|
||||||
|
|
||||||
// Arrange.
|
// Arrange.
|
||||||
|
let validation_url: Rc<RefCell<String>> = Rc::new(RefCell::new(String::new()));
|
||||||
|
|
||||||
|
let validation_url_clone = validation_url.clone();
|
||||||
let mut mock_email_service = utils::mock_email::MockEmailService::new();
|
let mut mock_email_service = utils::mock_email::MockEmailService::new();
|
||||||
mock_email_service
|
mock_email_service
|
||||||
.expect_send_email()
|
.expect_send_email()
|
||||||
.with(
|
.withf_st(move |email, _title, message| {
|
||||||
predicate::eq("president@spaceball.planet"),
|
sscanf!(
|
||||||
predicate::always(),
|
message,
|
||||||
predicate::always(),
|
"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)
|
.times(1)
|
||||||
.returning(|_email, _title, _message| Ok(()));
|
.returning(|_email, _title, _message| Ok(()));
|
||||||
|
|
||||||
let state = utils::common_state_with_email_service(Arc::new(mock_email_service)).await?;
|
let state = utils::common_state_with_email_service(Arc::new(mock_email_service)).await?;
|
||||||
let server = TestServer::new(app::make_service(state))?;
|
let server = TestServer::new(app::make_service(state))?;
|
||||||
|
|
||||||
// Act.
|
let tr = recipes::translation::Tr::new("en");
|
||||||
let response = server
|
|
||||||
.post("/signup")
|
|
||||||
.form(&SignUpFormData {
|
|
||||||
email: "president@spaceball.planet".into(),
|
|
||||||
password_1: "12345678".into(),
|
|
||||||
password_2: "12345678".into(),
|
|
||||||
})
|
|
||||||
.await;
|
|
||||||
|
|
||||||
// Assert.
|
// Sign up page.
|
||||||
response.assert_status_ok();
|
{
|
||||||
|
// 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.
|
||||||
assert_eq!(document.errors.len(), 0);
|
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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue