test(notification-client): replace unit test with crate-specific integration tests

Signed-off-by: Michael Goldenberg <m@mgoldenberg.net>
This commit is contained in:
Michael Goldenberg
2026-02-10 11:07:34 -05:00
committed by Damir Jelić
parent 1833e9185d
commit ce1ec8bab3
2 changed files with 88 additions and 101 deletions
@@ -1034,26 +1034,12 @@ pub enum Error {
#[cfg(test)]
mod tests {
use std::{
collections::{BTreeMap, BTreeSet},
sync::Arc,
};
use assert_matches2::assert_let;
use matrix_sdk::test_utils::mocks::{MatrixMockServer, RoomContextResponseTemplate};
use matrix_sdk_test::{JoinedRoomBuilder, async_test, event_factory::EventFactory};
use ruma::{
api::client::sync::sync_events::v5::{Response, response},
assign, event_id, owned_user_id, room_id, uint, user_id,
};
use matrix_sdk::test_utils::mocks::MatrixMockServer;
use matrix_sdk_test::{async_test, event_factory::EventFactory};
use ruma::{event_id, room_id, user_id};
use crate::{
notification_client::{
NotificationClient, NotificationItem, NotificationProcessSetup, NotificationStatus,
RawNotificationEvent,
},
sync_service::SyncService,
};
use crate::notification_client::{NotificationItem, RawNotificationEvent};
#[async_test]
async fn test_notification_item_returns_thread_id() {
@@ -1079,84 +1065,4 @@ mod tests {
assert_let!(Some(thread_id) = notification_item.thread_id);
assert_eq!(thread_id, thread_root_event_id);
}
#[async_test]
async fn test_notification_room_display_name_excludes_service_members() {
let server = MatrixMockServer::new().await;
let client = server.client_builder().build().await;
let alice_user_id = owned_user_id!("@alice:b.c");
let bob_user_id = owned_user_id!("@bob:b.c");
let charlie_user_id = owned_user_id!("@charlie:b.c");
let room_id = room_id!("!a:b.c");
let event_id = event_id!("$a:b.c");
let f = EventFactory::new().room(room_id).sender(&alice_user_id);
let initial_state = vec![
f.member(&alice_user_id).display_name("Alice").into_raw_sync_state(),
f.member(&bob_user_id).display_name("Bob").into_raw_sync_state(),
f.member(&charlie_user_id).display_name("Charlie").into_raw_sync_state(),
f.member_hints(BTreeSet::from([charlie_user_id.clone()]))
.sender(&alice_user_id)
.into_raw_sync_state(),
];
let expected_display_name = "Alice, Bob".to_owned();
let joined_room_builder = JoinedRoomBuilder::new(room_id);
let room = server
.sync_room(&client, joined_room_builder.add_state_bulk(initial_state.clone()))
.await;
assert_eq!(room.display_name().await.unwrap().to_string(), expected_display_name);
let process_setup = NotificationProcessSetup::SingleProcess {
sync_service: Arc::new(SyncService::builder(client.clone()).build().await.unwrap()),
};
let event = f.text_msg("Hey").event_id(event_id).into_event();
server
.mock_room_event_context()
.room(room_id.to_owned())
.match_event_id()
.ok(RoomContextResponseTemplate::new(event))
.mount()
.await;
// Check that the notification we get with `/context` shows the correct room
// name
let notification_client =
NotificationClient::new(client.clone(), process_setup.clone()).await.unwrap();
assert_let!(
NotificationStatus::Event(notification) =
notification_client.get_notification_with_context(room_id, event_id).await.unwrap()
);
assert_eq!(notification.room_computed_display_name, expected_display_name);
let response_room = assign!(response::Room::new(), {
required_state: initial_state,
initial: Some(true),
joined_count: Some(uint!(3)),
timeline: vec![f.text_msg("Hey").event_id(event_id).into_raw_sync()],
});
server
.mock_sliding_sync()
.ok(assign!(Response::new("1".to_owned()), {
rooms: BTreeMap::from([(room_id.to_owned(), response_room)])
}))
.mount()
.await;
// Check that the notification we get with sliding sync shows the correct room
// name
let notification_client =
NotificationClient::new(client.clone(), process_setup.clone()).await.unwrap();
assert_let!(
NotificationStatus::Event(notification) = notification_client
.get_notification_with_sliding_sync(room_id, event_id)
.await
.unwrap()
);
assert_eq!(notification.room_computed_display_name, expected_display_name);
}
}
@@ -1,5 +1,5 @@
use std::{
collections::BTreeMap,
collections::{BTreeMap, BTreeSet},
sync::{Arc, Mutex},
};
@@ -25,9 +25,11 @@ use matrix_sdk_ui::{
sync_service::SyncService,
};
use ruma::{
RoomVersionId, event_id,
RoomVersionId,
api::client::sync::sync_events::v5::{Response, response},
assign, event_id,
events::{Mentions, TimelineEventType, room::member::MembershipState},
mxc_uri, owned_user_id, room_id, user_id,
mxc_uri, owned_user_id, room_id, uint, user_id,
};
use serde_json::json;
use wiremock::{
@@ -1183,3 +1185,82 @@ async fn test_notification_client_context_filters_out_events_from_ignored_users(
assert_matches!(result, NotificationStatus::EventFilteredOut);
}
#[async_test]
async fn test_notification_room_display_name_excludes_service_members() {
let server = MatrixMockServer::new().await;
let client = server.client_builder().build().await;
let alice_user_id = owned_user_id!("@alice:b.c");
let bob_user_id = owned_user_id!("@bob:b.c");
let charlie_user_id = owned_user_id!("@charlie:b.c");
let room_id = room_id!("!a:b.c");
let event_id = event_id!("$a:b.c");
let f = EventFactory::new().room(room_id).sender(&alice_user_id);
let initial_state = vec![
f.member(&alice_user_id).display_name("Alice").into_raw_sync_state(),
f.member(&bob_user_id).display_name("Bob").into_raw_sync_state(),
f.member(&charlie_user_id).display_name("Charlie").into_raw_sync_state(),
f.member_hints(BTreeSet::from([charlie_user_id.clone()]))
.sender(&alice_user_id)
.into_raw_sync_state(),
];
let expected_display_name = "Alice, Bob".to_owned();
let joined_room_builder = JoinedRoomBuilder::new(room_id);
let room =
server.sync_room(&client, joined_room_builder.add_state_bulk(initial_state.clone())).await;
assert_eq!(room.display_name().await.unwrap().to_string(), expected_display_name);
let process_setup = NotificationProcessSetup::SingleProcess {
sync_service: Arc::new(SyncService::builder(client.clone()).build().await.unwrap()),
};
let event = f.text_msg("Hey").event_id(event_id).into_event();
server
.mock_room_event_context()
.room(room_id.to_owned())
.match_event_id()
.ok(RoomContextResponseTemplate::new(event))
.mount()
.await;
// Check that the notification we get with `/context` shows the correct room
// name
let notification_client =
NotificationClient::new(client.clone(), process_setup.clone()).await.unwrap();
assert_let!(
NotificationStatus::Event(notification) =
notification_client.get_notification_with_context(room_id, event_id).await.unwrap()
);
assert_eq!(notification.room_computed_display_name, expected_display_name);
let response_room = assign!(response::Room::new(), {
required_state: initial_state,
initial: Some(true),
joined_count: Some(uint!(3)),
timeline: vec![f.text_msg("Hey").event_id(event_id).into_raw_sync()],
});
server
.mock_sliding_sync()
.ok(assign!(Response::new("1".to_owned()), {
rooms: BTreeMap::from([(room_id.to_owned(), response_room)])
}))
.mount()
.await;
// Check that the notification we get with sliding sync shows the correct room
// name
let notification_client =
NotificationClient::new(client.clone(), process_setup.clone()).await.unwrap();
assert_let!(
NotificationStatus::Event(notification) = notification_client
.get_notification_with_sliding_sync(room_id, event_id)
.await
.unwrap()
);
assert_eq!(notification.room_computed_display_name, expected_display_name);
}