document_test.rs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. use std::{collections::HashMap, vec};
  2. use collab_document::blocks::{Block, BlockAction, BlockActionPayload, BlockActionType};
  3. use serde_json::{json, to_value, Value};
  4. use flowy_document2::document_data::{default_document_data, PARAGRAPH_BLOCK_TYPE};
  5. use crate::document::util::{gen_document_id, gen_id, DocumentTest};
  6. #[tokio::test]
  7. async fn restore_document() {
  8. let test = DocumentTest::new();
  9. // create a document
  10. let doc_id: String = gen_document_id();
  11. let data = default_document_data();
  12. let document_a = test.create_document(&doc_id, Some(data.clone())).unwrap();
  13. let data_a = document_a.lock().get_document_data().unwrap();
  14. assert_eq!(data_a, data);
  15. // open a document
  16. let data_b = test
  17. .get_document(&doc_id)
  18. .unwrap()
  19. .lock()
  20. .get_document_data()
  21. .unwrap();
  22. // close a document
  23. _ = test.close_document(&doc_id);
  24. assert_eq!(data_b, data);
  25. // restore
  26. _ = test.create_document(&doc_id, Some(data.clone()));
  27. // open a document
  28. let data_b = test
  29. .get_document(&doc_id)
  30. .unwrap()
  31. .lock()
  32. .get_document_data()
  33. .unwrap();
  34. // close a document
  35. _ = test.close_document(&doc_id);
  36. assert_eq!(data_b, data);
  37. }
  38. #[tokio::test]
  39. async fn document_apply_insert_action() {
  40. let test = DocumentTest::new();
  41. let doc_id: String = gen_document_id();
  42. let data = default_document_data();
  43. // create a document
  44. _ = test.create_document(&doc_id, Some(data.clone()));
  45. // open a document
  46. let document = test.get_document(&doc_id).unwrap();
  47. let page_block = document.lock().get_block(&data.page_id).unwrap();
  48. // insert a text block
  49. let text_block = Block {
  50. id: gen_id(),
  51. ty: PARAGRAPH_BLOCK_TYPE.to_string(),
  52. parent: page_block.id,
  53. children: gen_id(),
  54. external_id: None,
  55. external_type: None,
  56. data: HashMap::new(),
  57. };
  58. let insert_text_action = BlockAction {
  59. action: BlockActionType::Insert,
  60. payload: BlockActionPayload {
  61. block: text_block,
  62. parent_id: None,
  63. prev_id: None,
  64. },
  65. };
  66. document.lock().apply_action(vec![insert_text_action]);
  67. let data_a = document.lock().get_document_data().unwrap();
  68. // close the original document
  69. _ = test.close_document(&doc_id);
  70. // re-open the document
  71. let data_b = test
  72. .get_document(&doc_id)
  73. .unwrap()
  74. .lock()
  75. .get_document_data()
  76. .unwrap();
  77. // close a document
  78. _ = test.close_document(&doc_id);
  79. assert_eq!(data_b, data_a);
  80. }
  81. #[tokio::test]
  82. async fn document_apply_update_page_action() {
  83. let test = DocumentTest::new();
  84. let doc_id: String = gen_document_id();
  85. let data = default_document_data();
  86. // create a document
  87. _ = test.create_document(&doc_id, Some(data.clone()));
  88. // open a document
  89. let document = test.get_document(&doc_id).unwrap();
  90. let page_block = document.lock().get_block(&data.page_id).unwrap();
  91. let mut page_block_clone = page_block;
  92. page_block_clone.data = HashMap::new();
  93. page_block_clone.data.insert(
  94. "delta".to_string(),
  95. to_value(json!([{"insert": "Hello World!"}])).unwrap(),
  96. );
  97. let action = BlockAction {
  98. action: BlockActionType::Update,
  99. payload: BlockActionPayload {
  100. block: page_block_clone,
  101. parent_id: None,
  102. prev_id: None,
  103. },
  104. };
  105. let actions = vec![action];
  106. tracing::trace!("{:?}", &actions);
  107. document.lock().apply_action(actions);
  108. let page_block_old = document.lock().get_block(&data.page_id).unwrap();
  109. _ = test.close_document(&doc_id);
  110. // re-open the document
  111. let document = test.get_document(&doc_id).unwrap();
  112. let page_block_new = document.lock().get_block(&data.page_id).unwrap();
  113. assert_eq!(page_block_old, page_block_new);
  114. assert!(page_block_new.data.contains_key("delta"));
  115. }
  116. #[tokio::test]
  117. async fn document_apply_update_action() {
  118. let test = DocumentTest::new();
  119. let doc_id: String = gen_document_id();
  120. let data = default_document_data();
  121. // create a document
  122. _ = test.create_document(&doc_id, Some(data.clone()));
  123. // open a document
  124. let document = test.get_document(&doc_id).unwrap();
  125. let page_block = document.lock().get_block(&data.page_id).unwrap();
  126. // insert a text block
  127. let text_block_id = gen_id();
  128. let text_block = Block {
  129. id: text_block_id.clone(),
  130. ty: PARAGRAPH_BLOCK_TYPE.to_string(),
  131. parent: page_block.id,
  132. children: gen_id(),
  133. external_id: None,
  134. external_type: None,
  135. data: HashMap::new(),
  136. };
  137. let insert_text_action = BlockAction {
  138. action: BlockActionType::Insert,
  139. payload: BlockActionPayload {
  140. block: text_block,
  141. parent_id: None,
  142. prev_id: None,
  143. },
  144. };
  145. document.lock().apply_action(vec![insert_text_action]);
  146. // update the text block
  147. let existing_text_block = document.lock().get_block(&text_block_id).unwrap();
  148. let mut updated_text_block_data = HashMap::new();
  149. updated_text_block_data.insert("delta".to_string(), Value::String("delta".to_string()));
  150. let updated_text_block = Block {
  151. id: existing_text_block.id,
  152. ty: existing_text_block.ty,
  153. parent: existing_text_block.parent,
  154. children: existing_text_block.children,
  155. external_id: None,
  156. external_type: None,
  157. data: updated_text_block_data.clone(),
  158. };
  159. let update_text_action = BlockAction {
  160. action: BlockActionType::Update,
  161. payload: BlockActionPayload {
  162. block: updated_text_block,
  163. parent_id: None,
  164. prev_id: None,
  165. },
  166. };
  167. document.lock().apply_action(vec![update_text_action]);
  168. // close the original document
  169. _ = test.close_document(&doc_id);
  170. // re-open the document
  171. let document = test.get_document(&doc_id).unwrap();
  172. let block = document.lock().get_block(&text_block_id).unwrap();
  173. assert_eq!(block.data, updated_text_block_data);
  174. // close a document
  175. _ = test.close_document(&doc_id);
  176. }