@@ -34,7 +34,9 @@ async fn concurrent_form_submissions_handled_gracefully() {
3434 assert_eq ! (
3535 response1. text( ) . await . unwrap( ) ,
3636 response2. text( ) . await . unwrap( )
37- )
37+ ) ;
38+
39+ app. dispatch_all_pending_emails ( ) . await ;
3840}
3941
4042#[ tokio:: test]
@@ -132,7 +134,11 @@ async fn newsletters_are_delivered_to_confirmed_subscribers() {
132134 . await ;
133135 assert_is_redirect_to ( & response, "/admin/newsletters" ) ;
134136 let html_page = app. get_submit_newsletters_html ( ) . await ;
135- assert ! ( html_page. contains( "<p><i>The newsletter issue has been published!</i></p>" ) ) ;
137+ assert ! ( html_page. contains(
138+ "The newsletter issue has been accepted - \
139+ email will go out shortly."
140+ ) ) ;
141+ app. dispatch_all_pending_emails ( ) . await ;
136142 // Mock verifies on Drop that we have sent the newsletter email
137143}
138144
@@ -160,8 +166,12 @@ async fn newsletters_are_not_delivered_to_unconfirmed_subscribers() {
160166 let response = app. post_newsletters ( & newsletter_request_body) . await ;
161167 assert_is_redirect_to ( & response, "/admin/newsletters" ) ;
162168 let html_page = app. get_submit_newsletters_html ( ) . await ;
169+ assert ! ( html_page. contains(
170+ "The newsletter issue has been accepted - \
171+ email will go out shortly."
172+ ) ) ;
173+ app. dispatch_all_pending_emails ( ) . await ;
163174 // assert on injected FlashMessage content
164- assert ! ( html_page. contains( "<p><i>The newsletter issue has been published!</i></p>" ) ) ;
165175 // Mock verifies on Drop that we haven't sent the newsletter email
166176}
167177
@@ -237,47 +247,43 @@ async fn create_confirmed_subscriber(app: &TestApp) {
237247 . error_for_status ( )
238248 . unwrap ( ) ;
239249}
240-
241- fn when_sending_an_email ( ) -> MockBuilder {
242- Mock :: given ( path ( "/email" ) ) . and ( method ( "POST" ) )
243- }
244-
245250#[ tokio:: test]
246- async fn transient_errors_do_nost_cause_duplicate_deliveries_on_retries ( ) {
251+ async fn newsletter_creation_is_idempotent ( ) {
252+ // Arrange
247253 let app = spawn_app ( ) . await ;
248- let newsletter_request_body = serde_json:: json!( {
249- "title" : "Newsletter title" ,
250- "text_content" : "Newsletter body as plain text" ,
251- "html_content" : "<p>Newsletter body as HTML</p>" ,
252- "idempotency_key" : uuid:: Uuid :: new_v4( ) . to_string( ) ,
253- } ) ;
254- create_confirmed_subscriber ( & app) . await ;
255254 create_confirmed_subscriber ( & app) . await ;
256255 app. test_user . login ( & app) . await ;
257- when_sending_an_email ( )
256+
257+ Mock :: given ( path ( "/email" ) )
258+ . and ( method ( "POST" ) )
258259 . respond_with ( ResponseTemplate :: new ( 200 ) )
259- . up_to_n_times ( 1 )
260- . expect ( 1 )
261- . mount ( & app. email_server )
262- . await ;
263- // second delivery should fail
264- when_sending_an_email ( )
265- . respond_with ( ResponseTemplate :: new ( 500 ) )
266- . up_to_n_times ( 1 )
267260 . expect ( 1 )
268261 . mount ( & app. email_server )
269262 . await ;
270263
264+ let newsletter_request_body = serde_json:: json!( {
265+ "title" : "Newsletter title" ,
266+ "text_content" : "Newsletter body as plain text" ,
267+ "html_content" : "<p>Newsletter body as HTML</p>" ,
268+ "idempotency_key" : uuid:: Uuid :: new_v4( ) . to_string( )
269+ } ) ;
271270 let response = app. post_newsletters ( & newsletter_request_body) . await ;
271+ assert_is_redirect_to ( & response, "/admin/newsletters" ) ;
272272
273- assert_eq ! ( response. status( ) . as_u16( ) , 500 ) ;
274- when_sending_an_email ( )
275- . respond_with ( ResponseTemplate :: new ( 200 ) )
276- . expect ( 1 )
277- . named ( "Delivery retry" )
278- . mount ( & app. email_server )
279- . await ;
273+ let html_page = app. get_submit_newsletters_html ( ) . await ;
274+ assert ! ( html_page. contains(
275+ "<p><i>The newsletter issue has been accepted - \
276+ emails will go out shortly.</i></p>"
277+ ) ) ;
280278
281279 let response = app. post_newsletters ( & newsletter_request_body) . await ;
282- assert_eq ! ( response. status( ) . as_u16( ) , 303 ) ;
280+ assert_is_redirect_to ( & response, "/admin/newsletters" ) ;
281+
282+ let html_page = app. get_submit_newsletters_html ( ) . await ;
283+ assert ! ( html_page. contains(
284+ "The newsletter issue has been accepted - \
285+ email will go out shortly."
286+ ) ) ;
287+ app. dispatch_all_pending_emails ( ) . await ;
283288}
289+
0 commit comments