mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
test: grid switch from number to text test (#1615)
* test: grid switch from number to text test * chore: update test * chore: fix tests * chore: cargo fmt Co-authored-by: nathan <nathan@appflowy.io>
This commit is contained in:
parent
05f99ee4a4
commit
b83b18274f
@ -137,16 +137,25 @@ pub fn try_decode_cell_str(
|
|||||||
/// If the cell data of the `FieldType` doesn't support displaying in String then will return an
|
/// If the cell data of the `FieldType` doesn't support displaying in String then will return an
|
||||||
/// empty string. For example, The string of the Multi-Select cell will be a list of the option's name
|
/// empty string. For example, The string of the Multi-Select cell will be a list of the option's name
|
||||||
/// separated by a comma.
|
/// separated by a comma.
|
||||||
|
///
|
||||||
|
/// # Arguments
|
||||||
|
///
|
||||||
|
/// * `cell_str`: the opaque cell string that can be decoded by corresponding structs that implement the
|
||||||
|
/// `FromCellString` trait.
|
||||||
|
/// * `decoded_field_type`: the field_type of the cell_str
|
||||||
|
/// * `field_type`: use this field type's `TypeOption` to stringify this cell_str
|
||||||
|
/// * `field_rev`: used to get the corresponding TypeOption for the specified field type.
|
||||||
|
///
|
||||||
|
/// returns: String
|
||||||
pub fn stringify_cell_data(
|
pub fn stringify_cell_data(
|
||||||
cell_str: String,
|
cell_str: String,
|
||||||
from_field_type: &FieldType,
|
decoded_field_type: &FieldType,
|
||||||
to_field_type: &FieldType,
|
field_type: &FieldType,
|
||||||
field_rev: &FieldRevision,
|
field_rev: &FieldRevision,
|
||||||
) -> String {
|
) -> String {
|
||||||
match TypeOptionCellExt::new_with_cell_data_cache(field_rev, None).get_type_option_cell_data_handler(to_field_type)
|
match TypeOptionCellExt::new_with_cell_data_cache(field_rev, None).get_type_option_cell_data_handler(field_type) {
|
||||||
{
|
|
||||||
None => "".to_string(),
|
None => "".to_string(),
|
||||||
Some(handler) => handler.stringify_cell_str(cell_str, from_field_type, field_rev),
|
Some(handler) => handler.stringify_cell_str(cell_str, decoded_field_type, field_rev),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,8 +7,8 @@ use crate::services::cell::{
|
|||||||
|
|
||||||
use crate::services::field::selection_type_option::type_option_transform::SelectOptionTypeOptionTransformHelper;
|
use crate::services::field::selection_type_option::type_option_transform::SelectOptionTypeOptionTransformHelper;
|
||||||
use crate::services::field::{
|
use crate::services::field::{
|
||||||
CheckboxCellData, ChecklistTypeOptionPB, MultiSelectTypeOptionPB, SingleSelectTypeOptionPB, TypeOption,
|
CheckboxCellData, ChecklistTypeOptionPB, MultiSelectTypeOptionPB, SingleSelectTypeOptionPB, StrCellData,
|
||||||
TypeOptionCellData, TypeOptionTransform,
|
TypeOption, TypeOptionCellData, TypeOptionTransform,
|
||||||
};
|
};
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use flowy_derive::{ProtoBuf, ProtoBuf_Enum};
|
use flowy_derive::{ProtoBuf, ProtoBuf_Enum};
|
||||||
@ -152,10 +152,10 @@ where
|
|||||||
fn transform_type_option_cell_str(
|
fn transform_type_option_cell_str(
|
||||||
&self,
|
&self,
|
||||||
cell_str: &str,
|
cell_str: &str,
|
||||||
_decoded_field_type: &FieldType,
|
decoded_field_type: &FieldType,
|
||||||
_field_rev: &FieldRevision,
|
_field_rev: &FieldRevision,
|
||||||
) -> Option<<Self as TypeOption>::CellData> {
|
) -> Option<<Self as TypeOption>::CellData> {
|
||||||
match _decoded_field_type {
|
match decoded_field_type {
|
||||||
FieldType::SingleSelect | FieldType::MultiSelect | FieldType::Checklist => None,
|
FieldType::SingleSelect | FieldType::MultiSelect | FieldType::Checklist => None,
|
||||||
FieldType::Checkbox => match CheckboxCellData::from_cell_str(cell_str) {
|
FieldType::Checkbox => match CheckboxCellData::from_cell_str(cell_str) {
|
||||||
Ok(checkbox_cell_data) => {
|
Ok(checkbox_cell_data) => {
|
||||||
@ -169,6 +169,7 @@ where
|
|||||||
}
|
}
|
||||||
Err(_) => None,
|
Err(_) => None,
|
||||||
},
|
},
|
||||||
|
FieldType::RichText => SelectOptionIds::from_cell_str(cell_str).ok(),
|
||||||
_ => Some(SelectOptionIds::from(vec![])),
|
_ => Some(SelectOptionIds::from(vec![])),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,24 +1,20 @@
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use crate::entities::FieldType;
|
use crate::entities::FieldType;
|
||||||
|
use crate::services::cell::stringify_cell_data;
|
||||||
use crate::services::cell::CellDataDecoder;
|
use crate::services::cell::CellDataDecoder;
|
||||||
use crate::services::field::FieldBuilder;
|
use crate::services::field::FieldBuilder;
|
||||||
|
|
||||||
use crate::services::field::*;
|
use crate::services::field::*;
|
||||||
|
|
||||||
// Test parser the cell data which field's type is FieldType::Date to cell data
|
// Test parser the cell data which field's type is FieldType::Date to cell data
|
||||||
// which field's type is FieldType::Text
|
// which field's type is FieldType::Text
|
||||||
#[test]
|
#[test]
|
||||||
fn date_type_to_text_type() {
|
fn date_type_to_text_type() {
|
||||||
let type_option = RichTextTypeOptionPB::default();
|
|
||||||
let field_type = FieldType::DateTime;
|
let field_type = FieldType::DateTime;
|
||||||
let field_rev = FieldBuilder::from_field_type(&field_type).build();
|
let field_rev = FieldBuilder::from_field_type(&field_type).build();
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
type_option
|
stringify_cell_data(1647251762.to_string(), &FieldType::RichText, &field_type, &field_rev),
|
||||||
.decode_cell_str(1647251762.to_string(), &field_type, &field_rev)
|
|
||||||
.unwrap()
|
|
||||||
.as_str(),
|
|
||||||
"Mar 14,2022"
|
"Mar 14,2022"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -27,8 +23,6 @@ mod tests {
|
|||||||
// which field's type is FieldType::Text
|
// which field's type is FieldType::Text
|
||||||
#[test]
|
#[test]
|
||||||
fn single_select_to_text_type() {
|
fn single_select_to_text_type() {
|
||||||
let type_option = RichTextTypeOptionPB::default();
|
|
||||||
|
|
||||||
let field_type = FieldType::SingleSelect;
|
let field_type = FieldType::SingleSelect;
|
||||||
let done_option = SelectOptionPB::new("Done");
|
let done_option = SelectOptionPB::new("Done");
|
||||||
let option_id = done_option.id.clone();
|
let option_id = done_option.id.clone();
|
||||||
@ -36,10 +30,7 @@ mod tests {
|
|||||||
let field_rev = FieldBuilder::new(single_select).build();
|
let field_rev = FieldBuilder::new(single_select).build();
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
type_option
|
stringify_cell_data(option_id, &FieldType::RichText, &field_type, &field_rev),
|
||||||
.decode_cell_str(option_id, &field_type, &field_rev)
|
|
||||||
.unwrap()
|
|
||||||
.to_string(),
|
|
||||||
done_option.name,
|
done_option.name,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -49,7 +40,6 @@ mod tests {
|
|||||||
*/
|
*/
|
||||||
#[test]
|
#[test]
|
||||||
fn multiselect_to_text_type() {
|
fn multiselect_to_text_type() {
|
||||||
let text_type_option = RichTextTypeOptionPB::default();
|
|
||||||
let field_type = FieldType::MultiSelect;
|
let field_type = FieldType::MultiSelect;
|
||||||
|
|
||||||
let france = SelectOptionPB::new("france");
|
let france = SelectOptionPB::new("france");
|
||||||
@ -65,14 +55,12 @@ mod tests {
|
|||||||
let field_rev = FieldBuilder::new(multi_select).build();
|
let field_rev = FieldBuilder::new(multi_select).build();
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
text_type_option
|
stringify_cell_data(
|
||||||
.decode_cell_str(
|
format!("{},{}", france_option_id, argentina_option_id),
|
||||||
format!("{},{}", france_option_id, argentina_option_id),
|
&FieldType::RichText,
|
||||||
&field_type,
|
&field_type,
|
||||||
&field_rev
|
&field_rev
|
||||||
)
|
),
|
||||||
.unwrap()
|
|
||||||
.to_string(),
|
|
||||||
format!("{},{}", france.name, argentina.name)
|
format!("{},{}", france.name, argentina.name)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,31 @@ impl TypeOption for RichTextTypeOptionPB {
|
|||||||
type CellFilter = TextFilterPB;
|
type CellFilter = TextFilterPB;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TypeOptionTransform for RichTextTypeOptionPB {}
|
impl TypeOptionTransform for RichTextTypeOptionPB {
|
||||||
|
fn transformable(&self) -> bool {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
fn transform_type_option(&mut self, _old_type_option_field_type: FieldType, _old_type_option_data: String) {}
|
||||||
|
|
||||||
|
fn transform_type_option_cell_str(
|
||||||
|
&self,
|
||||||
|
cell_str: &str,
|
||||||
|
decoded_field_type: &FieldType,
|
||||||
|
field_rev: &FieldRevision,
|
||||||
|
) -> Option<<Self as TypeOption>::CellData> {
|
||||||
|
if decoded_field_type.is_date()
|
||||||
|
|| decoded_field_type.is_single_select()
|
||||||
|
|| decoded_field_type.is_multi_select()
|
||||||
|
|| decoded_field_type.is_number()
|
||||||
|
|| decoded_field_type.is_url()
|
||||||
|
{
|
||||||
|
Some(stringify_cell_data(cell_str.to_owned(), decoded_field_type, decoded_field_type, field_rev).into())
|
||||||
|
} else {
|
||||||
|
StrCellData::from_cell_str(&cell_str).ok()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl TypeOptionCellData for RichTextTypeOptionPB {
|
impl TypeOptionCellData for RichTextTypeOptionPB {
|
||||||
fn convert_to_protobuf(&self, cell_data: <Self as TypeOption>::CellData) -> <Self as TypeOption>::CellProtobufType {
|
fn convert_to_protobuf(&self, cell_data: <Self as TypeOption>::CellData) -> <Self as TypeOption>::CellProtobufType {
|
||||||
@ -64,19 +88,10 @@ impl CellDataDecoder for RichTextTypeOptionPB {
|
|||||||
fn decode_cell_str(
|
fn decode_cell_str(
|
||||||
&self,
|
&self,
|
||||||
cell_str: String,
|
cell_str: String,
|
||||||
decoded_field_type: &FieldType,
|
_decoded_field_type: &FieldType,
|
||||||
field_rev: &FieldRevision,
|
_field_rev: &FieldRevision,
|
||||||
) -> FlowyResult<<Self as TypeOption>::CellData> {
|
) -> FlowyResult<<Self as TypeOption>::CellData> {
|
||||||
if decoded_field_type.is_date()
|
StrCellData::from_cell_str(&cell_str)
|
||||||
|| decoded_field_type.is_single_select()
|
|
||||||
|| decoded_field_type.is_multi_select()
|
|
||||||
|| decoded_field_type.is_number()
|
|
||||||
|| decoded_field_type.is_url()
|
|
||||||
{
|
|
||||||
Ok(stringify_cell_data(cell_str, decoded_field_type, decoded_field_type, field_rev).into())
|
|
||||||
} else {
|
|
||||||
StrCellData::from_cell_str(&cell_str)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn decode_cell_data_to_str(&self, cell_data: <Self as TypeOption>::CellData) -> String {
|
fn decode_cell_data_to_str(&self, cell_data: <Self as TypeOption>::CellData) -> String {
|
||||||
|
@ -47,7 +47,8 @@ pub trait TypeOptionCellDataHandler {
|
|||||||
|
|
||||||
/// Decode the cell_str to corresponding cell data, and then return the display string of the
|
/// Decode the cell_str to corresponding cell data, and then return the display string of the
|
||||||
/// cell data.
|
/// cell data.
|
||||||
fn stringify_cell_str(&self, cell_str: String, field_type: &FieldType, field_rev: &FieldRevision) -> String;
|
fn stringify_cell_str(&self, cell_str: String, decoded_field_type: &FieldType, field_rev: &FieldRevision)
|
||||||
|
-> String;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct CellDataCacheKey(u64);
|
struct CellDataCacheKey(u64);
|
||||||
@ -222,9 +223,14 @@ where
|
|||||||
perform_filter().unwrap_or(true)
|
perform_filter().unwrap_or(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn stringify_cell_str(&self, cell_str: String, field_type: &FieldType, field_rev: &FieldRevision) -> String {
|
fn stringify_cell_str(
|
||||||
|
&self,
|
||||||
|
cell_str: String,
|
||||||
|
decoded_field_type: &FieldType,
|
||||||
|
field_rev: &FieldRevision,
|
||||||
|
) -> String {
|
||||||
if self.transformable() {
|
if self.transformable() {
|
||||||
let cell_data = self.transform_type_option_cell_str(&cell_str, field_type, field_rev);
|
let cell_data = self.transform_type_option_cell_str(&cell_str, decoded_field_type, field_rev);
|
||||||
if let Some(cell_data) = cell_data {
|
if let Some(cell_data) = cell_data {
|
||||||
return self.decode_cell_data_to_str(cell_data);
|
return self.decode_cell_data_to_str(cell_data);
|
||||||
}
|
}
|
||||||
|
@ -208,25 +208,25 @@ async fn grid_switch_from_multi_select_to_text_test() {
|
|||||||
|
|
||||||
let mut multi_select_type_option = test.get_multi_select_type_option(&field_rev.id);
|
let mut multi_select_type_option = test.get_multi_select_type_option(&field_rev.id);
|
||||||
|
|
||||||
let script_switchfield = vec![SwitchToField {
|
let script_switch_field = vec![SwitchToField {
|
||||||
field_id: field_rev.id.clone(),
|
field_id: field_rev.id.clone(),
|
||||||
new_field_type: FieldType::RichText,
|
new_field_type: FieldType::RichText,
|
||||||
}];
|
}];
|
||||||
|
|
||||||
test.run_scripts(script_switchfield).await;
|
test.run_scripts(script_switch_field).await;
|
||||||
|
|
||||||
let script_assertfield = vec![AssertCellContent {
|
let script_assert_field = vec![AssertCellContent {
|
||||||
field_id: field_rev.id.clone(),
|
field_id: field_rev.id.clone(),
|
||||||
row_index: 0,
|
row_index: 0,
|
||||||
from_field_type: FieldType::MultiSelect,
|
from_field_type: FieldType::MultiSelect,
|
||||||
expected_content: format!(
|
expected_content: format!(
|
||||||
"{},{}",
|
"{},{}",
|
||||||
multi_select_type_option.get_mut(0).unwrap().id.to_string(),
|
multi_select_type_option.get_mut(0).unwrap().name.to_string(),
|
||||||
multi_select_type_option.get_mut(1).unwrap().id.to_string()
|
multi_select_type_option.get_mut(1).unwrap().name.to_string()
|
||||||
),
|
),
|
||||||
}];
|
}];
|
||||||
|
|
||||||
test.run_scripts(script_assertfield).await;
|
test.run_scripts(script_assert_field).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test when switching the current field from Checkbox to Text test
|
// Test when switching the current field from Checkbox to Text test
|
||||||
@ -276,4 +276,28 @@ async fn grid_switch_from_date_to_text_test() {}
|
|||||||
// input:
|
// input:
|
||||||
// $1 -> "$1"(This string will be different base on current data setting)
|
// $1 -> "$1"(This string will be different base on current data setting)
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn grid_switch_from_number_to_text_test() {}
|
async fn grid_switch_from_number_to_text_test() {
|
||||||
|
let mut test = GridFieldTest::new().await;
|
||||||
|
let field_rev = test.get_first_field_rev(FieldType::Number).clone();
|
||||||
|
|
||||||
|
let scripts = vec![
|
||||||
|
SwitchToField {
|
||||||
|
field_id: field_rev.id.clone(),
|
||||||
|
new_field_type: FieldType::RichText,
|
||||||
|
},
|
||||||
|
AssertCellContent {
|
||||||
|
field_id: field_rev.id.clone(),
|
||||||
|
row_index: 0,
|
||||||
|
from_field_type: FieldType::Number,
|
||||||
|
expected_content: "$1".to_string(),
|
||||||
|
},
|
||||||
|
AssertCellContent {
|
||||||
|
field_id: field_rev.id.clone(),
|
||||||
|
row_index: 4,
|
||||||
|
from_field_type: FieldType::Number,
|
||||||
|
expected_content: "".to_string(),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
test.run_scripts(scripts).await;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user