script.rs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. use crate::database::database_editor::DatabaseEditorTest;
  2. use database_model::FieldRevision;
  3. use flowy_database::entities::{CreateFieldParams, FieldChangesetParams, FieldType};
  4. use flowy_database::services::cell::{stringify_cell_data, TypeCellData};
  5. pub enum FieldScript {
  6. CreateField {
  7. params: CreateFieldParams,
  8. },
  9. UpdateField {
  10. changeset: FieldChangesetParams,
  11. },
  12. DeleteField {
  13. field_rev: FieldRevision,
  14. },
  15. SwitchToField {
  16. field_id: String,
  17. new_field_type: FieldType,
  18. },
  19. UpdateTypeOption {
  20. field_id: String,
  21. type_option: Vec<u8>,
  22. },
  23. AssertFieldCount(usize),
  24. AssertFieldFrozen {
  25. field_index: usize,
  26. frozen: bool,
  27. },
  28. AssertFieldTypeOptionEqual {
  29. field_index: usize,
  30. expected_type_option_data: String,
  31. },
  32. AssertCellContent {
  33. field_id: String,
  34. row_index: usize,
  35. from_field_type: FieldType,
  36. expected_content: String,
  37. },
  38. }
  39. pub struct DatabaseFieldTest {
  40. inner: DatabaseEditorTest,
  41. }
  42. impl DatabaseFieldTest {
  43. pub async fn new() -> Self {
  44. let editor_test = DatabaseEditorTest::new_grid().await;
  45. Self { inner: editor_test }
  46. }
  47. pub fn view_id(&self) -> String {
  48. self.view_id.clone()
  49. }
  50. pub fn field_count(&self) -> usize {
  51. self.field_count
  52. }
  53. pub async fn run_scripts(&mut self, scripts: Vec<FieldScript>) {
  54. for script in scripts {
  55. self.run_script(script).await;
  56. }
  57. }
  58. pub async fn run_script(&mut self, script: FieldScript) {
  59. match script {
  60. FieldScript::CreateField { params } => {
  61. self.field_count += 1;
  62. self
  63. .editor
  64. .create_new_field_rev_with_type_option(&params.field_type, params.type_option_data)
  65. .await
  66. .unwrap();
  67. self.field_revs = self.editor.get_field_revs(None).await.unwrap();
  68. assert_eq!(self.field_count, self.field_revs.len());
  69. },
  70. FieldScript::UpdateField { changeset: change } => {
  71. self.editor.update_field(change).await.unwrap();
  72. self.field_revs = self.editor.get_field_revs(None).await.unwrap();
  73. },
  74. FieldScript::DeleteField { field_rev } => {
  75. if self.editor.contain_field(&field_rev.id).await {
  76. self.field_count -= 1;
  77. }
  78. self.editor.delete_field(&field_rev.id).await.unwrap();
  79. self.field_revs = self.editor.get_field_revs(None).await.unwrap();
  80. assert_eq!(self.field_count, self.field_revs.len());
  81. },
  82. FieldScript::SwitchToField {
  83. field_id,
  84. new_field_type,
  85. } => {
  86. //
  87. self
  88. .editor
  89. .switch_to_field_type(&field_id, &new_field_type)
  90. .await
  91. .unwrap();
  92. self.field_revs = self.editor.get_field_revs(None).await.unwrap();
  93. },
  94. FieldScript::UpdateTypeOption {
  95. field_id,
  96. type_option,
  97. } => {
  98. //
  99. self
  100. .editor
  101. .update_field_type_option(&self.view_id, &field_id, type_option, None)
  102. .await
  103. .unwrap();
  104. self.field_revs = self.editor.get_field_revs(None).await.unwrap();
  105. },
  106. FieldScript::AssertFieldCount(count) => {
  107. assert_eq!(self.editor.get_field_revs(None).await.unwrap().len(), count);
  108. },
  109. FieldScript::AssertFieldFrozen {
  110. field_index,
  111. frozen,
  112. } => {
  113. let field_revs = self.editor.get_field_revs(None).await.unwrap();
  114. let field_rev = field_revs[field_index].as_ref();
  115. assert_eq!(field_rev.frozen, frozen);
  116. },
  117. FieldScript::AssertFieldTypeOptionEqual {
  118. field_index,
  119. expected_type_option_data,
  120. } => {
  121. let field_revs = self.editor.get_field_revs(None).await.unwrap();
  122. let field_rev = field_revs[field_index].as_ref();
  123. let type_option_data = field_rev.get_type_option_str(field_rev.ty).unwrap();
  124. assert_eq!(type_option_data, expected_type_option_data);
  125. },
  126. FieldScript::AssertCellContent {
  127. field_id,
  128. row_index,
  129. from_field_type,
  130. expected_content,
  131. } => {
  132. let field_rev = self.editor.get_field_rev(&field_id).await.unwrap();
  133. let field_type: FieldType = field_rev.ty.into();
  134. let rows = self
  135. .editor
  136. .get_database(&self.view_id())
  137. .await
  138. .unwrap()
  139. .rows;
  140. let row = rows.get(row_index).unwrap();
  141. let row_rev = self.editor.get_row_rev(&row.id).await.unwrap().unwrap();
  142. let cell_rev = row_rev.cells.get(&field_id).unwrap().clone();
  143. let type_cell_data: TypeCellData = cell_rev.try_into().unwrap();
  144. let content = stringify_cell_data(
  145. type_cell_data.cell_str,
  146. &from_field_type,
  147. &field_type,
  148. &field_rev,
  149. );
  150. assert_eq!(content, expected_content);
  151. },
  152. }
  153. }
  154. }
  155. impl std::ops::Deref for DatabaseFieldTest {
  156. type Target = DatabaseEditorTest;
  157. fn deref(&self) -> &Self::Target {
  158. &self.inner
  159. }
  160. }
  161. impl std::ops::DerefMut for DatabaseFieldTest {
  162. fn deref_mut(&mut self) -> &mut Self::Target {
  163. &mut self.inner
  164. }
  165. }