mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2025-07-08 01:22:57 +00:00

* feat: initial calculation controller * fix: entities * feat: calculations * fix: review comments and support floats * fix: abstract business logic into calculations service * fix: clean calculation entities after merge * feat: react to changes to row/cell/field_type * chore: changes after merging main * feat: handle delete field * test: add grid calculations tests * fix: add validation + format numbers * refactor: get cell number * chore: bump collab * chore: fix clippy * chore: update docs * chore: update docs * chore: fmt * chore: fix flutter * chore: collab rev * fix: cleanup and hover to show * fix: localization * test: add basic rust test * fix: clippy * fix: support updating calculation on duplicate row --------- Co-authored-by: nathan <nathan@appflowy.io>
88 lines
2.5 KiB
Rust
88 lines
2.5 KiB
Rust
use std::sync::Arc;
|
|
|
|
use crate::database::calculations_test::script::{CalculationScript::*, DatabaseCalculationTest};
|
|
|
|
use collab_database::fields::Field;
|
|
use flowy_database2::entities::{CalculationType, FieldType, UpdateCalculationChangesetPB};
|
|
|
|
#[tokio::test]
|
|
async fn calculations_test() {
|
|
let mut test = DatabaseCalculationTest::new().await;
|
|
|
|
let expected_sum = 25.00000;
|
|
let expected_min = 1.00000;
|
|
let expected_average = 5.00000;
|
|
let expected_max = 14.00000;
|
|
let expected_median = 3.00000;
|
|
|
|
let view_id = &test.view_id;
|
|
let number_fields = test
|
|
.fields
|
|
.clone()
|
|
.into_iter()
|
|
.filter(|field| field.field_type == FieldType::Number as i64)
|
|
.collect::<Vec<Arc<Field>>>();
|
|
let field_id = &number_fields.first().unwrap().id;
|
|
|
|
let calculation_id = "calc_id".to_owned();
|
|
let scripts = vec![
|
|
// Insert Sum calculation first time
|
|
InsertCalculation {
|
|
payload: UpdateCalculationChangesetPB {
|
|
view_id: view_id.to_owned(),
|
|
field_id: field_id.to_owned(),
|
|
calculation_id: Some(calculation_id.clone()),
|
|
calculation_type: CalculationType::Sum,
|
|
},
|
|
},
|
|
AssertCalculationValue {
|
|
expected: expected_sum,
|
|
},
|
|
InsertCalculation {
|
|
payload: UpdateCalculationChangesetPB {
|
|
view_id: view_id.to_owned(),
|
|
field_id: field_id.to_owned(),
|
|
calculation_id: Some(calculation_id.clone()),
|
|
calculation_type: CalculationType::Min,
|
|
},
|
|
},
|
|
AssertCalculationValue {
|
|
expected: expected_min,
|
|
},
|
|
InsertCalculation {
|
|
payload: UpdateCalculationChangesetPB {
|
|
view_id: view_id.to_owned(),
|
|
field_id: field_id.to_owned(),
|
|
calculation_id: Some(calculation_id.clone()),
|
|
calculation_type: CalculationType::Average,
|
|
},
|
|
},
|
|
AssertCalculationValue {
|
|
expected: expected_average,
|
|
},
|
|
InsertCalculation {
|
|
payload: UpdateCalculationChangesetPB {
|
|
view_id: view_id.to_owned(),
|
|
field_id: field_id.to_owned(),
|
|
calculation_id: Some(calculation_id.clone()),
|
|
calculation_type: CalculationType::Max,
|
|
},
|
|
},
|
|
AssertCalculationValue {
|
|
expected: expected_max,
|
|
},
|
|
InsertCalculation {
|
|
payload: UpdateCalculationChangesetPB {
|
|
view_id: view_id.to_owned(),
|
|
field_id: field_id.to_owned(),
|
|
calculation_id: Some(calculation_id),
|
|
calculation_type: CalculationType::Median,
|
|
},
|
|
},
|
|
AssertCalculationValue {
|
|
expected: expected_median,
|
|
},
|
|
];
|
|
test.run_scripts(scripts).await;
|
|
}
|