folder_test.rs 9.1 KB

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