diff --git a/tests/update_test.rs b/tests/update_test.rs new file mode 100644 index 0000000..8b3c681 --- /dev/null +++ b/tests/update_test.rs @@ -0,0 +1,130 @@ +mod support; + +use morethantext::{ + CalcValue, Calculation, Field, FieldType, MoreThanText, Operand, Query, Records, Update, +}; +use std::collections::HashSet; +use support::{setup_range, TestDocument}; +use uuid::Uuid; + +#[test] +fn is_it_possible_to_update_nothing() { + let count = 3; + let outside: i128 = (count + 2).try_into().unwrap(); + let (mut mtt, test_doc) = setup_range(count); + let mut update = Update::new(test_doc.get_doc_name()); + update.add_field(test_doc.get_field_name(0), 20); + let mut calc = Calculation::new(Operand::Equal); + calc.add_value(outside.clone()).unwrap(); + calc.add_value(CalcValue::Existing(FieldType::Integer)) + .unwrap(); + update.get_query_mut().add(test_doc.get_field_name(0), calc); + let result = mtt.records(update).unwrap(); + assert_eq!(result.len(), 0); +} + +#[test] +fn does_it_update_information() { + let mut mtt = MoreThanText::new(); + let test_doc = TestDocument::new(vec![FieldType::Uuid, FieldType::StaticString]); + mtt.create_document(test_doc.get_docdef()); + let field0 = Uuid::new_v4(); + let field1 = "new"; + let mut input: Vec = Vec::new(); + input.push(field0.clone().into()); + input.push("old".into()); + test_doc.populate(&mut mtt, input); + let mut update = Update::new(test_doc.get_doc_name()); + update.add_field(test_doc.get_field_name(1), field1); + let mut calc = Calculation::new(Operand::Equal); + calc.add_value(field0.clone()).unwrap(); + calc.add_value(CalcValue::Existing(FieldType::Uuid)) + .unwrap(); + update.get_query_mut().add(test_doc.get_field_name(0), calc); + let tester = |result: Records| { + assert_eq!(result.len(), 1); + let rec = result.iter().last().unwrap(); + assert_eq!( + rec.get(test_doc.get_field_name(0)).unwrap(), + field0.clone().into() + ); + assert_eq!(rec.get(test_doc.get_field_name(1)).unwrap(), field1.into()); + }; + tester(mtt.records(update).unwrap()); + tester(mtt.records(Query::new(test_doc.get_doc_name())).unwrap()); +} + +#[test] +fn are_the_updates_limited_to_the_queried() { + let count = 3; + let choice = 1; + let changed = 20; + let (mut mtt, test_doc) = setup_range(count); + let mut update = Update::new(test_doc.get_doc_name()); + update.add_field(test_doc.get_field_name(0), changed.clone()); + let mut calc = Calculation::new(Operand::Equal); + calc.add_value(choice.clone()).unwrap(); + calc.add_value(CalcValue::Existing(FieldType::Integer)) + .unwrap(); + update.get_query_mut().add(test_doc.get_field_name(0), calc); + let result = mtt.records(update).unwrap(); + assert_eq!(result.len(), 1); + let rec = result.iter().last().unwrap(); + assert_eq!(rec.get(test_doc.get_field_name(0)).unwrap(), changed.into()); + let mut expected: HashSet = HashSet::new(); + expected.insert(0.into()); + expected.insert(2.into()); + expected.insert(20.into()); + let docs = mtt.records(Query::new(test_doc.get_doc_name())).unwrap(); + for doc_data in docs.iter() { + let id = doc_data.get(test_doc.get_field_name(0)).unwrap(); + expected.remove(&id); + } + assert_eq!( + expected.len(), + 0, + "missed {:?} from docs: {:?}", + expected, + docs + ); +} + +#[test] +fn can_multiple_documents_be_update() { + let count = 3; + let choice = 1; + let (mut mtt, test_doc) = setup_range(count); + let mut add_up = Calculation::new(Operand::Add); + add_up + .add_value(CalcValue::Existing(FieldType::Integer)) + .unwrap(); + add_up.add_value(20); + let mut update = Update::new(test_doc.get_doc_name()); + update.add_field(test_doc.get_field_name(0), add_up); + let mut calc = Calculation::new(Operand::GreaterThanEqual); + calc.add_value(choice.clone()).unwrap(); + calc.add_value(CalcValue::Existing(FieldType::Integer)) + .unwrap(); + update.get_query_mut().add(test_doc.get_field_name(0), calc); + let result = mtt.records(update).unwrap(); + assert_eq!(result.len(), 2); + for rec in result.iter() { + assert!(rec.get(test_doc.get_field_name(0)).unwrap() > 10.into()); + } + let mut expected: HashSet = HashSet::new(); + expected.insert(2.into()); + expected.insert(20.into()); + expected.insert(21.into()); + let docs = mtt.records(Query::new(test_doc.get_doc_name())).unwrap(); + for doc_data in docs.iter() { + let id = doc_data.get(test_doc.get_field_name(0)).unwrap(); + expected.remove(&id); + } + assert_eq!( + expected.len(), + 0, + "missed {:?} from docs: {:?}", + expected, + docs + ); +}