grid_test.rs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. use crate::grid::script::EditorScript::*;
  2. use crate::grid::script::*;
  3. use flowy_grid::services::cell::*;
  4. use flowy_grid::services::row::{deserialize_cell_data, serialize_cell_data, CellDataSerde, CreateRowContextBuilder};
  5. use flowy_grid_data_model::entities::{FieldChangeset, FieldType, GridBlock, GridBlockChangeset, RowMetaChangeset};
  6. #[tokio::test]
  7. async fn grid_create_field() {
  8. let mut test = GridEditorTest::new().await;
  9. let text_field = create_text_field();
  10. let single_select_field = create_single_select_field();
  11. let scripts = vec![
  12. CreateField {
  13. field_meta: text_field.clone(),
  14. },
  15. AssertFieldEqual {
  16. field_index: test.field_count,
  17. field_meta: text_field,
  18. },
  19. ];
  20. test.run_scripts(scripts).await;
  21. let scripts = vec![
  22. CreateField {
  23. field_meta: single_select_field.clone(),
  24. },
  25. AssertFieldEqual {
  26. field_index: test.field_count,
  27. field_meta: single_select_field,
  28. },
  29. ];
  30. test.run_scripts(scripts).await;
  31. }
  32. #[tokio::test]
  33. async fn grid_create_duplicate_field() {
  34. let mut test = GridEditorTest::new().await;
  35. let text_field = create_text_field();
  36. let field_count = test.field_count;
  37. let expected_field_count = field_count + 1;
  38. let scripts = vec![
  39. CreateField {
  40. field_meta: text_field.clone(),
  41. },
  42. CreateField {
  43. field_meta: text_field.clone(),
  44. },
  45. AssertFieldCount(expected_field_count),
  46. ];
  47. test.run_scripts(scripts).await;
  48. }
  49. #[tokio::test]
  50. async fn grid_update_field_with_empty_change() {
  51. let mut test = GridEditorTest::new().await;
  52. let single_select_field = create_single_select_field();
  53. let changeset = FieldChangeset {
  54. field_id: single_select_field.id.clone(),
  55. name: None,
  56. desc: None,
  57. field_type: None,
  58. frozen: None,
  59. visibility: None,
  60. width: None,
  61. type_options: None,
  62. };
  63. let scripts = vec![
  64. CreateField {
  65. field_meta: single_select_field.clone(),
  66. },
  67. UpdateField { changeset },
  68. AssertFieldEqual {
  69. field_index: test.field_count,
  70. field_meta: single_select_field,
  71. },
  72. ];
  73. test.run_scripts(scripts).await;
  74. }
  75. #[tokio::test]
  76. async fn grid_update_field() {
  77. let mut test = GridEditorTest::new().await;
  78. let single_select_field = create_single_select_field();
  79. let mut cloned_field = single_select_field.clone();
  80. let mut single_select_type_options = SingleSelectDescription::from(&single_select_field);
  81. single_select_type_options.options.push(SelectOption::new("Unknown"));
  82. let changeset = FieldChangeset {
  83. field_id: single_select_field.id.clone(),
  84. name: None,
  85. desc: None,
  86. field_type: None,
  87. frozen: Some(true),
  88. visibility: None,
  89. width: Some(1000),
  90. type_options: Some(single_select_type_options.clone().into()),
  91. };
  92. cloned_field.frozen = true;
  93. cloned_field.width = 1000;
  94. cloned_field.type_options = single_select_type_options.into();
  95. let scripts = vec![
  96. CreateField {
  97. field_meta: single_select_field.clone(),
  98. },
  99. UpdateField { changeset },
  100. AssertFieldEqual {
  101. field_index: test.field_count,
  102. field_meta: cloned_field,
  103. },
  104. ];
  105. test.run_scripts(scripts).await;
  106. }
  107. #[tokio::test]
  108. async fn grid_delete_field() {
  109. let mut test = GridEditorTest::new().await;
  110. let expected_field_count = test.field_count;
  111. let text_field = create_text_field();
  112. let scripts = vec![
  113. CreateField {
  114. field_meta: text_field.clone(),
  115. },
  116. DeleteField { field_meta: text_field },
  117. AssertFieldCount(expected_field_count),
  118. ];
  119. test.run_scripts(scripts).await;
  120. }
  121. #[tokio::test]
  122. async fn grid_create_block() {
  123. let grid_block = GridBlock::new();
  124. let scripts = vec![
  125. AssertBlockCount(1),
  126. CreateBlock { block: grid_block },
  127. AssertBlockCount(2),
  128. ];
  129. GridEditorTest::new().await.run_scripts(scripts).await;
  130. }
  131. #[tokio::test]
  132. async fn grid_update_block() {
  133. let grid_block = GridBlock::new();
  134. let mut cloned_grid_block = grid_block.clone();
  135. let changeset = GridBlockChangeset {
  136. block_id: grid_block.id.clone(),
  137. start_row_index: Some(2),
  138. row_count: Some(10),
  139. };
  140. cloned_grid_block.start_row_index = 2;
  141. cloned_grid_block.row_count = 10;
  142. let scripts = vec![
  143. AssertBlockCount(1),
  144. CreateBlock { block: grid_block },
  145. UpdateBlock { changeset },
  146. AssertBlockCount(2),
  147. AssertBlockEqual {
  148. block_index: 1,
  149. block: cloned_grid_block,
  150. },
  151. ];
  152. GridEditorTest::new().await.run_scripts(scripts).await;
  153. }
  154. #[tokio::test]
  155. async fn grid_create_row() {
  156. let scripts = vec![AssertRowCount(3), CreateEmptyRow, CreateEmptyRow, AssertRowCount(5)];
  157. GridEditorTest::new().await.run_scripts(scripts).await;
  158. }
  159. #[tokio::test]
  160. async fn grid_create_row2() {
  161. let mut test = GridEditorTest::new().await;
  162. let create_row_context = CreateRowContextBuilder::new(&test.field_metas).build();
  163. let scripts = vec![
  164. AssertRowCount(3),
  165. CreateRow {
  166. context: create_row_context,
  167. },
  168. AssertRowCount(4),
  169. ];
  170. test.run_scripts(scripts).await;
  171. }
  172. #[tokio::test]
  173. async fn grid_update_row() {
  174. let mut test = GridEditorTest::new().await;
  175. let context = CreateRowContextBuilder::new(&test.field_metas).build();
  176. let changeset = RowMetaChangeset {
  177. row_id: context.row_id.clone(),
  178. height: None,
  179. visibility: None,
  180. cell_by_field_id: Default::default(),
  181. };
  182. let scripts = vec![
  183. AssertRowCount(3),
  184. CreateRow { context },
  185. UpdateRow {
  186. changeset: changeset.clone(),
  187. },
  188. AssertRow { changeset },
  189. AssertRowCount(4),
  190. ];
  191. test.run_scripts(scripts).await;
  192. }
  193. #[tokio::test]
  194. async fn grid_delete_row() {
  195. let mut test = GridEditorTest::new().await;
  196. let context_1 = CreateRowContextBuilder::new(&test.field_metas).build();
  197. let context_2 = CreateRowContextBuilder::new(&test.field_metas).build();
  198. let row_ids = vec![context_1.row_id.clone(), context_2.row_id.clone()];
  199. let scripts = vec![
  200. AssertRowCount(3),
  201. CreateRow { context: context_1 },
  202. CreateRow { context: context_2 },
  203. AssertBlockCount(1),
  204. AssertBlock {
  205. block_index: 0,
  206. row_count: 5,
  207. start_row_index: 0,
  208. },
  209. DeleteRow { row_ids },
  210. AssertBlock {
  211. block_index: 0,
  212. row_count: 3,
  213. start_row_index: 0,
  214. },
  215. ];
  216. test.run_scripts(scripts).await;
  217. }
  218. #[tokio::test]
  219. async fn grid_update_cell() {
  220. let mut test = GridEditorTest::new().await;
  221. let mut builder = CreateRowContextBuilder::new(&test.field_metas);
  222. for field in &test.field_metas {
  223. match field.field_type {
  224. FieldType::RichText => {
  225. let data = serialize_cell_data("hello world", field).unwrap();
  226. builder = builder.add_cell(&field.id, data);
  227. }
  228. FieldType::Number => {
  229. let data = serialize_cell_data("¥18,443", field).unwrap();
  230. builder = builder.add_cell(&field.id, data);
  231. }
  232. FieldType::DateTime => {
  233. let data = serialize_cell_data("1647251762", field).unwrap();
  234. builder = builder.add_cell(&field.id, data);
  235. }
  236. FieldType::SingleSelect => {
  237. let description = SingleSelectDescription::from(field);
  238. let options = description.options.first().unwrap();
  239. let data = description.serialize_cell_data(&options.id).unwrap();
  240. builder = builder.add_cell(&field.id, data);
  241. }
  242. FieldType::MultiSelect => {
  243. let description = MultiSelectDescription::from(field);
  244. let options = description
  245. .options
  246. .iter()
  247. .map(|option| option.id.clone())
  248. .collect::<Vec<_>>()
  249. .join(",");
  250. let data = description.serialize_cell_data(&options).unwrap();
  251. builder = builder.add_cell(&field.id, data);
  252. }
  253. FieldType::Checkbox => {
  254. let data = serialize_cell_data("false", field).unwrap();
  255. builder = builder.add_cell(&field.id, data);
  256. }
  257. }
  258. }
  259. let context = builder.build();
  260. let scripts = vec![AssertRowCount(3), CreateRow { context }, AssertGridMetaPad];
  261. test.run_scripts(scripts).await;
  262. }