script.rs 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  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, FieldChangeset, FieldMeta, FieldType, GridBlock, GridBlockChangeset, 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_meta: FieldMeta,
  17. },
  18. UpdateField {
  19. changeset: FieldChangeset,
  20. },
  21. DeleteField {
  22. field_meta: FieldMeta,
  23. },
  24. AssertFieldCount(usize),
  25. AssertFieldEqual {
  26. field_index: usize,
  27. field_meta: FieldMeta,
  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 field_metas: Vec<FieldMeta>,
  70. pub grid_blocks: Vec<GridBlock>,
  71. pub row_metas: Vec<Arc<RowMeta>>,
  72. }
  73. impl GridEditorTest {
  74. pub async fn new() -> Self {
  75. Self::with_data("".to_owned()).await
  76. }
  77. pub async fn with_data(data: String) -> Self {
  78. let sdk = FlowySDKTest::default();
  79. let _ = sdk.init_user().await;
  80. let test = ViewTest::new_grid_view(&sdk, data).await;
  81. let editor = sdk.grid_manager.open_grid(&test.view.id).await.unwrap();
  82. let fields = editor.get_field_metas(None).await.unwrap();
  83. let grid_blocks = editor.get_blocks().await.unwrap();
  84. let row_metas = editor.get_row_metas(None).await.unwrap();
  85. let grid_id = test.view.id;
  86. Self {
  87. sdk,
  88. grid_id,
  89. editor,
  90. field_metas: fields,
  91. grid_blocks,
  92. row_metas,
  93. }
  94. }
  95. pub async fn run_scripts(&mut self, scripts: Vec<EditorScript>) {
  96. for script in scripts {
  97. self.run_script(script).await;
  98. }
  99. }
  100. pub async fn run_script(&mut self, script: EditorScript) {
  101. let grid_manager = self.sdk.grid_manager.clone();
  102. let pool = self.sdk.user_session.db_pool().unwrap();
  103. let rev_manager = self.editor.rev_manager();
  104. let _cache = rev_manager.revision_cache().await;
  105. match script {
  106. EditorScript::CreateField { field_meta: field } => {
  107. self.editor.create_field(field).await.unwrap();
  108. self.field_metas = self.editor.get_field_metas(None).await.unwrap();
  109. }
  110. EditorScript::UpdateField { changeset: change } => {
  111. self.editor.update_field(change).await.unwrap();
  112. self.field_metas = self.editor.get_field_metas(None).await.unwrap();
  113. }
  114. EditorScript::DeleteField { field_meta: field } => {
  115. self.editor.delete_field(&field.id).await.unwrap();
  116. self.field_metas = self.editor.get_field_metas(None).await.unwrap();
  117. }
  118. EditorScript::AssertFieldCount(count) => {
  119. assert_eq!(self.editor.get_field_metas(None).await.unwrap().len(), count);
  120. }
  121. EditorScript::AssertFieldEqual {
  122. field_index,
  123. field_meta,
  124. } => {
  125. let field_metas = self.editor.get_field_metas(None).await.unwrap();
  126. assert_eq!(field_metas[field_index].clone(), field_meta);
  127. }
  128. EditorScript::CreateBlock { block } => {
  129. self.editor.create_block(block).await.unwrap();
  130. self.grid_blocks = self.editor.get_blocks().await.unwrap();
  131. }
  132. EditorScript::UpdateBlock { changeset: change } => {
  133. self.editor.update_block(change).await.unwrap();
  134. }
  135. EditorScript::AssertBlockCount(count) => {
  136. assert_eq!(self.editor.get_blocks().await.unwrap().len(), count);
  137. }
  138. EditorScript::AssertBlock {
  139. block_index,
  140. row_count,
  141. start_row_index,
  142. } => {
  143. assert_eq!(self.grid_blocks[block_index].row_count, row_count);
  144. assert_eq!(self.grid_blocks[block_index].start_row_index, start_row_index);
  145. }
  146. EditorScript::AssertBlockEqual { block_index, block } => {
  147. let blocks = self.editor.get_blocks().await.unwrap();
  148. let compared_block = blocks[block_index].clone();
  149. assert_eq!(compared_block, block);
  150. }
  151. EditorScript::CreateEmptyRow => {
  152. self.editor.create_row().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::CreateRow { context } => {
  157. self.editor.insert_rows(vec![context]).await.unwrap();
  158. self.row_metas = self.editor.get_row_metas(None).await.unwrap();
  159. self.grid_blocks = self.editor.get_blocks().await.unwrap();
  160. }
  161. EditorScript::UpdateRow { changeset: change } => self.editor.update_row(change).await.unwrap(),
  162. EditorScript::DeleteRow { row_ids } => {
  163. self.editor.delete_rows(row_ids).await.unwrap();
  164. self.row_metas = self.editor.get_row_metas(None).await.unwrap();
  165. self.grid_blocks = self.editor.get_blocks().await.unwrap();
  166. }
  167. EditorScript::AssertRow { changeset } => {
  168. let row = self.row_metas.iter().find(|row| row.id == changeset.row_id).unwrap();
  169. if let Some(visibility) = changeset.visibility {
  170. assert_eq!(row.visibility, visibility);
  171. }
  172. if let Some(height) = changeset.height {
  173. assert_eq!(row.height, height);
  174. }
  175. }
  176. EditorScript::UpdateCell { changeset } => {
  177. self.editor.update_cell(changeset).await.unwrap();
  178. self.row_metas = self.editor.get_row_metas(None).await.unwrap();
  179. }
  180. EditorScript::AssertRowCount(count) => {
  181. assert_eq!(self.editor.get_rows(None).await.unwrap().len(), count);
  182. }
  183. EditorScript::AssertGridMetaPad => {
  184. sleep(Duration::from_millis(2 * REVISION_WRITE_INTERVAL_IN_MILLIS)).await;
  185. let mut grid_rev_manager = grid_manager.make_grid_rev_manager(&self.grid_id, pool.clone()).unwrap();
  186. let grid_pad = grid_rev_manager.load::<GridPadBuilder>(None).await.unwrap();
  187. println!("{}", grid_pad.delta_str());
  188. }
  189. }
  190. }
  191. }
  192. pub fn create_text_field() -> FieldMeta {
  193. FieldBuilder::new(RichTextTypeOptionsBuilder::default())
  194. .name("Name")
  195. .visibility(true)
  196. .field_type(FieldType::RichText)
  197. .build()
  198. }
  199. pub fn create_single_select_field() -> FieldMeta {
  200. let single_select = SingleSelectTypeOptionsBuilder::default()
  201. .option(SelectOption::new("Done"))
  202. .option(SelectOption::new("Progress"));
  203. FieldBuilder::new(single_select)
  204. .name("Name")
  205. .visibility(true)
  206. .field_type(FieldType::SingleSelect)
  207. .build()
  208. }