AppFlowy-Cloud/tests/collab/awareness_test.rs

71 lines
2.3 KiB
Rust

use client_api_test_util::TestClient;
use collab_entity::CollabType;
use database_entity::dto::{AFAccessLevel, AFRole};
use std::time::Duration;
use tokio::time::sleep;
#[tokio::test]
async fn viewing_document_editing_users_test() {
let collab_type = CollabType::Document;
let mut owner = TestClient::new_user().await;
let mut guest = TestClient::new_user().await;
let workspace_id = owner.workspace_id().await;
owner
.add_workspace_member(&workspace_id, &guest, AFRole::Member)
.await;
let object_id = owner
.create_and_edit_collab(&workspace_id, collab_type.clone())
.await;
let owner_uid = owner.uid().await;
let clients = owner.get_connect_users(&object_id).await;
assert_eq!(clients.len(), 1);
assert_eq!(clients[0], owner_uid);
owner
.add_collab_member(
&workspace_id,
&object_id,
&guest,
AFAccessLevel::ReadAndWrite,
)
.await;
guest
.open_collab(&workspace_id, &object_id, collab_type)
.await;
guest.wait_object_sync_complete(&object_id).await.unwrap();
// after guest open the collab, it will emit an awareness that contains the user id of guest.
// This awareness will be sent to the server. Server will broadcast the awareness to all the clients
// that are connected to the collab.
let guest_uid = guest.uid().await;
let mut clients: Vec<i64> = owner.get_connect_users(&object_id).await;
clients.sort();
let mut expected_clients = [owner_uid, guest_uid];
expected_clients.sort();
assert_eq!(clients.len(), 2);
assert_eq!(clients, expected_clients);
// simulate the guest close the collab
guest.clean_awareness_state(&object_id);
// sleep 2 second to make sure the awareness observe callback is called
sleep(Duration::from_secs(2)).await;
guest.wait_object_sync_complete(&object_id).await.unwrap();
let clients = owner.get_connect_users(&object_id).await;
assert_eq!(clients.len(), 1);
assert_eq!(clients[0], owner_uid);
// simulate the guest open the collab again
guest.emit_awareness_state(&object_id);
sleep(Duration::from_secs(2)).await;
guest.wait_object_sync_complete(&object_id).await.unwrap();
guest.wait_object_sync_complete(&object_id).await.unwrap();
let clients = owner.get_connect_users(&object_id).await;
assert_eq!(clients.len(), 2);
}