script.rs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. use flowy_grid::services::cell::*;
  2. use flowy_grid::services::field::*;
  3. use flowy_grid::services::grid_editor::{ClientGridEditor, GridPadBuilder};
  4. use flowy_grid::services::row::CreateRowContext;
  5. use flowy_grid_data_model::entities::{
  6. CellMetaChangeset, Field, FieldChangeset, FieldType, GridBlock, GridBlockChangeset, Row, RowMeta, RowMetaChangeset,
  7. };
  8. use flowy_sync::REVISION_WRITE_INTERVAL_IN_MILLIS;
  9. use flowy_test::helper::ViewTest;
  10. use flowy_test::FlowySDKTest;
  11. use std::sync::Arc;
  12. use std::time::Duration;
  13. use tokio::time::sleep;
  14. pub enum EditorScript {
  15. CreateField {
  16. field: Field,
  17. },
  18. UpdateField {
  19. changeset: FieldChangeset,
  20. },
  21. DeleteField {
  22. field: Field,
  23. },
  24. AssertFieldCount(usize),
  25. AssertFieldEqual {
  26. field_index: usize,
  27. field: Field,
  28. },
  29. CreateBlock {
  30. block: GridBlock,
  31. },
  32. UpdateBlock {
  33. changeset: GridBlockChangeset,
  34. },
  35. AssertBlockCount(usize),
  36. AssertBlock {
  37. block_index: usize,
  38. row_count: i32,
  39. start_row_index: i32,
  40. },
  41. AssertBlockEqual {
  42. block_index: usize,
  43. block: GridBlock,
  44. },
  45. CreateEmptyRow,
  46. CreateRow {
  47. context: CreateRowContext,
  48. },
  49. UpdateRow {
  50. changeset: RowMetaChangeset,
  51. },
  52. AssertRow {
  53. changeset: RowMetaChangeset,
  54. },
  55. DeleteRow {
  56. row_ids: Vec<String>,
  57. },
  58. UpdateCell {
  59. changeset: CellMetaChangeset,
  60. },
  61. AssertRowCount(usize),
  62. // AssertRowEqual{ row_index: usize, row: RowMeta},
  63. AssertGridMetaPad,
  64. }
  65. pub struct GridEditorTest {
  66. pub sdk: FlowySDKTest,
  67. pub grid_id: String,
  68. pub editor: Arc<ClientGridEditor>,
  69. pub fields: Vec<Field>,
  70. pub grid_blocks: Vec<GridBlock>,
  71. pub row_metas: Vec<RowMeta>,
  72. }
  73. impl GridEditorTest {
  74. pub async fn new() -> Self {
  75. let sdk = FlowySDKTest::default();
  76. let _ = sdk.init_user().await;
  77. let test = ViewTest::new_grid_view(&sdk).await;
  78. let editor = sdk.grid_manager.open_grid(&test.view.id).await.unwrap();
  79. let fields = editor.get_fields(None).await.unwrap();
  80. let grid_blocks = editor.get_blocks().await.unwrap();
  81. let row_metas = editor.get_row_metas(&None).await.unwrap();
  82. let grid_id = test.view.id;
  83. Self {
  84. sdk,
  85. grid_id,
  86. editor,
  87. fields,
  88. grid_blocks,
  89. row_metas,
  90. }
  91. }
  92. pub async fn run_scripts(&mut self, scripts: Vec<EditorScript>) {
  93. for script in scripts {
  94. self.run_script(script).await;
  95. }
  96. }
  97. pub async fn run_script(&mut self, script: EditorScript) {
  98. let grid_manager = self.sdk.grid_manager.clone();
  99. let pool = self.sdk.user_session.db_pool().unwrap();
  100. let rev_manager = self.editor.rev_manager();
  101. let cache = rev_manager.revision_cache().await;
  102. match script {
  103. EditorScript::CreateField { field } => {
  104. self.editor.create_field(field).await.unwrap();
  105. self.fields = self.editor.get_fields(None).await.unwrap();
  106. }
  107. EditorScript::UpdateField { changeset: change } => {
  108. self.editor.update_field(change).await.unwrap();
  109. self.fields = self.editor.get_fields(None).await.unwrap();
  110. }
  111. EditorScript::DeleteField { field } => {
  112. self.editor.delete_field(&field.id).await.unwrap();
  113. self.fields = self.editor.get_fields(None).await.unwrap();
  114. }
  115. EditorScript::AssertFieldCount(count) => {
  116. assert_eq!(self.editor.get_fields(None).await.unwrap().len(), count);
  117. }
  118. EditorScript::AssertFieldEqual { field_index, field } => {
  119. let repeated_fields = self.editor.get_fields(None).await.unwrap();
  120. let compared_field = repeated_fields[field_index].clone();
  121. assert_eq!(compared_field, field);
  122. }
  123. EditorScript::CreateBlock { block } => {
  124. self.editor.create_block(block).await.unwrap();
  125. self.grid_blocks = self.editor.get_blocks().await.unwrap();
  126. }
  127. EditorScript::UpdateBlock { changeset: change } => {
  128. self.editor.update_block(change).await.unwrap();
  129. }
  130. EditorScript::AssertBlockCount(count) => {
  131. assert_eq!(self.editor.get_blocks().await.unwrap().len(), count);
  132. }
  133. EditorScript::AssertBlock {
  134. block_index,
  135. row_count,
  136. start_row_index,
  137. } => {
  138. assert_eq!(self.grid_blocks[block_index].row_count, row_count);
  139. assert_eq!(self.grid_blocks[block_index].start_row_index, start_row_index);
  140. }
  141. EditorScript::AssertBlockEqual { block_index, block } => {
  142. let blocks = self.editor.get_blocks().await.unwrap();
  143. let compared_block = blocks[block_index].clone();
  144. assert_eq!(compared_block, block);
  145. }
  146. EditorScript::CreateEmptyRow => {
  147. self.editor.create_row().await.unwrap();
  148. self.row_metas = self.editor.get_row_metas(&None).await.unwrap();
  149. self.grid_blocks = self.editor.get_blocks().await.unwrap();
  150. }
  151. EditorScript::CreateRow { context } => {
  152. self.editor.insert_rows(vec![context]).await.unwrap();
  153. self.row_metas = self.editor.get_row_metas(&None).await.unwrap();
  154. self.grid_blocks = self.editor.get_blocks().await.unwrap();
  155. }
  156. EditorScript::UpdateRow { changeset: change } => self.editor.update_row(change).await.unwrap(),
  157. EditorScript::DeleteRow { row_ids } => {
  158. self.editor.delete_rows(row_ids).await.unwrap();
  159. self.row_metas = self.editor.get_row_metas(&None).await.unwrap();
  160. self.grid_blocks = self.editor.get_blocks().await.unwrap();
  161. }
  162. EditorScript::AssertRow { changeset } => {
  163. let row = self.row_metas.iter().find(|row| row.id == changeset.row_id).unwrap();
  164. if let Some(visibility) = changeset.visibility {
  165. assert_eq!(row.visibility, visibility);
  166. }
  167. if let Some(height) = changeset.height {
  168. assert_eq!(row.height, height);
  169. }
  170. }
  171. EditorScript::UpdateCell { changeset } => {
  172. self.editor.update_cell(changeset).await.unwrap();
  173. self.row_metas = self.editor.get_row_metas(&None).await.unwrap();
  174. }
  175. EditorScript::AssertRowCount(count) => {
  176. assert_eq!(self.editor.get_rows(None).await.unwrap().len(), count);
  177. }
  178. EditorScript::AssertGridMetaPad => {
  179. sleep(Duration::from_millis(2 * REVISION_WRITE_INTERVAL_IN_MILLIS)).await;
  180. let mut grid_rev_manager = grid_manager.make_grid_rev_manager(&self.grid_id, pool.clone()).unwrap();
  181. let grid_pad = grid_rev_manager.load::<GridPadBuilder>(None).await.unwrap();
  182. println!("{}", grid_pad.delta_str());
  183. }
  184. }
  185. }
  186. }
  187. pub fn create_text_field() -> Field {
  188. FieldBuilder::new(RichTextTypeOptionsBuilder::default())
  189. .name("Name")
  190. .visibility(true)
  191. .field_type(FieldType::RichText)
  192. .build()
  193. }
  194. pub fn create_single_select_field() -> Field {
  195. let single_select = SingleSelectTypeOptionsBuilder::default()
  196. .option(SelectOption::new("Done"))
  197. .option(SelectOption::new("Progress"));
  198. FieldBuilder::new(single_select)
  199. .name("Name")
  200. .visibility(true)
  201. .field_type(FieldType::SingleSelect)
  202. .build()
  203. }