helper.rs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. use std::ops::Deref;
  2. use std::sync::Arc;
  3. use collab::core::collab::MutexCollab;
  4. use collab::core::origin::CollabOrigin;
  5. use collab::preclude::updates::decoder::Decode;
  6. use collab::preclude::{merge_updates_v1, Update};
  7. use collab_document::blocks::DocumentData;
  8. use collab_document::document::Document;
  9. use flowy_document2::entities::{
  10. DocumentDataPB, OpenDocumentPayloadPB, RepeatedDocumentSnapshotPB,
  11. };
  12. use flowy_document2::event_map::DocumentEvent::{GetDocumentData, GetDocumentSnapshots};
  13. use flowy_folder2::entities::ViewPB;
  14. use flowy_test::event_builder::EventBuilder;
  15. use crate::util::FlowySupabaseTest;
  16. pub struct FlowySupabaseDocumentTest {
  17. inner: FlowySupabaseTest,
  18. }
  19. impl FlowySupabaseDocumentTest {
  20. pub async fn new() -> Option<Self> {
  21. let inner = FlowySupabaseTest::new()?;
  22. let uuid = uuid::Uuid::new_v4().to_string();
  23. let _ = inner.third_party_sign_up_with_uuid(&uuid, None).await;
  24. Some(Self { inner })
  25. }
  26. pub async fn create_document(&self) -> ViewPB {
  27. let current_workspace = self.inner.get_current_workspace().await;
  28. self
  29. .inner
  30. .create_document(
  31. &current_workspace.workspace.id,
  32. "my document".to_string(),
  33. vec![],
  34. )
  35. .await
  36. }
  37. pub async fn get_document_snapshots(&self, view_id: &str) -> RepeatedDocumentSnapshotPB {
  38. EventBuilder::new(self.inner.deref().clone())
  39. .event(GetDocumentSnapshots)
  40. .payload(OpenDocumentPayloadPB {
  41. document_id: view_id.to_string(),
  42. })
  43. .async_send()
  44. .await
  45. .parse::<RepeatedDocumentSnapshotPB>()
  46. }
  47. pub async fn get_document_data(&self, view_id: &str) -> DocumentData {
  48. let pb = EventBuilder::new(self.inner.deref().clone())
  49. .event(GetDocumentData)
  50. .payload(OpenDocumentPayloadPB {
  51. document_id: view_id.to_string(),
  52. })
  53. .async_send()
  54. .await
  55. .parse::<DocumentDataPB>();
  56. DocumentData::from(pb)
  57. }
  58. pub async fn get_collab_update(&self, document_id: &str) -> Vec<u8> {
  59. let cloud_service = self.document_manager.get_cloud_service().clone();
  60. let remote_updates = cloud_service
  61. .get_document_updates(document_id)
  62. .await
  63. .unwrap();
  64. if remote_updates.is_empty() {
  65. return vec![];
  66. }
  67. let updates = remote_updates
  68. .iter()
  69. .map(|update| update.as_ref())
  70. .collect::<Vec<&[u8]>>();
  71. merge_updates_v1(&updates).unwrap()
  72. }
  73. }
  74. impl Deref for FlowySupabaseDocumentTest {
  75. type Target = FlowySupabaseTest;
  76. fn deref(&self) -> &Self::Target {
  77. &self.inner
  78. }
  79. }
  80. pub fn assert_document_data_equal(collab_update: &[u8], doc_id: &str, expected: DocumentData) {
  81. let collab = MutexCollab::new(CollabOrigin::Server, doc_id, vec![]);
  82. collab.lock().with_origin_transact_mut(|txn| {
  83. let update = Update::decode_v1(collab_update).unwrap();
  84. txn.apply_update(update);
  85. });
  86. let document = Document::open(Arc::new(collab)).unwrap();
  87. let actual = document.get_document_data().unwrap();
  88. assert_eq!(actual, expected);
  89. }