Use the crate mockall to mock the email service in integration tests

This commit is contained in:
Greg Burri 2025-05-02 13:38:41 +02:00
parent 3626f8a11b
commit 8c70f90234
5 changed files with 109 additions and 23 deletions

View file

@ -1,10 +1,11 @@
use std::error::Error;
use std::{error::Error, sync::Arc};
use axum_test::TestServer;
use cookie::Cookie;
use mockall::predicate;
use scraper::{ElementRef, Html, Selector};
use recipes::app;
use recipes::{app, email};
use serde::Serialize;
mod utils;
@ -104,7 +105,18 @@ pub struct SignUpFormData {
#[tokio::test]
async fn sign_up() -> Result<(), Box<dyn Error>> {
// Arrange.
let state = utils::common_state().await?;
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(),
)
.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.
@ -122,7 +134,6 @@ async fn sign_up() -> Result<(), Box<dyn Error>> {
let document = Html::parse_document(&response.text());
assert_eq!(document.errors.len(), 0);
dbg!(response);
Ok(())
}