Skip to content

Commit

Permalink
fixup! crypto: Provide a way to subscribe to identity status changes
Browse files Browse the repository at this point in the history
  • Loading branch information
andybalaam committed Sep 27, 2024
1 parent 0a6b823 commit 52bbc70
Showing 1 changed file with 21 additions and 16 deletions.
37 changes: 21 additions & 16 deletions crates/matrix-sdk/src/room/identity_status_changes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,10 @@ impl IdentityStatusChanges {
yield current_state;
}
while let Some(item) = unprocessed_stream.next().await {
yield state.room_identity_state.process_change(item).await;
let update = state.room_identity_state.process_change(item).await;
if !update.is_empty() {
yield update;
}
}
}))
}
Expand Down Expand Up @@ -145,9 +148,13 @@ fn wrap_room_member_events(

#[cfg(test)]
mod tests {
use std::pin::{pin, Pin};
use std::{
pin::{pin, Pin},
time::Duration,
};

use futures_core::Stream;
use futures_util::FutureExt;
use matrix_sdk_base::crypto::{IdentityState, IdentityStatusChange};
use matrix_sdk_test::async_test;
use test_setup::TestSetup;
Expand Down Expand Up @@ -233,13 +240,15 @@ mod tests {

// And we are listening for identity changes
let changes = t.subscribe_to_identity_status_changes().await;
let mut changes = pin!(changes);

// When Bob joins the room
t.join().await;

// Then there is no notification
let change = next_change(&mut pin!(changes)).await;
assert!(change.is_empty());
tokio::time::sleep(Duration::from_millis(200)).await;
let change = changes.next().now_or_never();
assert!(change.is_none());
}

#[async_test]
Expand Down Expand Up @@ -302,34 +311,30 @@ mod tests {

// ... leaves and joins again (ignored since they stay pinned) ...
t.leave().await;
let change3 = next_change(&mut changes).await;
t.join().await;
let change4 = next_change(&mut changes).await;

// ... becomes unpinned ...
t.unpin().await;
let change5 = next_change(&mut changes).await;
let change3 = next_change(&mut changes).await;

// ... and leaves.
t.leave().await;
let change6 = next_change(&mut changes).await;
let change4 = next_change(&mut changes).await;

assert_eq!(change1[0].user_id, t.user_id());
assert_eq!(change2[0].user_id, t.user_id());
assert_eq!(change5[0].user_id, t.user_id());
assert_eq!(change6[0].user_id, t.user_id());
assert_eq!(change3[0].user_id, t.user_id());
assert_eq!(change4[0].user_id, t.user_id());

assert_eq!(change1[0].changed_to, IdentityState::PinViolation);
assert_eq!(change2[0].changed_to, IdentityState::Pinned);
assert_eq!(change5[0].changed_to, IdentityState::PinViolation);
assert_eq!(change6[0].changed_to, IdentityState::Pinned);
assert_eq!(change3[0].changed_to, IdentityState::PinViolation);
assert_eq!(change4[0].changed_to, IdentityState::Pinned);

assert_eq!(change1.len(), 1);
assert_eq!(change2.len(), 1);
assert_eq!(change3.len(), 0);
assert_eq!(change4.len(), 0);
assert_eq!(change5.len(), 1);
assert_eq!(change6.len(), 1);
assert_eq!(change3.len(), 1);
assert_eq!(change4.len(), 1);
}

async fn next_change(
Expand Down

0 comments on commit 52bbc70

Please sign in to comment.