Do not allocate.

Unhappy path tests.
This commit is contained in:
LukeMathWalker 2021-01-16 23:54:21 +00:00
parent 8fe02f6c42
commit 391f29de3d

View file

@ -27,11 +27,11 @@ impl EmailClient {
) -> Result<(), reqwest::Error> { ) -> Result<(), reqwest::Error> {
let url = format!("{}/email", self.base_url); let url = format!("{}/email", self.base_url);
let request_body = SendEmailRequest { let request_body = SendEmailRequest {
from: self.sender.as_ref().to_owned(), from: self.sender.as_ref(),
to: recipient.as_ref().to_owned(), to: recipient.as_ref(),
subject: subject.into(), subject,
html_body: html_content.into(), html_body: html_content,
text_body: text_content.into(), text_body: text_content,
}; };
self.http_client self.http_client
.post(&url) .post(&url)
@ -45,22 +45,23 @@ impl EmailClient {
#[derive(serde::Serialize)] #[derive(serde::Serialize)]
#[serde(rename_all = "PascalCase")] #[serde(rename_all = "PascalCase")]
struct SendEmailRequest { struct SendEmailRequest<'a> {
from: String, from: &'a str,
to: String, to: &'a str,
subject: String, subject: &'a str,
html_body: String, html_body: &'a str,
text_body: String, text_body: &'a str,
} }
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use crate::domain::SubscriberEmail; use crate::domain::SubscriberEmail;
use crate::email_client::EmailClient; use crate::email_client::EmailClient;
use claim::{assert_err, assert_ok};
use fake::faker::internet::en::SafeEmail; use fake::faker::internet::en::SafeEmail;
use fake::faker::lorem::en::{Paragraph, Sentence}; use fake::faker::lorem::en::{Paragraph, Sentence};
use fake::{Fake, Faker}; use fake::{Fake, Faker};
use wiremock::matchers::{header, header_exists, method, path}; use wiremock::matchers::{any, header, header_exists, method, path};
use wiremock::{Mock, MockServer, Request, ResponseTemplate}; use wiremock::{Mock, MockServer, Request, ResponseTemplate};
struct SendEmailBodyMatcher; struct SendEmailBodyMatcher;
@ -81,7 +82,7 @@ mod tests {
} }
#[actix_rt::test] #[actix_rt::test]
async fn send_email_fires_a_request_to_base_url() { async fn send_email_sends_the_expected_request() {
// Arrange // Arrange
let mock_server = MockServer::start().await; let mock_server = MockServer::start().await;
let sender = SubscriberEmail::parse(SafeEmail().fake()).unwrap(); let sender = SubscriberEmail::parse(SafeEmail().fake()).unwrap();
@ -108,4 +109,57 @@ mod tests {
// Assert // Assert
} }
#[actix_rt::test]
async fn send_email_succeeds_if_the_server_returns_200() {
// Arrange
let mock_server = MockServer::start().await;
let sender = SubscriberEmail::parse(SafeEmail().fake()).unwrap();
let email_client = EmailClient::new(mock_server.uri(), sender, 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())
.respond_with(ResponseTemplate::new(200))
.expect(1)
.mount(&mock_server)
.await;
// Act
let outcome = email_client
.send_email(subscriber_email, &subject, &content, &content)
.await;
// Assert
assert_ok!(outcome);
}
#[actix_rt::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, 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);
}
} }