modularize app and database internals
- Extract editor, form, export, and schema modules - Add database workflow integration tests
This commit is contained in:
70
tests/database_workflows.rs
Normal file
70
tests/database_workflows.rs
Normal file
@@ -0,0 +1,70 @@
|
||||
use rogue_agenda::{
|
||||
Database,
|
||||
model::{ItemChanges, ViewKind},
|
||||
};
|
||||
use tempfile::tempdir;
|
||||
|
||||
fn all_items(database: &Database) -> rogue_agenda::model::ViewDef {
|
||||
database
|
||||
.views()
|
||||
.unwrap()
|
||||
.into_iter()
|
||||
.find(|view| view.kind == ViewKind::List)
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn completing_a_recurring_item_preserves_wall_time() {
|
||||
let directory = tempdir().unwrap();
|
||||
let path = directory.path().join("recurring.agnd");
|
||||
let mut database = Database::open(&path).unwrap();
|
||||
let item = database.add_item("Weekly review").unwrap();
|
||||
database
|
||||
.update_item(
|
||||
item,
|
||||
&ItemChanges {
|
||||
when_at: Some(Some("2026-09-01T14:30:00+00:00".into())),
|
||||
recurrence: Some("weekly".into()),
|
||||
..ItemChanges::default()
|
||||
},
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
database.toggle_done(&[item]).unwrap();
|
||||
|
||||
let items = database.items(&all_items(&database), "").unwrap();
|
||||
let next = items.iter().find(|candidate| candidate.id != item).unwrap();
|
||||
assert!(
|
||||
next.when_at
|
||||
.as_deref()
|
||||
.unwrap()
|
||||
.contains("2026-09-08T14:30:00")
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn completed_recurring_ical_roundtrip_does_not_create_a_duplicate() {
|
||||
let directory = tempdir().unwrap();
|
||||
let source_path = directory.path().join("source.agnd");
|
||||
let mut source = Database::open(&source_path).unwrap();
|
||||
let item = source.add_item("Prepare launch").unwrap();
|
||||
source
|
||||
.update_item(
|
||||
item,
|
||||
&ItemChanges {
|
||||
when_at: Some(Some("2026-09-01T14:30:00+00:00".into())),
|
||||
recurrence: Some("every 2 weeks".into()),
|
||||
..ItemChanges::default()
|
||||
},
|
||||
)
|
||||
.unwrap();
|
||||
source.toggle_done(&[item]).unwrap();
|
||||
|
||||
let export_path = directory.path().join("tasks.ics");
|
||||
source.export("ics", &export_path, None).unwrap();
|
||||
|
||||
let target_path = directory.path().join("target.agnd");
|
||||
let mut target = Database::open(&target_path).unwrap();
|
||||
assert_eq!(target.import_path(&export_path).unwrap(), 2);
|
||||
assert_eq!(target.items(&all_items(&target), "").unwrap().len(), 2);
|
||||
}
|
||||
Reference in New Issue
Block a user