mirror of
				https://github.com/AppFlowy-IO/AppFlowy.git
				synced 2025-11-04 03:54:44 +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;
 | 
						|
}
 |