diff --git a/libs/workspace-template/src/document/get_started.rs b/libs/workspace-template/src/document/get_started.rs index 18d58e77..8ecb9cbe 100644 --- a/libs/workspace-template/src/document/get_started.rs +++ b/libs/workspace-template/src/document/get_started.rs @@ -25,8 +25,7 @@ impl WorkspaceTemplate for GetStartedDocumentTemplate { async fn create(&self, object_id: String) -> anyhow::Result { let data = tokio::task::spawn_blocking(|| { - let json_str = include_str!("../../assets/read_me.json"); - let document_data = JsonToDocumentParser::json_str_to_document(json_str).unwrap(); + let document_data = get_started_document_data().unwrap(); let collab = Arc::new(MutexCollab::new(Collab::new_with_origin( CollabOrigin::Empty, &object_id, @@ -124,3 +123,8 @@ impl WorkspaceTemplate for DocumentTemplate { self.create(view_id).await } } + +pub fn get_started_document_data() -> Result { + let json_str = include_str!("../../assets/read_me.json"); + JsonToDocumentParser::json_str_to_document(json_str) +} diff --git a/services/appflowy-collaborate/src/group/manager.rs b/services/appflowy-collaborate/src/group/manager.rs index 757fb46d..cd85b67e 100644 --- a/services/appflowy-collaborate/src/group/manager.rs +++ b/services/appflowy-collaborate/src/group/manager.rs @@ -123,7 +123,10 @@ where expect: metadata.workspace_id, actual: workspace_id.to_string(), }; - warn!("[Realtime]:{}:{}, {}", object_id, collab_type, err); + warn!( + "[Realtime]:user_id:{},object_id:{}:{},error:{}", + uid, object_id, collab_type, err + ); return Err(err); } } diff --git a/tests/main.rs b/tests/main.rs index 46f82e6a..315e3e26 100644 --- a/tests/main.rs +++ b/tests/main.rs @@ -7,3 +7,4 @@ mod websocket; mod workspace; mod ai_test; +mod yrs_version; diff --git a/tests/workspace/template_test.rs b/tests/workspace/template_test.rs index e60efbcc..1adb35aa 100644 --- a/tests/workspace/template_test.rs +++ b/tests/workspace/template_test.rs @@ -1,4 +1,11 @@ use client_api_test_util::*; +use collab::core::collab::DataSource; +use collab::core::origin::CollabOrigin; +use collab_document::document::Document; +use collab_entity::CollabType; +use database_entity::dto::{QueryCollab, QueryCollabParams}; +use std::fs::File; +use std::io::Write; #[tokio::test] async fn get_user_default_workspace_test() { @@ -6,10 +13,45 @@ async fn get_user_default_workspace_test() { let password = "Hello!123#"; let c = localhost_client(); c.sign_up(&email, password).await.unwrap(); - let test_client = TestClient::new_user().await; + let mut test_client = TestClient::new_user().await; + let workspace_id = test_client.workspace_id().await; let folder = test_client.get_user_folder().await; let views = folder.get_views_belong_to(&test_client.workspace_id().await); assert_eq!(views.len(), 1); assert_eq!(views[0].name, "Getting started"); + + let document_id = views[0].id.clone(); + let document = + get_document_collab_from_remote(&mut test_client, workspace_id, &document_id).await; + let document_data = document.get_document_data().unwrap(); + assert_eq!(document_data.blocks.len(), 25); +} + +async fn get_document_collab_from_remote( + test_client: &mut TestClient, + workspace_id: String, + document_id: &str, +) -> Document { + let params = QueryCollabParams { + workspace_id, + inner: QueryCollab { + object_id: document_id.to_string(), + collab_type: CollabType::Document, + }, + }; + let resp = test_client.get_collab(params).await.unwrap(); + let mut file = File::create("./get_started_encode_collab").unwrap(); + + // Step 3: Write the Vec data to the file. + file + .write_all(&resp.encode_collab.encode_to_bytes().unwrap()) + .unwrap(); + Document::from_doc_state( + CollabOrigin::Empty, + DataSource::DocStateV1(resp.encode_collab.doc_state.to_vec()), + document_id, + vec![], + ) + .unwrap() } diff --git a/tests/yrs_version/README.md b/tests/yrs_version/README.md new file mode 100644 index 00000000..e3ad7200 --- /dev/null +++ b/tests/yrs_version/README.md @@ -0,0 +1,6 @@ +The `yrs_version` test is designed to ensure that data encoded +with an older version of Yrs can be accurately decoded by the +new version of Yrs code. Each time a new version of Yrs is released, +this test should be conducted to verify compatibility with older versions. + +Tests should be added and run before updating to a new version of Yrs. \ No newline at end of file diff --git a/tests/yrs_version/document_test.rs b/tests/yrs_version/document_test.rs new file mode 100644 index 00000000..f532318f --- /dev/null +++ b/tests/yrs_version/document_test.rs @@ -0,0 +1,41 @@ +use crate::yrs_version::util::read_bytes_from_file; +use collab::core::collab::DataSource; +use collab::core::origin::CollabOrigin; +use collab::entity::EncodedCollab; +use collab_document::document::Document; + +/// Load collaboration data that was encoded using Yjs version 0.17. +#[test] +fn load_yrs_0172_version_get_started_document_using_current_yrs_version() { + let data = read_bytes_from_file("get_started_encode_collab_0172"); + let encode_collab = EncodedCollab::decode_from_bytes(&data).unwrap(); + + let document = Document::from_doc_state( + CollabOrigin::Empty, + DataSource::DocStateV1(encode_collab.doc_state.to_vec()), + "fake_id", + vec![], + ) + .unwrap(); + + let document_data = document.get_document_data().unwrap(); + assert_eq!(document_data.blocks.len(), 25); + let first_block = document_data.blocks.get(&document_data.page_id).unwrap(); + assert_eq!(first_block.id, document_data.page_id); + + let icon_block = document_data.blocks.get("a9SSKQKF4-").unwrap(); + let icon_data = icon_block.data.get("icon").unwrap().as_str().unwrap(); + assert_eq!(icon_data, "🥰"); + + let welcome_to_appflowy = document_data + .meta + .text_map + .as_ref() + .unwrap() + .get("OETXfTYZEw") + .unwrap(); + assert_eq!( + welcome_to_appflowy, + r#"[{"insert":"Welcome to AppFlowy!"}]"# + ); +} diff --git a/tests/yrs_version/files/folder_encode_collab_0172 b/tests/yrs_version/files/folder_encode_collab_0172 new file mode 100644 index 00000000..aa7701e0 Binary files /dev/null and b/tests/yrs_version/files/folder_encode_collab_0172 differ diff --git a/tests/yrs_version/files/get_started_encode_collab_0172 b/tests/yrs_version/files/get_started_encode_collab_0172 new file mode 100644 index 00000000..6d1d7448 Binary files /dev/null and b/tests/yrs_version/files/get_started_encode_collab_0172 differ diff --git a/tests/yrs_version/folder_test.rs b/tests/yrs_version/folder_test.rs new file mode 100644 index 00000000..9671820a --- /dev/null +++ b/tests/yrs_version/folder_test.rs @@ -0,0 +1,54 @@ +use crate::yrs_version::util::read_bytes_from_file; +use collab::core::collab::DataSource; +use collab::core::origin::CollabOrigin; +use collab::entity::EncodedCollab; +use collab_folder::Folder; + +/// Load collaboration data that was encoded using Yjs version 0.17. +/// folder structure: +/// favorite: document3 +/// person-document2 +/// person-document1 +/// - person-document1-1 +/// - person-document1-2 +/// Getting started +/// - document1 +/// - document2 +/// - document3 +/// +#[test] +fn load_yrs_0172_version_folder_using_current_yrs_version() { + let data = read_bytes_from_file("folder_encode_collab_0172"); + let encode_collab = EncodedCollab::decode_from_bytes(&data).unwrap(); + + let folder = Folder::from_collab_doc_state( + 322319512080748544, + CollabOrigin::Empty, + DataSource::DocStateV1(encode_collab.doc_state.to_vec()), + "fake_id", // just use fake id + vec![], + ) + .unwrap(); + + let workspace_id = folder.get_workspace_id(); + let views = folder.get_views_belong_to(&workspace_id); + assert_eq!(views.len(), 3); + assert_eq!(views[0].name, "person-document2"); + assert_eq!(views[1].name, "person-document1"); + assert_eq!(views[2].name, "Getting started"); + + let view_1_sub_views = folder.get_views_belong_to(&views[1].id); + assert_eq!(view_1_sub_views.len(), 2); + assert_eq!(view_1_sub_views[0].name, "person-document1-1"); + assert_eq!(view_1_sub_views[1].name, "person-document1-2"); + + let view_2_sub_views = folder.get_views_belong_to(&views[2].id); + assert_eq!(view_2_sub_views.len(), 3); + assert_eq!(view_2_sub_views[0].name, "document1"); + assert_eq!(view_2_sub_views[1].name, "document2"); + assert_eq!(view_2_sub_views[2].name, "document3"); + + let favorite_section_items = folder.get_my_favorite_sections(); + assert_eq!(favorite_section_items.len(), 1); + assert_eq!(view_2_sub_views[2].id, favorite_section_items[0].id); +} diff --git a/tests/yrs_version/mod.rs b/tests/yrs_version/mod.rs new file mode 100644 index 00000000..b85133f0 --- /dev/null +++ b/tests/yrs_version/mod.rs @@ -0,0 +1,3 @@ +mod document_test; +mod folder_test; +mod util; diff --git a/tests/yrs_version/util.rs b/tests/yrs_version/util.rs new file mode 100644 index 00000000..39d9ab84 --- /dev/null +++ b/tests/yrs_version/util.rs @@ -0,0 +1,9 @@ +use std::fs::File; +use std::io::Read; + +pub(crate) fn read_bytes_from_file(file_name: &str) -> Vec { + let mut file = File::open(format!("./tests/yrs_version/files/{}", file_name)).unwrap(); + let mut buffer = Vec::new(); + file.read_to_end(&mut buffer).unwrap(); + buffer +}