script.rs 9.9 KB

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