@@ -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