From 247712f10fa1f581e02142a7f9722203b2b43ef2 Mon Sep 17 00:00:00 2001 From: Jeff Baskin Date: Wed, 26 Nov 2025 20:20:43 -0500 Subject: [PATCH] Generates the on_blank messages. --- src/message.rs | 172 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 168 insertions(+), 4 deletions(-) diff --git a/src/message.rs b/src/message.rs index 8adef79..ec58198 100644 --- a/src/message.rs +++ b/src/message.rs @@ -48,7 +48,10 @@ enum Action { Create, Delete, Error, + OnAddition, + OnDelete, OnQuery, + OnUpdate, Query, Records, Register, @@ -64,7 +67,10 @@ impl From for Action { MsgAction::Create(_) => Action::Create, MsgAction::Delete(_) => Action::Delete, MsgAction::Error(_) => Action::Error, + MsgAction::OnAddition(_) => Action::OnAddition, + MsgAction::OnDelete(_) => Action::OnDelete, MsgAction::OnQuery(_) => Action::OnQuery, + MsgAction::OnUpdate(_) => Action::OnUpdate, MsgAction::Query(_) => Action::Query, MsgAction::Records(_) => Action::Records, MsgAction::Register(_) => Action::Register, @@ -129,7 +135,10 @@ enum MsgAction { // Alter // Remove Error(MTTError), + OnAddition(Records), + OnDelete(Records), OnQuery(Records), + OnUpdate(Records), Query(Query), Records(Records), Register(Register), @@ -4584,8 +4593,10 @@ impl DocumentFile { self.docs.insert(oid.clone(), holder.clone()); records.insert(oid, holder); } - let reply = msg.response(records); - self.queue.send(reply).unwrap(); + self.queue.send(msg.response(records.clone())).unwrap(); + self.queue + .send(msg.response(MsgAction::OnAddition(records))) + .unwrap(); } fn delete(&mut self, msg: &Message) { @@ -4608,7 +4619,10 @@ impl DocumentFile { self.docs.remove(oid); } let rec = Records::with_data(self.docdef.get_field_names().clone(), records); - self.queue.send(msg.response(rec)).unwrap(); + self.queue.send(msg.response(rec.clone())).unwrap(); + self.queue + .send(msg.response(MsgAction::OnDelete(rec))) + .unwrap(); } fn run_query(&self, query: &Query) -> Result { @@ -4742,7 +4756,10 @@ impl DocumentFile { self.docs.insert(oid.clone(), new_rec.clone()); } let recs = Records::with_data(self.docdef.get_field_names().clone(), updates); - self.queue.send(msg.response(recs)).unwrap(); + self.queue.send(msg.response(recs.clone())).unwrap(); + self.queue + .send(msg.response(MsgAction::OnUpdate(recs))) + .unwrap(); } } @@ -5038,6 +5055,153 @@ mod document_files { } } + #[test] + fn send_on_addition_message() { + let data: Field = Uuid::new_v4().into(); + let field_name = Name::english("field0"); + let mut test_doc = TestDocument::new([FieldType::Uuid].to_vec()); + let doc_name = test_doc.get_docdef().get_document_names()[0].clone(); + let queue = test_doc.get_queue(); + let routes = vec![Path::new( + Include::All, + Include::All, + Include::Some(Action::OnAddition), + )]; + test_doc.start(routes); + let name_id: NameType = test_doc.get_name_id().into(); + let mut add = Addition::new(); + add.add_field(field_name.clone(), data.clone()); + let msg = Message::new(doc_name.clone(), add); + queue.send(msg.clone()).unwrap(); + let result = test_doc.get_receiver().recv_timeout(TIMEOUT).unwrap(); + assert_eq!( + result.get_message_id(), + msg.get_message_id(), + "message ids should match" + ); + assert_eq!( + result.get_document_id(), + &name_id, + "document name ids should match" + ); + match result.get_action() { + MsgAction::OnAddition(output) => { + assert_eq!(output.len(), 1, "wrong number of entries: got {:?}", output); + for rec in output.iter() { + assert_eq!(rec.get(Name::english("field0")).unwrap(), data); + } + } + _ => unreachable!("should never get here"), + } + } + + #[test] + fn sends_on_delete_message() { + let count = 5; + let mut data: HashSet = HashSet::new(); + while data.len() < count { + let field: Field = Uuid::new_v4().into(); + data.insert(field); + } + let mut test_doc = TestDocument::new([FieldType::Uuid].to_vec()); + let doc_name = test_doc.get_docdef().get_document_names()[0].clone(); + let queue = test_doc.get_queue(); + let routes = [Path::new( + Include::All, + Include::All, + Include::Some(Action::OnDelete), + )] + .to_vec(); + test_doc.start(routes); + let name_id: NameType = test_doc.get_name_id().into(); + for item in data.iter() { + test_doc.populate([item.clone()].to_vec()); + } + let msg = Message::new(doc_name.clone(), Delete::new(Query::new())); + queue.send(msg.clone()).unwrap(); + let result = test_doc.get_receiver().recv_timeout(TIMEOUT).unwrap(); + assert_eq!( + result.get_message_id(), + msg.get_message_id(), + "message ids should match" + ); + assert_eq!( + result.get_document_id(), + &name_id, + "document name ids should match" + ); + match result.get_action() { + MsgAction::OnDelete(output) => { + assert_eq!( + output.len(), + count, + "wrong number of entries: got {:?}", + output + ); + for rec in output.iter() { + assert!(data.contains(&rec.get(Name::english("field0")).unwrap())); + } + } + _ => unreachable!("should never get here"), + } + } + + #[test] + fn sends_on_update_message() { + let count = 5; + let field_name = Name::english("field0"); + let mut data: HashSet = HashSet::new(); + while data.len() < count { + let field: Field = Uuid::new_v4().into(); + data.insert(field); + } + let mut test_doc = TestDocument::new([FieldType::Uuid].to_vec()); + let doc_name = test_doc.get_docdef().get_document_names()[0].clone(); + let queue = test_doc.get_queue(); + let routes = [Path::new( + Include::All, + Include::All, + Include::Some(Action::OnUpdate), + )] + .to_vec(); + test_doc.start(routes); + let name_id: NameType = test_doc.get_name_id().into(); + for item in data.iter() { + test_doc.populate([item.clone()].to_vec()); + } + let mut update = Update::new(Query::new()); + update + .get_values_mut() + .add_field(field_name.clone(), Uuid::nil()); + let msg = Message::new(doc_name.clone(), update); + queue.send(msg.clone()).unwrap(); + let result = test_doc.get_receiver().recv_timeout(TIMEOUT).unwrap(); + assert_eq!( + result.get_message_id(), + msg.get_message_id(), + "message ids should match" + ); + assert_eq!( + result.get_document_id(), + &name_id, + "document name ids should match" + ); + match result.get_action() { + MsgAction::OnUpdate(output) => { + assert_eq!( + output.len(), + count, + "wrong number of entries: got {:?}", + output + ); + for rec in output.iter() { + assert_eq!(rec.get(&field_name).unwrap(), Uuid::nil().into()); + } + } + _ => unreachable!("should never get here"), + } + } + #[test] fn can_document_be_added() { let doc_name = Name::english("document");