folder_test.rs 8.7 KB

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