row_test.rs 5.4 KB

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