test.rs 27 KB

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