Skip to content

Commit 1a6b534

Browse files
committed
test(sdk): Add new tests for Room::active_service_members_count
1 parent 1d7af29 commit 1a6b534

1 file changed

Lines changed: 186 additions & 1 deletion

File tree

  • crates/matrix-sdk/tests/integration

crates/matrix-sdk/tests/integration/sync.rs

Lines changed: 186 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use ruma::{
2222
guest_access::{GuestAccess, RoomGuestAccessEventContent},
2323
history_visibility::{HistoryVisibility, RoomHistoryVisibilityEventContent},
2424
join_rules::RoomJoinRulesEventContent,
25+
member::RoomMemberEvent,
2526
name::RoomNameEventContent,
2627
pinned_events::RoomPinnedEventsEventContent,
2728
power_levels::RoomPowerLevelsEventContent,
@@ -2384,7 +2385,7 @@ async fn test_receive_stripped_room_topic_event_via_sync() {
23842385
}
23852386

23862387
#[async_test]
2387-
async fn test_active_service_members() {
2388+
async fn test_update_active_service_members() {
23882389
let server = MatrixMockServer::new().await;
23892390
let client = server.client_builder().build().await;
23902391
let user_id = client.user_id().unwrap();
@@ -2421,6 +2422,7 @@ async fn test_active_service_members() {
24212422
assert_eq!(active_members.len(), 1);
24222423
assert_eq!(room.service_members().unwrap().len(), 2);
24232424
assert!(room.update_active_service_members().await.unwrap().unwrap().is_empty());
2425+
assert!(room.active_service_members_count().is_none());
24242426

24252427
// Now another user joined the room
24262428
let human_user = EventFactory::new()
@@ -2441,6 +2443,7 @@ async fn test_active_service_members() {
24412443
assert_eq!(active_members.len(), 2);
24422444
assert_eq!(room.service_members().unwrap().len(), 2);
24432445
assert!(room.update_active_service_members().await.unwrap().unwrap().is_empty());
2446+
assert!(room.active_service_members_count().is_none());
24442447

24452448
// Now one of the service members in the member hints joined the room
24462449
let service_member_1 =
@@ -2460,6 +2463,7 @@ async fn test_active_service_members() {
24602463
assert_eq!(active_members.len(), 3);
24612464
assert_eq!(room.service_members().unwrap().len(), 2);
24622465
assert_eq!(room.update_active_service_members().await.unwrap().unwrap().len(), 1);
2466+
assert_eq!(room.active_service_members_count().unwrap_or_default(), 1);
24632467

24642468
// And a second one joins too
24652469
let service_member_2 =
@@ -2479,6 +2483,7 @@ async fn test_active_service_members() {
24792483
assert_eq!(active_members.len(), 4);
24802484
assert_eq!(room.service_members().unwrap().len(), 2);
24812485
assert_eq!(room.update_active_service_members().await.unwrap().unwrap().len(), 2);
2486+
assert_eq!(room.active_service_members_count().unwrap_or_default(), 2);
24822487

24832488
// And now the 2nd service member leaves the room
24842489
let service_member_2_left = EventFactory::new()
@@ -2501,4 +2506,184 @@ async fn test_active_service_members() {
25012506
assert_eq!(active_members.len(), 3);
25022507
assert_eq!(room.service_members().unwrap().len(), 2);
25032508
assert_eq!(room.update_active_service_members().await.unwrap().unwrap().len(), 1);
2509+
assert_eq!(room.active_service_members_count().unwrap_or_default(), 1);
2510+
}
2511+
2512+
#[async_test]
2513+
async fn test_active_service_members_resets_when_member_counts_change() {
2514+
let server = MatrixMockServer::new().await;
2515+
let client = server.client_builder().build().await;
2516+
let user_id = client.user_id().unwrap();
2517+
let service_member_id_1 = owned_user_id!("@service_1:localhost");
2518+
let service_member_id_2 = owned_user_id!("@service_2:localhost");
2519+
2520+
let room_id = room_id!("!room:localhost");
2521+
let service_members_event = EventFactory::new()
2522+
.room(room_id)
2523+
.sender(user_id)
2524+
.member_hints(BTreeSet::from_iter(vec![
2525+
service_member_id_1.clone(),
2526+
service_member_id_2.clone(),
2527+
]))
2528+
.into_raw_sync_state();
2529+
let own_member_event =
2530+
EventFactory::new().room(room_id).member(user_id).display_name("Me").into_raw_sync_state();
2531+
let service_member_1 =
2532+
EventFactory::new().room(room_id).member(&service_member_id_1).into_raw_sync_state();
2533+
let service_member_2 =
2534+
EventFactory::new().room(room_id).member(&service_member_id_2).into_raw_sync_state();
2535+
2536+
// We start with just the room and our own member event, no service events
2537+
let room = server
2538+
.sync_room(
2539+
&client,
2540+
AnyRoomBuilder::Joined(
2541+
JoinedRoomBuilder::new(room_id)
2542+
.add_state_event(own_member_event)
2543+
.add_state_event(service_member_1)
2544+
.add_state_event(service_member_2)
2545+
.add_state_event(service_members_event),
2546+
),
2547+
)
2548+
.await;
2549+
2550+
let active_members = room.members_no_sync(RoomMemberships::ACTIVE).await.unwrap();
2551+
assert_eq!(active_members.len(), 3);
2552+
assert_eq!(room.service_members().unwrap().len(), 2);
2553+
2554+
// We got some computed values after update_active_service_members
2555+
assert_eq!(room.update_active_service_members().await.unwrap().unwrap().len(), 2);
2556+
assert_eq!(room.active_service_members_count().unwrap(), 2);
2557+
2558+
// But then the member counts change
2559+
let room = server
2560+
.sync_room(
2561+
&client,
2562+
AnyRoomBuilder::Joined(JoinedRoomBuilder::new(room_id).set_joined_members_count(32)),
2563+
)
2564+
.await;
2565+
2566+
// And the active service members should be reset to None
2567+
assert!(room.active_service_members_count().is_none());
2568+
}
2569+
2570+
#[async_test]
2571+
async fn test_cached_active_service_members_resets_when_member_counts_change() {
2572+
let server = MatrixMockServer::new().await;
2573+
let client = server.client_builder().build().await;
2574+
let user_id = client.user_id().unwrap();
2575+
let service_member_id_1 = owned_user_id!("@service_1:localhost");
2576+
let service_member_id_2 = owned_user_id!("@service_2:localhost");
2577+
2578+
let room_id = room_id!("!room:localhost");
2579+
let service_members_event = EventFactory::new()
2580+
.room(room_id)
2581+
.sender(user_id)
2582+
.member_hints(BTreeSet::from_iter(vec![
2583+
service_member_id_1.clone(),
2584+
service_member_id_2.clone(),
2585+
]))
2586+
.into_raw_sync_state();
2587+
let own_member_event =
2588+
EventFactory::new().room(room_id).member(user_id).display_name("Me").into_raw_sync_state();
2589+
let service_member_1 =
2590+
EventFactory::new().room(room_id).member(&service_member_id_1).into_raw();
2591+
let service_member_2 =
2592+
EventFactory::new().room(room_id).member(&service_member_id_2).into_raw();
2593+
2594+
// We start with just the room and our own member event, no service events
2595+
let room = server
2596+
.sync_room(
2597+
&client,
2598+
AnyRoomBuilder::Joined(
2599+
JoinedRoomBuilder::new(room_id)
2600+
.add_state_event(own_member_event)
2601+
.add_state_event(service_member_1)
2602+
.add_state_event(service_member_2)
2603+
.add_state_event(service_members_event),
2604+
),
2605+
)
2606+
.await;
2607+
2608+
let active_members = room.members_no_sync(RoomMemberships::ACTIVE).await.unwrap();
2609+
assert_eq!(active_members.len(), 3);
2610+
assert_eq!(room.service_members().unwrap().len(), 2);
2611+
2612+
// We got some computed values after update_active_service_members
2613+
assert_eq!(room.update_active_service_members().await.unwrap().unwrap().len(), 2);
2614+
assert_eq!(room.active_service_members_count().unwrap(), 2);
2615+
2616+
// But then the member counts change
2617+
let room = server
2618+
.sync_room(
2619+
&client,
2620+
AnyRoomBuilder::Joined(JoinedRoomBuilder::new(room_id).set_joined_members_count(32)),
2621+
)
2622+
.await;
2623+
2624+
// And the active service members should be reset to None
2625+
assert!(room.active_service_members_count().is_none());
2626+
}
2627+
2628+
#[async_test]
2629+
async fn test_cached_active_service_members_updates_on_sync_members() {
2630+
let server = MatrixMockServer::new().await;
2631+
let client = server.client_builder().build().await;
2632+
let user_id = client.user_id().unwrap();
2633+
let service_member_id_1 = owned_user_id!("@service_1:localhost");
2634+
let service_member_id_2 = owned_user_id!("@service_2:localhost");
2635+
2636+
let room_id = room_id!("!room:localhost");
2637+
let service_members_event = EventFactory::new()
2638+
.room(room_id)
2639+
.sender(user_id)
2640+
.member_hints(BTreeSet::from_iter(vec![
2641+
service_member_id_1.clone(),
2642+
service_member_id_2.clone(),
2643+
]))
2644+
.into_raw_sync_state();
2645+
let own_member_event =
2646+
EventFactory::new().room(room_id).member(user_id).display_name("Me").into_raw_sync_state();
2647+
let service_member_1 = EventFactory::new()
2648+
.room(room_id)
2649+
.member(&service_member_id_1)
2650+
.into_raw::<RoomMemberEvent>();
2651+
let service_member_2 = EventFactory::new()
2652+
.room(room_id)
2653+
.member(&service_member_id_2)
2654+
.into_raw::<RoomMemberEvent>();
2655+
2656+
// We start with just the room and our own member event, no service events
2657+
let room = server
2658+
.sync_room(
2659+
&client,
2660+
AnyRoomBuilder::Joined(
2661+
JoinedRoomBuilder::new(room_id)
2662+
.add_state_event(own_member_event)
2663+
.add_state_event(service_members_event),
2664+
),
2665+
)
2666+
.await;
2667+
2668+
let active_members = room.members_no_sync(RoomMemberships::ACTIVE).await.unwrap();
2669+
assert_eq!(active_members.len(), 1);
2670+
assert_eq!(room.service_members().unwrap().len(), 2);
2671+
2672+
// We don't have a computed value for active service members yet
2673+
assert!(room.active_service_members_count().is_none());
2674+
2675+
// But if we now sync the room members, the active service members should be
2676+
// updated
2677+
server
2678+
.mock_get_members()
2679+
.ok(vec![service_member_1, service_member_2])
2680+
.mock_once()
2681+
.mount()
2682+
.await;
2683+
2684+
room.sync_members().await.expect("sync_members");
2685+
2686+
// We got some computed values after sync_members
2687+
assert!(room.active_service_members_count().is_some());
2688+
assert_eq!(room.active_service_members_count().unwrap(), 2);
25042689
}

0 commit comments

Comments
 (0)