From da485c6df9800a2ebb1793d611c265a4e88413bc Mon Sep 17 00:00:00 2001 From: appflowy Date: Thu, 18 Aug 2022 23:12:26 +0800 Subject: [PATCH] chore: add more test --- .../src/services/view/controller.rs | 19 ------- .../tests/workspace/folder_test.rs | 8 --- .../flowy-folder/tests/workspace/script.rs | 12 ++--- .../flowy-grid/src/services/block_manager.rs | 8 ++- .../group/group_generator/group_controller.rs | 4 ++ .../group_generator/select_option_group.rs | 27 ++++++---- .../flowy-grid/tests/grid/group_test/test.rs | 50 +++++++++++++++++++ .../flowy-revision/src/rev_persistence.rs | 4 +- .../flowy-sdk/src/deps_resolve/folder_deps.rs | 1 + frontend/rust-lib/flowy-test/src/helper.rs | 11 ++-- .../src/revision/grid_block.rs | 2 +- 11 files changed, 85 insertions(+), 61 deletions(-) diff --git a/frontend/rust-lib/flowy-folder/src/services/view/controller.rs b/frontend/rust-lib/flowy-folder/src/services/view/controller.rs index 8ad370916e..ab0783cec0 100644 --- a/frontend/rust-lib/flowy-folder/src/services/view/controller.rs +++ b/frontend/rust-lib/flowy-folder/src/services/view/controller.rs @@ -19,7 +19,6 @@ use flowy_database::kv::KV; use flowy_folder_data_model::revision::{gen_view_id, ViewRevision}; use flowy_sync::entities::text_block::TextBlockIdPB; use futures::{FutureExt, StreamExt}; -use lib_infra::util::timestamp; use std::{collections::HashSet, sync::Arc}; const LATEST_VIEW_ID: &str = "latest_view_id"; @@ -453,24 +452,6 @@ async fn handle_trash_event( } } -fn make_view_rev_from(params: CreateViewParams) -> ViewRevision { - let time = timestamp(); - ViewRevision { - id: params.view_id, - app_id: params.belong_to_id, - name: params.name, - desc: params.desc, - data_type: params.data_type.into(), - version: 0, - belongings: vec![], - modified_time: time, - create_time: time, - ext_data: "".to_string(), - thumbnail: params.thumbnail, - layout: params.layout.into(), - } -} - fn get_data_processor( data_processors: ViewDataProcessorMap, data_type: &ViewDataTypePB, diff --git a/frontend/rust-lib/flowy-folder/tests/workspace/folder_test.rs b/frontend/rust-lib/flowy-folder/tests/workspace/folder_test.rs index 068619f785..33564c923d 100644 --- a/frontend/rust-lib/flowy-folder/tests/workspace/folder_test.rs +++ b/frontend/rust-lib/flowy-folder/tests/workspace/folder_test.rs @@ -1,8 +1,6 @@ use crate::script::{invalid_workspace_name_test_case, FolderScript::*, FolderTest}; use flowy_folder::entities::view::ViewDataTypePB; use flowy_folder::entities::workspace::CreateWorkspacePayloadPB; -use flowy_folder::entities::ViewLayoutTypePB; - use flowy_revision::disk::RevisionState; use flowy_test::{event_builder::*, FlowySDKTest}; @@ -136,13 +134,11 @@ async fn app_create_with_view() { name: "View A".to_owned(), desc: "View A description".to_owned(), data_type: ViewDataTypePB::Text, - layout: ViewLayoutTypePB::Grid, }, CreateView { name: "Grid".to_owned(), desc: "Grid description".to_owned(), data_type: ViewDataTypePB::Database, - layout: ViewLayoutTypePB::Grid, }, ReadApp(app.id), ]) @@ -202,13 +198,11 @@ async fn view_delete_all() { name: "View A".to_owned(), desc: "View A description".to_owned(), data_type: ViewDataTypePB::Text, - layout: ViewLayoutTypePB::Grid, }, CreateView { name: "Grid".to_owned(), desc: "Grid description".to_owned(), data_type: ViewDataTypePB::Database, - layout: ViewLayoutTypePB::Grid, }, ReadApp(app.id.clone()), ]) @@ -237,7 +231,6 @@ async fn view_delete_all_permanent() { name: "View A".to_owned(), desc: "View A description".to_owned(), data_type: ViewDataTypePB::Text, - layout: ViewLayoutTypePB::Grid, }, ReadApp(app.id.clone()), ]) @@ -337,7 +330,6 @@ async fn folder_sync_revision_with_new_view() { name: view_name.clone(), desc: view_desc.clone(), data_type: ViewDataTypePB::Text, - layout: ViewLayoutTypePB::Grid, }, AssertCurrentRevId(3), AssertNextSyncRevId(Some(3)), diff --git a/frontend/rust-lib/flowy-folder/tests/workspace/script.rs b/frontend/rust-lib/flowy-folder/tests/workspace/script.rs index 2c53d5e2a4..74b90ce654 100644 --- a/frontend/rust-lib/flowy-folder/tests/workspace/script.rs +++ b/frontend/rust-lib/flowy-folder/tests/workspace/script.rs @@ -53,7 +53,6 @@ pub enum FolderScript { name: String, desc: String, data_type: ViewDataTypePB, - layout: ViewLayoutTypePB, }, AssertView(ViewPB), ReadView(String), @@ -181,12 +180,11 @@ impl FolderTest { delete_app(sdk, &self.app.id).await; } - FolderScript::CreateView { - name, - desc, - data_type, - layout, - } => { + FolderScript::CreateView { name, desc, data_type } => { + let layout = match data_type { + ViewDataTypePB::Text => ViewLayoutTypePB::Document, + ViewDataTypePB::Database => ViewLayoutTypePB::Grid, + }; let view = create_view(sdk, &self.app.id, &name, &desc, data_type, layout).await; self.view = view; } diff --git a/frontend/rust-lib/flowy-grid/src/services/block_manager.rs b/frontend/rust-lib/flowy-grid/src/services/block_manager.rs index 3d31f99676..1bc9b9dc42 100644 --- a/frontend/rust-lib/flowy-grid/src/services/block_manager.rs +++ b/frontend/rust-lib/flowy-grid/src/services/block_manager.rs @@ -110,8 +110,7 @@ impl GridBlockManager { None => tracing::error!("Internal error: can't find the row with id: {}", changeset.row_id), Some(row_rev) => { let row_pb = make_row_from_row_rev(row_rev.clone()); - let block_order_changeset = - GridBlockChangesetPB::update(&editor.block_id, vec![row_pb]); + let block_order_changeset = GridBlockChangesetPB::update(&editor.block_id, vec![row_pb]); let _ = self .notify_did_update_block(&editor.block_id, block_order_changeset) .await?; @@ -189,10 +188,9 @@ impl GridBlockManager { } } - pub async fn update_cell(&self, changeset: CellChangesetPB ) -> FlowyResult<()> - { + pub async fn update_cell(&self, changeset: CellChangesetPB) -> FlowyResult<()> { let row_changeset: RowChangeset = changeset.clone().into(); - let _ = self.update_row(row_changeset, ).await?; + let _ = self.update_row(row_changeset).await?; self.notify_did_update_cell(changeset).await?; Ok(()) } diff --git a/frontend/rust-lib/flowy-grid/src/services/group/group_generator/group_controller.rs b/frontend/rust-lib/flowy-grid/src/services/group/group_generator/group_controller.rs index 05924bcfef..de9d93bba1 100644 --- a/frontend/rust-lib/flowy-grid/src/services/group/group_generator/group_controller.rs +++ b/frontend/rust-lib/flowy-grid/src/services/group/group_generator/group_controller.rs @@ -149,6 +149,10 @@ impl Group { pub fn index_of_row(&self, row_id: &str) -> Option { self.rows.iter().position(|row| row.id == row_id) } + + pub fn number_of_row(&self) -> usize { + self.rows.len() + } } impl GenericGroupController diff --git a/frontend/rust-lib/flowy-grid/src/services/group/group_generator/select_option_group.rs b/frontend/rust-lib/flowy-grid/src/services/group/group_generator/select_option_group.rs index 625f1fa643..029c64b578 100644 --- a/frontend/rust-lib/flowy-grid/src/services/group/group_generator/select_option_group.rs +++ b/frontend/rust-lib/flowy-grid/src/services/group/group_generator/select_option_group.rs @@ -249,27 +249,34 @@ fn move_row( ) { cell_data.select_options.iter().for_each(|option| { // Remove the row in which group contains the row - if option.id == group.id && group.contains_row(&row_rev.id) { + let is_group_contains = group.contains_row(&row_rev.id); + let to_index = group.index_of_row(to_row_id); + + if option.id == group.id && is_group_contains { group_changeset.push(GroupRowsChangesetPB::delete(group.id.clone(), vec![row_rev.id.clone()])); group.remove_row(&row_rev.id); } // Find the inserted group - if let Some(index) = group.index_of_row(to_row_id) { + if let Some(to_index) = to_index { let row_pb = RowPB::from(row_rev); let inserted_row = InsertedRowPB { row: row_pb.clone(), - index: Some(index as i32), + index: Some(to_index as i32), }; group_changeset.push(GroupRowsChangesetPB::insert(group.id.clone(), vec![inserted_row])); - group.insert_row(index, row_pb); - - // If the inserted row comes from other group, it needs to update the corresponding cell content. - if option.id != group.id { - // Update the corresponding row's cell content. - let cell_rev = insert_select_option_cell(group.id.clone(), field_rev); - row_changeset.cell_by_field_id.insert(field_rev.id.clone(), cell_rev); + if group.number_of_row() == to_index { + group.add_row(row_pb); + } else { + group.insert_row(to_index, row_pb); } } + + // If the inserted row comes from other group, it needs to update the corresponding cell content. + if to_index.is_some() && option.id != group.id { + // Update the corresponding row's cell content. + let cell_rev = insert_select_option_cell(group.id.clone(), field_rev); + row_changeset.cell_by_field_id.insert(field_rev.id.clone(), cell_rev); + } }); } diff --git a/frontend/rust-lib/flowy-grid/tests/grid/group_test/test.rs b/frontend/rust-lib/flowy-grid/tests/grid/group_test/test.rs index f568dfb816..317c852b5d 100644 --- a/frontend/rust-lib/flowy-grid/tests/grid/group_test/test.rs +++ b/frontend/rust-lib/flowy-grid/tests/grid/group_test/test.rs @@ -24,6 +24,30 @@ async fn board_init_test() { #[tokio::test] async fn board_move_row_test() { + let mut test = GridGroupTest::new().await; + let group = test.group_at_index(0).await; + let scripts = vec![ + MoveRow { + from_group_index: 0, + from_row_index: 0, + to_group_index: 0, + to_row_index: 1, + }, + AssertGroup { + group_index: 0, + row_count: 2, + }, + AssertGroupRow { + group_index: 0, + row_index: 1, + row: group.rows.get(0).unwrap().clone(), + }, + ]; + test.run_scripts(scripts).await; +} + +#[tokio::test] +async fn board_move_row_to_other_group_test() { let mut test = GridGroupTest::new().await; let group = test.group_at_index(0).await; let scripts = vec![ @@ -49,3 +73,29 @@ async fn board_move_row_test() { ]; test.run_scripts(scripts).await; } + +#[tokio::test] +async fn board_move_row_to_other_group_and_reorder_test() { + let mut test = GridGroupTest::new().await; + let group = test.group_at_index(0).await; + let scripts = vec![ + MoveRow { + from_group_index: 0, + from_row_index: 0, + to_group_index: 1, + to_row_index: 1, + }, + MoveRow { + from_group_index: 1, + from_row_index: 1, + to_group_index: 1, + to_row_index: 2, + }, + AssertGroupRow { + group_index: 1, + row_index: 2, + row: group.rows.get(0).unwrap().clone(), + }, + ]; + test.run_scripts(scripts).await; +} diff --git a/frontend/rust-lib/flowy-revision/src/rev_persistence.rs b/frontend/rust-lib/flowy-revision/src/rev_persistence.rs index cf672368ed..2124598400 100644 --- a/frontend/rust-lib/flowy-revision/src/rev_persistence.rs +++ b/frontend/rust-lib/flowy-revision/src/rev_persistence.rs @@ -320,9 +320,7 @@ impl RevisionSyncSequence { fn compact(&self) -> Option<(RevisionRange, VecDeque)> { // Make sure there are two rev_id going to sync. No need to compact if there is only // one rev_id in queue. - if self.next_rev_id().is_none() { - return None; - } + self.next_rev_id()?; let mut new_seq = self.0.clone(); let mut drained = new_seq.drain(1..).collect::>(); diff --git a/frontend/rust-lib/flowy-sdk/src/deps_resolve/folder_deps.rs b/frontend/rust-lib/flowy-sdk/src/deps_resolve/folder_deps.rs index 150ff831a2..0dc51c1a09 100644 --- a/frontend/rust-lib/flowy-sdk/src/deps_resolve/folder_deps.rs +++ b/frontend/rust-lib/flowy-sdk/src/deps_resolve/folder_deps.rs @@ -186,6 +186,7 @@ impl ViewDataProcessor for TextBlockViewDataProcessor { view_id: &str, layout: ViewLayoutTypePB, ) -> FutureResult { + debug_assert_eq!(layout, ViewLayoutTypePB::Document); let user_id = user_id.to_string(); let view_id = view_id.to_string(); let manager = self.0.clone(); diff --git a/frontend/rust-lib/flowy-test/src/helper.rs b/frontend/rust-lib/flowy-test/src/helper.rs index e55b4fdbeb..ef530b3888 100644 --- a/frontend/rust-lib/flowy-test/src/helper.rs +++ b/frontend/rust-lib/flowy-test/src/helper.rs @@ -25,16 +25,11 @@ pub struct ViewTest { impl ViewTest { #[allow(dead_code)] - pub async fn new( - sdk: &FlowySDKTest, - data_type: ViewDataTypePB, - sub_data_type: ViewLayoutTypePB, - data: Vec, - ) -> Self { + pub async fn new(sdk: &FlowySDKTest, data_type: ViewDataTypePB, layout: ViewLayoutTypePB, data: Vec) -> Self { let workspace = create_workspace(sdk, "Workspace", "").await; open_workspace(sdk, &workspace.id).await; let app = create_app(sdk, "App", "AppFlowy GitHub Project", &workspace.id).await; - let view = create_view(sdk, &app.id, data_type, sub_data_type, data).await; + let view = create_view(sdk, &app.id, data_type, layout, data).await; Self { sdk: sdk.clone(), workspace, @@ -52,7 +47,7 @@ impl ViewTest { } pub async fn new_text_block_view(sdk: &FlowySDKTest) -> Self { - Self::new(sdk, ViewDataTypePB::Text, ViewLayoutTypePB::Grid, vec![]).await + Self::new(sdk, ViewDataTypePB::Text, ViewLayoutTypePB::Document, vec![]).await } } diff --git a/shared-lib/flowy-grid-data-model/src/revision/grid_block.rs b/shared-lib/flowy-grid-data-model/src/revision/grid_block.rs index 99737dc4d6..5464d83877 100644 --- a/shared-lib/flowy-grid-data-model/src/revision/grid_block.rs +++ b/shared-lib/flowy-grid-data-model/src/revision/grid_block.rs @@ -55,7 +55,7 @@ impl RowChangeset { row_id, height: None, visibility: None, - cell_by_field_id: Default::default() + cell_by_field_id: Default::default(), } }