AppFlowy-Cloud/tests/collab/storage_test.rs

217 lines
5.8 KiB
Rust

use crate::{
collab::workspace_id_from_client, user::utils::generate_unique_registered_user_client,
};
use collab::core::collab_plugin::EncodedCollabV1;
use std::collections::HashMap;
use app_error::ErrorCode;
use collab_entity::CollabType;
use database_entity::dto::{
BatchQueryCollab, BatchQueryCollabParams, DeleteCollabParams, InsertCollabParams,
QueryCollabParams, QueryCollabResult,
};
use sqlx::types::Uuid;
#[tokio::test]
async fn success_insert_collab_test() {
let (c, _user) = generate_unique_registered_user_client().await;
let raw_data = "hello world".to_string().as_bytes().to_vec();
let encoded_collab_v1 = EncodedCollabV1::new(vec![], raw_data.clone())
.encode_to_bytes()
.unwrap();
let workspace_id = workspace_id_from_client(&c).await;
let object_id = Uuid::new_v4().to_string();
c.create_collab(InsertCollabParams::new(
&object_id,
CollabType::Document,
encoded_collab_v1,
workspace_id.clone(),
))
.await
.unwrap();
let bytes = c
.get_collab(QueryCollabParams {
object_id,
workspace_id,
collab_type: CollabType::Document,
})
.await
.unwrap()
.doc_state;
assert_eq!(bytes, raw_data);
}
#[tokio::test]
async fn success_batch_get_collab_test() {
let (c, _user) = generate_unique_registered_user_client().await;
let workspace_id = workspace_id_from_client(&c).await;
let queries = BatchQueryCollabParams(vec![
BatchQueryCollab {
object_id: Uuid::new_v4().to_string(),
collab_type: CollabType::Document,
},
BatchQueryCollab {
object_id: Uuid::new_v4().to_string(),
collab_type: CollabType::Folder,
},
BatchQueryCollab {
object_id: Uuid::new_v4().to_string(),
collab_type: CollabType::Database,
},
]);
let mut expected_results = HashMap::new();
for i in 0..3 {
let object_id = queries.0[i].object_id.clone();
let collab_type = queries.0[i].collab_type.clone();
let raw_data = format!("hello world {}", i).as_bytes().to_vec();
expected_results.insert(
object_id.clone(),
QueryCollabResult::Success {
encode_collab_v1: raw_data.clone(),
},
);
c.create_collab(InsertCollabParams::new(
&object_id,
collab_type,
raw_data.clone(),
workspace_id.clone(),
))
.await
.unwrap();
}
let results = c.batch_get_collab(&workspace_id, queries).await.unwrap().0;
for (object_id, result) in expected_results.iter() {
assert_eq!(result, results.get(object_id).unwrap());
}
}
#[tokio::test]
async fn success_part_batch_get_collab_test() {
let (c, _user) = generate_unique_registered_user_client().await;
let workspace_id = workspace_id_from_client(&c).await;
let queries = BatchQueryCollabParams(vec![
BatchQueryCollab {
object_id: Uuid::new_v4().to_string(),
collab_type: CollabType::Document,
},
BatchQueryCollab {
object_id: Uuid::new_v4().to_string(),
collab_type: CollabType::Folder,
},
BatchQueryCollab {
object_id: Uuid::new_v4().to_string(),
collab_type: CollabType::Database,
},
]);
let mut expected_results = HashMap::new();
for i in 0..3 {
let object_id = queries.0[i].object_id.clone();
let collab_type = queries.0[i].collab_type.clone();
let raw_data = format!("hello world {}", i).as_bytes().to_vec();
if i == 1 {
expected_results.insert(
object_id.clone(),
QueryCollabResult::Failed {
error: "Record not found".to_string(),
},
);
} else {
expected_results.insert(
object_id.clone(),
QueryCollabResult::Success {
encode_collab_v1: raw_data.clone(),
},
);
c.create_collab(InsertCollabParams::new(
&object_id,
collab_type,
raw_data.clone(),
workspace_id.clone(),
))
.await
.unwrap();
}
}
let results = c.batch_get_collab(&workspace_id, queries).await.unwrap().0;
for (object_id, result) in expected_results.iter() {
assert_eq!(result, results.get(object_id).unwrap());
}
}
#[tokio::test]
async fn success_delete_collab_test() {
let (c, _user) = generate_unique_registered_user_client().await;
let raw_data = "hello world".to_string().as_bytes().to_vec();
let workspace_id = workspace_id_from_client(&c).await;
let object_id = Uuid::new_v4().to_string();
c.create_collab(InsertCollabParams::new(
object_id.clone(),
CollabType::Document,
raw_data.clone(),
workspace_id.clone(),
))
.await
.unwrap();
c.delete_collab(DeleteCollabParams {
object_id: object_id.clone(),
workspace_id: workspace_id.clone(),
})
.await
.unwrap();
let error = c
.get_collab(QueryCollabParams {
object_id,
workspace_id,
collab_type: CollabType::Document,
})
.await
.unwrap_err();
assert_eq!(error.code, ErrorCode::RecordNotFound);
}
#[tokio::test]
async fn fail_insert_collab_with_empty_payload_test() {
let (c, _user) = generate_unique_registered_user_client().await;
let workspace_id = workspace_id_from_client(&c).await;
let error = c
.create_collab(InsertCollabParams::new(
Uuid::new_v4().to_string(),
CollabType::Document,
vec![],
workspace_id,
))
.await
.unwrap_err();
assert_eq!(error.code, ErrorCode::InvalidRequest);
}
#[tokio::test]
async fn fail_insert_collab_with_invalid_workspace_id_test() {
let (c, _user) = generate_unique_registered_user_client().await;
let workspace_id = Uuid::new_v4().to_string();
let raw_data = "hello world".to_string().as_bytes().to_vec();
let error = c
.create_collab(InsertCollabParams::new(
Uuid::new_v4().to_string(),
CollabType::Document,
raw_data.clone(),
workspace_id,
))
.await
.unwrap_err();
assert_eq!(error.code, ErrorCode::NotEnoughPermissions);
}