folder_test.rs 9.7 KB

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