test.rs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900
  1. use std::convert::TryFrom;
  2. use bytes::Bytes;
  3. use event_integration::event_builder::EventBuilder;
  4. use event_integration::FlowyCoreTest;
  5. use flowy_database2::entities::{
  6. CellChangesetPB, CellIdPB, ChecklistCellDataChangesetPB, DatabaseLayoutPB,
  7. DatabaseSettingChangesetPB, DatabaseViewIdPB, DateChangesetPB, FieldType, SelectOptionCellDataPB,
  8. UpdateRowMetaChangesetPB,
  9. };
  10. use lib_infra::util::timestamp;
  11. #[tokio::test]
  12. async fn get_database_id_event_test() {
  13. let test = FlowyCoreTest::new_with_guest_user().await;
  14. let current_workspace = test.get_current_workspace().await.workspace;
  15. let grid_view = test
  16. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  17. .await;
  18. // The view id can be used to get the database id.
  19. let database_id = EventBuilder::new(test.clone())
  20. .event(flowy_database2::event_map::DatabaseEvent::GetDatabaseId)
  21. .payload(DatabaseViewIdPB {
  22. value: grid_view.id.clone(),
  23. })
  24. .async_send()
  25. .await
  26. .parse::<flowy_database2::entities::DatabaseIdPB>()
  27. .value;
  28. assert_ne!(database_id, grid_view.id);
  29. }
  30. #[tokio::test]
  31. async fn get_database_event_test() {
  32. let test = FlowyCoreTest::new_with_guest_user().await;
  33. let current_workspace = test.get_current_workspace().await.workspace;
  34. let grid_view = test
  35. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  36. .await;
  37. let database = test.get_database(&grid_view.id).await;
  38. assert_eq!(database.fields.len(), 3);
  39. assert_eq!(database.rows.len(), 3);
  40. assert_eq!(database.layout_type, DatabaseLayoutPB::Grid);
  41. }
  42. #[tokio::test]
  43. async fn get_field_event_test() {
  44. let test = FlowyCoreTest::new_with_guest_user().await;
  45. let current_workspace = test.get_current_workspace().await.workspace;
  46. let grid_view = test
  47. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  48. .await;
  49. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  50. assert_eq!(fields[0].field_type, FieldType::RichText);
  51. assert_eq!(fields[1].field_type, FieldType::SingleSelect);
  52. assert_eq!(fields[2].field_type, FieldType::Checkbox);
  53. assert_eq!(fields.len(), 3);
  54. }
  55. #[tokio::test]
  56. async fn create_field_event_test() {
  57. let test = FlowyCoreTest::new_with_guest_user().await;
  58. let current_workspace = test.get_current_workspace().await.workspace;
  59. let grid_view = test
  60. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  61. .await;
  62. test.create_field(&grid_view.id, FieldType::Checkbox).await;
  63. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  64. assert_eq!(fields.len(), 4);
  65. assert_eq!(fields[3].field_type, FieldType::Checkbox);
  66. }
  67. #[tokio::test]
  68. async fn delete_field_event_test() {
  69. let test = FlowyCoreTest::new_with_guest_user().await;
  70. let current_workspace = test.get_current_workspace().await.workspace;
  71. let grid_view = test
  72. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  73. .await;
  74. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  75. assert_eq!(fields[0].field_type, FieldType::RichText);
  76. assert_eq!(fields[1].field_type, FieldType::SingleSelect);
  77. assert_eq!(fields[2].field_type, FieldType::Checkbox);
  78. let error = test.delete_field(&grid_view.id, &fields[1].id).await;
  79. assert!(error.is_none());
  80. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  81. assert_eq!(fields.len(), 2);
  82. }
  83. // The primary field is not allowed to be deleted.
  84. #[tokio::test]
  85. async fn delete_primary_field_event_test() {
  86. let test = FlowyCoreTest::new_with_guest_user().await;
  87. let current_workspace = test.get_current_workspace().await.workspace;
  88. let grid_view = test
  89. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  90. .await;
  91. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  92. // the primary field is not allowed to be deleted.
  93. assert!(fields[0].is_primary);
  94. let error = test.delete_field(&grid_view.id, &fields[0].id).await;
  95. assert!(error.is_some());
  96. }
  97. #[tokio::test]
  98. async fn update_field_type_event_test() {
  99. let test = FlowyCoreTest::new_with_guest_user().await;
  100. let current_workspace = test.get_current_workspace().await.workspace;
  101. let grid_view = test
  102. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  103. .await;
  104. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  105. let error = test
  106. .update_field_type(&grid_view.id, &fields[1].id, FieldType::Checklist)
  107. .await;
  108. assert!(error.is_none());
  109. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  110. assert_eq!(fields[1].field_type, FieldType::Checklist);
  111. }
  112. #[tokio::test]
  113. async fn update_primary_field_type_event_test() {
  114. let test = FlowyCoreTest::new_with_guest_user().await;
  115. let current_workspace = test.get_current_workspace().await.workspace;
  116. let grid_view = test
  117. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  118. .await;
  119. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  120. // the primary field is not allowed to be deleted.
  121. assert!(fields[0].is_primary);
  122. // the primary field is not allowed to be updated.
  123. let error = test
  124. .update_field_type(&grid_view.id, &fields[0].id, FieldType::Checklist)
  125. .await;
  126. assert!(error.is_some());
  127. }
  128. #[tokio::test]
  129. async fn duplicate_field_event_test() {
  130. let test = FlowyCoreTest::new_with_guest_user().await;
  131. let current_workspace = test.get_current_workspace().await.workspace;
  132. let grid_view = test
  133. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  134. .await;
  135. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  136. // the primary field is not allowed to be updated.
  137. let error = test.duplicate_field(&grid_view.id, &fields[1].id).await;
  138. assert!(error.is_none());
  139. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  140. assert_eq!(fields.len(), 4);
  141. }
  142. // The primary field is not allowed to be duplicated. So this test should return an error.
  143. #[tokio::test]
  144. async fn duplicate_primary_field_test() {
  145. let test = FlowyCoreTest::new_with_guest_user().await;
  146. let current_workspace = test.get_current_workspace().await.workspace;
  147. let grid_view = test
  148. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  149. .await;
  150. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  151. // the primary field is not allowed to be duplicated.
  152. let error = test.duplicate_field(&grid_view.id, &fields[0].id).await;
  153. assert!(error.is_some());
  154. }
  155. #[tokio::test]
  156. async fn get_primary_field_event_test() {
  157. let test = FlowyCoreTest::new_with_guest_user().await;
  158. let current_workspace = test.get_current_workspace().await.workspace;
  159. let grid_view = test
  160. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  161. .await;
  162. // By default the primary field type is RichText.
  163. let field = test.get_primary_field(&grid_view.id).await;
  164. assert_eq!(field.field_type, FieldType::RichText);
  165. }
  166. #[tokio::test]
  167. async fn create_row_event_test() {
  168. let test = FlowyCoreTest::new_with_guest_user().await;
  169. let current_workspace = test.get_current_workspace().await.workspace;
  170. let grid_view = test
  171. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  172. .await;
  173. let _ = test.create_row(&grid_view.id, None, None).await;
  174. let database = test.get_database(&grid_view.id).await;
  175. assert_eq!(database.rows.len(), 4);
  176. }
  177. #[tokio::test]
  178. async fn delete_row_event_test() {
  179. let test = FlowyCoreTest::new_with_guest_user().await;
  180. let current_workspace = test.get_current_workspace().await.workspace;
  181. let grid_view = test
  182. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  183. .await;
  184. // delete the row
  185. let database = test.get_database(&grid_view.id).await;
  186. let remove_row_id = database.rows[0].id.clone();
  187. assert_eq!(database.rows.len(), 3);
  188. let error = test.delete_row(&grid_view.id, &remove_row_id).await;
  189. assert!(error.is_none());
  190. let database = test.get_database(&grid_view.id).await;
  191. assert_eq!(database.rows.len(), 2);
  192. // get the row again and check if it is deleted.
  193. let optional_row = test.get_row(&grid_view.id, &remove_row_id).await;
  194. assert!(optional_row.row.is_none());
  195. }
  196. #[tokio::test]
  197. async fn get_row_event_test() {
  198. let test = FlowyCoreTest::new_with_guest_user().await;
  199. let current_workspace = test.get_current_workspace().await.workspace;
  200. let grid_view = test
  201. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  202. .await;
  203. let database = test.get_database(&grid_view.id).await;
  204. let row = test.get_row(&grid_view.id, &database.rows[0].id).await.row;
  205. assert!(row.is_some());
  206. let row = test.get_row_meta(&grid_view.id, &database.rows[0].id).await;
  207. assert!(!row.document_id.is_empty());
  208. }
  209. #[tokio::test]
  210. async fn update_row_meta_event_with_url_test() {
  211. let test = FlowyCoreTest::new_with_guest_user().await;
  212. let current_workspace = test.get_current_workspace().await.workspace;
  213. let grid_view = test
  214. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  215. .await;
  216. let database = test.get_database(&grid_view.id).await;
  217. // By default the row icon is None.
  218. let row = test.get_row_meta(&grid_view.id, &database.rows[0].id).await;
  219. assert_eq!(row.icon, None);
  220. // Insert icon url to the row.
  221. let changeset = UpdateRowMetaChangesetPB {
  222. id: database.rows[0].id.clone(),
  223. view_id: grid_view.id.clone(),
  224. icon_url: Some("icon_url".to_owned()),
  225. cover_url: None,
  226. };
  227. let error = test.update_row_meta(changeset).await;
  228. assert!(error.is_none());
  229. // Check if the icon is updated.
  230. let row = test.get_row_meta(&grid_view.id, &database.rows[0].id).await;
  231. assert_eq!(row.icon, Some("icon_url".to_owned()));
  232. }
  233. #[tokio::test]
  234. async fn update_row_meta_event_with_cover_test() {
  235. let test = FlowyCoreTest::new_with_guest_user().await;
  236. let current_workspace = test.get_current_workspace().await.workspace;
  237. let grid_view = test
  238. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  239. .await;
  240. let database = test.get_database(&grid_view.id).await;
  241. // By default the row icon is None.
  242. let row = test.get_row_meta(&grid_view.id, &database.rows[0].id).await;
  243. assert_eq!(row.cover, None);
  244. // Insert cover to the row.
  245. let changeset = UpdateRowMetaChangesetPB {
  246. id: database.rows[0].id.clone(),
  247. view_id: grid_view.id.clone(),
  248. cover_url: Some("cover url".to_owned()),
  249. icon_url: None,
  250. };
  251. let error = test.update_row_meta(changeset).await;
  252. assert!(error.is_none());
  253. // Check if the icon is updated.
  254. let row = test.get_row_meta(&grid_view.id, &database.rows[0].id).await;
  255. assert_eq!(row.cover, Some("cover url".to_owned()));
  256. }
  257. #[tokio::test]
  258. async fn delete_row_event_with_invalid_row_id_test() {
  259. let test = FlowyCoreTest::new_with_guest_user().await;
  260. let current_workspace = test.get_current_workspace().await.workspace;
  261. let grid_view = test
  262. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  263. .await;
  264. // delete the row with empty row_id. It should return an error.
  265. let error = test.delete_row(&grid_view.id, "").await;
  266. assert!(error.is_some());
  267. }
  268. #[tokio::test]
  269. async fn duplicate_row_event_test() {
  270. let test = FlowyCoreTest::new_with_guest_user().await;
  271. let current_workspace = test.get_current_workspace().await.workspace;
  272. let grid_view = test
  273. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  274. .await;
  275. let database = test.get_database(&grid_view.id).await;
  276. let error = test
  277. .duplicate_row(&grid_view.id, &database.rows[0].id)
  278. .await;
  279. assert!(error.is_none());
  280. let database = test.get_database(&grid_view.id).await;
  281. assert_eq!(database.rows.len(), 4);
  282. }
  283. #[tokio::test]
  284. async fn duplicate_row_event_with_invalid_row_id_test() {
  285. let test = FlowyCoreTest::new_with_guest_user().await;
  286. let current_workspace = test.get_current_workspace().await.workspace;
  287. let grid_view = test
  288. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  289. .await;
  290. let database = test.get_database(&grid_view.id).await;
  291. assert_eq!(database.rows.len(), 3);
  292. let error = test.duplicate_row(&grid_view.id, "").await;
  293. assert!(error.is_some());
  294. let database = test.get_database(&grid_view.id).await;
  295. assert_eq!(database.rows.len(), 3);
  296. }
  297. #[tokio::test]
  298. async fn move_row_event_test() {
  299. let test = FlowyCoreTest::new_with_guest_user().await;
  300. let current_workspace = test.get_current_workspace().await.workspace;
  301. let grid_view = test
  302. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  303. .await;
  304. let database = test.get_database(&grid_view.id).await;
  305. let row_1 = database.rows[0].id.clone();
  306. let row_2 = database.rows[1].id.clone();
  307. let row_3 = database.rows[2].id.clone();
  308. let error = test.move_row(&grid_view.id, &row_1, &row_3).await;
  309. assert!(error.is_none());
  310. let database = test.get_database(&grid_view.id).await;
  311. assert_eq!(database.rows[0].id, row_2);
  312. assert_eq!(database.rows[1].id, row_3);
  313. assert_eq!(database.rows[2].id, row_1);
  314. }
  315. #[tokio::test]
  316. async fn move_row_event_test2() {
  317. let test = FlowyCoreTest::new_with_guest_user().await;
  318. let current_workspace = test.get_current_workspace().await.workspace;
  319. let grid_view = test
  320. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  321. .await;
  322. let database = test.get_database(&grid_view.id).await;
  323. let row_1 = database.rows[0].id.clone();
  324. let row_2 = database.rows[1].id.clone();
  325. let row_3 = database.rows[2].id.clone();
  326. let error = test.move_row(&grid_view.id, &row_2, &row_1).await;
  327. assert!(error.is_none());
  328. let database = test.get_database(&grid_view.id).await;
  329. assert_eq!(database.rows[0].id, row_2);
  330. assert_eq!(database.rows[1].id, row_1);
  331. assert_eq!(database.rows[2].id, row_3);
  332. }
  333. #[tokio::test]
  334. async fn move_row_event_with_invalid_row_id_test() {
  335. let test = FlowyCoreTest::new_with_guest_user().await;
  336. let current_workspace = test.get_current_workspace().await.workspace;
  337. let grid_view = test
  338. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  339. .await;
  340. let database = test.get_database(&grid_view.id).await;
  341. let row_1 = database.rows[0].id.clone();
  342. let row_2 = database.rows[1].id.clone();
  343. let row_3 = database.rows[2].id.clone();
  344. for i in 0..2 {
  345. if i == 0 {
  346. let error = test.move_row(&grid_view.id, &row_1, "").await;
  347. assert!(error.is_some());
  348. } else {
  349. let error = test.move_row(&grid_view.id, "", &row_1).await;
  350. assert!(error.is_some());
  351. }
  352. let database = test.get_database(&grid_view.id).await;
  353. assert_eq!(database.rows[0].id, row_1);
  354. assert_eq!(database.rows[1].id, row_2);
  355. assert_eq!(database.rows[2].id, row_3);
  356. }
  357. }
  358. #[tokio::test]
  359. async fn update_text_cell_event_test() {
  360. let test = FlowyCoreTest::new_with_guest_user().await;
  361. let current_workspace = test.get_current_workspace().await.workspace;
  362. let grid_view = test
  363. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  364. .await;
  365. let database = test.get_database(&grid_view.id).await;
  366. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  367. let row_id = database.rows[0].id.clone();
  368. let field_id = fields[0].id.clone();
  369. assert_eq!(fields[0].field_type, FieldType::RichText);
  370. // Update the first cell of the first row.
  371. let error = test
  372. .update_cell(CellChangesetPB {
  373. view_id: grid_view.id.clone(),
  374. row_id: row_id.clone(),
  375. field_id: field_id.clone(),
  376. cell_changeset: "hello world".to_string(),
  377. })
  378. .await;
  379. assert!(error.is_none());
  380. let cell = test.get_cell(&grid_view.id, &row_id, &field_id).await;
  381. let s = String::from_utf8(cell.data).unwrap();
  382. assert_eq!(s, "hello world");
  383. }
  384. #[tokio::test]
  385. async fn update_checkbox_cell_event_test() {
  386. let test = FlowyCoreTest::new_with_guest_user().await;
  387. let current_workspace = test.get_current_workspace().await.workspace;
  388. let grid_view = test
  389. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  390. .await;
  391. let database = test.get_database(&grid_view.id).await;
  392. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  393. let row_id = database.rows[0].id.clone();
  394. let field_id = fields[2].id.clone();
  395. assert_eq!(fields[2].field_type, FieldType::Checkbox);
  396. for input in &["yes", "true", "1"] {
  397. let error = test
  398. .update_cell(CellChangesetPB {
  399. view_id: grid_view.id.clone(),
  400. row_id: row_id.clone(),
  401. field_id: field_id.clone(),
  402. cell_changeset: input.to_string(),
  403. })
  404. .await;
  405. assert!(error.is_none());
  406. let cell = test.get_cell(&grid_view.id, &row_id, &field_id).await;
  407. let output = String::from_utf8(cell.data).unwrap();
  408. assert_eq!(output, "Yes");
  409. }
  410. }
  411. #[tokio::test]
  412. async fn update_single_select_cell_event_test() {
  413. let test = FlowyCoreTest::new_with_guest_user().await;
  414. let current_workspace = test.get_current_workspace().await.workspace;
  415. let grid_view = test
  416. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  417. .await;
  418. let database = test.get_database(&grid_view.id).await;
  419. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  420. let row_id = database.rows[0].id.clone();
  421. let field_id = fields[1].id.clone();
  422. assert_eq!(fields[1].field_type, FieldType::SingleSelect);
  423. // Insert a new option. This should update the cell with the new option.
  424. let error = test
  425. .insert_option(&grid_view.id, &field_id, &row_id, "task 1")
  426. .await;
  427. assert!(error.is_none());
  428. // Check that the cell data is updated.
  429. let cell = test.get_cell(&grid_view.id, &row_id, &field_id).await;
  430. let select_option_cell = SelectOptionCellDataPB::try_from(Bytes::from(cell.data)).unwrap();
  431. assert_eq!(select_option_cell.options.len(), 1);
  432. assert_eq!(select_option_cell.select_options.len(), 1);
  433. }
  434. #[tokio::test]
  435. async fn update_date_cell_event_test() {
  436. let test = FlowyCoreTest::new_with_guest_user().await;
  437. let current_workspace = test.get_current_workspace().await.workspace;
  438. let grid_view = test
  439. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  440. .await;
  441. let database = test.get_database(&grid_view.id).await;
  442. // Create a date field
  443. let date_field = test.create_field(&grid_view.id, FieldType::DateTime).await;
  444. let cell_path = CellIdPB {
  445. view_id: grid_view.id.clone(),
  446. field_id: date_field.id.clone(),
  447. row_id: database.rows[0].id.clone(),
  448. };
  449. // Insert data into the date cell of the first row.
  450. let timestamp = 1686300557;
  451. let error = test
  452. .update_date_cell(DateChangesetPB {
  453. cell_id: cell_path,
  454. date: Some(timestamp),
  455. ..Default::default()
  456. })
  457. .await;
  458. assert!(error.is_none());
  459. // Check that the cell data is updated.
  460. let cell = test
  461. .get_date_cell(&grid_view.id, &database.rows[0].id, &date_field.id)
  462. .await;
  463. assert_eq!(cell.date, "Jun 09, 2023");
  464. assert_eq!(cell.timestamp, timestamp);
  465. }
  466. #[tokio::test]
  467. async fn update_date_cell_event_with_empty_time_str_test() {
  468. let test = FlowyCoreTest::new_with_guest_user().await;
  469. let current_workspace = test.get_current_workspace().await.workspace;
  470. let grid_view = test
  471. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  472. .await;
  473. let database = test.get_database(&grid_view.id).await;
  474. let row_id = database.rows[0].id.clone();
  475. // Create a date field
  476. let date_field = test.create_field(&grid_view.id, FieldType::DateTime).await;
  477. let cell_path = CellIdPB {
  478. view_id: grid_view.id.clone(),
  479. field_id: date_field.id.clone(),
  480. row_id: row_id.clone(),
  481. };
  482. // Insert empty timestamp string
  483. let error = test
  484. .update_date_cell(DateChangesetPB {
  485. cell_id: cell_path,
  486. date: None,
  487. ..Default::default()
  488. })
  489. .await;
  490. assert!(error.is_none());
  491. // Check that the cell data is updated.
  492. let cell = test
  493. .get_date_cell(&grid_view.id, &row_id, &date_field.id)
  494. .await;
  495. assert_eq!(cell.date, "");
  496. assert_eq!(cell.timestamp, 0);
  497. }
  498. #[tokio::test]
  499. async fn create_checklist_field_test() {
  500. let test = FlowyCoreTest::new_with_guest_user().await;
  501. let current_workspace = test.get_current_workspace().await.workspace;
  502. let grid_view = test
  503. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  504. .await;
  505. // create checklist field
  506. let checklist_field = test.create_field(&grid_view.id, FieldType::Checklist).await;
  507. let database = test.get_database(&grid_view.id).await;
  508. // Get the checklist cell
  509. let cell = test
  510. .get_checklist_cell(&grid_view.id, &checklist_field.id, &database.rows[0].id)
  511. .await;
  512. assert_eq!(cell.options.len(), 0);
  513. assert_eq!(cell.selected_options.len(), 0);
  514. assert_eq!(cell.percentage, 0.0);
  515. }
  516. #[tokio::test]
  517. async fn update_checklist_cell_test() {
  518. let test = FlowyCoreTest::new_with_guest_user().await;
  519. let current_workspace = test.get_current_workspace().await.workspace;
  520. let grid_view = test
  521. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  522. .await;
  523. // create checklist field
  524. let checklist_field = test.create_field(&grid_view.id, FieldType::Checklist).await;
  525. let database = test.get_database(&grid_view.id).await;
  526. // update the checklist cell
  527. let changeset = ChecklistCellDataChangesetPB {
  528. view_id: grid_view.id.clone(),
  529. row_id: database.rows[0].id.clone(),
  530. field_id: checklist_field.id.clone(),
  531. insert_options: vec![
  532. "task 1".to_string(),
  533. "task 2".to_string(),
  534. "task 3".to_string(),
  535. ],
  536. selected_option_ids: vec![],
  537. delete_option_ids: vec![],
  538. update_options: vec![],
  539. };
  540. test.update_checklist_cell(changeset).await;
  541. // get the cell
  542. let cell = test
  543. .get_checklist_cell(&grid_view.id, &checklist_field.id, &database.rows[0].id)
  544. .await;
  545. assert_eq!(cell.options.len(), 3);
  546. assert_eq!(cell.selected_options.len(), 0);
  547. // select some options
  548. let changeset = ChecklistCellDataChangesetPB {
  549. view_id: grid_view.id.clone(),
  550. row_id: database.rows[0].id.clone(),
  551. field_id: checklist_field.id.clone(),
  552. selected_option_ids: vec![cell.options[0].id.clone(), cell.options[1].id.clone()],
  553. ..Default::default()
  554. };
  555. test.update_checklist_cell(changeset).await;
  556. // get the cell
  557. let cell = test
  558. .get_checklist_cell(&grid_view.id, &checklist_field.id, &database.rows[0].id)
  559. .await;
  560. assert_eq!(cell.options.len(), 3);
  561. assert_eq!(cell.selected_options.len(), 2);
  562. assert_eq!(cell.percentage, 0.67);
  563. }
  564. // The number of groups should be 0 if there is no group by field in grid
  565. #[tokio::test]
  566. async fn get_groups_event_with_grid_test() {
  567. let test = FlowyCoreTest::new_with_guest_user().await;
  568. let current_workspace = test.get_current_workspace().await.workspace;
  569. let grid_view = test
  570. .create_grid(&current_workspace.id, "my board view".to_owned(), vec![])
  571. .await;
  572. let groups = test.get_groups(&grid_view.id).await;
  573. assert_eq!(groups.len(), 0);
  574. }
  575. #[tokio::test]
  576. async fn get_groups_event_test() {
  577. let test = FlowyCoreTest::new_with_guest_user().await;
  578. let current_workspace = test.get_current_workspace().await.workspace;
  579. let board_view = test
  580. .create_board(&current_workspace.id, "my board view".to_owned(), vec![])
  581. .await;
  582. let groups = test.get_groups(&board_view.id).await;
  583. assert_eq!(groups.len(), 4);
  584. }
  585. #[tokio::test]
  586. async fn move_group_event_test() {
  587. let test = FlowyCoreTest::new_with_guest_user().await;
  588. let current_workspace = test.get_current_workspace().await.workspace;
  589. let board_view = test
  590. .create_board(&current_workspace.id, "my board view".to_owned(), vec![])
  591. .await;
  592. let groups = test.get_groups(&board_view.id).await;
  593. assert_eq!(groups.len(), 4);
  594. let group_1 = groups[0].group_id.clone();
  595. let group_2 = groups[1].group_id.clone();
  596. let group_3 = groups[2].group_id.clone();
  597. let group_4 = groups[3].group_id.clone();
  598. let error = test.move_group(&board_view.id, &group_2, &group_3).await;
  599. assert!(error.is_none());
  600. let groups = test.get_groups(&board_view.id).await;
  601. assert_eq!(groups[0].group_id, group_1);
  602. assert_eq!(groups[1].group_id, group_3);
  603. assert_eq!(groups[2].group_id, group_2);
  604. assert_eq!(groups[3].group_id, group_4);
  605. let error = test.move_group(&board_view.id, &group_1, &group_4).await;
  606. assert!(error.is_none());
  607. let groups = test.get_groups(&board_view.id).await;
  608. assert_eq!(groups[0].group_id, group_3);
  609. assert_eq!(groups[1].group_id, group_2);
  610. assert_eq!(groups[2].group_id, group_4);
  611. assert_eq!(groups[3].group_id, group_1);
  612. }
  613. #[tokio::test]
  614. async fn move_group_event_with_invalid_id_test() {
  615. let test = FlowyCoreTest::new_with_guest_user().await;
  616. let current_workspace = test.get_current_workspace().await.workspace;
  617. let board_view = test
  618. .create_board(&current_workspace.id, "my board view".to_owned(), vec![])
  619. .await;
  620. // Empty to group id
  621. let groups = test.get_groups(&board_view.id).await;
  622. let error = test
  623. .move_group(&board_view.id, &groups[0].group_id, "")
  624. .await;
  625. assert!(error.is_some());
  626. // empty from group id
  627. let error = test
  628. .move_group(&board_view.id, "", &groups[1].group_id)
  629. .await;
  630. assert!(error.is_some());
  631. }
  632. #[tokio::test]
  633. async fn rename_group_event_test() {
  634. let test = FlowyCoreTest::new_with_guest_user().await;
  635. let current_workspace = test.get_current_workspace().await.workspace;
  636. let board_view = test
  637. .create_board(&current_workspace.id, "my board view".to_owned(), vec![])
  638. .await;
  639. // Empty to group id
  640. let groups = test.get_groups(&board_view.id).await;
  641. let error = test
  642. .update_group(
  643. &board_view.id,
  644. &groups[0].group_id,
  645. Some("new name".to_owned()),
  646. None,
  647. )
  648. .await;
  649. assert!(error.is_none());
  650. let groups = test.get_groups(&board_view.id).await;
  651. assert_eq!(groups[0].group_name, "new name".to_owned());
  652. }
  653. #[tokio::test]
  654. async fn hide_group_event_test2() {
  655. let test = FlowyCoreTest::new_with_guest_user().await;
  656. let current_workspace = test.get_current_workspace().await.workspace;
  657. let board_view = test
  658. .create_board(&current_workspace.id, "my board view".to_owned(), vec![])
  659. .await;
  660. // Empty to group id
  661. let groups = test.get_groups(&board_view.id).await;
  662. assert_eq!(groups.len(), 4);
  663. let error = test
  664. .update_group(&board_view.id, &groups[0].group_id, None, Some(false))
  665. .await;
  666. assert!(error.is_none());
  667. let groups = test.get_groups(&board_view.id).await;
  668. assert_eq!(groups.len(), 3);
  669. }
  670. // Update the database layout type from grid to board
  671. #[tokio::test]
  672. async fn update_database_layout_event_test() {
  673. let test = FlowyCoreTest::new_with_guest_user().await;
  674. let current_workspace = test.get_current_workspace().await.workspace;
  675. let grid_view = test
  676. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  677. .await;
  678. let error = test
  679. .update_setting(DatabaseSettingChangesetPB {
  680. view_id: grid_view.id.clone(),
  681. layout_type: Some(DatabaseLayoutPB::Board),
  682. ..Default::default()
  683. })
  684. .await;
  685. assert!(error.is_none());
  686. let database = test.get_database(&grid_view.id).await;
  687. assert_eq!(database.layout_type, DatabaseLayoutPB::Board);
  688. }
  689. // Update the database layout type from grid to board. Set the checkbox field as the grouping field
  690. #[tokio::test]
  691. async fn update_database_layout_event_test2() {
  692. let test = FlowyCoreTest::new_with_guest_user().await;
  693. let current_workspace = test.get_current_workspace().await.workspace;
  694. let grid_view = test
  695. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  696. .await;
  697. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  698. let checkbox_field = fields
  699. .iter()
  700. .find(|field| field.field_type == FieldType::Checkbox)
  701. .unwrap();
  702. test
  703. .set_group_by_field(&grid_view.id, &checkbox_field.id)
  704. .await;
  705. let error = test
  706. .update_setting(DatabaseSettingChangesetPB {
  707. view_id: grid_view.id.clone(),
  708. layout_type: Some(DatabaseLayoutPB::Board),
  709. ..Default::default()
  710. })
  711. .await;
  712. assert!(error.is_none());
  713. // Empty to group id
  714. let groups = test.get_groups(&grid_view.id).await;
  715. assert_eq!(groups.len(), 2);
  716. }
  717. // Create a checkbox field in the default board and then set it as the grouping field.
  718. #[tokio::test]
  719. async fn set_group_by_checkbox_field_test() {
  720. let test = FlowyCoreTest::new_with_guest_user().await;
  721. let current_workspace = test.get_current_workspace().await.workspace;
  722. let board_view = test
  723. .create_board(&current_workspace.id, "my board view".to_owned(), vec![])
  724. .await;
  725. let checkbox_field = test.create_field(&board_view.id, FieldType::Checkbox).await;
  726. test
  727. .set_group_by_field(&board_view.id, &checkbox_field.id)
  728. .await;
  729. let groups = test.get_groups(&board_view.id).await;
  730. assert_eq!(groups.len(), 2);
  731. }
  732. #[tokio::test]
  733. async fn get_all_calendar_event_test() {
  734. let test = FlowyCoreTest::new_with_guest_user().await;
  735. let current_workspace = test.get_current_workspace().await.workspace;
  736. let calendar_view = test
  737. .create_calendar(&current_workspace.id, "my calendar view".to_owned(), vec![])
  738. .await;
  739. // By default, there should be no events
  740. let events = test.get_all_calendar_events(&calendar_view.id).await;
  741. assert!(events.is_empty());
  742. }
  743. #[tokio::test]
  744. async fn create_calendar_event_test() {
  745. let test = FlowyCoreTest::new_with_guest_user().await;
  746. let current_workspace = test.get_current_workspace().await.workspace;
  747. let calendar_view = test
  748. .create_calendar(&current_workspace.id, "my calendar view".to_owned(), vec![])
  749. .await;
  750. let fields = test.get_all_database_fields(&calendar_view.id).await.items;
  751. let date_field = fields
  752. .iter()
  753. .find(|field| field.field_type == FieldType::DateTime)
  754. .unwrap();
  755. // create a new row
  756. let row = test.create_row(&calendar_view.id, None, None).await;
  757. // Insert data into the date cell of the first row.
  758. let error = test
  759. .update_date_cell(DateChangesetPB {
  760. cell_id: CellIdPB {
  761. view_id: calendar_view.id.clone(),
  762. field_id: date_field.id.clone(),
  763. row_id: row.id,
  764. },
  765. date: Some(timestamp()),
  766. ..Default::default()
  767. })
  768. .await;
  769. assert!(error.is_none());
  770. let events = test.get_all_calendar_events(&calendar_view.id).await;
  771. assert_eq!(events.len(), 1);
  772. }