test.rs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904
  1. use std::convert::TryFrom;
  2. use bytes::Bytes;
  3. use flowy_database2::entities::{
  4. CellChangesetPB, CellIdPB, ChecklistCellDataChangesetPB, DatabaseLayoutPB,
  5. DatabaseSettingChangesetPB, DatabaseViewIdPB, DateChangesetPB, FieldType, SelectOptionCellDataPB,
  6. UpdateRowMetaChangesetPB,
  7. };
  8. use flowy_test::event_builder::EventBuilder;
  9. use flowy_test::FlowyCoreTest;
  10. use lib_infra::util::timestamp;
  11. #[tokio::test]
  12. async fn get_database_id_event_test() {
  13. let test = FlowyCoreTest::new_with_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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 timestamp_str = 1686300557.to_string();
  452. let error = test
  453. .update_date_cell(DateChangesetPB {
  454. cell_id: cell_path,
  455. date: Some(timestamp_str.clone()),
  456. time: None,
  457. include_time: None,
  458. })
  459. .await;
  460. assert!(error.is_none());
  461. // Check that the cell data is updated.
  462. let cell = test
  463. .get_date_cell(&grid_view.id, &database.rows[0].id, &date_field.id)
  464. .await;
  465. assert_eq!(cell.date, "Jun 09, 2023");
  466. assert_eq!(cell.timestamp, timestamp);
  467. }
  468. #[tokio::test]
  469. async fn update_date_cell_event_with_empty_time_str_test() {
  470. let test = FlowyCoreTest::new_with_user().await;
  471. let current_workspace = test.get_current_workspace().await.workspace;
  472. let grid_view = test
  473. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  474. .await;
  475. let database = test.get_database(&grid_view.id).await;
  476. let row_id = database.rows[0].id.clone();
  477. // Create a date field
  478. let date_field = test.create_field(&grid_view.id, FieldType::DateTime).await;
  479. let cell_path = CellIdPB {
  480. view_id: grid_view.id.clone(),
  481. field_id: date_field.id.clone(),
  482. row_id: row_id.clone(),
  483. };
  484. // Insert empty timestamp string
  485. let error = test
  486. .update_date_cell(DateChangesetPB {
  487. cell_id: cell_path,
  488. date: Some("".to_string()),
  489. ..Default::default()
  490. })
  491. .await;
  492. assert!(error.is_none());
  493. // Check that the cell data is updated.
  494. let cell = test
  495. .get_date_cell(&grid_view.id, &row_id, &date_field.id)
  496. .await;
  497. assert_eq!(cell.date, "");
  498. assert_eq!(cell.timestamp, 0);
  499. }
  500. #[tokio::test]
  501. async fn create_checklist_field_test() {
  502. let test = FlowyCoreTest::new_with_user().await;
  503. let current_workspace = test.get_current_workspace().await.workspace;
  504. let grid_view = test
  505. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  506. .await;
  507. // create checklist field
  508. let checklist_field = test.create_field(&grid_view.id, FieldType::Checklist).await;
  509. let database = test.get_database(&grid_view.id).await;
  510. // Get the checklist cell
  511. let cell = test
  512. .get_checklist_cell(&grid_view.id, &checklist_field.id, &database.rows[0].id)
  513. .await;
  514. assert_eq!(cell.options.len(), 0);
  515. assert_eq!(cell.selected_options.len(), 0);
  516. assert_eq!(cell.percentage, 0.0);
  517. }
  518. #[tokio::test]
  519. async fn update_checklist_cell_test() {
  520. let test = FlowyCoreTest::new_with_user().await;
  521. let current_workspace = test.get_current_workspace().await.workspace;
  522. let grid_view = test
  523. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  524. .await;
  525. // create checklist field
  526. let checklist_field = test.create_field(&grid_view.id, FieldType::Checklist).await;
  527. let database = test.get_database(&grid_view.id).await;
  528. // update the checklist cell
  529. let changeset = ChecklistCellDataChangesetPB {
  530. view_id: grid_view.id.clone(),
  531. row_id: database.rows[0].id.clone(),
  532. field_id: checklist_field.id.clone(),
  533. insert_options: vec![
  534. "task 1".to_string(),
  535. "task 2".to_string(),
  536. "task 3".to_string(),
  537. ],
  538. selected_option_ids: vec![],
  539. delete_option_ids: vec![],
  540. update_options: vec![],
  541. };
  542. test.update_checklist_cell(changeset).await;
  543. // get the cell
  544. let cell = test
  545. .get_checklist_cell(&grid_view.id, &checklist_field.id, &database.rows[0].id)
  546. .await;
  547. assert_eq!(cell.options.len(), 3);
  548. assert_eq!(cell.selected_options.len(), 0);
  549. // select some options
  550. let changeset = ChecklistCellDataChangesetPB {
  551. view_id: grid_view.id.clone(),
  552. row_id: database.rows[0].id.clone(),
  553. field_id: checklist_field.id.clone(),
  554. selected_option_ids: vec![cell.options[0].id.clone(), cell.options[1].id.clone()],
  555. ..Default::default()
  556. };
  557. test.update_checklist_cell(changeset).await;
  558. // get the cell
  559. let cell = test
  560. .get_checklist_cell(&grid_view.id, &checklist_field.id, &database.rows[0].id)
  561. .await;
  562. assert_eq!(cell.options.len(), 3);
  563. assert_eq!(cell.selected_options.len(), 2);
  564. assert_eq!(cell.percentage, 0.6);
  565. }
  566. // The number of groups should be 0 if there is no group by field in grid
  567. #[tokio::test]
  568. async fn get_groups_event_with_grid_test() {
  569. let test = FlowyCoreTest::new_with_user().await;
  570. let current_workspace = test.get_current_workspace().await.workspace;
  571. let grid_view = test
  572. .create_grid(&current_workspace.id, "my board view".to_owned(), vec![])
  573. .await;
  574. let groups = test.get_groups(&grid_view.id).await;
  575. assert_eq!(groups.len(), 0);
  576. }
  577. #[tokio::test]
  578. async fn get_groups_event_test() {
  579. let test = FlowyCoreTest::new_with_user().await;
  580. let current_workspace = test.get_current_workspace().await.workspace;
  581. let board_view = test
  582. .create_board(&current_workspace.id, "my board view".to_owned(), vec![])
  583. .await;
  584. let groups = test.get_groups(&board_view.id).await;
  585. assert_eq!(groups.len(), 4);
  586. }
  587. #[tokio::test]
  588. async fn move_group_event_test() {
  589. let test = FlowyCoreTest::new_with_user().await;
  590. let current_workspace = test.get_current_workspace().await.workspace;
  591. let board_view = test
  592. .create_board(&current_workspace.id, "my board view".to_owned(), vec![])
  593. .await;
  594. let groups = test.get_groups(&board_view.id).await;
  595. assert_eq!(groups.len(), 4);
  596. let group_1 = groups[0].group_id.clone();
  597. let group_2 = groups[1].group_id.clone();
  598. let group_3 = groups[2].group_id.clone();
  599. let group_4 = groups[3].group_id.clone();
  600. let error = test.move_group(&board_view.id, &group_2, &group_3).await;
  601. assert!(error.is_none());
  602. let groups = test.get_groups(&board_view.id).await;
  603. assert_eq!(groups[0].group_id, group_1);
  604. assert_eq!(groups[1].group_id, group_3);
  605. assert_eq!(groups[2].group_id, group_2);
  606. assert_eq!(groups[3].group_id, group_4);
  607. let error = test.move_group(&board_view.id, &group_1, &group_4).await;
  608. assert!(error.is_none());
  609. let groups = test.get_groups(&board_view.id).await;
  610. assert_eq!(groups[0].group_id, group_3);
  611. assert_eq!(groups[1].group_id, group_2);
  612. assert_eq!(groups[2].group_id, group_4);
  613. assert_eq!(groups[3].group_id, group_1);
  614. }
  615. #[tokio::test]
  616. async fn move_group_event_with_invalid_id_test() {
  617. let test = FlowyCoreTest::new_with_user().await;
  618. let current_workspace = test.get_current_workspace().await.workspace;
  619. let board_view = test
  620. .create_board(&current_workspace.id, "my board view".to_owned(), vec![])
  621. .await;
  622. // Empty to group id
  623. let groups = test.get_groups(&board_view.id).await;
  624. let error = test
  625. .move_group(&board_view.id, &groups[0].group_id, "")
  626. .await;
  627. assert!(error.is_some());
  628. // empty from group id
  629. let error = test
  630. .move_group(&board_view.id, "", &groups[1].group_id)
  631. .await;
  632. assert!(error.is_some());
  633. }
  634. #[tokio::test]
  635. async fn rename_group_event_test() {
  636. let test = FlowyCoreTest::new_with_user().await;
  637. let current_workspace = test.get_current_workspace().await.workspace;
  638. let board_view = test
  639. .create_board(&current_workspace.id, "my board view".to_owned(), vec![])
  640. .await;
  641. // Empty to group id
  642. let groups = test.get_groups(&board_view.id).await;
  643. let error = test
  644. .update_group(
  645. &board_view.id,
  646. &groups[0].group_id,
  647. Some("new name".to_owned()),
  648. None,
  649. )
  650. .await;
  651. assert!(error.is_none());
  652. let groups = test.get_groups(&board_view.id).await;
  653. assert_eq!(groups[0].group_name, "new name".to_owned());
  654. }
  655. #[tokio::test]
  656. async fn hide_group_event_test2() {
  657. let test = FlowyCoreTest::new_with_user().await;
  658. let current_workspace = test.get_current_workspace().await.workspace;
  659. let board_view = test
  660. .create_board(&current_workspace.id, "my board view".to_owned(), vec![])
  661. .await;
  662. // Empty to group id
  663. let groups = test.get_groups(&board_view.id).await;
  664. assert_eq!(groups.len(), 4);
  665. let error = test
  666. .update_group(&board_view.id, &groups[0].group_id, None, Some(false))
  667. .await;
  668. assert!(error.is_none());
  669. let groups = test.get_groups(&board_view.id).await;
  670. assert_eq!(groups.len(), 3);
  671. }
  672. // Update the database layout type from grid to board
  673. #[tokio::test]
  674. async fn update_database_layout_event_test() {
  675. let test = FlowyCoreTest::new_with_user().await;
  676. let current_workspace = test.get_current_workspace().await.workspace;
  677. let grid_view = test
  678. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  679. .await;
  680. let error = test
  681. .update_setting(DatabaseSettingChangesetPB {
  682. view_id: grid_view.id.clone(),
  683. layout_type: Some(DatabaseLayoutPB::Board),
  684. ..Default::default()
  685. })
  686. .await;
  687. assert!(error.is_none());
  688. let database = test.get_database(&grid_view.id).await;
  689. assert_eq!(database.layout_type, DatabaseLayoutPB::Board);
  690. }
  691. // Update the database layout type from grid to board. Set the checkbox field as the grouping field
  692. #[tokio::test]
  693. async fn update_database_layout_event_test2() {
  694. let test = FlowyCoreTest::new_with_user().await;
  695. let current_workspace = test.get_current_workspace().await.workspace;
  696. let grid_view = test
  697. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  698. .await;
  699. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  700. let checkbox_field = fields
  701. .iter()
  702. .find(|field| field.field_type == FieldType::Checkbox)
  703. .unwrap();
  704. test
  705. .set_group_by_field(&grid_view.id, &checkbox_field.id)
  706. .await;
  707. let error = test
  708. .update_setting(DatabaseSettingChangesetPB {
  709. view_id: grid_view.id.clone(),
  710. layout_type: Some(DatabaseLayoutPB::Board),
  711. ..Default::default()
  712. })
  713. .await;
  714. assert!(error.is_none());
  715. // Empty to group id
  716. let groups = test.get_groups(&grid_view.id).await;
  717. assert_eq!(groups.len(), 2);
  718. }
  719. // Create a checkbox field in the default board and then set it as the grouping field.
  720. #[tokio::test]
  721. async fn set_group_by_checkbox_field_test() {
  722. let test = FlowyCoreTest::new_with_user().await;
  723. let current_workspace = test.get_current_workspace().await.workspace;
  724. let board_view = test
  725. .create_board(&current_workspace.id, "my board view".to_owned(), vec![])
  726. .await;
  727. let checkbox_field = test.create_field(&board_view.id, FieldType::Checkbox).await;
  728. test
  729. .set_group_by_field(&board_view.id, &checkbox_field.id)
  730. .await;
  731. let groups = test.get_groups(&board_view.id).await;
  732. assert_eq!(groups.len(), 2);
  733. }
  734. #[tokio::test]
  735. async fn get_all_calendar_event_test() {
  736. let test = FlowyCoreTest::new_with_user().await;
  737. let current_workspace = test.get_current_workspace().await.workspace;
  738. let calendar_view = test
  739. .create_calendar(&current_workspace.id, "my calendar view".to_owned(), vec![])
  740. .await;
  741. // By default, there should be no events
  742. let events = test.get_all_calendar_events(&calendar_view.id).await;
  743. assert!(events.is_empty());
  744. }
  745. #[tokio::test]
  746. async fn create_calendar_event_test() {
  747. let test = FlowyCoreTest::new_with_user().await;
  748. let current_workspace = test.get_current_workspace().await.workspace;
  749. let calendar_view = test
  750. .create_calendar(&current_workspace.id, "my calendar view".to_owned(), vec![])
  751. .await;
  752. let fields = test.get_all_database_fields(&calendar_view.id).await.items;
  753. let date_field = fields
  754. .iter()
  755. .find(|field| field.field_type == FieldType::DateTime)
  756. .unwrap();
  757. // create a new row
  758. let row = test.create_row(&calendar_view.id, None, None).await;
  759. // Insert data into the date cell of the first row.
  760. let timestamp_str = timestamp().to_string();
  761. let error = test
  762. .update_date_cell(DateChangesetPB {
  763. cell_id: CellIdPB {
  764. view_id: calendar_view.id.clone(),
  765. field_id: date_field.id.clone(),
  766. row_id: row.id,
  767. },
  768. date: Some(timestamp_str.clone()),
  769. time: None,
  770. include_time: None,
  771. })
  772. .await;
  773. assert!(error.is_none());
  774. let events = test.get_all_calendar_events(&calendar_view.id).await;
  775. assert_eq!(events.len(), 1);
  776. }