folder_test.rs 9.0 KB

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