row_test.rs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. use crate::grid::script::EditorScript::*;
  2. use crate::grid::script::*;
  3. use chrono::NaiveDateTime;
  4. use flowy_grid::services::field::{
  5. DateCellData, MultiSelectTypeOption, SingleSelectTypeOption, SELECTION_IDS_SEPARATOR,
  6. };
  7. use flowy_grid::services::row::{decode_cell_data_from_type_option_cell_data, CreateRowRevisionBuilder};
  8. use flowy_grid_data_model::entities::FieldType;
  9. use flowy_grid_data_model::revision::RowMetaChangeset;
  10. #[tokio::test]
  11. async fn grid_create_row_count_test() {
  12. let test = GridEditorTest::new().await;
  13. let create_row_context = CreateRowRevisionBuilder::new(&test.field_revs).build();
  14. let scripts = vec![
  15. AssertRowCount(3),
  16. CreateEmptyRow,
  17. CreateEmptyRow,
  18. CreateRow {
  19. context: create_row_context,
  20. },
  21. AssertRowCount(6),
  22. ];
  23. GridEditorTest::new().await.run_scripts(scripts).await;
  24. }
  25. #[tokio::test]
  26. async fn grid_update_row() {
  27. let mut test = GridEditorTest::new().await;
  28. let context = CreateRowRevisionBuilder::new(&test.field_revs).build();
  29. let changeset = RowMetaChangeset {
  30. row_id: context.row_id.clone(),
  31. height: None,
  32. visibility: None,
  33. cell_by_field_id: Default::default(),
  34. };
  35. let scripts = vec![AssertRowCount(3), CreateRow { context }, UpdateRow { changeset }];
  36. test.run_scripts(scripts).await;
  37. let expected_row = (&*test.row_revs.last().cloned().unwrap()).clone();
  38. let scripts = vec![AssertRow { expected_row }, AssertRowCount(4)];
  39. test.run_scripts(scripts).await;
  40. }
  41. #[tokio::test]
  42. async fn grid_delete_row() {
  43. let mut test = GridEditorTest::new().await;
  44. let context_1 = CreateRowRevisionBuilder::new(&test.field_revs).build();
  45. let context_2 = CreateRowRevisionBuilder::new(&test.field_revs).build();
  46. let row_ids = vec![context_1.row_id.clone(), context_2.row_id.clone()];
  47. let scripts = vec![
  48. AssertRowCount(3),
  49. CreateRow { context: context_1 },
  50. CreateRow { context: context_2 },
  51. AssertBlockCount(1),
  52. AssertBlock {
  53. block_index: 0,
  54. row_count: 5,
  55. start_row_index: 0,
  56. },
  57. DeleteRows { row_ids },
  58. AssertBlock {
  59. block_index: 0,
  60. row_count: 3,
  61. start_row_index: 0,
  62. },
  63. ];
  64. test.run_scripts(scripts).await;
  65. }
  66. #[tokio::test]
  67. async fn grid_row_add_cells_test() {
  68. let mut test = GridEditorTest::new().await;
  69. let mut builder = CreateRowRevisionBuilder::new(&test.field_revs);
  70. for field in &test.field_revs {
  71. match field.field_type {
  72. FieldType::RichText => {
  73. builder.add_cell(&field.id, "hello world".to_owned()).unwrap();
  74. }
  75. FieldType::Number => {
  76. builder.add_cell(&field.id, "18,443".to_owned()).unwrap();
  77. }
  78. FieldType::DateTime => {
  79. builder
  80. .add_cell(&field.id, make_date_cell_string("1647251762"))
  81. .unwrap();
  82. }
  83. FieldType::SingleSelect => {
  84. let type_option = SingleSelectTypeOption::from(field);
  85. let option = type_option.options.first().unwrap();
  86. builder.add_select_option_cell(&field.id, option.id.clone()).unwrap();
  87. }
  88. FieldType::MultiSelect => {
  89. let type_option = MultiSelectTypeOption::from(field);
  90. let ops_ids = type_option
  91. .options
  92. .iter()
  93. .map(|option| option.id.clone())
  94. .collect::<Vec<_>>()
  95. .join(SELECTION_IDS_SEPARATOR);
  96. builder.add_select_option_cell(&field.id, ops_ids).unwrap();
  97. }
  98. FieldType::Checkbox => {
  99. builder.add_cell(&field.id, "false".to_string()).unwrap();
  100. }
  101. FieldType::URL => {
  102. builder.add_cell(&field.id, "1".to_string()).unwrap();
  103. }
  104. }
  105. }
  106. let context = builder.build();
  107. let scripts = vec![CreateRow { context }, AssertGridRevisionPad];
  108. test.run_scripts(scripts).await;
  109. }
  110. #[tokio::test]
  111. async fn grid_row_add_date_cell_test() {
  112. let mut test = GridEditorTest::new().await;
  113. let mut builder = CreateRowRevisionBuilder::new(&test.field_revs);
  114. let mut date_field = None;
  115. let timestamp = 1647390674;
  116. for field in &test.field_revs {
  117. if field.field_type == FieldType::DateTime {
  118. date_field = Some(field.clone());
  119. NaiveDateTime::from_timestamp(123, 0);
  120. // The data should not be empty
  121. assert!(builder.add_cell(&field.id, "".to_string()).is_err());
  122. assert!(builder.add_cell(&field.id, make_date_cell_string("123")).is_ok());
  123. assert!(builder
  124. .add_cell(&field.id, make_date_cell_string(&timestamp.to_string()))
  125. .is_ok());
  126. }
  127. }
  128. let context = builder.build();
  129. let date_field = date_field.unwrap();
  130. let cell_data = context.cell_by_field_id.get(&date_field.id).unwrap().clone();
  131. assert_eq!(
  132. decode_cell_data_from_type_option_cell_data(cell_data.data.clone(), &date_field, &date_field.field_type)
  133. .parse::<DateCellData>()
  134. .unwrap()
  135. .date,
  136. "2022/03/16",
  137. );
  138. let scripts = vec![CreateRow { context }];
  139. test.run_scripts(scripts).await;
  140. }