row_test.rs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. use crate::grid::field_util::*;
  2. use crate::grid::row_util::GridRowTestBuilder;
  3. use crate::grid::script::EditorScript::*;
  4. use crate::grid::script::*;
  5. use chrono::NaiveDateTime;
  6. use flowy_grid::entities::FieldType;
  7. use flowy_grid::services::field::select_option::SELECTION_IDS_SEPARATOR;
  8. use flowy_grid::services::field::{DateCellData, MultiSelectTypeOption, SingleSelectTypeOption};
  9. use flowy_grid::services::row::{decode_any_cell_data, CreateRowRevisionBuilder};
  10. use flowy_grid_data_model::revision::RowMetaChangeset;
  11. #[tokio::test]
  12. async fn grid_create_row_count_test() {
  13. let test = GridEditorTest::new().await;
  14. let scripts = vec![
  15. AssertRowCount(3),
  16. CreateEmptyRow,
  17. CreateEmptyRow,
  18. CreateRow {
  19. payload: GridRowTestBuilder::new(&test).build(),
  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 payload = GridRowTestBuilder::new(&test).build();
  29. let changeset = RowMetaChangeset {
  30. row_id: payload.row_id.clone(),
  31. height: None,
  32. visibility: None,
  33. cell_by_field_id: Default::default(),
  34. };
  35. let scripts = vec![AssertRowCount(3), CreateRow { payload }, 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 payload1 = GridRowTestBuilder::new(&test).build();
  45. let payload2 = GridRowTestBuilder::new(&test).build();
  46. let row_ids = vec![payload1.row_id.clone(), payload2.row_id.clone()];
  47. let scripts = vec![
  48. AssertRowCount(3),
  49. CreateRow { payload: payload1 },
  50. CreateRow { payload: payload2 },
  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. let field_type: FieldType = field.field_type_rev.into();
  72. match field_type {
  73. FieldType::RichText => {
  74. builder.add_cell(&field.id, "hello world".to_owned()).unwrap();
  75. }
  76. FieldType::Number => {
  77. builder.add_cell(&field.id, "18,443".to_owned()).unwrap();
  78. }
  79. FieldType::DateTime => {
  80. builder
  81. .add_cell(&field.id, make_date_cell_string("1647251762"))
  82. .unwrap();
  83. }
  84. FieldType::SingleSelect => {
  85. let type_option = SingleSelectTypeOption::from(field);
  86. let option = type_option.options.first().unwrap();
  87. builder.add_select_option_cell(&field.id, option.id.clone()).unwrap();
  88. }
  89. FieldType::MultiSelect => {
  90. let type_option = MultiSelectTypeOption::from(field);
  91. let ops_ids = type_option
  92. .options
  93. .iter()
  94. .map(|option| option.id.clone())
  95. .collect::<Vec<_>>()
  96. .join(SELECTION_IDS_SEPARATOR);
  97. builder.add_select_option_cell(&field.id, ops_ids).unwrap();
  98. }
  99. FieldType::Checkbox => {
  100. builder.add_cell(&field.id, "false".to_string()).unwrap();
  101. }
  102. FieldType::URL => {
  103. builder.add_cell(&field.id, "1".to_string()).unwrap();
  104. }
  105. }
  106. }
  107. let context = builder.build();
  108. let scripts = vec![CreateRow { payload: context }, AssertGridRevisionPad];
  109. test.run_scripts(scripts).await;
  110. }
  111. #[tokio::test]
  112. async fn grid_row_add_date_cell_test() {
  113. let mut test = GridEditorTest::new().await;
  114. let mut builder = CreateRowRevisionBuilder::new(&test.field_revs);
  115. let mut date_field = None;
  116. let timestamp = 1647390674;
  117. for field in &test.field_revs {
  118. let field_type: FieldType = field.field_type_rev.into();
  119. if field_type == FieldType::DateTime {
  120. date_field = Some(field.clone());
  121. NaiveDateTime::from_timestamp(123, 0);
  122. // The data should not be empty
  123. assert!(builder.add_cell(&field.id, "".to_string()).is_err());
  124. assert!(builder.add_cell(&field.id, make_date_cell_string("123")).is_ok());
  125. assert!(builder
  126. .add_cell(&field.id, make_date_cell_string(&timestamp.to_string()))
  127. .is_ok());
  128. }
  129. }
  130. let context = builder.build();
  131. let date_field = date_field.unwrap();
  132. let cell_rev = context.cell_by_field_id.get(&date_field.id).unwrap();
  133. assert_eq!(
  134. decode_any_cell_data(cell_rev, &date_field)
  135. .parse::<DateCellData>()
  136. .unwrap()
  137. .date,
  138. "2022/03/16",
  139. );
  140. let scripts = vec![CreateRow { payload: context }];
  141. test.run_scripts(scripts).await;
  142. }