script.rs 8.2 KB

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