test.rs 12 KB

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