document_test.rs 5.7 KB

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