folder_test.rs 9.5 KB

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