From eb73a310149ba7714a69da1175af087f748509e1 Mon Sep 17 00:00:00 2001 From: Jeff Baskin Date: Thu, 28 Aug 2025 13:18:18 -0400 Subject: [PATCH] Finished getting update running. --- src/message.rs | 88 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 87 insertions(+), 1 deletion(-) diff --git a/src/message.rs b/src/message.rs index 38fb7cf..ae75c44 100644 --- a/src/message.rs +++ b/src/message.rs @@ -1108,12 +1108,50 @@ impl FieldSetting { fn get_default(&self) -> &DefaultSetting { &self.default_setting } + + fn check(&self, value: &Field) -> Result { + let output = value.clone(); + let vft: FieldType = value.into(); + if vft != self.fieldtype { + return Err(MTTError::DocumentFieldWrongDataType( + self.fieldtype.clone(), + vft, + )); + } + Ok(output) + } } #[cfg(test)] mod fieldsettings { use super::*; + #[test] + fn checks_field_type() { + let fset = FieldSetting::new(FieldType::Uuid); + let value: Field = Uuid::new_v4().into(); + match fset.check(&value) { + Ok(data) => assert_eq!(data, value), + Err(err) => unreachable!("got {:?}: should have gotten a value", err), + } + } + + #[test] + fn checks_for_bad_field_type() { + let fset = FieldSetting::new(FieldType::Uuid); + let value: Field = "text".into(); + match fset.check(&value) { + Ok(data) => unreachable!("got {:?}: should have gotten an error", data), + Err(err) => match err { + MTTError::DocumentFieldWrongDataType(expected, got) => { + assert_eq!(expected, FieldType::Uuid); + assert_eq!(got, FieldType::StaticString); + } + _ => unreachable!("got {:?}: should have gotten a value", err), + }, + } + } + #[test] fn can_field_type_be_assigned() { let ftypes = [FieldType::StaticString, FieldType::Uuid]; @@ -1781,7 +1819,13 @@ impl DocumentFile { for oid in oids.iter() { let doc = self.docs.get_mut(oid).unwrap(); for (key, value) in update.get_values().iter() { - doc.add_field(key.clone(), value.clone()); + match self.docdef.get_field(key) { + Ok(fset) => match fset.check(value) { + Ok(field) => doc.add_field(key.clone(), field.clone()), + Err(err) => return err.into(), + }, + Err(err) => return err.into(), + } } reply.add(doc.clone()); } @@ -2529,6 +2573,38 @@ mod document_files { queue.send(msg).unwrap(); rx.recv_timeout(TIMEOUT).unwrap(); let mut update = Update::new(); + update + .get_query_mut() + .add_specifier("field0".to_string(), Operand::Equal, id.clone()); + update.get_values_mut().add_field("wrong".to_string(), new); + let msg = Message::new(doc_name.clone(), update); + queue.send(msg).unwrap(); + let result = rx.recv_timeout(TIMEOUT).unwrap(); + let action = result.get_action(); + match action { + MsgAction::Error(err) => match err { + MTTError::DocumentFieldNotFound(data) => assert_eq!(data, "wrong"), + _ => unreachable!("got {:?}: should have gotten an missing field", err), + }, + _ => unreachable!("got {:?}: should have gotten an error", action), + } + } + + #[test] + fn update_errors_on_bad_field_type() { + let (mut docdef, doc_name) = + create_docdef([FieldType::Uuid, FieldType::StaticString].to_vec()); + let (mut queue, rx) = test_doc(doc_name.as_str(), docdef, standard_routes()); + let id = Uuid::new_v4(); + let old = "old"; + let new = Uuid::nil(); + let mut addition = Addition::new(); + addition.add_field("field0".to_string(), id.clone()); + addition.add_field("field1".to_string(), old); + let msg = Message::new(doc_name.clone(), addition); + queue.send(msg).unwrap(); + rx.recv_timeout(TIMEOUT).unwrap(); + let mut update = Update::new(); update .get_query_mut() .add_specifier("field0".to_string(), Operand::Equal, id.clone()); @@ -2537,6 +2613,16 @@ mod document_files { queue.send(msg).unwrap(); let result = rx.recv_timeout(TIMEOUT).unwrap(); let action = result.get_action(); + match action { + MsgAction::Error(err) => match err { + MTTError::DocumentFieldWrongDataType(expected, got) => { + assert_eq!(expected, &FieldType::StaticString); + assert_eq!(got, &FieldType::Uuid); + } + _ => unreachable!("got {:?}: should have gotten an missing field", err), + }, + _ => unreachable!("got {:?}: should have gotten an error", action), + } } }