test.rs 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. use std::convert::TryFrom;
  2. use bytes::Bytes;
  3. use flowy_database2::entities::{
  4. CellChangesetPB, DatabaseLayoutPB, DatabaseViewIdPB, FieldType, SelectOptionCellDataPB,
  5. };
  6. use flowy_test::event_builder::EventBuilder;
  7. use flowy_test::FlowyCoreTest;
  8. #[tokio::test]
  9. async fn get_database_id_event_test() {
  10. let test = FlowyCoreTest::new_with_user().await;
  11. let current_workspace = test.get_current_workspace().await.workspace;
  12. let grid_view = test
  13. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  14. .await;
  15. // The view id can be used to get the database id.
  16. let database_id = EventBuilder::new(test.clone())
  17. .event(flowy_database2::event_map::DatabaseEvent::GetDatabaseId)
  18. .payload(DatabaseViewIdPB {
  19. value: grid_view.id.clone(),
  20. })
  21. .async_send()
  22. .await
  23. .parse::<flowy_database2::entities::DatabaseIdPB>()
  24. .value;
  25. assert_ne!(database_id, grid_view.id);
  26. }
  27. #[tokio::test]
  28. async fn get_database_event_test() {
  29. let test = FlowyCoreTest::new_with_user().await;
  30. let current_workspace = test.get_current_workspace().await.workspace;
  31. let grid_view = test
  32. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  33. .await;
  34. let database = test.get_database(&grid_view.id).await;
  35. assert_eq!(database.fields.len(), 3);
  36. assert_eq!(database.rows.len(), 3);
  37. assert_eq!(database.layout_type, DatabaseLayoutPB::Grid);
  38. }
  39. #[tokio::test]
  40. async fn get_field_event_test() {
  41. let test = FlowyCoreTest::new_with_user().await;
  42. let current_workspace = test.get_current_workspace().await.workspace;
  43. let grid_view = test
  44. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  45. .await;
  46. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  47. assert_eq!(fields[0].field_type, FieldType::RichText);
  48. assert_eq!(fields[1].field_type, FieldType::SingleSelect);
  49. assert_eq!(fields[2].field_type, FieldType::Checkbox);
  50. assert_eq!(fields.len(), 3);
  51. }
  52. #[tokio::test]
  53. async fn create_field_event_test() {
  54. let test = FlowyCoreTest::new_with_user().await;
  55. let current_workspace = test.get_current_workspace().await.workspace;
  56. let grid_view = test
  57. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  58. .await;
  59. test.create_field(&grid_view.id, FieldType::Checkbox).await;
  60. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  61. assert_eq!(fields.len(), 4);
  62. assert_eq!(fields[3].field_type, FieldType::Checkbox);
  63. }
  64. #[tokio::test]
  65. async fn delete_field_event_test() {
  66. let test = FlowyCoreTest::new_with_user().await;
  67. let current_workspace = test.get_current_workspace().await.workspace;
  68. let grid_view = test
  69. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  70. .await;
  71. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  72. assert_eq!(fields[0].field_type, FieldType::RichText);
  73. assert_eq!(fields[1].field_type, FieldType::SingleSelect);
  74. assert_eq!(fields[2].field_type, FieldType::Checkbox);
  75. let error = test.delete_field(&grid_view.id, &fields[1].id).await;
  76. assert!(error.is_none());
  77. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  78. assert_eq!(fields.len(), 2);
  79. }
  80. #[tokio::test]
  81. async fn delete_primary_field_event_test() {
  82. let test = FlowyCoreTest::new_with_user().await;
  83. let current_workspace = test.get_current_workspace().await.workspace;
  84. let grid_view = test
  85. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  86. .await;
  87. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  88. // the primary field is not allowed to be deleted.
  89. assert!(fields[0].is_primary);
  90. let error = test.delete_field(&grid_view.id, &fields[0].id).await;
  91. assert!(error.is_some());
  92. }
  93. #[tokio::test]
  94. async fn update_field_type_event_test() {
  95. let test = FlowyCoreTest::new_with_user().await;
  96. let current_workspace = test.get_current_workspace().await.workspace;
  97. let grid_view = test
  98. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  99. .await;
  100. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  101. let error = test
  102. .update_field_type(&grid_view.id, &fields[1].id, FieldType::Checklist)
  103. .await;
  104. assert!(error.is_none());
  105. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  106. assert_eq!(fields[1].field_type, FieldType::Checklist);
  107. }
  108. #[tokio::test]
  109. async fn update_primary_field_type_event_test() {
  110. let test = FlowyCoreTest::new_with_user().await;
  111. let current_workspace = test.get_current_workspace().await.workspace;
  112. let grid_view = test
  113. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  114. .await;
  115. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  116. // the primary field is not allowed to be deleted.
  117. assert!(fields[0].is_primary);
  118. // the primary field is not allowed to be updated.
  119. let error = test
  120. .update_field_type(&grid_view.id, &fields[0].id, FieldType::Checklist)
  121. .await;
  122. assert!(error.is_some());
  123. }
  124. #[tokio::test]
  125. async fn duplicate_field_event_test() {
  126. let test = FlowyCoreTest::new_with_user().await;
  127. let current_workspace = test.get_current_workspace().await.workspace;
  128. let grid_view = test
  129. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  130. .await;
  131. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  132. // the primary field is not allowed to be updated.
  133. let error = test.duplicate_field(&grid_view.id, &fields[1].id).await;
  134. assert!(error.is_none());
  135. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  136. assert_eq!(fields.len(), 4);
  137. }
  138. #[tokio::test]
  139. async fn duplicate_primary_field_test() {
  140. let test = FlowyCoreTest::new_with_user().await;
  141. let current_workspace = test.get_current_workspace().await.workspace;
  142. let grid_view = test
  143. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  144. .await;
  145. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  146. // the primary field is not allowed to be duplicated.
  147. let error = test.duplicate_field(&grid_view.id, &fields[0].id).await;
  148. assert!(error.is_some());
  149. }
  150. #[tokio::test]
  151. async fn create_row_event_test() {
  152. let test = FlowyCoreTest::new_with_user().await;
  153. let current_workspace = test.get_current_workspace().await.workspace;
  154. let grid_view = test
  155. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  156. .await;
  157. let _ = test.create_row(&grid_view.id, None, None).await;
  158. let database = test.get_database(&grid_view.id).await;
  159. assert_eq!(database.rows.len(), 4);
  160. }
  161. #[tokio::test]
  162. async fn duplicate_row_event_test() {
  163. let test = FlowyCoreTest::new_with_user().await;
  164. let current_workspace = test.get_current_workspace().await.workspace;
  165. let grid_view = test
  166. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  167. .await;
  168. let database = test.get_database(&grid_view.id).await;
  169. let error = test
  170. .duplicate_row(&grid_view.id, &database.rows[0].id)
  171. .await;
  172. assert!(error.is_none());
  173. let database = test.get_database(&grid_view.id).await;
  174. assert_eq!(database.rows.len(), 4);
  175. }
  176. #[tokio::test]
  177. async fn update_text_cell_event_test() {
  178. let test = FlowyCoreTest::new_with_user().await;
  179. let current_workspace = test.get_current_workspace().await.workspace;
  180. let grid_view = test
  181. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  182. .await;
  183. let database = test.get_database(&grid_view.id).await;
  184. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  185. let row_id = database.rows[0].id.clone();
  186. let field_id = fields[0].id.clone();
  187. assert_eq!(fields[0].field_type, FieldType::RichText);
  188. // Update the first cell of the first row.
  189. let error = test
  190. .update_cell(CellChangesetPB {
  191. view_id: grid_view.id.clone(),
  192. row_id: row_id.clone(),
  193. field_id: field_id.clone(),
  194. cell_changeset: "hello world".to_string(),
  195. })
  196. .await;
  197. assert!(error.is_none());
  198. let cell = test.get_cell(&grid_view.id, &row_id, &field_id).await;
  199. let s = String::from_utf8(cell.data).unwrap();
  200. assert_eq!(s, "hello world");
  201. }
  202. #[tokio::test]
  203. async fn update_checkbox_cell_event_test() {
  204. let test = FlowyCoreTest::new_with_user().await;
  205. let current_workspace = test.get_current_workspace().await.workspace;
  206. let grid_view = test
  207. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  208. .await;
  209. let database = test.get_database(&grid_view.id).await;
  210. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  211. let row_id = database.rows[0].id.clone();
  212. let field_id = fields[2].id.clone();
  213. assert_eq!(fields[2].field_type, FieldType::Checkbox);
  214. for input in &["yes", "true", "1"] {
  215. let error = test
  216. .update_cell(CellChangesetPB {
  217. view_id: grid_view.id.clone(),
  218. row_id: row_id.clone(),
  219. field_id: field_id.clone(),
  220. cell_changeset: input.to_string(),
  221. })
  222. .await;
  223. assert!(error.is_none());
  224. let cell = test.get_cell(&grid_view.id, &row_id, &field_id).await;
  225. let output = String::from_utf8(cell.data).unwrap();
  226. assert_eq!(output, "Yes");
  227. }
  228. }
  229. #[tokio::test]
  230. async fn update_single_select_cell_event_test() {
  231. let test = FlowyCoreTest::new_with_user().await;
  232. let current_workspace = test.get_current_workspace().await.workspace;
  233. let grid_view = test
  234. .create_grid(&current_workspace.id, "my grid view".to_owned(), vec![])
  235. .await;
  236. let database = test.get_database(&grid_view.id).await;
  237. let fields = test.get_all_database_fields(&grid_view.id).await.items;
  238. let row_id = database.rows[0].id.clone();
  239. let field_id = fields[1].id.clone();
  240. assert_eq!(fields[1].field_type, FieldType::SingleSelect);
  241. let error = test
  242. .insert_option(&grid_view.id, &field_id, &row_id, "task 1")
  243. .await;
  244. assert!(error.is_none());
  245. let cell = test.get_cell(&grid_view.id, &row_id, &field_id).await;
  246. let select_option_cell = SelectOptionCellDataPB::try_from(Bytes::from(cell.data)).unwrap();
  247. assert_eq!(select_option_cell.options.len(), 1);
  248. assert_eq!(select_option_cell.select_options.len(), 1);
  249. }