mirror of
				https://github.com/AppFlowy-IO/AppFlowy.git
				synced 2025-10-31 18:15:09 +00:00 
			
		
		
		
	 171c5634f2
			
		
	
	
		171c5634f2
		
			
		
	
	
	
	
		
			
			* chore: add test * chore: update test * chore: create events * chore: load csv * test: add events * test: clean * chore: fix test * chore: fix test * chore: fix test * chore: fmt --------- Co-authored-by: Mathias Mogensen <mathias@appflowy.io>
		
			
				
	
	
		
			196 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			196 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use std::sync::Arc;
 | |
| 
 | |
| use crate::database::calculations_test::script::DatabaseCalculationTest;
 | |
| use collab_database::fields::Field;
 | |
| use flowy_database2::entities::{CalculationType, FieldType, UpdateCalculationChangesetPB};
 | |
| use lib_infra::box_any::BoxAny;
 | |
| 
 | |
| #[tokio::test]
 | |
| async fn calculations_test() {
 | |
|   let mut test = DatabaseCalculationTest::new().await;
 | |
| 
 | |
|   let expected_sum = 25.00;
 | |
|   let expected_min = 1.00;
 | |
|   let expected_average = 5.00;
 | |
|   let expected_max = 14.00;
 | |
|   let expected_median = 3.00;
 | |
| 
 | |
|   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();
 | |
| 
 | |
|   // Insert Sum calculation and assert its value
 | |
|   test
 | |
|     .insert_calculation(UpdateCalculationChangesetPB {
 | |
|       view_id: view_id.to_owned(),
 | |
|       field_id: field_id.to_owned(),
 | |
|       calculation_id: Some(calculation_id.clone()),
 | |
|       calculation_type: CalculationType::Sum,
 | |
|     })
 | |
|     .await;
 | |
| 
 | |
|   test.assert_calculation_float_value(expected_sum).await;
 | |
| 
 | |
|   // Insert Min calculation and assert its value
 | |
|   test
 | |
|     .insert_calculation(UpdateCalculationChangesetPB {
 | |
|       view_id: view_id.to_owned(),
 | |
|       field_id: field_id.to_owned(),
 | |
|       calculation_id: Some(calculation_id.clone()),
 | |
|       calculation_type: CalculationType::Min,
 | |
|     })
 | |
|     .await;
 | |
| 
 | |
|   test.assert_calculation_float_value(expected_min).await;
 | |
| 
 | |
|   // Insert Average calculation and assert its value
 | |
|   test
 | |
|     .insert_calculation(UpdateCalculationChangesetPB {
 | |
|       view_id: view_id.to_owned(),
 | |
|       field_id: field_id.to_owned(),
 | |
|       calculation_id: Some(calculation_id.clone()),
 | |
|       calculation_type: CalculationType::Average,
 | |
|     })
 | |
|     .await;
 | |
| 
 | |
|   test.assert_calculation_float_value(expected_average).await;
 | |
| 
 | |
|   // Insert Max calculation and assert its value
 | |
|   test
 | |
|     .insert_calculation(UpdateCalculationChangesetPB {
 | |
|       view_id: view_id.to_owned(),
 | |
|       field_id: field_id.to_owned(),
 | |
|       calculation_id: Some(calculation_id.clone()),
 | |
|       calculation_type: CalculationType::Max,
 | |
|     })
 | |
|     .await;
 | |
| 
 | |
|   test.assert_calculation_float_value(expected_max).await;
 | |
| 
 | |
|   // Insert Median calculation and assert its value
 | |
|   test
 | |
|     .insert_calculation(UpdateCalculationChangesetPB {
 | |
|       view_id: view_id.to_owned(),
 | |
|       field_id: field_id.to_owned(),
 | |
|       calculation_id: Some(calculation_id.clone()),
 | |
|       calculation_type: CalculationType::Median,
 | |
|     })
 | |
|     .await;
 | |
| 
 | |
|   test.assert_calculation_float_value(expected_median).await;
 | |
| }
 | |
| 
 | |
| #[tokio::test]
 | |
| async fn calculations_empty_test() {
 | |
|   let mut test = DatabaseCalculationTest::new().await;
 | |
| 
 | |
|   let view_id = &test.view_id();
 | |
|   let text_fields = test
 | |
|     .fields
 | |
|     .clone()
 | |
|     .into_iter()
 | |
|     .filter(|field| field.field_type == FieldType::RichText as i64)
 | |
|     .collect::<Vec<Arc<Field>>>();
 | |
|   let field_id = &text_fields.first().unwrap().id.clone();
 | |
|   let calculation_id = "calc_id".to_owned();
 | |
| 
 | |
|   test
 | |
|     .insert_calculation(UpdateCalculationChangesetPB {
 | |
|       view_id: view_id.clone(),
 | |
|       field_id: field_id.clone(),
 | |
|       calculation_id: Some(calculation_id.clone()),
 | |
|       calculation_type: CalculationType::CountEmpty,
 | |
|     })
 | |
|     .await;
 | |
|   test.assert_calculation_value("1").await;
 | |
| 
 | |
|   // Update the cell with a non-empty value
 | |
|   test
 | |
|     .update_cell(
 | |
|       field_id,
 | |
|       test.rows[1].id.clone(),
 | |
|       BoxAny::new("change".to_string()),
 | |
|     )
 | |
|     .await
 | |
|     .unwrap();
 | |
| 
 | |
|   // sleep for 3 seconds to wait for the calculation to update
 | |
|   tokio::time::sleep(tokio::time::Duration::from_secs(3)).await;
 | |
|   test.assert_calculation_value("0").await;
 | |
| }
 | |
| 
 | |
| #[tokio::test]
 | |
| async fn calculations_non_empty_test() {
 | |
|   let mut test = DatabaseCalculationTest::new().await;
 | |
| 
 | |
|   let view_id = &test.view_id();
 | |
|   let text_fields = test
 | |
|     .fields
 | |
|     .clone()
 | |
|     .into_iter()
 | |
|     .filter(|field| field.field_type == FieldType::RichText as i64)
 | |
|     .collect::<Vec<Arc<Field>>>();
 | |
|   let field_id = &text_fields.first().unwrap().id.clone();
 | |
|   let calculation_id = "calc_id".to_owned();
 | |
| 
 | |
|   test
 | |
|     .insert_calculation(UpdateCalculationChangesetPB {
 | |
|       view_id: view_id.clone(),
 | |
|       field_id: field_id.clone(),
 | |
|       calculation_id: Some(calculation_id.clone()),
 | |
|       calculation_type: CalculationType::CountNonEmpty,
 | |
|     })
 | |
|     .await;
 | |
|   test.assert_calculation_value("6").await;
 | |
| 
 | |
|   // Update the cell with a non-empty value
 | |
|   test
 | |
|     .update_cell(
 | |
|       field_id,
 | |
|       test.rows[1].id.clone(),
 | |
|       BoxAny::new("change".to_string()),
 | |
|     )
 | |
|     .await
 | |
|     .unwrap();
 | |
| 
 | |
|   // sleep for 3 seconds to wait for the calculation to update
 | |
|   tokio::time::sleep(tokio::time::Duration::from_secs(3)).await;
 | |
|   test.assert_calculation_value("7").await;
 | |
| }
 | |
| 
 | |
| #[tokio::test]
 | |
| async fn calculations_count_test() {
 | |
|   let mut test = DatabaseCalculationTest::new().await;
 | |
| 
 | |
|   let view_id = &test.view_id();
 | |
|   let text_fields = test
 | |
|     .fields
 | |
|     .clone()
 | |
|     .into_iter()
 | |
|     .filter(|field| field.field_type == FieldType::RichText as i64)
 | |
|     .collect::<Vec<Arc<Field>>>();
 | |
|   let field_id = &text_fields.first().unwrap().id.clone();
 | |
|   let calculation_id = "calc_id".to_owned();
 | |
| 
 | |
|   test
 | |
|     .insert_calculation(UpdateCalculationChangesetPB {
 | |
|       view_id: view_id.clone(),
 | |
|       field_id: field_id.clone(),
 | |
|       calculation_id: Some(calculation_id.clone()),
 | |
|       calculation_type: CalculationType::Count,
 | |
|     })
 | |
|     .await;
 | |
|   test.assert_calculation_value("7").await;
 | |
|   test.duplicate_row(&test.rows[1].id).await;
 | |
| 
 | |
|   tokio::time::sleep(tokio::time::Duration::from_secs(3)).await;
 | |
|   test.assert_calculation_value("8").await;
 | |
| }
 |