mirror of
https://github.com/chatmail/core.git
synced 2026-05-17 05:46:30 +03:00
fix: Emit MsgsChanged, not IncomingMsg, for messages only having special parts (#8157)
And example of such messages is location-only messages.
This commit is contained in:
@@ -861,7 +861,7 @@ mod tests {
|
|||||||
use crate::config::Config;
|
use crate::config::Config;
|
||||||
use crate::message::MessageState;
|
use crate::message::MessageState;
|
||||||
use crate::receive_imf::receive_imf;
|
use crate::receive_imf::receive_imf;
|
||||||
use crate::test_utils::{TestContext, TestContextManager};
|
use crate::test_utils::{TestContext, TestContextManager, event_tracker::GetMatchingArgs};
|
||||||
use crate::tools::SystemTime;
|
use crate::tools::SystemTime;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@@ -1107,7 +1107,18 @@ Content-Disposition: attachment; filename="location.kml"
|
|||||||
SystemTime::shift(Duration::from_secs(10));
|
SystemTime::shift(Duration::from_secs(10));
|
||||||
delete_expired(alice, time()).await?;
|
delete_expired(alice, time()).await?;
|
||||||
maybe_send_locations(alice).await?;
|
maybe_send_locations(alice).await?;
|
||||||
|
bob.evtracker.clear_events();
|
||||||
bob.recv_msg_opt(&alice.pop_sent_msg().await).await;
|
bob.recv_msg_opt(&alice.pop_sent_msg().await).await;
|
||||||
|
bob.evtracker
|
||||||
|
.get_matching_ex(
|
||||||
|
bob,
|
||||||
|
GetMatchingArgs {
|
||||||
|
expected: |e| matches!(e, EventType::MsgsChanged { .. }),
|
||||||
|
unexpected: |e| matches!(e, EventType::IncomingMsg { .. }),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
assert_eq!(get_range(alice, None, None, 0, 0).await?.len(), 1);
|
assert_eq!(get_range(alice, None, None, 0, 0).await?.len(), 1);
|
||||||
assert_eq!(get_range(bob, None, None, 0, 0).await?.len(), 1);
|
assert_eq!(get_range(bob, None, None, 0, 0).await?.len(), 1);
|
||||||
|
|
||||||
|
|||||||
@@ -1075,8 +1075,11 @@ UPDATE msgs SET state=? WHERE
|
|||||||
let is_bot = context.get_config_bool(Config::Bot).await?;
|
let is_bot = context.get_config_bool(Config::Bot).await?;
|
||||||
let is_pre_message = matches!(mime_parser.pre_message, PreMessageMode::Pre { .. });
|
let is_pre_message = matches!(mime_parser.pre_message, PreMessageMode::Pre { .. });
|
||||||
let skip_bot_notify = is_bot && is_pre_message;
|
let skip_bot_notify = is_bot && is_pre_message;
|
||||||
let important =
|
let important = mime_parser.incoming
|
||||||
mime_parser.incoming && fresh && !is_old_contact_request && !skip_bot_notify;
|
&& !mime_parser.parts.is_empty()
|
||||||
|
&& fresh
|
||||||
|
&& !is_old_contact_request
|
||||||
|
&& !skip_bot_notify;
|
||||||
|
|
||||||
for msg_id in &received_msg.msg_ids {
|
for msg_id in &received_msg.msg_ids {
|
||||||
chat_id.emit_msg_event(context, *msg_id, important);
|
chat_id.emit_msg_event(context, *msg_id, important);
|
||||||
|
|||||||
@@ -1433,6 +1433,16 @@ pub fn fiona_keypair() -> SignedSecretKey {
|
|||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct EventTracker(EventEmitter);
|
pub struct EventTracker(EventEmitter);
|
||||||
|
|
||||||
|
pub mod event_tracker {
|
||||||
|
use super::EventType;
|
||||||
|
|
||||||
|
/// See [`super::EventTracker::get_matching_ex`].
|
||||||
|
pub struct GetMatchingArgs<E: Fn(&EventType) -> bool, U: Fn(&EventType) -> bool> {
|
||||||
|
pub expected: E,
|
||||||
|
pub unexpected: U,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Deref for EventTracker {
|
impl Deref for EventTracker {
|
||||||
type Target = EventEmitter;
|
type Target = EventEmitter;
|
||||||
|
|
||||||
@@ -1488,6 +1498,27 @@ impl EventTracker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Consumes all emitted events returning the first matching one if any. Panics on unexpected
|
||||||
|
/// events.
|
||||||
|
pub async fn get_matching_ex<E: Fn(&EventType) -> bool, U: Fn(&EventType) -> bool>(
|
||||||
|
&self,
|
||||||
|
ctx: &Context,
|
||||||
|
args: event_tracker::GetMatchingArgs<E, U>,
|
||||||
|
) -> Option<EventType> {
|
||||||
|
ctx.emit_event(EventType::Test);
|
||||||
|
let mut found_event = None;
|
||||||
|
loop {
|
||||||
|
let event = self.recv().await.unwrap();
|
||||||
|
assert!(!(args.unexpected)(&event.typ));
|
||||||
|
if let EventType::Test = event.typ {
|
||||||
|
return found_event;
|
||||||
|
}
|
||||||
|
if (args.expected)(&event.typ) {
|
||||||
|
found_event.get_or_insert(event.typ);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Consumes events looking for an [`EventType::Info`] with substring matching.
|
/// Consumes events looking for an [`EventType::Info`] with substring matching.
|
||||||
pub async fn get_info_contains(&self, s: &str) -> EventType {
|
pub async fn get_info_contains(&self, s: &str) -> EventType {
|
||||||
self.get_matching(|evt| match evt {
|
self.get_matching(|evt| match evt {
|
||||||
|
|||||||
Reference in New Issue
Block a user