script.rs 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. use collab_folder::core::ViewLayout;
  2. use flowy_folder2::entities::*;
  3. use flowy_folder2::event_map::FolderEvent::*;
  4. use flowy_test::event_builder::EventBuilder;
  5. use flowy_test::FlowyCoreTest;
  6. pub enum FolderScript {
  7. // Workspace
  8. ReadAllWorkspaces,
  9. CreateWorkspace {
  10. name: String,
  11. desc: String,
  12. },
  13. AssertWorkspace(WorkspacePB),
  14. ReadWorkspace(Option<String>),
  15. // App
  16. CreateParentView {
  17. name: String,
  18. desc: String,
  19. },
  20. AssertParentView(ViewPB),
  21. ReloadParentView(String),
  22. UpdateParentView {
  23. name: Option<String>,
  24. desc: Option<String>,
  25. },
  26. DeleteParentView,
  27. // View
  28. CreateView {
  29. name: String,
  30. desc: String,
  31. layout: ViewLayout,
  32. },
  33. AssertView(ViewPB),
  34. ReadView(String),
  35. UpdateView {
  36. name: Option<String>,
  37. desc: Option<String>,
  38. },
  39. DeleteView,
  40. DeleteViews(Vec<String>),
  41. MoveView {
  42. view_id: String,
  43. new_parent_id: String,
  44. prev_view_id: Option<String>,
  45. },
  46. // Trash
  47. RestoreAppFromTrash,
  48. RestoreViewFromTrash,
  49. ReadTrash,
  50. DeleteAllTrash,
  51. }
  52. pub struct FolderTest {
  53. pub sdk: FlowyCoreTest,
  54. pub all_workspace: Vec<WorkspacePB>,
  55. pub workspace: WorkspacePB,
  56. pub parent_view: ViewPB,
  57. pub child_view: ViewPB,
  58. pub trash: Vec<TrashPB>,
  59. }
  60. impl FolderTest {
  61. pub async fn new() -> Self {
  62. let sdk = FlowyCoreTest::new();
  63. let _ = sdk.init_user().await;
  64. let workspace = create_workspace(&sdk, "FolderWorkspace", "Folder test workspace").await;
  65. let parent_view = create_app(&sdk, &workspace.id, "Folder App", "Folder test app").await;
  66. let view = create_view(
  67. &sdk,
  68. &parent_view.id,
  69. "Folder View",
  70. "Folder test view",
  71. ViewLayout::Document,
  72. )
  73. .await;
  74. Self {
  75. sdk,
  76. all_workspace: vec![],
  77. workspace,
  78. parent_view,
  79. child_view: view,
  80. trash: vec![],
  81. }
  82. }
  83. pub async fn run_scripts(&mut self, scripts: Vec<FolderScript>) {
  84. for script in scripts {
  85. self.run_script(script).await;
  86. }
  87. }
  88. pub async fn run_script(&mut self, script: FolderScript) {
  89. let sdk = &self.sdk;
  90. match script {
  91. FolderScript::ReadAllWorkspaces => {
  92. let all_workspace = read_workspace(sdk, None).await;
  93. self.all_workspace = all_workspace;
  94. },
  95. FolderScript::CreateWorkspace { name, desc } => {
  96. let workspace = create_workspace(sdk, &name, &desc).await;
  97. self.workspace = workspace;
  98. },
  99. FolderScript::AssertWorkspace(workspace) => {
  100. assert_eq!(self.workspace, workspace, "Workspace not equal");
  101. },
  102. FolderScript::ReadWorkspace(workspace_id) => {
  103. let workspace = read_workspace(sdk, workspace_id).await.pop().unwrap();
  104. self.workspace = workspace;
  105. },
  106. FolderScript::CreateParentView { name, desc } => {
  107. let app = create_app(sdk, &self.workspace.id, &name, &desc).await;
  108. self.parent_view = app;
  109. },
  110. FolderScript::AssertParentView(app) => {
  111. assert_eq!(self.parent_view, app, "App not equal");
  112. },
  113. FolderScript::ReloadParentView(parent_view_id) => {
  114. let parent_view = read_view(sdk, &parent_view_id).await;
  115. self.parent_view = parent_view;
  116. },
  117. FolderScript::UpdateParentView { name, desc } => {
  118. update_view(sdk, &self.parent_view.id, name, desc).await;
  119. },
  120. FolderScript::DeleteParentView => {
  121. delete_view(sdk, vec![self.parent_view.id.clone()]).await;
  122. },
  123. FolderScript::CreateView { name, desc, layout } => {
  124. let view = create_view(sdk, &self.parent_view.id, &name, &desc, layout).await;
  125. self.child_view = view;
  126. },
  127. FolderScript::MoveView {
  128. view_id,
  129. new_parent_id,
  130. prev_view_id,
  131. } => {
  132. move_view(sdk, view_id, new_parent_id, prev_view_id).await;
  133. },
  134. FolderScript::AssertView(view) => {
  135. assert_eq!(self.child_view, view, "View not equal");
  136. },
  137. FolderScript::ReadView(view_id) => {
  138. let view = read_view(sdk, &view_id).await;
  139. self.child_view = view;
  140. },
  141. FolderScript::UpdateView { name, desc } => {
  142. update_view(sdk, &self.child_view.id, name, desc).await;
  143. },
  144. FolderScript::DeleteView => {
  145. delete_view(sdk, vec![self.child_view.id.clone()]).await;
  146. },
  147. FolderScript::DeleteViews(view_ids) => {
  148. delete_view(sdk, view_ids).await;
  149. },
  150. FolderScript::RestoreAppFromTrash => {
  151. restore_app_from_trash(sdk, &self.parent_view.id).await;
  152. },
  153. FolderScript::RestoreViewFromTrash => {
  154. restore_view_from_trash(sdk, &self.child_view.id).await;
  155. },
  156. FolderScript::ReadTrash => {
  157. let trash = read_trash(sdk).await;
  158. self.trash = trash.items;
  159. },
  160. FolderScript::DeleteAllTrash => {
  161. delete_all_trash(sdk).await;
  162. self.trash = vec![];
  163. },
  164. }
  165. }
  166. }
  167. pub async fn create_workspace(sdk: &FlowyCoreTest, name: &str, desc: &str) -> WorkspacePB {
  168. let request = CreateWorkspacePayloadPB {
  169. name: name.to_owned(),
  170. desc: desc.to_owned(),
  171. };
  172. EventBuilder::new(sdk.clone())
  173. .event(CreateWorkspace)
  174. .payload(request)
  175. .async_send()
  176. .await
  177. .parse::<WorkspacePB>()
  178. }
  179. pub async fn read_workspace(sdk: &FlowyCoreTest, workspace_id: Option<String>) -> Vec<WorkspacePB> {
  180. let request = WorkspaceIdPB {
  181. value: workspace_id,
  182. };
  183. let repeated_workspace = EventBuilder::new(sdk.clone())
  184. .event(ReadAllWorkspaces)
  185. .payload(request.clone())
  186. .async_send()
  187. .await
  188. .parse::<RepeatedWorkspacePB>();
  189. let workspaces;
  190. if let Some(workspace_id) = &request.value {
  191. workspaces = repeated_workspace
  192. .items
  193. .into_iter()
  194. .filter(|workspace| &workspace.id == workspace_id)
  195. .collect::<Vec<WorkspacePB>>();
  196. debug_assert_eq!(workspaces.len(), 1);
  197. } else {
  198. workspaces = repeated_workspace.items;
  199. }
  200. workspaces
  201. }
  202. pub async fn create_app(sdk: &FlowyCoreTest, workspace_id: &str, name: &str, desc: &str) -> ViewPB {
  203. let create_view_request = CreateViewPayloadPB {
  204. parent_view_id: workspace_id.to_owned(),
  205. name: name.to_string(),
  206. desc: desc.to_string(),
  207. thumbnail: None,
  208. layout: ViewLayout::Document.into(),
  209. initial_data: vec![],
  210. meta: Default::default(),
  211. set_as_current: true,
  212. };
  213. EventBuilder::new(sdk.clone())
  214. .event(CreateView)
  215. .payload(create_view_request)
  216. .async_send()
  217. .await
  218. .parse::<ViewPB>()
  219. }
  220. pub async fn create_view(
  221. sdk: &FlowyCoreTest,
  222. app_id: &str,
  223. name: &str,
  224. desc: &str,
  225. layout: ViewLayout,
  226. ) -> ViewPB {
  227. let request = CreateViewPayloadPB {
  228. parent_view_id: app_id.to_string(),
  229. name: name.to_string(),
  230. desc: desc.to_string(),
  231. thumbnail: None,
  232. layout: layout.into(),
  233. initial_data: vec![],
  234. meta: Default::default(),
  235. set_as_current: true,
  236. };
  237. EventBuilder::new(sdk.clone())
  238. .event(CreateView)
  239. .payload(request)
  240. .async_send()
  241. .await
  242. .parse::<ViewPB>()
  243. }
  244. pub async fn read_view(sdk: &FlowyCoreTest, view_id: &str) -> ViewPB {
  245. let view_id = ViewIdPB::from(view_id);
  246. EventBuilder::new(sdk.clone())
  247. .event(ReadView)
  248. .payload(view_id)
  249. .async_send()
  250. .await
  251. .parse::<ViewPB>()
  252. }
  253. pub async fn move_view(
  254. sdk: &FlowyCoreTest,
  255. view_id: String,
  256. parent_id: String,
  257. prev_view_id: Option<String>,
  258. ) {
  259. let request = MoveNestedViewPayloadPB {
  260. view_id,
  261. new_parent_id: parent_id,
  262. prev_view_id,
  263. };
  264. EventBuilder::new(sdk.clone())
  265. .event(MoveNestedView)
  266. .payload(request)
  267. .async_send()
  268. .await;
  269. }
  270. pub async fn update_view(
  271. sdk: &FlowyCoreTest,
  272. view_id: &str,
  273. name: Option<String>,
  274. desc: Option<String>,
  275. ) {
  276. let request = UpdateViewPayloadPB {
  277. view_id: view_id.to_string(),
  278. name,
  279. desc,
  280. ..Default::default()
  281. };
  282. EventBuilder::new(sdk.clone())
  283. .event(UpdateView)
  284. .payload(request)
  285. .async_send()
  286. .await;
  287. }
  288. pub async fn delete_view(sdk: &FlowyCoreTest, view_ids: Vec<String>) {
  289. let request = RepeatedViewIdPB { items: view_ids };
  290. EventBuilder::new(sdk.clone())
  291. .event(DeleteView)
  292. .payload(request)
  293. .async_send()
  294. .await;
  295. }
  296. pub async fn read_trash(sdk: &FlowyCoreTest) -> RepeatedTrashPB {
  297. EventBuilder::new(sdk.clone())
  298. .event(ReadTrash)
  299. .async_send()
  300. .await
  301. .parse::<RepeatedTrashPB>()
  302. }
  303. pub async fn restore_app_from_trash(sdk: &FlowyCoreTest, app_id: &str) {
  304. let id = TrashIdPB {
  305. id: app_id.to_owned(),
  306. };
  307. EventBuilder::new(sdk.clone())
  308. .event(PutbackTrash)
  309. .payload(id)
  310. .async_send()
  311. .await;
  312. }
  313. pub async fn restore_view_from_trash(sdk: &FlowyCoreTest, view_id: &str) {
  314. let id = TrashIdPB {
  315. id: view_id.to_owned(),
  316. };
  317. EventBuilder::new(sdk.clone())
  318. .event(PutbackTrash)
  319. .payload(id)
  320. .async_send()
  321. .await;
  322. }
  323. pub async fn delete_all_trash(sdk: &FlowyCoreTest) {
  324. EventBuilder::new(sdk.clone())
  325. .event(DeleteAllTrash)
  326. .async_send()
  327. .await;
  328. }