folder_test.rs 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. use crate::script::{invalid_workspace_name_test_case, FolderScript::*, FolderTest};
  2. use flowy_folder::entities::view::ViewDataTypePB;
  3. use flowy_folder::entities::workspace::CreateWorkspacePayloadPB;
  4. use flowy_folder::entities::ViewLayoutTypePB;
  5. use flowy_revision::disk::RevisionState;
  6. use flowy_test::{event_builder::*, FlowySDKTest};
  7. #[tokio::test]
  8. async fn workspace_read_all() {
  9. let mut test = FolderTest::new().await;
  10. test.run_scripts(vec![ReadAllWorkspaces]).await;
  11. assert!(!test.all_workspace.is_empty());
  12. }
  13. #[tokio::test]
  14. async fn workspace_create() {
  15. let mut test = FolderTest::new().await;
  16. let name = "My new workspace".to_owned();
  17. let desc = "Daily routines".to_owned();
  18. test.run_scripts(vec![CreateWorkspace {
  19. name: name.clone(),
  20. desc: desc.clone(),
  21. }])
  22. .await;
  23. let workspace = test.workspace.clone();
  24. assert_eq!(workspace.name, name);
  25. assert_eq!(workspace.desc, desc);
  26. test.run_scripts(vec![
  27. ReadWorkspace(Some(workspace.id.clone())),
  28. AssertWorkspace(workspace),
  29. ])
  30. .await;
  31. }
  32. #[tokio::test]
  33. async fn workspace_read() {
  34. let mut test = FolderTest::new().await;
  35. let workspace = test.workspace.clone();
  36. test.run_scripts(vec![
  37. ReadWorkspace(Some(workspace.id.clone())),
  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. test.run_scripts(vec![ReadApp(app.id)]).await;
  52. }
  53. #[tokio::test]
  54. async fn workspace_create_with_invalid_name() {
  55. for (name, code) in invalid_workspace_name_test_case() {
  56. let sdk = FlowySDKTest::default();
  57. let request = CreateWorkspacePayloadPB {
  58. name,
  59. desc: "".to_owned(),
  60. };
  61. assert_eq!(
  62. FolderEventBuilder::new(sdk)
  63. .event(flowy_folder::event_map::FolderEvent::CreateWorkspace)
  64. .payload(request)
  65. .async_send()
  66. .await
  67. .error()
  68. .code,
  69. code.value()
  70. )
  71. }
  72. }
  73. #[tokio::test]
  74. #[should_panic]
  75. async fn app_delete() {
  76. let mut test = FolderTest::new().await;
  77. let app = test.app.clone();
  78. test.run_scripts(vec![DeleteApp, ReadApp(app.id)]).await;
  79. }
  80. #[tokio::test]
  81. async fn app_delete_then_restore() {
  82. let mut test = FolderTest::new().await;
  83. let app = test.app.clone();
  84. test.run_scripts(vec![
  85. DeleteApp,
  86. RestoreAppFromTrash,
  87. ReadApp(app.id.clone()),
  88. AssertApp(app),
  89. ])
  90. .await;
  91. }
  92. #[tokio::test]
  93. async fn app_read() {
  94. let mut test = FolderTest::new().await;
  95. let app = test.app.clone();
  96. test.run_scripts(vec![ReadApp(app.id.clone()), AssertApp(app)]).await;
  97. }
  98. #[tokio::test]
  99. async fn app_update() {
  100. let mut test = FolderTest::new().await;
  101. let app = test.app.clone();
  102. let new_name = "😁 hell world".to_owned();
  103. assert_ne!(app.name, new_name);
  104. test.run_scripts(vec![
  105. UpdateApp {
  106. name: Some(new_name.clone()),
  107. desc: None,
  108. },
  109. ReadApp(app.id),
  110. ])
  111. .await;
  112. assert_eq!(test.app.name, new_name);
  113. }
  114. #[tokio::test]
  115. async fn app_create_with_view() {
  116. let mut test = FolderTest::new().await;
  117. let mut app = test.app.clone();
  118. test.run_scripts(vec![
  119. CreateView {
  120. name: "View A".to_owned(),
  121. desc: "View A description".to_owned(),
  122. data_type: ViewDataTypePB::Text,
  123. layout: ViewLayoutTypePB::Document,
  124. },
  125. CreateView {
  126. name: "Grid".to_owned(),
  127. desc: "Grid description".to_owned(),
  128. data_type: ViewDataTypePB::Database,
  129. layout: ViewLayoutTypePB::Document,
  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: ViewDataTypePB::Text,
  183. layout: ViewLayoutTypePB::Document,
  184. },
  185. CreateView {
  186. name: "Grid".to_owned(),
  187. desc: "Grid description".to_owned(),
  188. data_type: ViewDataTypePB::Database,
  189. layout: ViewLayoutTypePB::Document,
  190. },
  191. ReadApp(app.id.clone()),
  192. ])
  193. .await;
  194. assert_eq!(test.app.belongings.len(), 3);
  195. let view_ids = test
  196. .app
  197. .belongings
  198. .iter()
  199. .map(|view| view.id.clone())
  200. .collect::<Vec<String>>();
  201. test.run_scripts(vec![DeleteViews(view_ids), ReadApp(app.id), ReadTrash])
  202. .await;
  203. assert_eq!(test.app.belongings.len(), 0);
  204. assert_eq!(test.trash.len(), 3);
  205. }
  206. #[tokio::test]
  207. async fn view_delete_all_permanent() {
  208. let mut test = FolderTest::new().await;
  209. let app = test.app.clone();
  210. test.run_scripts(vec![
  211. CreateView {
  212. name: "View A".to_owned(),
  213. desc: "View A description".to_owned(),
  214. data_type: ViewDataTypePB::Text,
  215. layout: ViewLayoutTypePB::Document,
  216. },
  217. ReadApp(app.id.clone()),
  218. ])
  219. .await;
  220. let view_ids = test
  221. .app
  222. .belongings
  223. .iter()
  224. .map(|view| view.id.clone())
  225. .collect::<Vec<String>>();
  226. test.run_scripts(vec![DeleteViews(view_ids), ReadApp(app.id), DeleteAllTrash, ReadTrash])
  227. .await;
  228. assert_eq!(test.app.belongings.len(), 0);
  229. assert_eq!(test.trash.len(), 0);
  230. }
  231. #[tokio::test]
  232. async fn folder_sync_revision_state() {
  233. let mut test = FolderTest::new().await;
  234. test.run_scripts(vec![
  235. AssertRevisionState {
  236. rev_id: 1,
  237. state: RevisionState::Sync,
  238. },
  239. AssertNextSyncRevId(Some(1)),
  240. AssertRevisionState {
  241. rev_id: 1,
  242. state: RevisionState::Ack,
  243. },
  244. ])
  245. .await;
  246. }
  247. #[tokio::test]
  248. async fn folder_sync_revision_seq() {
  249. let mut test = FolderTest::new().await;
  250. test.run_scripts(vec![
  251. AssertRevisionState {
  252. rev_id: 1,
  253. state: RevisionState::Sync,
  254. },
  255. AssertRevisionState {
  256. rev_id: 2,
  257. state: RevisionState::Sync,
  258. },
  259. AssertNextSyncRevId(Some(1)),
  260. AssertNextSyncRevId(Some(2)),
  261. AssertRevisionState {
  262. rev_id: 1,
  263. state: RevisionState::Ack,
  264. },
  265. AssertRevisionState {
  266. rev_id: 2,
  267. state: RevisionState::Ack,
  268. },
  269. ])
  270. .await;
  271. }
  272. #[tokio::test]
  273. async fn folder_sync_revision_with_new_app() {
  274. let mut test = FolderTest::new().await;
  275. let app_name = "AppFlowy contributors".to_owned();
  276. let app_desc = "Welcome to be a AppFlowy contributor".to_owned();
  277. test.run_scripts(vec![
  278. AssertNextSyncRevId(Some(1)),
  279. AssertNextSyncRevId(Some(2)),
  280. CreateApp {
  281. name: app_name.clone(),
  282. desc: app_desc.clone(),
  283. },
  284. AssertCurrentRevId(3),
  285. AssertNextSyncRevId(Some(3)),
  286. AssertNextSyncRevId(None),
  287. ])
  288. .await;
  289. let app = test.app.clone();
  290. assert_eq!(app.name, app_name);
  291. assert_eq!(app.desc, app_desc);
  292. test.run_scripts(vec![ReadApp(app.id.clone()), AssertApp(app)]).await;
  293. }
  294. #[tokio::test]
  295. async fn folder_sync_revision_with_new_view() {
  296. let mut test = FolderTest::new().await;
  297. let view_name = "AppFlowy features".to_owned();
  298. let view_desc = "😁".to_owned();
  299. test.run_scripts(vec![
  300. AssertNextSyncRevId(Some(1)),
  301. AssertNextSyncRevId(Some(2)),
  302. CreateView {
  303. name: view_name.clone(),
  304. desc: view_desc.clone(),
  305. data_type: ViewDataTypePB::Text,
  306. layout: ViewLayoutTypePB::Document,
  307. },
  308. AssertCurrentRevId(3),
  309. AssertNextSyncRevId(Some(3)),
  310. AssertNextSyncRevId(None),
  311. ])
  312. .await;
  313. let view = test.view.clone();
  314. assert_eq!(view.name, view_name);
  315. test.run_scripts(vec![ReadView(view.id.clone()), AssertView(view)])
  316. .await;
  317. }