Skip to content

Commit 8c006ca

Browse files
committed
test: test_markseen_pre_msg: Check that MDN on pre-message changes message state to OutMdnRcvd (#8004)
1 parent bdc9e7c commit 8c006ca

3 files changed

Lines changed: 94 additions & 39 deletions

File tree

src/smtp.rs

Lines changed: 69 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::config::Config;
1313
use crate::contact::{Contact, ContactId};
1414
use crate::context::Context;
1515
use crate::events::EventType;
16-
use crate::log::{LogExt, warn};
16+
use crate::log::warn;
1717
use crate::message::Message;
1818
use crate::message::{self, MsgId};
1919
use crate::mimefactory::MimeFactory;
@@ -584,44 +584,77 @@ async fn send_mdn_rfc724_mid(
584584
if context.get_config_bool(Config::BccSelf).await? {
585585
add_self_recipients(context, &mut recipients, encrypted).await?;
586586
}
587-
let recipients: Vec<_> = recipients
588-
.into_iter()
589-
.filter_map(|addr| {
590-
async_smtp::EmailAddress::new(addr.clone())
591-
.with_context(|| format!("Invalid recipient: {addr}"))
592-
.log_err(context)
593-
.ok()
594-
})
595-
.collect();
596-
597-
match smtp_send(context, &recipients, &body, smtp, None).await {
598-
SendResult::Success => {
599-
if !recipients.is_empty() {
600-
info!(context, "Successfully sent MDN for {rfc724_mid}.");
587+
#[cfg(not(test))]
588+
{
589+
use crate::log::LogExt;
590+
591+
let recipients: Vec<_> = recipients
592+
.into_iter()
593+
.filter_map(|addr| {
594+
async_smtp::EmailAddress::new(addr.clone())
595+
.with_context(|| format!("Invalid recipient: {addr}"))
596+
.log_err(context)
597+
.ok()
598+
})
599+
.collect();
600+
601+
match smtp_send(context, &recipients, &body, smtp, None).await {
602+
SendResult::Success => {
603+
if !recipients.is_empty() {
604+
info!(context, "Successfully sent MDN for {rfc724_mid}.");
605+
}
606+
context
607+
.sql
608+
.transaction(|transaction| {
609+
let mut stmt =
610+
transaction.prepare("DELETE FROM smtp_mdns WHERE rfc724_mid = ?")?;
611+
stmt.execute((rfc724_mid,))?;
612+
for additional_rfc724_mid in additional_rfc724_mids {
613+
stmt.execute((additional_rfc724_mid,))?;
614+
}
615+
Ok(())
616+
})
617+
.await?;
618+
Ok(true)
601619
}
602-
context
603-
.sql
604-
.transaction(|transaction| {
605-
let mut stmt =
606-
transaction.prepare("DELETE FROM smtp_mdns WHERE rfc724_mid = ?")?;
607-
stmt.execute((rfc724_mid,))?;
608-
for additional_rfc724_mid in additional_rfc724_mids {
609-
stmt.execute((additional_rfc724_mid,))?;
610-
}
611-
Ok(())
612-
})
613-
.await?;
614-
Ok(true)
615-
}
616-
SendResult::Retry => {
617-
info!(
618-
context,
619-
"Temporary SMTP failure while sending an MDN for {rfc724_mid}."
620-
);
621-
Ok(false)
620+
SendResult::Retry => {
621+
info!(
622+
context,
623+
"Temporary SMTP failure while sending an MDN for {rfc724_mid}."
624+
);
625+
Ok(false)
626+
}
627+
SendResult::Failure(err) => Err(err),
622628
}
623-
SendResult::Failure(err) => Err(err),
624629
}
630+
#[cfg(test)]
631+
{
632+
let _ = smtp;
633+
context
634+
.sql
635+
.transaction(|t| {
636+
t.execute(
637+
"INSERT INTO smtp (rfc724_mid, recipients, mime, msg_id)
638+
VALUES (?, ?, ?, ?)",
639+
(rfc724_mid, recipients.join(" "), body, u32::MAX),
640+
)?;
641+
let mut stmt = t.prepare("DELETE FROM smtp_mdns WHERE rfc724_mid = ?")?;
642+
stmt.execute((rfc724_mid,))?;
643+
for additional_rfc724_mid in additional_rfc724_mids {
644+
stmt.execute((additional_rfc724_mid,))?;
645+
}
646+
Ok(())
647+
})
648+
.await?;
649+
Ok(true)
650+
}
651+
}
652+
653+
#[cfg(test)]
654+
pub(crate) async fn queue_mdn(context: &Context) -> Result<()> {
655+
let queued = send_mdn(context, &mut Smtp::new()).await?;
656+
assert!(queued);
657+
Ok(())
625658
}
626659

627660
/// Tries to send a single MDN. Returns true if more MDNs should be sent.

src/test_utils.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -716,7 +716,8 @@ impl TestContext {
716716
}
717717

718718
pub async fn get_smtp_rows_for_msg<'a>(&'a self, msg_id: MsgId) -> Vec<SentMessage<'a>> {
719-
self.ctx
719+
let sent_msgs = self
720+
.ctx
720721
.sql
721722
.query_map_vec(
722723
"SELECT id, msg_id, mime, recipients FROM smtp WHERE msg_id=?",
@@ -738,7 +739,23 @@ impl TestContext {
738739
sender_context: &self.ctx,
739740
recipients,
740741
})
741-
.collect()
742+
.collect();
743+
self.ctx
744+
.sql
745+
.execute("DELETE FROM smtp WHERE msg_id=?", (msg_id,))
746+
.await
747+
.expect("Delete smtp jobs");
748+
update_msg_state(&self.ctx, msg_id, MessageState::OutDelivered)
749+
.await
750+
.expect("Update message state");
751+
self.sql
752+
.execute(
753+
"UPDATE msgs SET timestamp_sent=? WHERE id=?",
754+
(time(), msg_id),
755+
)
756+
.await
757+
.expect("Update timestamp_sent");
758+
sent_msgs
742759
}
743760

744761
/// Parses a message.

src/tests/pre_messages/receiving.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use crate::message::{Message, MessageState, Viewtype, delete_msgs, markseen_msgs
1010
use crate::mimeparser::MimeMessage;
1111
use crate::param::Param;
1212
use crate::reaction::{get_msg_reactions, send_reaction};
13+
use crate::smtp;
1314
use crate::summary::assert_summary_texts;
1415
use crate::test_utils::TestContextManager;
1516
use crate::tests::pre_messages::util::{
@@ -523,7 +524,7 @@ async fn test_markseen_pre_msg() -> Result<()> {
523524
alice.create_chat(bob).await; // Make sure the chat is accepted.
524525

525526
tcm.section("Bob sends a large message to Alice");
526-
let (pre_message, post_message, _bob_msg_id) =
527+
let (pre_message, post_message, bob_msg_id) =
527528
send_large_file_message(bob, bob_chat_id, Viewtype::File, &vec![0u8; 1_000_000]).await?;
528529

529530
tcm.section("Alice receives a pre-message message from Bob");
@@ -542,6 +543,10 @@ async fn test_markseen_pre_msg() -> Result<()> {
542543
.await?,
543544
1
544545
);
546+
smtp::queue_mdn(alice).await?;
547+
bob.recv_msg_trash(&alice.pop_sent_msg().await).await;
548+
let bob_msg = Message::load_from_db(bob, bob_msg_id).await?;
549+
assert_eq!(bob_msg.get_state(), MessageState::OutMdnRcvd);
545550

546551
tcm.section("Alice downloads message");
547552
alice.recv_msg_trash(&post_message).await;

0 commit comments

Comments
 (0)