refactor: fav and workspace (#3837)

* refactor: workspace

* chore: update collab rev

* test: add data migration test

* fix: test

* fix: tauri build

* test: fix bloc test

* test: fix bloc test

* test: fix bloc test

* chore: restore magic codde
This commit is contained in:
Nathan.fooo
2023-11-01 11:45:35 +08:00
committed by GitHub
parent 54dbcb7c5e
commit 3e088d48ac
79 changed files with 646 additions and 661 deletions

View File

@ -1,53 +1,10 @@
use collab_folder::core::ViewLayout;
use collab_folder::ViewLayout;
use flowy_folder2::entities::icon::{ViewIconPB, ViewIconTypePB};
use crate::folder::local_test::script::FolderScript::*;
use crate::folder::local_test::script::FolderTest;
#[tokio::test]
async fn read_all_workspace_test() {
let mut test = FolderTest::new().await;
test.run_scripts(vec![ReadAllWorkspaces]).await;
assert!(!test.all_workspace.is_empty());
}
#[tokio::test]
async fn create_workspace_test() {
let mut test = FolderTest::new().await;
let name = "My new workspace".to_owned();
let desc = "Daily routines".to_owned();
test
.run_scripts(vec![CreateWorkspace {
name: name.clone(),
desc: desc.clone(),
}])
.await;
let workspace = test.workspace.clone();
assert_eq!(workspace.name, name);
test
.run_scripts(vec![
ReadWorkspace(Some(workspace.id.clone())),
AssertWorkspace(workspace),
])
.await;
}
#[tokio::test]
async fn get_workspace_test() {
let mut test = FolderTest::new().await;
let workspace = test.workspace.clone();
test
.run_scripts(vec![
ReadWorkspace(Some(workspace.id.clone())),
AssertWorkspace(workspace),
])
.await;
}
#[tokio::test]
async fn create_parent_view_test() {
let mut test = FolderTest::new().await;

View File

@ -1,4 +1,4 @@
use collab_folder::core::ViewLayout;
use collab_folder::ViewLayout;
use event_integration::event_builder::EventBuilder;
use event_integration::EventIntegrationTest;
@ -7,14 +7,15 @@ use flowy_folder2::entities::*;
use flowy_folder2::event_map::FolderEvent::*;
pub enum FolderScript {
// Workspace
ReadAllWorkspaces,
#[allow(dead_code)]
CreateWorkspace {
name: String,
desc: String,
},
#[allow(dead_code)]
AssertWorkspace(WorkspacePB),
ReadWorkspace(Option<String>),
#[allow(dead_code)]
ReadWorkspace(String),
// App
CreateParentView {
@ -65,7 +66,6 @@ pub enum FolderScript {
pub struct FolderTest {
pub sdk: EventIntegrationTest,
pub all_workspace: Vec<WorkspacePB>,
pub workspace: WorkspacePB,
pub parent_view: ViewPB,
pub child_view: ViewPB,
@ -77,8 +77,15 @@ impl FolderTest {
pub async fn new() -> Self {
let sdk = EventIntegrationTest::new().await;
let _ = sdk.init_anon_user().await;
let workspace = create_workspace(&sdk, "FolderWorkspace", "Folder test workspace").await;
let parent_view = create_app(&sdk, &workspace.id, "Folder App", "Folder test app").await;
let workspace = sdk.folder_manager.get_current_workspace().await.unwrap();
let parent_view = create_view(
&sdk,
&workspace.id,
"Folder App",
"Folder test app",
ViewLayout::Document,
)
.await;
let view = create_view(
&sdk,
&parent_view.id,
@ -89,7 +96,6 @@ impl FolderTest {
.await;
Self {
sdk,
all_workspace: vec![],
workspace,
parent_view,
child_view: view,
@ -107,10 +113,6 @@ impl FolderTest {
pub async fn run_script(&mut self, script: FolderScript) {
let sdk = &self.sdk;
match script {
FolderScript::ReadAllWorkspaces => {
let all_workspace = read_workspace(sdk, None).await;
self.all_workspace = all_workspace;
},
FolderScript::CreateWorkspace { name, desc } => {
let workspace = create_workspace(sdk, &name, &desc).await;
self.workspace = workspace;
@ -119,11 +121,11 @@ impl FolderTest {
assert_eq!(self.workspace, workspace, "Workspace not equal");
},
FolderScript::ReadWorkspace(workspace_id) => {
let workspace = read_workspace(sdk, workspace_id).await.pop().unwrap();
let workspace = read_workspace(sdk, workspace_id).await;
self.workspace = workspace;
},
FolderScript::CreateParentView { name, desc } => {
let app = create_app(sdk, &self.workspace.id, &name, &desc).await;
let app = create_view(sdk, &self.workspace.id, &name, &desc, ViewLayout::Document).await;
self.parent_view = app;
},
FolderScript::AssertParentView(app) => {
@ -215,70 +217,27 @@ pub async fn create_workspace(sdk: &EventIntegrationTest, name: &str, desc: &str
.parse::<WorkspacePB>()
}
pub async fn read_workspace(
sdk: &EventIntegrationTest,
workspace_id: Option<String>,
) -> Vec<WorkspacePB> {
pub async fn read_workspace(sdk: &EventIntegrationTest, workspace_id: String) -> WorkspacePB {
let request = WorkspaceIdPB {
value: workspace_id,
};
let repeated_workspace = EventBuilder::new(sdk.clone())
.event(ReadAllWorkspaces)
EventBuilder::new(sdk.clone())
.event(ReadCurrentWorkspace)
.payload(request.clone())
.async_send()
.await
.parse::<RepeatedWorkspacePB>();
let workspaces;
if let Some(workspace_id) = &request.value {
workspaces = repeated_workspace
.items
.into_iter()
.filter(|workspace| &workspace.id == workspace_id)
.collect::<Vec<WorkspacePB>>();
debug_assert_eq!(workspaces.len(), 1);
} else {
workspaces = repeated_workspace.items;
}
workspaces
}
pub async fn create_app(
sdk: &EventIntegrationTest,
workspace_id: &str,
name: &str,
desc: &str,
) -> ViewPB {
let create_view_request = CreateViewPayloadPB {
parent_view_id: workspace_id.to_owned(),
name: name.to_string(),
desc: desc.to_string(),
thumbnail: None,
layout: ViewLayout::Document.into(),
initial_data: vec![],
meta: Default::default(),
set_as_current: true,
index: None,
};
EventBuilder::new(sdk.clone())
.event(CreateView)
.payload(create_view_request)
.async_send()
.await
.parse::<ViewPB>()
.parse::<WorkspacePB>()
}
pub async fn create_view(
sdk: &EventIntegrationTest,
app_id: &str,
parent_view_id: &str,
name: &str,
desc: &str,
layout: ViewLayout,
) -> ViewPB {
let request = CreateViewPayloadPB {
parent_view_id: app_id.to_string(),
parent_view_id: parent_view_id.to_string(),
name: name.to_string(),
desc: desc.to_string(),
thumbnail: None,

View File

@ -17,7 +17,7 @@ use crate::util::receive_with_timeout;
/// 6. Ensure that the received views contain the newly created "test_view".
async fn create_child_view_in_workspace_subscription_test() {
let test = EventIntegrationTest::new_with_guest_user().await;
let workspace = test.get_current_workspace().await.workspace;
let workspace = test.get_current_workspace().await;
let rx = test
.notification_sender
.subscribe::<RepeatedViewPB>(&workspace.id, FolderNotification::DidUpdateWorkspaceViews);
@ -41,7 +41,7 @@ async fn create_child_view_in_workspace_subscription_test() {
#[tokio::test]
async fn create_child_view_in_view_subscription_test() {
let test = EventIntegrationTest::new_with_guest_user().await;
let mut workspace = test.get_current_workspace().await.workspace;
let mut workspace = test.get_current_workspace().await;
let workspace_child_view = workspace.views.pop().unwrap();
let rx = test.notification_sender.subscribe::<ChildViewUpdatePB>(
&workspace_child_view.id,
@ -73,7 +73,7 @@ async fn create_child_view_in_view_subscription_test() {
#[tokio::test]
async fn delete_view_subscription_test() {
let test = EventIntegrationTest::new_with_guest_user().await;
let workspace = test.get_current_workspace().await.workspace;
let workspace = test.get_current_workspace().await;
let rx = test
.notification_sender
.subscribe::<ChildViewUpdatePB>(&workspace.id, FolderNotification::DidUpdateChildViews);
@ -104,7 +104,7 @@ async fn delete_view_subscription_test() {
#[tokio::test]
async fn update_view_subscription_test() {
let test = EventIntegrationTest::new_with_guest_user().await;
let mut workspace = test.get_current_workspace().await.workspace;
let mut workspace = test.get_current_workspace().await;
let rx = test
.notification_sender
.subscribe::<ChildViewUpdatePB>(&workspace.id, FolderNotification::DidUpdateChildViews);

View File

@ -16,44 +16,45 @@ async fn create_workspace_event_test() {
.payload(request)
.async_send()
.await
.parse::<flowy_folder2::entities::WorkspacePB>();
assert_eq!(resp.name, "my second workspace");
.error()
.unwrap();
assert_eq!(resp.code, ErrorCode::NotSupportYet);
}
#[tokio::test]
async fn open_workspace_event_test() {
let test = EventIntegrationTest::new_with_guest_user().await;
let payload = CreateWorkspacePayloadPB {
name: "my second workspace".to_owned(),
desc: "".to_owned(),
};
// create a workspace
let resp_1 = EventBuilder::new(test.clone())
.event(flowy_folder2::event_map::FolderEvent::CreateWorkspace)
.payload(payload)
.async_send()
.await
.parse::<flowy_folder2::entities::WorkspacePB>();
// open the workspace
let payload = WorkspaceIdPB {
value: Some(resp_1.id.clone()),
};
let resp_2 = EventBuilder::new(test)
.event(flowy_folder2::event_map::FolderEvent::OpenWorkspace)
.payload(payload)
.async_send()
.await
.parse::<flowy_folder2::entities::WorkspacePB>();
assert_eq!(resp_1.id, resp_2.id);
assert_eq!(resp_1.name, resp_2.name);
}
// #[tokio::test]
// async fn open_workspace_event_test() {
// let test = EventIntegrationTest::new_with_guest_user().await;
// let payload = CreateWorkspacePayloadPB {
// name: "my second workspace".to_owned(),
// desc: "".to_owned(),
// };
// // create a workspace
// let resp_1 = EventBuilder::new(test.clone())
// .event(flowy_folder2::event_map::FolderEvent::CreateWorkspace)
// .payload(payload)
// .async_send()
// .await
// .parse::<flowy_folder2::entities::WorkspacePB>();
//
// // open the workspace
// let payload = WorkspaceIdPB {
// value: Some(resp_1.id.clone()),
// };
// let resp_2 = EventBuilder::new(test)
// .event(flowy_folder2::event_map::FolderEvent::OpenWorkspace)
// .payload(payload)
// .async_send()
// .await
// .parse::<flowy_folder2::entities::WorkspacePB>();
//
// assert_eq!(resp_1.id, resp_2.id);
// assert_eq!(resp_1.name, resp_2.name);
// }
#[tokio::test]
async fn create_view_event_test() {
let test = EventIntegrationTest::new_with_guest_user().await;
let current_workspace = test.get_current_workspace().await.workspace;
let current_workspace = test.get_current_workspace().await;
let view = test
.create_view(&current_workspace.id, "My first view".to_string())
.await;
@ -65,7 +66,7 @@ async fn create_view_event_test() {
#[tokio::test]
async fn update_view_event_with_name_test() {
let test = EventIntegrationTest::new_with_guest_user().await;
let current_workspace = test.get_current_workspace().await.workspace;
let current_workspace = test.get_current_workspace().await;
let view = test
.create_view(&current_workspace.id, "My first view".to_string())
.await;
@ -86,7 +87,7 @@ async fn update_view_event_with_name_test() {
#[tokio::test]
async fn update_view_icon_event_test() {
let test = EventIntegrationTest::new_with_guest_user().await;
let current_workspace = test.get_current_workspace().await.workspace;
let current_workspace = test.get_current_workspace().await;
let view = test
.create_view(&current_workspace.id, "My first view".to_string())
.await;
@ -110,7 +111,7 @@ async fn update_view_icon_event_test() {
#[tokio::test]
async fn delete_view_event_test() {
let test = EventIntegrationTest::new_with_guest_user().await;
let current_workspace = test.get_current_workspace().await.workspace;
let current_workspace = test.get_current_workspace().await;
let view = test
.create_view(&current_workspace.id, "My first view".to_string())
.await;
@ -133,7 +134,7 @@ async fn delete_view_event_test() {
#[tokio::test]
async fn put_back_trash_event_test() {
let test = EventIntegrationTest::new_with_guest_user().await;
let current_workspace = test.get_current_workspace().await.workspace;
let current_workspace = test.get_current_workspace().await;
let view = test
.create_view(&current_workspace.id, "My first view".to_string())
.await;
@ -176,7 +177,7 @@ async fn put_back_trash_event_test() {
#[tokio::test]
async fn delete_view_permanently_event_test() {
let test = EventIntegrationTest::new_with_guest_user().await;
let current_workspace = test.get_current_workspace().await.workspace;
let current_workspace = test.get_current_workspace().await;
let view = test
.create_view(&current_workspace.id, "My first view".to_string())
.await;
@ -225,7 +226,7 @@ async fn delete_view_permanently_event_test() {
#[tokio::test]
async fn delete_all_trash_test() {
let test = EventIntegrationTest::new_with_guest_user().await;
let current_workspace = test.get_current_workspace().await.workspace;
let current_workspace = test.get_current_workspace().await;
for i in 0..3 {
let view = test
@ -269,7 +270,7 @@ async fn delete_all_trash_test() {
#[tokio::test]
async fn multiple_hierarchy_view_test() {
let test = EventIntegrationTest::new_with_guest_user().await;
let current_workspace = test.get_current_workspace().await.workspace;
let current_workspace = test.get_current_workspace().await;
for i in 1..4 {
let parent = test
.create_view(&current_workspace.id, format!("My {} view", i))
@ -345,7 +346,7 @@ async fn multiple_hierarchy_view_test() {
#[tokio::test]
async fn move_view_event_test() {
let test = EventIntegrationTest::new_with_guest_user().await;
let current_workspace = test.get_current_workspace().await.workspace;
let current_workspace = test.get_current_workspace().await;
for i in 1..4 {
let parent = test
.create_view(&current_workspace.id, format!("My {} view", i))
@ -383,7 +384,7 @@ async fn move_view_event_test() {
#[tokio::test]
async fn move_view_event_after_delete_view_test() {
let test = EventIntegrationTest::new_with_guest_user().await;
let current_workspace = test.get_current_workspace().await.workspace;
let current_workspace = test.get_current_workspace().await;
for i in 1..6 {
let _ = test
.create_view(&current_workspace.id, format!("My {} view", i))
@ -425,7 +426,7 @@ async fn move_view_event_after_delete_view_test() {
#[tokio::test]
async fn move_view_event_after_delete_view_test2() {
let test = EventIntegrationTest::new_with_guest_user().await;
let current_workspace = test.get_current_workspace().await.workspace;
let current_workspace = test.get_current_workspace().await;
let parent = test
.create_view(&current_workspace.id, "My view".to_string())
.await;
@ -495,7 +496,7 @@ fn invalid_workspace_name_test_case() -> Vec<(String, ErrorCode)> {
#[tokio::test]
async fn move_view_across_parent_test() {
let test = EventIntegrationTest::new_with_guest_user().await;
let current_workspace = test.get_current_workspace().await.workspace;
let current_workspace = test.get_current_workspace().await;
let parent_1 = test
.create_view(&current_workspace.id, "My view 1".to_string())
.await;

View File

@ -5,7 +5,7 @@ use collab::core::collab::MutexCollab;
use collab::core::origin::CollabOrigin;
use collab::preclude::updates::decoder::Decode;
use collab::preclude::{merge_updates_v1, JsonValue, Update};
use collab_folder::core::FolderData;
use collab_folder::FolderData;
use event_integration::event_builder::EventBuilder;
use flowy_folder2::entities::{FolderSnapshotPB, RepeatedFolderSnapshotPB, WorkspaceIdPB};
@ -39,7 +39,7 @@ impl FlowySupabaseFolderTest {
EventBuilder::new(self.inner.deref().clone())
.event(GetFolderSnapshots)
.payload(WorkspaceIdPB {
value: Some(workspace_id.to_string()),
value: workspace_id.to_string(),
})
.async_send()
.await

View File

@ -12,11 +12,12 @@ use crate::util::{get_folder_data_from_server, receive_with_timeout};
#[tokio::test]
async fn supabase_encrypt_folder_test() {
if let Some(test) = FlowySupabaseFolderTest::new().await {
let uid = test.user_manager.user_id().unwrap();
let secret = test.enable_encryption().await;
let local_folder_data = test.get_local_folder_data().await;
let workspace_id = test.get_current_workspace().await.workspace.id;
let remote_folder_data = get_folder_data_from_server(&workspace_id, Some(secret))
let workspace_id = test.get_current_workspace().await.id;
let remote_folder_data = get_folder_data_from_server(&uid, &workspace_id, Some(secret))
.await
.unwrap()
.unwrap();
@ -28,8 +29,9 @@ async fn supabase_encrypt_folder_test() {
#[tokio::test]
async fn supabase_decrypt_folder_data_test() {
if let Some(test) = FlowySupabaseFolderTest::new().await {
let uid = test.user_manager.user_id().unwrap();
let secret = Some(test.enable_encryption().await);
let workspace_id = test.get_current_workspace().await.workspace.id;
let workspace_id = test.get_current_workspace().await.id;
test
.create_view(&workspace_id, "encrypt view".to_string())
.await;
@ -41,7 +43,7 @@ async fn supabase_decrypt_folder_data_test() {
receive_with_timeout(rx, Duration::from_secs(10))
.await
.unwrap();
let folder_data = get_folder_data_from_server(&workspace_id, secret)
let folder_data = get_folder_data_from_server(&uid, &workspace_id, secret)
.await
.unwrap()
.unwrap();
@ -54,8 +56,9 @@ async fn supabase_decrypt_folder_data_test() {
#[should_panic]
async fn supabase_decrypt_with_invalid_secret_folder_data_test() {
if let Some(test) = FlowySupabaseFolderTest::new().await {
let uid = test.user_manager.user_id().unwrap();
let _ = Some(test.enable_encryption().await);
let workspace_id = test.get_current_workspace().await.workspace.id;
let workspace_id = test.get_current_workspace().await.id;
test
.create_view(&workspace_id, "encrypt view".to_string())
.await;
@ -66,7 +69,7 @@ async fn supabase_decrypt_with_invalid_secret_folder_data_test() {
.await
.unwrap();
let _ = get_folder_data_from_server(&workspace_id, Some("invalid secret".to_string()))
let _ = get_folder_data_from_server(&uid, &workspace_id, Some("invalid secret".to_string()))
.await
.unwrap();
}
@ -74,7 +77,7 @@ async fn supabase_decrypt_with_invalid_secret_folder_data_test() {
#[tokio::test]
async fn supabase_folder_snapshot_test() {
if let Some(test) = FlowySupabaseFolderTest::new().await {
let workspace_id = test.get_current_workspace().await.workspace.id;
let workspace_id = test.get_current_workspace().await.id;
let rx = test
.notification_sender
.subscribe::<FolderSnapshotStatePB>(&workspace_id, DidUpdateFolderSnapshotState);
@ -92,7 +95,7 @@ async fn supabase_folder_snapshot_test() {
#[tokio::test]
async fn supabase_initial_folder_snapshot_test2() {
if let Some(test) = FlowySupabaseFolderTest::new().await {
let workspace_id = test.get_current_workspace().await.workspace.id;
let workspace_id = test.get_current_workspace().await.id;
test
.create_view(&workspace_id, "supabase test view1".to_string())