folder_test.rs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. use crate::script::{invalid_workspace_name_test_case, FolderScript::*, FolderTest};
  2. use flowy_folder::entities::workspace::CreateWorkspacePayload;
  3. use flowy_folder_data_model::entities::view::ViewDataType;
  4. use flowy_folder_data_model::revision::{AppRevision, WorkspaceRevision};
  5. use flowy_revision::disk::RevisionState;
  6. use flowy_test::{event_builder::*, FlowySDKTest};
  7. #[tokio::test]
  8. async fn workspace_read_all() {
  9. let mut test = FolderTest::new().await;
  10. test.run_scripts(vec![ReadAllWorkspaces]).await;
  11. assert!(!test.all_workspace.is_empty());
  12. }
  13. #[tokio::test]
  14. async fn workspace_create() {
  15. let mut test = FolderTest::new().await;
  16. let name = "My new workspace".to_owned();
  17. let desc = "Daily routines".to_owned();
  18. test.run_scripts(vec![CreateWorkspace {
  19. name: name.clone(),
  20. desc: desc.clone(),
  21. }])
  22. .await;
  23. let workspace = test.workspace.clone();
  24. assert_eq!(workspace.name, name);
  25. assert_eq!(workspace.desc, desc);
  26. test.run_scripts(vec![
  27. ReadWorkspace(Some(workspace.id.clone())),
  28. AssertWorkspace(workspace),
  29. ])
  30. .await;
  31. }
  32. #[tokio::test]
  33. async fn workspace_read() {
  34. let mut test = FolderTest::new().await;
  35. let workspace = test.workspace.clone();
  36. let workspace_revision: WorkspaceRevision = workspace.clone().into();
  37. let json = serde_json::to_string(&workspace_revision).unwrap();
  38. test.run_scripts(vec![
  39. ReadWorkspace(Some(workspace.id.clone())),
  40. AssertWorkspaceRevisionJson(json),
  41. AssertWorkspace(workspace),
  42. ])
  43. .await;
  44. }
  45. #[tokio::test]
  46. async fn workspace_create_with_apps() {
  47. let mut test = FolderTest::new().await;
  48. test.run_scripts(vec![CreateApp {
  49. name: "App".to_string(),
  50. desc: "App description".to_string(),
  51. }])
  52. .await;
  53. let app = test.app.clone();
  54. let app_revision: AppRevision = app.clone().into();
  55. let json = serde_json::to_string(&app_revision).unwrap();
  56. test.run_scripts(vec![ReadApp(app.id), AssertAppRevisionJson(json)])
  57. .await;
  58. }
  59. #[tokio::test]
  60. async fn workspace_create_with_invalid_name() {
  61. for (name, code) in invalid_workspace_name_test_case() {
  62. let sdk = FlowySDKTest::default();
  63. let request = CreateWorkspacePayload {
  64. name,
  65. desc: "".to_owned(),
  66. };
  67. assert_eq!(
  68. FolderEventBuilder::new(sdk)
  69. .event(flowy_folder::event_map::FolderEvent::CreateWorkspace)
  70. .payload(request)
  71. .async_send()
  72. .await
  73. .error()
  74. .code,
  75. code.value()
  76. )
  77. }
  78. }
  79. #[tokio::test]
  80. #[should_panic]
  81. async fn app_delete() {
  82. let mut test = FolderTest::new().await;
  83. let app = test.app.clone();
  84. test.run_scripts(vec![DeleteApp, ReadApp(app.id)]).await;
  85. }
  86. #[tokio::test]
  87. async fn app_delete_then_restore() {
  88. let mut test = FolderTest::new().await;
  89. let app = test.app.clone();
  90. test.run_scripts(vec![
  91. DeleteApp,
  92. RestoreAppFromTrash,
  93. ReadApp(app.id.clone()),
  94. AssertApp(app),
  95. ])
  96. .await;
  97. }
  98. #[tokio::test]
  99. async fn app_read() {
  100. let mut test = FolderTest::new().await;
  101. let app = test.app.clone();
  102. test.run_scripts(vec![ReadApp(app.id.clone()), AssertApp(app)]).await;
  103. }
  104. #[tokio::test]
  105. async fn app_update() {
  106. let mut test = FolderTest::new().await;
  107. let app = test.app.clone();
  108. let new_name = "😁 hell world".to_owned();
  109. assert_ne!(app.name, new_name);
  110. test.run_scripts(vec![
  111. UpdateApp {
  112. name: Some(new_name.clone()),
  113. desc: None,
  114. },
  115. ReadApp(app.id),
  116. ])
  117. .await;
  118. assert_eq!(test.app.name, new_name);
  119. }
  120. #[tokio::test]
  121. async fn app_create_with_view() {
  122. let mut test = FolderTest::new().await;
  123. let mut app = test.app.clone();
  124. test.run_scripts(vec![
  125. CreateView {
  126. name: "View A".to_owned(),
  127. desc: "View A description".to_owned(),
  128. data_type: ViewDataType::TextBlock,
  129. },
  130. CreateView {
  131. name: "Grid".to_owned(),
  132. desc: "Grid description".to_owned(),
  133. data_type: ViewDataType::Grid,
  134. },
  135. ReadApp(app.id),
  136. ])
  137. .await;
  138. app = test.app.clone();
  139. assert_eq!(app.belongings.len(), 3);
  140. assert_eq!(app.belongings[1].name, "View A");
  141. assert_eq!(app.belongings[2].name, "Grid")
  142. }
  143. #[tokio::test]
  144. async fn view_update() {
  145. let mut test = FolderTest::new().await;
  146. let view = test.view.clone();
  147. let new_name = "😁 123".to_owned();
  148. assert_ne!(view.name, new_name);
  149. test.run_scripts(vec![
  150. UpdateView {
  151. name: Some(new_name.clone()),
  152. desc: None,
  153. },
  154. ReadView(view.id),
  155. ])
  156. .await;
  157. assert_eq!(test.view.name, new_name);
  158. }
  159. #[tokio::test]
  160. #[should_panic]
  161. async fn view_delete() {
  162. let mut test = FolderTest::new().await;
  163. let view = test.view.clone();
  164. test.run_scripts(vec![DeleteView, ReadView(view.id)]).await;
  165. }
  166. #[tokio::test]
  167. async fn view_delete_then_restore() {
  168. let mut test = FolderTest::new().await;
  169. let view = test.view.clone();
  170. test.run_scripts(vec![
  171. DeleteView,
  172. RestoreViewFromTrash,
  173. ReadView(view.id.clone()),
  174. AssertView(view),
  175. ])
  176. .await;
  177. }
  178. #[tokio::test]
  179. async fn view_delete_all() {
  180. let mut test = FolderTest::new().await;
  181. let app = test.app.clone();
  182. test.run_scripts(vec![
  183. CreateView {
  184. name: "View A".to_owned(),
  185. desc: "View A description".to_owned(),
  186. data_type: ViewDataType::TextBlock,
  187. },
  188. CreateView {
  189. name: "Grid".to_owned(),
  190. desc: "Grid description".to_owned(),
  191. data_type: ViewDataType::Grid,
  192. },
  193. ReadApp(app.id.clone()),
  194. ])
  195. .await;
  196. assert_eq!(test.app.belongings.len(), 3);
  197. let view_ids = test
  198. .app
  199. .belongings
  200. .iter()
  201. .map(|view| view.id.clone())
  202. .collect::<Vec<String>>();
  203. test.run_scripts(vec![DeleteViews(view_ids), ReadApp(app.id), ReadTrash])
  204. .await;
  205. assert_eq!(test.app.belongings.len(), 0);
  206. assert_eq!(test.trash.len(), 3);
  207. }
  208. #[tokio::test]
  209. async fn view_delete_all_permanent() {
  210. let mut test = FolderTest::new().await;
  211. let app = test.app.clone();
  212. test.run_scripts(vec![
  213. CreateView {
  214. name: "View A".to_owned(),
  215. desc: "View A description".to_owned(),
  216. data_type: ViewDataType::TextBlock,
  217. },
  218. ReadApp(app.id.clone()),
  219. ])
  220. .await;
  221. let view_ids = test
  222. .app
  223. .belongings
  224. .iter()
  225. .map(|view| view.id.clone())
  226. .collect::<Vec<String>>();
  227. test.run_scripts(vec![DeleteViews(view_ids), ReadApp(app.id), DeleteAllTrash, ReadTrash])
  228. .await;
  229. assert_eq!(test.app.belongings.len(), 0);
  230. assert_eq!(test.trash.len(), 0);
  231. }
  232. #[tokio::test]
  233. async fn folder_sync_revision_state() {
  234. let mut test = FolderTest::new().await;
  235. test.run_scripts(vec![
  236. AssertRevisionState {
  237. rev_id: 1,
  238. state: RevisionState::Sync,
  239. },
  240. AssertNextSyncRevId(Some(1)),
  241. AssertRevisionState {
  242. rev_id: 1,
  243. state: RevisionState::Ack,
  244. },
  245. ])
  246. .await;
  247. }
  248. #[tokio::test]
  249. async fn folder_sync_revision_seq() {
  250. let mut test = FolderTest::new().await;
  251. test.run_scripts(vec![
  252. AssertRevisionState {
  253. rev_id: 1,
  254. state: RevisionState::Sync,
  255. },
  256. AssertRevisionState {
  257. rev_id: 2,
  258. state: RevisionState::Sync,
  259. },
  260. AssertNextSyncRevId(Some(1)),
  261. AssertNextSyncRevId(Some(2)),
  262. AssertRevisionState {
  263. rev_id: 1,
  264. state: RevisionState::Ack,
  265. },
  266. AssertRevisionState {
  267. rev_id: 2,
  268. state: RevisionState::Ack,
  269. },
  270. ])
  271. .await;
  272. }
  273. #[tokio::test]
  274. async fn folder_sync_revision_with_new_app() {
  275. let mut test = FolderTest::new().await;
  276. let app_name = "AppFlowy contributors".to_owned();
  277. let app_desc = "Welcome to be a AppFlowy contributor".to_owned();
  278. test.run_scripts(vec![
  279. AssertNextSyncRevId(Some(1)),
  280. AssertNextSyncRevId(Some(2)),
  281. CreateApp {
  282. name: app_name.clone(),
  283. desc: app_desc.clone(),
  284. },
  285. AssertCurrentRevId(3),
  286. AssertNextSyncRevId(Some(3)),
  287. AssertNextSyncRevId(None),
  288. ])
  289. .await;
  290. let app = test.app.clone();
  291. assert_eq!(app.name, app_name);
  292. assert_eq!(app.desc, app_desc);
  293. test.run_scripts(vec![ReadApp(app.id.clone()), AssertApp(app)]).await;
  294. }
  295. #[tokio::test]
  296. async fn folder_sync_revision_with_new_view() {
  297. let mut test = FolderTest::new().await;
  298. let view_name = "AppFlowy features".to_owned();
  299. let view_desc = "😁".to_owned();
  300. test.run_scripts(vec![
  301. AssertNextSyncRevId(Some(1)),
  302. AssertNextSyncRevId(Some(2)),
  303. CreateView {
  304. name: view_name.clone(),
  305. desc: view_desc.clone(),
  306. data_type: ViewDataType::TextBlock,
  307. },
  308. AssertCurrentRevId(3),
  309. AssertNextSyncRevId(Some(3)),
  310. AssertNextSyncRevId(None),
  311. ])
  312. .await;
  313. let view = test.view.clone();
  314. assert_eq!(view.name, view_name);
  315. assert_eq!(view.desc, view_desc);
  316. test.run_scripts(vec![ReadView(view.id.clone()), AssertView(view)])
  317. .await;
  318. }