Readded more tests.
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 1s

This commit is contained in:
Jeff Baskin 2025-10-17 14:46:08 -04:00
parent b397cc4239
commit cbcd8ff6e7

View File

@ -3908,16 +3908,19 @@ impl Index {
output
}
fn pull(&self, calc: &Calculation) -> HashSet<Oid> {
fn pull(&self, calc: &Calculation) -> Result<HashSet<Oid>, MTTError> {
let mut output = HashSet::new();
for (key, value) in self.data.iter() {
let mut op = calc.clone();
op.add_value(key.clone());
match op.add_value(key.clone()) {
Ok(_) => {},
Err(err) => return Err(err),
}
if op.calculate() == true.into() {
output = output.union(&value).cloned().collect();
}
}
output
Ok(output)
}
fn remove(&mut self, field: &Field, oid: &Oid) {
@ -3964,9 +3967,7 @@ impl Indexes {
self.data.get(field_id).unwrap()
}
fn pull(&self, field_id: &Uuid, calc: &Calculation) -> HashSet<Oid> {
println!("{:?}", field_id);
println!("{:?}", self.data);
fn pull(&self, field_id: &Uuid, calc: &Calculation) -> Result<HashSet<Oid>, MTTError> {
self.data.get(field_id).unwrap().pull(calc)
}
@ -4343,107 +4344,10 @@ impl DocumentFile {
}
let mut oids: HashSet<Oid> = self.docs.keys().cloned().collect();
for (field_id, calculation) in indexed.iter() {
let holder = self.indexes.pull(field_id, calculation);
oids = oids.intersection(&holder).cloned().collect();
}
for (field_id, calculation) in unindexed.iter() {
for oid in oids.clone().iter() {
let doc = self.docs.get(oid).unwrap();
let mut calc = calculation.clone();
calc.add_value(doc.get(field_id).unwrap().clone());
if calc.calculate() == false.into() {
oids.remove(oid);
}
}
}
Ok(oids)
/*
let query_ids = query.field_ids();
let doc_ids = self.docdef.field_ids();
let index_ids = self.indexes.index_ids();
if !doc_ids.is_superset(&query_ids) {
let missed = query_ids.difference(&doc_ids).last().unwrap();
return Err(MTTError::DocumentFieldNotFound(missed.to_string()));
}
let used_indexed = index_ids
.intersection(&query_ids)
.cloned()
.collect::<HashSet<&String>>();
let used_unindexed = query_ids
.difference(&index_ids)
.cloned()
.collect::<HashSet<&String>>();
let mut oids = HashSet::new();
if used_indexed.is_empty() {
'docs: for (oid, doc) in self.docs.iter() {
for query_id in query_ids.iter() {
let doc_data = doc.get_field(query_id).unwrap();
let mut operation = query.get(query_id).unwrap();
match operation.add_value(doc_data.clone()) {
Ok(_) => {}
Err(err) => match err {
MTTError::DocumentFieldWrongDataType(got, expected) => {
return Err(MTTError::DocumentFieldWrongDataType(expected, got))
}
_ => return Err(err),
},
}
if operation.calculate() == false.into() {
continue 'docs;
}
}
oids.insert(oid.clone());
}
} else {
let mut first_time = true;
for field_id in used_indexed.iter() {
let op = query.get(field_id).unwrap();
let holder = self.indexes.pull(field_id, &op);
if first_time {
oids = holder;
} else {
oids = oids.intersection(&holder).cloned().collect();
}
first_time = false;
}
for field_id in used_unindexed.iter() {
let mut holder: HashSet<Oid> = HashSet::new();
for oid in oids.iter() {
let doc = self.docs.get(oid).unwrap();
let mut op = query.get(field_id).unwrap().clone();
op.add_value(doc.get_field(field_id).unwrap());
if op.calculate() == true.into() {
holder.insert(oid.clone());
}
}
oids = oids.intersection(&holder).cloned().collect();
}
}
Ok(oids)
*/
}
fn query(&self, query: &Query) -> MsgAction {
let mut records = RecordIter::with_names(self.docdef.get_field_names().clone());
let indexed_ids = self.indexes.index_ids();
let mut indexed: HashMap<Uuid, Calculation> = HashMap::new();
let mut unindexed: HashMap<Uuid, Calculation> = HashMap::new();
for (field, data) in query.iter() {
let id = match self.docdef.get_field_id(field) {
Ok(fid) => fid,
Err(err) => return err.into(),
let holder = match self.indexes.pull(field_id, calculation) {
Ok(data) => data,
Err(err) => return Err(err),
};
if indexed_ids.contains(&id) {
indexed.insert(id, data.clone());
} else {
unindexed.insert(id, data.clone());
}
}
let mut oids: HashSet<Oid> = self.docs.keys().cloned().collect();
for (field_id, calculation) in indexed.iter() {
let holder = self.indexes.pull(field_id, calculation);
println!("{:?}", holder);
oids = oids.intersection(&holder).cloned().collect();
}
for (field_id, calculation) in unindexed.iter() {
@ -4452,13 +4356,22 @@ impl DocumentFile {
let mut calc = calculation.clone();
match calc.add_value(doc.get(field_id).unwrap().clone()) {
Ok(_) => {},
Err(err) => return err.into(),
Err(err) => return Err(err),
}
if calc.calculate() == false.into() {
oids.remove(oid);
}
}
}
Ok(oids)
}
fn query(&self, query: &Query) -> MsgAction {
let oids = match self.run_query(query) {
Ok(data) => data,
Err(err) => return err.into(),
};
let mut records = RecordIter::with_names(self.docdef.get_field_names().clone());
for oid in oids.iter() {
records.insert(self.docs.get(oid).unwrap().clone());
}
@ -4466,48 +4379,27 @@ impl DocumentFile {
}
fn update(&mut self, update: &Update) -> MsgAction {
/*
let mut changes: HashMap<Uuid, Field> = HashMap::new();
for (key, value) in update.get_values().iter() {
let (id, field) = match self.validate(key, Some(value.clone())) {
Ok(data) => data,
Err(err) => return err.into(),
};
changes.insert(id, field);
}
let oids = match self.run_query(update.get_query()) {
Ok(result) => result,
Err(err) => return err.into(),
};
let mut holder: HashMap<Oid, [Document; 2]> = HashMap::new();
let mut output = RecordIter::with_names(self.docdef.get_field_names().clone());
for oid in oids.iter() {
let doc = self.docs.get(oid).unwrap();
let old_new = [doc.clone(), doc.clone()];
holder.insert(oid.clone(), old_new);
}
let mut index_holder = self.docdef.create_indexes();
for (oid, docs) in holder.iter_mut() {
let mut updated = Document::new();
for (key, value) in update.get_values().iter() {
match self.validate(&key, Some(value.clone())) {
Ok(field) => {
let id = self.docdef.get_field_id(&key).unwrap();
match index_holder.validate(&id, &field) {
Ok(_) => {
index_holder.add_to_index(&id, field.clone(), oid.clone());
docs[1].add_field(key.clone(), field.clone());
}
Err(err) => return Self::add_field_to_error(key.to_string(), err).into(),
}
}
Err(err) => return err.into(),
}
let rec = self.docs.get_mut(oid).unwrap();
for (field_id, value) in changes.iter() {
rec.insert(field_id.clone(), value.clone());
}
output.insert(rec.clone());
}
let mut reply = Reply::new();
for (oid, docs) in holder.iter() {
self.docs.insert(oid.clone(), docs[1].clone());
reply.add(docs[1].clone());
for (key, value) in docs[0].iter() {
self.remove_from_index(&key, &value, oid);
self.add_to_index(&key, docs[1].get_field(&key).unwrap().clone(), oid.clone());
}
}
reply.into()
*/
Reply::new().into()
output.into()
}
}
@ -5094,25 +4986,55 @@ mod document_files {
}
}
/*
#[test]
fn errors_on_bad_field_type_with_index() {
let mut doc = TestDocument::new([FieldType::Uuid].to_vec());
doc.get_docdef_mut().add_index(&Name::english("field0"), IndexType::Index);
doc.start();
doc.populate([Uuid::nil().into()].to_vec());
let mut calc = Calculation::new(Operand::Equal);
calc.add_value("notUUID");
let mut query = Query::new();
query.add(Name::english("field0"), calc);
doc.send(query).unwrap();
let result = doc.get_receiver().recv_timeout(TIMEOUT).unwrap();
let action = result.get_action();
match action {
MsgAction::Error(data) => match data {
MTTError::DocumentFieldWrongDataType(expected, got) => {
assert_eq!(got, &FieldType::Uuid);
assert_eq!(expected, &FieldType::StaticString);
}
_ => unreachable!("got {:?}: should been field not found", data),
},
_ => unreachable!("got {:?}: should have been a error", action),
}
}
#[test]
fn can_use_default_values() {
let (mut docdef, doc_name) = create_docdef([FieldType::StaticString].to_vec());
let doc_name = Name::english("default");
let mut docdef = DocDef::new(doc_name.clone());
let field_name = Name::english("holder");
docdef.add_field(field_name.clone(), FieldType::StaticString);
let mut calc = Calculation::new(Operand::Assign);
calc.add_value(FieldType::StaticString);
docdef.set_default("field0", calc);
let (queue, rx) = test_doc(doc_name.as_str(), docdef, standard_routes());
docdef.set_default(&field_name, calc);
let mut test_doc: TestDocument = docdef.into();
test_doc.start();
let queue = test_doc.get_queue();
let rx = test_doc.get_receiver();
let new_doc = Addition::new();
let msg = Message::new(doc_name, new_doc);
queue.send(msg).unwrap();
let result = rx.recv_timeout(TIMEOUT).unwrap();
let action = result.get_action();
match action {
MsgAction::Reply(docs) => {
MsgAction::Records(docs) => {
assert_eq!(docs.len(), 1);
for doc in docs.iter() {
for doc in docs.clone() {
let expected: Field = "".into();
assert_eq!(doc.get_field("field0").unwrap(), expected);
assert_eq!(doc.get(&field_name).unwrap(), expected);
}
}
_ => unreachable!("got {:?}: should have gotten a reply", action),
@ -5121,23 +5043,28 @@ mod document_files {
#[test]
fn can_a_default_value_be_set() {
let (mut docdef, doc_name) = create_docdef([FieldType::Uuid].to_vec());
let input = Uuid::nil();
let doc_name = Name::english("assigned");
let mut docdef = DocDef::new(doc_name.clone());
let field_name = Name::english("id");
docdef.add_field(field_name.clone(), FieldType::Uuid);
let mut calc = Calculation::new(Operand::Assign);
calc.add_value(input.clone());
docdef.set_default("field0", calc);
let (queue, rx) = test_doc(doc_name.as_str(), docdef, standard_routes());
calc.add_value(Uuid::nil());
docdef.set_default(&field_name, calc);
let mut test_doc: TestDocument = docdef.into();
test_doc.start();
let queue = test_doc.get_queue();
let rx = test_doc.get_receiver();
let new_doc = Addition::new();
let msg = Message::new(doc_name, new_doc);
queue.send(msg).unwrap();
let result = rx.recv_timeout(TIMEOUT).unwrap();
let action = result.get_action();
match action {
MsgAction::Reply(docs) => {
MsgAction::Records(docs) => {
assert_eq!(docs.len(), 1);
let expected: Field = input.into();
for doc in docs.iter() {
assert_eq!(doc.get_field("field0").unwrap(), expected);
for doc in docs.clone() {
let expected: Field = Uuid::nil().into();
assert_eq!(doc.get(&field_name).unwrap(), expected);
}
}
_ => unreachable!("got {:?}: should have gotten a reply", action),
@ -5146,23 +5073,29 @@ mod document_files {
#[test]
fn can_default_values_be_overridden() {
let (mut docdef, doc_name) = create_docdef([FieldType::Uuid].to_vec());
let doc_name = Name::english("assigned");
let mut docdef = DocDef::new(doc_name.clone());
let field_name = Name::english("id");
docdef.add_field(field_name.clone(), FieldType::Uuid);
let mut calc = Calculation::new(Operand::Assign);
calc.add_value(FieldType::Uuid);
docdef.set_default("field0", calc);
let (queue, rx) = test_doc(doc_name.as_str(), docdef, standard_routes());
docdef.set_default(&field_name, calc);
let mut test_doc: TestDocument = docdef.into();
test_doc.start();
let queue = test_doc.get_queue();
let rx = test_doc.get_receiver();
let mut new_doc = Addition::new();
new_doc.add_field("field0".to_string(), Uuid::nil());
new_doc.add_field(&field_name, Uuid::nil());
let msg = Message::new(doc_name, new_doc);
queue.send(msg).unwrap();
let result = rx.recv_timeout(TIMEOUT).unwrap();
let action = result.get_action();
match action {
MsgAction::Reply(docs) => {
MsgAction::Records(docs) => {
assert_eq!(docs.len(), 1);
let expected: Field = Uuid::nil().into();
for doc in docs.iter() {
assert_eq!(doc.get_field("field0").unwrap(), expected);
for doc in docs.clone() {
let expected: Field = Uuid::nil().into();
assert_eq!(doc.get(&field_name).unwrap(), expected);
}
}
_ => unreachable!("got {:?}: should have gotten a reply", action),
@ -5186,86 +5119,56 @@ mod document_files {
let mut update = Update::new();
let mut calc = Calculation::new(Operand::Equal);
calc.add_value(id);
update.get_query_mut().add("field0".to_string(), calc);
update.get_query_mut().add(Name::english("field0"), calc);
update
.get_values_mut()
.add_field("field0".to_string(), Uuid::nil());
.add_field(Name::english("field0"), Uuid::nil());
doc.send(update).unwrap();
let result = doc.get_receiver().recv_timeout(TIMEOUT).unwrap();
let action = result.get_action();
match action {
MsgAction::Reply(docs) => assert_eq!(docs.len(), 0),
MsgAction::Records(docs) => assert_eq!(docs.len(), 0),
_ => unreachable!("got {:?}: should have gotten a reply", action),
}
}
#[test]
fn only_responses_to_its_update_request() {
let mut doc = TestDocument::new([FieldType::Integer].to_vec());
doc.start();
let alt_doc_name = "alternate";
let (tx, _) = channel();
let mut queue = doc.get_queue();
queue
.register(tx, alt_doc_name.to_string(), Vec::new())
.unwrap();
let update = Update::new();
let msg = Message::new(alt_doc_name, update);
queue.send(msg).unwrap();
match doc.get_receiver().recv_timeout(TIMEOUT) {
Ok(msg) => unreachable!("should not receive: {:?}", msg),
Err(err) => match err {
RecvTimeoutError::Timeout => {}
_ => unreachable!("should have timed out"),
},
}
}
#[test]
fn changes_information_requested() {
let mut doc = TestDocument::new([FieldType::Uuid, FieldType::StaticString].to_vec());
doc.start();
let id = Uuid::new_v4();
let doc_name = doc.get_docdef().get_document_name().clone();
let old = "old";
let new = "new";
let id = Uuid::new_v4();
doc.populate([id.into(), old.into()].to_vec());
let mut update = Update::new();
let mut calc = Calculation::new(Operand::Equal);
calc.add_value(id.clone());
update
.get_query_mut()
.add("field0".to_string(), calc.clone());
update.get_values_mut().add_field("field1".to_string(), new);
doc.send(update).unwrap();
let mut results: HashMap<String, Message> = HashMap::new();
results.insert(
"update".to_string(),
doc.get_receiver().recv_timeout(TIMEOUT).unwrap(),
);
let mut query = Query::new();
query.add("field0".to_string(), calc.clone());
doc.send(query).unwrap();
results.insert(
"query".to_string(),
doc.get_receiver().recv_timeout(TIMEOUT).unwrap(),
);
let expected_id: Field = id.into();
let output: Field = new.into();
for (key, result) in results.iter() {
.add(Name::english("field0"), calc);
update.get_values_mut().add_field(Name::english("field1"), new);
let mut testing = |msg: Message| {
doc.get_queue().send(msg.clone()).unwrap();
let result = doc.get_receiver().recv_timeout(TIMEOUT).unwrap();
assert_eq!(result.get_message_id(), msg.get_message_id());
let action = result.get_action();
match action {
MsgAction::Reply(docs) => {
assert_eq!(docs.len(), 1, "{}", key);
for doc in docs.iter() {
assert_eq!(doc.get_field("field0").unwrap(), expected_id, "{}", key);
assert_eq!(doc.get_field("field1").unwrap(), output, "{}", key);
MsgAction::Records(docs) => {
assert_eq!(docs.len(), 1, "should have one entry");
for doc in docs.clone() {
assert_eq!(doc.get(Name::english("field0")).unwrap(), id.into());
assert_eq!(doc.get(Name::english("field1")).unwrap(), new.into());
}
}
_ => unreachable!("got {:?}: should have gotten a reply", action),
}
}
};
testing(Message::new(doc_name.clone(), update));
testing(Message::new(doc_name.clone(), Query::new()));
}
/*
#[test]
fn changes_only_the_queried() {
let mut doc = TestDocument::new([FieldType::Uuid, FieldType::StaticString].to_vec());