helper.rs 2.9 KB

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