document_test.rs 6.1 KB

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