folder_test.rs 8.8 KB

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