AppFlowy/frontend/rust-lib/flowy-folder/tests/workspace/script.rs

220 lines
7.9 KiB
Rust
Raw Normal View History

2022-01-22 10:48:43 +00:00
use crate::helper::*;
2022-02-25 14:27:44 +00:00
use flowy_collaboration::entities::{document_info::BlockInfo, revision::RevisionState};
2022-02-26 03:03:42 +00:00
use flowy_folder::{errors::ErrorCode, services::folder_editor::ClientFolderEditor};
use flowy_folder_data_model::entities::{
2022-01-22 10:48:43 +00:00
app::{App, RepeatedApp},
trash::Trash,
view::{RepeatedView, View, ViewType},
workspace::Workspace,
};
use flowy_sync::REVISION_WRITE_INTERVAL_IN_MILLIS;
use flowy_test::FlowySDKTest;
use std::{sync::Arc, time::Duration};
use tokio::time::sleep;
pub enum FolderScript {
// Workspace
ReadAllWorkspaces,
CreateWorkspace { name: String, desc: String },
AssertWorkspaceJson(String),
AssertWorkspace(Workspace),
ReadWorkspace(Option<String>),
// App
2022-01-26 15:29:18 +00:00
CreateApp { name: String, desc: String },
2022-01-22 10:48:43 +00:00
AssertAppJson(String),
AssertApp(App),
ReadApp(String),
UpdateApp { name: Option<String>, desc: Option<String> },
DeleteApp,
// View
2022-01-26 15:29:18 +00:00
CreateView { name: String, desc: String },
2022-01-22 10:48:43 +00:00
AssertView(View),
ReadView(String),
UpdateView { name: Option<String>, desc: Option<String> },
DeleteView,
DeleteViews(Vec<String>),
// Trash
RestoreAppFromTrash,
RestoreViewFromTrash,
ReadTrash,
DeleteAllTrash,
// Document
OpenDocument,
// Sync
AssertCurrentRevId(i64),
AssertNextSyncRevId(Option<i64>),
AssertRevisionState { rev_id: i64, state: RevisionState },
}
pub struct FolderTest {
pub sdk: FlowySDKTest,
pub all_workspace: Vec<Workspace>,
pub workspace: Workspace,
pub app: App,
pub view: View,
pub trash: Vec<Trash>,
2022-02-25 14:27:44 +00:00
pub document_info: Option<BlockInfo>,
2022-01-22 10:48:43 +00:00
// pub folder_editor:
}
impl FolderTest {
pub async fn new() -> Self {
let sdk = FlowySDKTest::default();
let _ = sdk.init_user().await;
let mut workspace = create_workspace(&sdk, "FolderWorkspace", "Folder test workspace").await;
let mut app = create_app(&sdk, &workspace.id, "Folder App", "Folder test app").await;
let view = create_view(&sdk, &app.id, "Folder View", "Folder test view", ViewType::Doc).await;
app.belongings = RepeatedView {
items: vec![view.clone()],
};
workspace.apps = RepeatedApp {
items: vec![app.clone()],
};
Self {
sdk,
all_workspace: vec![],
workspace,
app,
view,
trash: vec![],
document_info: None,
}
}
pub async fn run_scripts(&mut self, scripts: Vec<FolderScript>) {
for script in scripts {
self.run_script(script).await;
}
}
pub async fn run_script(&mut self, script: FolderScript) {
let sdk = &self.sdk;
2022-02-26 03:03:42 +00:00
let folder_editor: Arc<ClientFolderEditor> = sdk.folder_manager.folder_editor().await;
2022-01-22 10:48:43 +00:00
let rev_manager = folder_editor.rev_manager();
2022-01-25 12:37:48 +00:00
let cache = rev_manager.revision_cache().await;
2022-01-22 10:48:43 +00:00
match script {
FolderScript::ReadAllWorkspaces => {
let all_workspace = read_workspace(sdk, None).await;
self.all_workspace = all_workspace;
2022-01-24 09:35:58 +00:00
}
2022-01-22 10:48:43 +00:00
FolderScript::CreateWorkspace { name, desc } => {
let workspace = create_workspace(sdk, &name, &desc).await;
self.workspace = workspace;
2022-01-24 09:35:58 +00:00
}
2022-01-22 10:48:43 +00:00
FolderScript::AssertWorkspaceJson(expected_json) => {
let workspace = read_workspace(sdk, Some(self.workspace.id.clone()))
.await
.pop()
.unwrap();
let json = serde_json::to_string(&workspace).unwrap();
assert_eq!(json, expected_json);
2022-01-24 09:35:58 +00:00
}
2022-01-22 10:48:43 +00:00
FolderScript::AssertWorkspace(workspace) => {
assert_eq!(self.workspace, workspace);
2022-01-24 09:35:58 +00:00
}
2022-01-22 10:48:43 +00:00
FolderScript::ReadWorkspace(workspace_id) => {
let workspace = read_workspace(sdk, workspace_id).await.pop().unwrap();
self.workspace = workspace;
2022-01-24 09:35:58 +00:00
}
2022-01-22 10:48:43 +00:00
FolderScript::CreateApp { name, desc } => {
2022-01-26 15:29:18 +00:00
let app = create_app(sdk, &self.workspace.id, &name, &desc).await;
2022-01-22 10:48:43 +00:00
self.app = app;
2022-01-24 09:35:58 +00:00
}
2022-01-22 10:48:43 +00:00
FolderScript::AssertAppJson(expected_json) => {
let json = serde_json::to_string(&self.app).unwrap();
assert_eq!(json, expected_json);
2022-01-24 09:35:58 +00:00
}
2022-01-22 10:48:43 +00:00
FolderScript::AssertApp(app) => {
assert_eq!(self.app, app);
2022-01-24 09:35:58 +00:00
}
2022-01-22 10:48:43 +00:00
FolderScript::ReadApp(app_id) => {
2022-01-24 09:35:58 +00:00
let app = read_app(sdk, &app_id).await;
2022-01-22 10:48:43 +00:00
self.app = app;
2022-01-24 09:35:58 +00:00
}
2022-01-22 10:48:43 +00:00
FolderScript::UpdateApp { name, desc } => {
2022-01-24 09:35:58 +00:00
update_app(sdk, &self.app.id, name, desc).await;
}
2022-01-22 10:48:43 +00:00
FolderScript::DeleteApp => {
2022-01-24 09:35:58 +00:00
delete_app(sdk, &self.app.id).await;
}
2022-01-22 10:48:43 +00:00
FolderScript::CreateView { name, desc } => {
2022-01-26 15:29:18 +00:00
let view = create_view(sdk, &self.app.id, &name, &desc, ViewType::Doc).await;
2022-01-22 10:48:43 +00:00
self.view = view;
2022-01-24 09:35:58 +00:00
}
2022-01-22 10:48:43 +00:00
FolderScript::AssertView(view) => {
assert_eq!(self.view, view);
2022-01-24 09:35:58 +00:00
}
2022-01-22 10:48:43 +00:00
FolderScript::ReadView(view_id) => {
2022-02-24 12:36:24 +00:00
let view = read_view(sdk, &view_id).await;
2022-01-22 10:48:43 +00:00
self.view = view;
2022-01-24 09:35:58 +00:00
}
2022-01-22 10:48:43 +00:00
FolderScript::UpdateView { name, desc } => {
2022-01-24 09:35:58 +00:00
update_view(sdk, &self.view.id, name, desc).await;
}
2022-01-22 10:48:43 +00:00
FolderScript::DeleteView => {
2022-01-24 09:35:58 +00:00
delete_view(sdk, vec![self.view.id.clone()]).await;
}
2022-01-22 10:48:43 +00:00
FolderScript::DeleteViews(view_ids) => {
2022-01-24 09:35:58 +00:00
delete_view(sdk, view_ids).await;
}
2022-01-22 10:48:43 +00:00
FolderScript::RestoreAppFromTrash => {
2022-01-24 09:35:58 +00:00
restore_app_from_trash(sdk, &self.app.id).await;
}
2022-01-22 10:48:43 +00:00
FolderScript::RestoreViewFromTrash => {
2022-01-24 09:35:58 +00:00
restore_view_from_trash(sdk, &self.view.id).await;
}
2022-01-22 10:48:43 +00:00
FolderScript::ReadTrash => {
2022-01-24 09:35:58 +00:00
let trash = read_trash(sdk).await;
2022-01-22 10:48:43 +00:00
self.trash = trash.into_inner();
2022-01-24 09:35:58 +00:00
}
2022-01-22 10:48:43 +00:00
FolderScript::DeleteAllTrash => {
2022-01-24 09:35:58 +00:00
delete_all_trash(sdk).await;
2022-01-22 10:48:43 +00:00
self.trash = vec![];
2022-01-24 09:35:58 +00:00
}
2022-01-22 10:48:43 +00:00
FolderScript::OpenDocument => {
2022-01-24 09:35:58 +00:00
let document_info = open_document(sdk, &self.view.id).await;
2022-01-22 10:48:43 +00:00
self.document_info = Some(document_info);
2022-01-24 09:35:58 +00:00
}
2022-01-22 10:48:43 +00:00
FolderScript::AssertRevisionState { rev_id, state } => {
let record = cache.get(rev_id).await.unwrap();
assert_eq!(record.state, state);
if let RevisionState::Ack = state {
// There is a defer action that writes the revisions to disk, so we wait here.
// Make sure everything is written.
sleep(Duration::from_millis(2 * REVISION_WRITE_INTERVAL_IN_MILLIS)).await;
}
2022-01-24 09:35:58 +00:00
}
2022-01-22 10:48:43 +00:00
FolderScript::AssertCurrentRevId(rev_id) => {
2022-01-26 15:29:18 +00:00
assert_eq!(rev_manager.rev_id(), rev_id, "Current rev_id is not match");
2022-01-24 09:35:58 +00:00
}
2022-01-22 10:48:43 +00:00
FolderScript::AssertNextSyncRevId(rev_id) => {
let next_revision = rev_manager.next_sync_revision().await.unwrap();
if rev_id.is_none() {
2022-01-24 09:35:58 +00:00
assert!(next_revision.is_none(), "Next revision should be None");
2022-01-22 10:48:43 +00:00
return;
}
2022-01-26 15:29:18 +00:00
let next_revision = next_revision
.unwrap_or_else(|| panic!("Expected Next revision is {}, but receive None", rev_id.unwrap()));
2022-02-18 15:04:55 +00:00
let mut notify = rev_manager.ack_notify();
let _ = notify.recv().await;
2022-01-22 10:48:43 +00:00
assert_eq!(next_revision.rev_id, rev_id.unwrap());
2022-01-24 09:35:58 +00:00
}
2022-01-22 10:48:43 +00:00
}
}
}
pub fn invalid_workspace_name_test_case() -> Vec<(String, ErrorCode)> {
vec![
("".to_owned(), ErrorCode::WorkspaceNameInvalid),
("1234".repeat(100), ErrorCode::WorkspaceNameTooLong),
]
}