From 170f34738b9011570aec7c7f7ef72d9031429f7f Mon Sep 17 00:00:00 2001 From: Sandro Eiler Date: Tue, 27 Feb 2024 15:20:23 +0100 Subject: [PATCH] test: add unhappy case for email client --- src/email_client.rs | 41 ++++++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/src/email_client.rs b/src/email_client.rs index 97c530b..87c45e8 100644 --- a/src/email_client.rs +++ b/src/email_client.rs @@ -40,8 +40,7 @@ impl EmailClient { html_body: html_content, text_body: text_content, }; - let _builder = self - .http_client + self.http_client .post(&url) .header( "X-Postmark-Server-Token", @@ -49,7 +48,8 @@ impl EmailClient { ) .json(&request_body) .send() - .await?; + .await? + .error_for_status()?; Ok(()) } } @@ -68,13 +68,13 @@ mod tests { use crate::domain::SubscriberEmail; use crate::email_client::EmailClient; + use claims::{assert_err, assert_ok}; use fake::faker::internet::en::SafeEmail; use fake::faker::lorem::en::{Paragraph, Sentence}; use fake::{Fake, Faker}; use secrecy::Secret; use wiremock::matchers::{any, header, header_exists, method, path}; use wiremock::{Mock, MockServer, Request, ResponseTemplate}; - use claims::assert_ok; struct SendEmailBodyMatcher; @@ -103,11 +103,7 @@ mod tests { // Arrange let mock_server = MockServer::start().await; let sender = SubscriberEmail::parse(SafeEmail().fake()).unwrap(); - let email_client = EmailClient::new( - mock_server.uri(), - sender, - Secret::new(Faker.fake()) - ); + let email_client = EmailClient::new(mock_server.uri(), sender, Secret::new(Faker.fake())); let subscriber_email = SubscriberEmail::parse(SafeEmail().fake()).unwrap(); let subject: String = Sentence(1..2).fake(); @@ -157,4 +153,31 @@ mod tests { // Assert // Mock expectations are checked on drop } + + #[tokio::test] + async fn send_email_fails_if_the_server_returns_500() { + // Arrange + let mock_server = MockServer::start().await; + let sender = SubscriberEmail::parse(SafeEmail().fake()).unwrap(); + let email_client = EmailClient::new(mock_server.uri(), sender, Secret::new(Faker.fake())); + + let subscriber_email = SubscriberEmail::parse(SafeEmail().fake()).unwrap(); + let subject: String = Sentence(1..2).fake(); + let content: String = Paragraph(1..10).fake(); + + Mock::given(any()) + // Not a 200 anymore! + .respond_with(ResponseTemplate::new(500)) + .expect(1) + .mount(&mock_server) + .await; + + // Act + let outcome = email_client + .send_email(subscriber_email, &subject, &content, &content) + .await; + + // Assert + assert_err!(outcome); + } }