Admin can now write posts
Posts can be displayed on the website. Subscribers are automatically notified by email. This gives the opportunity to track explicitly how many people followed the link provided in the emails sent without being intrusive (no invisible image).
This commit is contained in:
83
tests/api/posts.rs
Normal file
83
tests/api/posts.rs
Normal file
@@ -0,0 +1,83 @@
|
||||
use crate::helpers::{TestApp, assert_is_redirect_to, when_sending_an_email};
|
||||
use fake::{
|
||||
Fake,
|
||||
faker::lorem::en::{Paragraph, Sentence},
|
||||
};
|
||||
use uuid::Uuid;
|
||||
use wiremock::ResponseTemplate;
|
||||
|
||||
fn subject() -> String {
|
||||
Sentence(1..2).fake()
|
||||
}
|
||||
|
||||
fn content() -> String {
|
||||
Paragraph(1..10).fake()
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn you_must_be_logged_in_to_create_a_new_post() {
|
||||
let app = TestApp::spawn().await;
|
||||
|
||||
let title = subject();
|
||||
let content = content();
|
||||
let body = serde_json::json!({
|
||||
"title": title,
|
||||
"content": content,
|
||||
});
|
||||
let response = app.post_create_post(&body).await;
|
||||
|
||||
assert_is_redirect_to(&response, "/login");
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn new_posts_are_stored_in_the_database() {
|
||||
let app = TestApp::spawn().await;
|
||||
app.admin_login().await;
|
||||
|
||||
let title = subject();
|
||||
let content = content();
|
||||
let body = serde_json::json!({
|
||||
"title": title,
|
||||
"content": content,
|
||||
"idempotency_key": Uuid::new_v4(),
|
||||
});
|
||||
let response = app.post_create_post(&body).await;
|
||||
|
||||
assert!(response.status().is_success());
|
||||
let html_fragment = response.text().await.unwrap();
|
||||
assert!(html_fragment.contains("Your new post has been saved"));
|
||||
|
||||
let saved = sqlx::query!("SELECT title, content FROM posts")
|
||||
.fetch_one(&app.connection_pool)
|
||||
.await
|
||||
.expect("Failed to fetch saved post");
|
||||
|
||||
assert_eq!(saved.title, title);
|
||||
assert_eq!(saved.content, content);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn confirmed_subscribers_are_notified_when_a_new_post_is_published() {
|
||||
let app = TestApp::spawn().await;
|
||||
app.create_unconfirmed_subscriber().await;
|
||||
app.create_confirmed_subscriber().await;
|
||||
app.admin_login().await;
|
||||
|
||||
when_sending_an_email()
|
||||
.respond_with(ResponseTemplate::new(200))
|
||||
.expect(1)
|
||||
.mount(&app.email_server)
|
||||
.await;
|
||||
|
||||
let title = subject();
|
||||
let content = content();
|
||||
let body = serde_json::json!({
|
||||
"title": title,
|
||||
"content": content,
|
||||
"idempotency_key": Uuid::new_v4(),
|
||||
|
||||
});
|
||||
app.post_create_post(&body).await;
|
||||
|
||||
app.dispatch_all_pending_emails().await;
|
||||
}
|
||||
Reference in New Issue
Block a user