From eba2e0d4dba7a01f244f55a8af9a0ddf334a3626 Mon Sep 17 00:00:00 2001 From: "Nathan.fooo" <86001920+appflowy@users.noreply.github.com> Date: Thu, 2 May 2024 21:30:23 +0800 Subject: [PATCH] ci: add test (#516) * ci: add test * ci: add test * ci: add readme * ci: update test --- .../src/document/get_started.rs | 8 ++- .../appflowy-collaborate/src/group/manager.rs | 5 +- tests/main.rs | 1 + tests/workspace/template_test.rs | 44 +++++++++++++- tests/yrs_version/README.md | 6 ++ tests/yrs_version/document_test.rs | 41 +++++++++++++ .../files/folder_encode_collab_0172 | Bin 0 -> 8778 bytes .../files/get_started_encode_collab_0172 | Bin 0 -> 9610 bytes tests/yrs_version/folder_test.rs | 54 ++++++++++++++++++ tests/yrs_version/mod.rs | 3 + tests/yrs_version/util.rs | 9 +++ 11 files changed, 167 insertions(+), 4 deletions(-) create mode 100644 tests/yrs_version/README.md create mode 100644 tests/yrs_version/document_test.rs create mode 100644 tests/yrs_version/files/folder_encode_collab_0172 create mode 100644 tests/yrs_version/files/get_started_encode_collab_0172 create mode 100644 tests/yrs_version/folder_test.rs create mode 100644 tests/yrs_version/mod.rs create mode 100644 tests/yrs_version/util.rs 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 0000000000000000000000000000000000000000..aa7701e07b1c56c85854bf90fa9c7e01b1aca88d GIT binary patch literal 8778 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 io+ECci8oMRg@x literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6d1d7448a5d2cf2b07258a407c8367a09d049c93 GIT binary patch literal 9610 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 Rf{en7R$$c~5gl!9{{ymWr@H_E literal 0 HcmV?d00001 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 +}