diff --git a/src/chat.rs b/src/chat.rs index cfa7e01c69..d994c68d0d 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -801,9 +801,14 @@ impl ChatId { Sync => chat.get_sync_id(context).await?, }; - context + let webxdc_ids = context .sql .transaction(|transaction| { + let mut stmt = transaction.prepare("SELECT id FROM msgs WHERE chat_id=? AND type=?")?; + let mut webxdc_ids = Vec::new(); + for id in stmt.query_map((self, Viewtype::Webxdc), |row| row.get(0))? { + webxdc_ids.push(id?); + } transaction.execute( "UPDATE imap SET target=? WHERE rfc724_mid IN (SELECT rfc724_mid FROM msgs WHERE chat_id=?)", (delete_msgs_target, self,), @@ -819,10 +824,13 @@ impl ChatId { transaction.execute("DELETE FROM msgs WHERE chat_id=?", (self,))?; transaction.execute("DELETE FROM chats_contacts WHERE chat_id=?", (self,))?; transaction.execute("DELETE FROM chats WHERE id=?", (self,))?; - Ok(()) + Ok(webxdc_ids) }) .await?; + for msg_id in webxdc_ids { + context.emit_event(EventType::WebxdcInstanceDeleted { msg_id }); + } context.emit_event(EventType::ChatDeleted { chat_id: self }); context.emit_msgs_changed_without_ids(); diff --git a/src/webxdc/webxdc_tests.rs b/src/webxdc/webxdc_tests.rs index ae4bd15867..b55ff80539 100644 --- a/src/webxdc/webxdc_tests.rs +++ b/src/webxdc/webxdc_tests.rs @@ -1790,6 +1790,37 @@ async fn test_webxdc_delete_event() -> Result<()> { Ok(()) } +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn test_chat_delete() -> Result<()> { + let alice = &TestContext::new_alice().await; + + let chat_id = create_group_chat(alice, ProtectionStatus::Unprotected, "foo").await?; + send_webxdc_instance(alice, chat_id).await?; + + let chat_id = create_group_chat(alice, ProtectionStatus::Unprotected, "bar").await?; + let instance = send_webxdc_instance(alice, chat_id).await?; + alice.send_text(chat_id, "wtf").await; + + chat_id.delete(alice).await?; + let EventType::WebxdcInstanceDeleted { msg_id } = alice + .evtracker + .get_matching(|evt| matches!(evt, EventType::WebxdcInstanceDeleted { .. })) + .await + else { + unreachable!(); + }; + assert_eq!(msg_id, instance.id); + assert!(alice + .evtracker + .get_matching_opt(alice, |evt| matches!( + evt, + EventType::WebxdcInstanceDeleted { .. } + )) + .await + .is_none()); + Ok(()) +} + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn change_logging_webxdc() -> Result<()> { let alice = TestContext::new_alice().await;