use chrono::{DateTime, Utc}; use morethantext::{ action::{CalcValue, Calculation, Field, FieldType, Operand, Query, Record}, MTTError, MoreThanText, Name, }; use std::time::Duration; use uuid::Uuid; fn get_session(mtt: &mut MoreThanText, id: &Uuid) -> Result { let doc_name = Name::english("session"); let mut qry = Query::new(doc_name); let mut calc = Calculation::new(Operand::Equal); calc.add_value(CalcValue::Existing(FieldType::Uuid)) .unwrap(); calc.add_value(id.clone()).unwrap(); qry.add(Name::english("id"), calc.clone()); match mtt.records(qry) { Ok(data) => Ok(data.iter().last().unwrap()), Err(err) => Err(err), } } #[test] fn are_session_ids_unique() { let mut mtt = MoreThanText::new(); let count = 10; let mut result: Vec = Vec::new(); for _ in 0..count { let id = mtt.validate_session(None); assert!(!result.contains(&id), "found {} in {:?}", id, result); result.push(id); } } #[test] fn bad_session_id_returns_new_id() { let mut mtt = MoreThanText::new(); let id1 = mtt.validate_session(Some("stuff".to_string())); let id2 = mtt.validate_session(Some("stuff".to_string())); assert_ne!(id1, id2); } #[test] fn creates_new_session_if_bad_or_expired() { let mut mtt = MoreThanText::new(); let id1 = mtt.validate_session(Some(Uuid::nil().to_string())); let id2 = mtt.validate_session(Some(Uuid::nil().to_string())); assert_ne!(id1, id2); } #[test] fn returns_same_session_id_when_valid() { let mut mtt = MoreThanText::new(); let id = mtt.validate_session(None); let result = mtt.validate_session(Some(id.to_string())); assert_eq!(result, id); } #[test] fn is_expiration_date_set_in_the_future() { let mut mtt = MoreThanText::new(); let start_time = Utc::now() + Duration::from_hours(1); let id = mtt.validate_session(None); let end_time = Utc::now() + Duration::from_hours(1); let rec = get_session(&mut mtt, &id).unwrap(); let holder = rec.get(Name::english("expire")).unwrap(); match holder { Field::DateTime(data) => { assert!(data > start_time, "expire should be after {:?}", start_time); assert!(data < end_time, "expire should be before {:?}", end_time); } _ => unreachable!("got {:?} should have been date time", holder), }; }