test.rs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. use crate::database::field_test::script::DatabaseFieldTest;
  2. use crate::database::field_test::script::FieldScript::*;
  3. use crate::database::field_test::util::*;
  4. use bytes::Bytes;
  5. use flowy_database::entities::{FieldChangesetParams, FieldType};
  6. use flowy_database::services::field::selection_type_option::SelectOptionPB;
  7. use flowy_database::services::field::{gen_option_id, SingleSelectTypeOptionPB, CHECK, UNCHECK};
  8. #[tokio::test]
  9. async fn grid_create_field() {
  10. let mut test = DatabaseFieldTest::new().await;
  11. let (params, field_rev) = create_text_field(&test.view_id());
  12. let scripts = vec![
  13. CreateField { params },
  14. AssertFieldTypeOptionEqual {
  15. field_index: test.field_count(),
  16. expected_type_option_data: field_rev
  17. .get_type_option_str(field_rev.ty)
  18. .unwrap()
  19. .to_owned(),
  20. },
  21. ];
  22. test.run_scripts(scripts).await;
  23. let (params, field_rev) = create_single_select_field(&test.view_id());
  24. let scripts = vec![
  25. CreateField { params },
  26. AssertFieldTypeOptionEqual {
  27. field_index: test.field_count(),
  28. expected_type_option_data: field_rev
  29. .get_type_option_str(field_rev.ty)
  30. .unwrap()
  31. .to_owned(),
  32. },
  33. ];
  34. test.run_scripts(scripts).await;
  35. }
  36. #[tokio::test]
  37. async fn grid_create_duplicate_field() {
  38. let mut test = DatabaseFieldTest::new().await;
  39. let (params, _) = create_text_field(&test.view_id());
  40. let field_count = test.field_count();
  41. let expected_field_count = field_count + 1;
  42. let scripts = vec![
  43. CreateField {
  44. params: params.clone(),
  45. },
  46. AssertFieldCount(expected_field_count),
  47. ];
  48. test.run_scripts(scripts).await;
  49. }
  50. #[tokio::test]
  51. async fn grid_update_field_with_empty_change() {
  52. let mut test = DatabaseFieldTest::new().await;
  53. let (params, _) = create_single_select_field(&test.view_id());
  54. let create_field_index = test.field_count();
  55. let scripts = vec![CreateField { params }];
  56. test.run_scripts(scripts).await;
  57. let field_rev = (*test.field_revs.clone().pop().unwrap()).clone();
  58. let changeset = FieldChangesetParams {
  59. field_id: field_rev.id.clone(),
  60. view_id: test.view_id(),
  61. ..Default::default()
  62. };
  63. let scripts = vec![
  64. UpdateField { changeset },
  65. AssertFieldTypeOptionEqual {
  66. field_index: create_field_index,
  67. expected_type_option_data: field_rev
  68. .get_type_option_str(field_rev.ty)
  69. .unwrap()
  70. .to_owned(),
  71. },
  72. ];
  73. test.run_scripts(scripts).await;
  74. }
  75. #[tokio::test]
  76. async fn grid_update_field() {
  77. let mut test = DatabaseFieldTest::new().await;
  78. let (params, _) = create_single_select_field(&test.view_id());
  79. let scripts = vec![CreateField { params }];
  80. let create_field_index = test.field_count();
  81. test.run_scripts(scripts).await;
  82. //
  83. let single_select_field = (*test.field_revs.clone().pop().unwrap()).clone();
  84. let mut single_select_type_option = SingleSelectTypeOptionPB::from(&single_select_field);
  85. single_select_type_option
  86. .options
  87. .push(SelectOptionPB::new("Unknown"));
  88. let changeset = FieldChangesetParams {
  89. field_id: single_select_field.id.clone(),
  90. view_id: test.view_id(),
  91. frozen: Some(true),
  92. width: Some(1000),
  93. ..Default::default()
  94. };
  95. // The expected_field must be equal to the field that applied the changeset
  96. let mut expected_field_rev = single_select_field.clone();
  97. expected_field_rev.frozen = true;
  98. expected_field_rev.width = 1000;
  99. expected_field_rev.insert_type_option(&single_select_type_option);
  100. let scripts = vec![
  101. UpdateField { changeset },
  102. AssertFieldFrozen {
  103. field_index: create_field_index,
  104. frozen: true,
  105. },
  106. ];
  107. test.run_scripts(scripts).await;
  108. }
  109. #[tokio::test]
  110. async fn grid_delete_field() {
  111. let mut test = DatabaseFieldTest::new().await;
  112. let original_field_count = test.field_count();
  113. let (params, _) = create_text_field(&test.view_id());
  114. let scripts = vec![CreateField { params }];
  115. test.run_scripts(scripts).await;
  116. let text_field_rev = (*test.field_revs.clone().pop().unwrap()).clone();
  117. let scripts = vec![
  118. DeleteField {
  119. field_rev: text_field_rev,
  120. },
  121. AssertFieldCount(original_field_count),
  122. ];
  123. test.run_scripts(scripts).await;
  124. }
  125. #[tokio::test]
  126. async fn grid_switch_from_select_option_to_checkbox_test() {
  127. let mut test = DatabaseFieldTest::new().await;
  128. let field_rev = test.get_first_field_rev(FieldType::SingleSelect);
  129. // Update the type option data of single select option
  130. let mut single_select_type_option = test.get_single_select_type_option(&field_rev.id);
  131. single_select_type_option.options.clear();
  132. // Add a new option with name CHECK
  133. single_select_type_option.options.push(SelectOptionPB {
  134. id: gen_option_id(),
  135. name: CHECK.to_string(),
  136. color: Default::default(),
  137. });
  138. // Add a new option with name UNCHECK
  139. single_select_type_option.options.push(SelectOptionPB {
  140. id: gen_option_id(),
  141. name: UNCHECK.to_string(),
  142. color: Default::default(),
  143. });
  144. let bytes: Bytes = single_select_type_option.try_into().unwrap();
  145. let scripts = vec![
  146. UpdateTypeOption {
  147. field_id: field_rev.id.clone(),
  148. type_option: bytes.to_vec(),
  149. },
  150. SwitchToField {
  151. field_id: field_rev.id.clone(),
  152. new_field_type: FieldType::Checkbox,
  153. },
  154. ];
  155. test.run_scripts(scripts).await;
  156. }
  157. #[tokio::test]
  158. async fn grid_switch_from_checkbox_to_select_option_test() {
  159. let mut test = DatabaseFieldTest::new().await;
  160. let field_rev = test.get_first_field_rev(FieldType::Checkbox).clone();
  161. let scripts = vec![
  162. // switch to single-select field type
  163. SwitchToField {
  164. field_id: field_rev.id.clone(),
  165. new_field_type: FieldType::SingleSelect,
  166. },
  167. // Assert the cell content after switch the field type. The cell content will be changed if
  168. // the FieldType::SingleSelect implement the cell data TypeOptionTransform. Check out the
  169. // TypeOptionTransform trait for more information.
  170. //
  171. // Make sure which cell of the row you want to check.
  172. AssertCellContent {
  173. field_id: field_rev.id.clone(),
  174. // the mock data of the checkbox with row_index one is "true"
  175. row_index: 1,
  176. // the from_field_type represents as the current field type
  177. from_field_type: FieldType::Checkbox,
  178. // The content of the checkbox should transform to the corresponding option name.
  179. expected_content: CHECK.to_string(),
  180. },
  181. ];
  182. test.run_scripts(scripts).await;
  183. let single_select_type_option = test.get_single_select_type_option(&field_rev.id);
  184. assert_eq!(single_select_type_option.options.len(), 2);
  185. assert!(single_select_type_option
  186. .options
  187. .iter()
  188. .any(|option| option.name == UNCHECK));
  189. assert!(single_select_type_option
  190. .options
  191. .iter()
  192. .any(|option| option.name == CHECK));
  193. }
  194. // Test when switching the current field from Multi-select to Text test
  195. // The build-in test data is located in `make_test_grid` method(flowy-database/tests/grid_editor.rs).
  196. // input:
  197. // option1, option2 -> "option1.name, option2.name"
  198. #[tokio::test]
  199. async fn grid_switch_from_multi_select_to_text_test() {
  200. let mut test = DatabaseFieldTest::new().await;
  201. let field_rev = test.get_first_field_rev(FieldType::MultiSelect).clone();
  202. let multi_select_type_option = test.get_multi_select_type_option(&field_rev.id);
  203. let script_switch_field = vec![SwitchToField {
  204. field_id: field_rev.id.clone(),
  205. new_field_type: FieldType::RichText,
  206. }];
  207. test.run_scripts(script_switch_field).await;
  208. let script_assert_field = vec![AssertCellContent {
  209. field_id: field_rev.id.clone(),
  210. row_index: 0,
  211. from_field_type: FieldType::MultiSelect,
  212. expected_content: format!(
  213. "{},{}",
  214. multi_select_type_option.get(0).unwrap().name,
  215. multi_select_type_option.get(1).unwrap().name
  216. ),
  217. }];
  218. test.run_scripts(script_assert_field).await;
  219. }
  220. // Test when switching the current field from Checkbox to Text test
  221. // input:
  222. // check -> "Yes"
  223. // unchecked -> ""
  224. #[tokio::test]
  225. async fn grid_switch_from_checkbox_to_text_test() {
  226. let mut test = DatabaseFieldTest::new().await;
  227. let field_rev = test.get_first_field_rev(FieldType::Checkbox);
  228. let scripts = vec![
  229. SwitchToField {
  230. field_id: field_rev.id.clone(),
  231. new_field_type: FieldType::RichText,
  232. },
  233. AssertCellContent {
  234. field_id: field_rev.id.clone(),
  235. row_index: 1,
  236. from_field_type: FieldType::Checkbox,
  237. expected_content: "Yes".to_string(),
  238. },
  239. AssertCellContent {
  240. field_id: field_rev.id.clone(),
  241. row_index: 2,
  242. from_field_type: FieldType::Checkbox,
  243. expected_content: "No".to_string(),
  244. },
  245. ];
  246. test.run_scripts(scripts).await;
  247. }
  248. // Test when switching the current field from Checkbox to Text test
  249. // input:
  250. // "Yes" -> check
  251. // "" -> unchecked
  252. #[tokio::test]
  253. async fn grid_switch_from_text_to_checkbox_test() {
  254. let mut test = DatabaseFieldTest::new().await;
  255. let field_rev = test.get_first_field_rev(FieldType::RichText).clone();
  256. let scripts = vec![
  257. SwitchToField {
  258. field_id: field_rev.id.clone(),
  259. new_field_type: FieldType::Checkbox,
  260. },
  261. AssertCellContent {
  262. field_id: field_rev.id.clone(),
  263. row_index: 0,
  264. from_field_type: FieldType::RichText,
  265. expected_content: "".to_string(),
  266. },
  267. ];
  268. test.run_scripts(scripts).await;
  269. }
  270. // Test when switching the current field from Date to Text test
  271. // input:
  272. // 1647251762 -> Mar 14,2022 (This string will be different base on current data setting)
  273. #[tokio::test]
  274. async fn grid_switch_from_date_to_text_test() {
  275. let mut test = DatabaseFieldTest::new().await;
  276. let field_rev = test.get_first_field_rev(FieldType::DateTime).clone();
  277. let scripts = vec![
  278. SwitchToField {
  279. field_id: field_rev.id.clone(),
  280. new_field_type: FieldType::RichText,
  281. },
  282. AssertCellContent {
  283. field_id: field_rev.id.clone(),
  284. row_index: 2,
  285. from_field_type: FieldType::DateTime,
  286. expected_content: "2022/03/14".to_string(),
  287. },
  288. AssertCellContent {
  289. field_id: field_rev.id.clone(),
  290. row_index: 3,
  291. from_field_type: FieldType::DateTime,
  292. expected_content: "2022/11/17".to_string(),
  293. },
  294. ];
  295. test.run_scripts(scripts).await;
  296. }
  297. // Test when switching the current field from Number to Text test
  298. // input:
  299. // $1 -> "$1"(This string will be different base on current data setting)
  300. #[tokio::test]
  301. async fn grid_switch_from_number_to_text_test() {
  302. let mut test = DatabaseFieldTest::new().await;
  303. let field_rev = test.get_first_field_rev(FieldType::Number).clone();
  304. let scripts = vec![
  305. SwitchToField {
  306. field_id: field_rev.id.clone(),
  307. new_field_type: FieldType::RichText,
  308. },
  309. AssertCellContent {
  310. field_id: field_rev.id.clone(),
  311. row_index: 0,
  312. from_field_type: FieldType::Number,
  313. expected_content: "$1".to_string(),
  314. },
  315. AssertCellContent {
  316. field_id: field_rev.id.clone(),
  317. row_index: 4,
  318. from_field_type: FieldType::Number,
  319. expected_content: "".to_string(),
  320. },
  321. ];
  322. test.run_scripts(scripts).await;
  323. }