AppFlowy-Cloud/tests/collab/storage_test.rs

228 lines
6.3 KiB
Rust

use crate::collab::util::test_encode_collab_v1;
use app_error::ErrorCode;
use client_api_test_util::*;
use collab_entity::CollabType;
use database_entity::dto::{
CreateCollabParams, DeleteCollabParams, QueryCollab, QueryCollabParams, QueryCollabResult,
};
use sqlx::types::Uuid;
use std::collections::HashMap;
#[tokio::test]
async fn success_insert_collab_test() {
let (c, _user) = generate_unique_registered_user_client().await;
let workspace_id = workspace_id_from_client(&c).await;
let object_id = Uuid::new_v4().to_string();
let encode_collab = test_encode_collab_v1(&object_id, "title", "hello world");
c.create_collab(CreateCollabParams {
object_id: object_id.clone(),
collab_type: CollabType::Document,
override_if_exist: false,
workspace_id: workspace_id.clone(),
encoded_collab_v1: encode_collab.encode_to_bytes().unwrap(),
})
.await
.unwrap();
let doc_state = c
.get_collab(QueryCollabParams::new(
&object_id,
CollabType::Document,
&workspace_id,
))
.await
.unwrap()
.doc_state;
assert_eq!(doc_state, encode_collab.doc_state);
}
#[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 = vec![
QueryCollab {
object_id: Uuid::new_v4().to_string(),
collab_type: CollabType::Document,
},
QueryCollab {
object_id: Uuid::new_v4().to_string(),
collab_type: CollabType::Folder,
},
QueryCollab {
object_id: Uuid::new_v4().to_string(),
collab_type: CollabType::Database,
},
];
let mut expected_results = HashMap::new();
for query in queries.iter() {
let object_id = query.object_id.clone();
let encode_collab = test_encode_collab_v1(&object_id, "title", "hello world")
.encode_to_bytes()
.unwrap();
let collab_type = query.collab_type.clone();
expected_results.insert(
object_id.clone(),
QueryCollabResult::Success {
encode_collab_v1: encode_collab.clone(),
},
);
c.create_collab(CreateCollabParams {
object_id: object_id.clone(),
encoded_collab_v1: encode_collab.clone(),
collab_type: collab_type.clone(),
override_if_exist: false,
workspace_id: 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 = vec![
QueryCollab {
object_id: Uuid::new_v4().to_string(),
collab_type: CollabType::Document,
},
QueryCollab {
object_id: Uuid::new_v4().to_string(),
collab_type: CollabType::Folder,
},
QueryCollab {
object_id: Uuid::new_v4().to_string(),
collab_type: CollabType::Database,
},
];
let mut expected_results = HashMap::new();
for (index, query) in queries.iter().enumerate() {
let object_id = query.object_id.clone();
let collab_type = query.collab_type.clone();
let encode_collab = test_encode_collab_v1(&object_id, "title", "hello world")
.encode_to_bytes()
.unwrap();
if index == 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: encode_collab.clone(),
},
);
c.create_collab(CreateCollabParams {
object_id: object_id.clone(),
encoded_collab_v1: encode_collab.clone(),
collab_type: collab_type.clone(),
override_if_exist: false,
workspace_id: 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 workspace_id = workspace_id_from_client(&c).await;
let object_id = Uuid::new_v4().to_string();
let encode_collab = test_encode_collab_v1(&object_id, "title", "hello world")
.encode_to_bytes()
.unwrap();
c.create_collab(CreateCollabParams {
object_id: object_id.clone(),
encoded_collab_v1: encode_collab,
collab_type: CollabType::Document,
override_if_exist: false,
workspace_id: 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::new(
&object_id,
CollabType::Document,
&workspace_id,
))
.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(CreateCollabParams {
object_id: Uuid::new_v4().to_string(),
encoded_collab_v1: vec![],
collab_type: CollabType::Document,
override_if_exist: false,
workspace_id: workspace_id.clone(),
})
.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 object_id = Uuid::new_v4().to_string();
let encode_collab = test_encode_collab_v1(&object_id, "title", "hello world")
.encode_to_bytes()
.unwrap();
let error = c
.create_collab(CreateCollabParams {
object_id,
encoded_collab_v1: encode_collab,
collab_type: CollabType::Document,
override_if_exist: false,
workspace_id: workspace_id.clone(),
})
.await
.unwrap_err();
assert_eq!(error.code, ErrorCode::NotEnoughPermissions);
}