mirror of
https://github.com/GothenburgBitFactory/taskwarrior.git
synced 2025-06-26 10:54:26 +02:00

The chrono types are central to use of TC, so this will help consumers of the TC crate to avoid dependency conflicts.
72 lines
2.2 KiB
Rust
72 lines
2.2 KiB
Rust
use taskchampion::chrono::{TimeZone, Utc};
|
|
use taskchampion::{Replica, ServerConfig, Status, StorageConfig};
|
|
use tempfile::TempDir;
|
|
|
|
#[test]
|
|
fn update_and_delete_sync_delete_first() -> anyhow::Result<()> {
|
|
update_and_delete_sync(true)
|
|
}
|
|
|
|
#[test]
|
|
fn update_and_delete_sync_update_first() -> anyhow::Result<()> {
|
|
update_and_delete_sync(false)
|
|
}
|
|
|
|
/// Test what happens when an update is sync'd into a repo after a task is deleted.
|
|
/// If delete_first, then the deletion is sync'd to the server first; otherwise
|
|
/// the update is sync'd first. Either way, the task is gone.
|
|
fn update_and_delete_sync(delete_first: bool) -> anyhow::Result<()> {
|
|
// set up two replicas, and demonstrate replication between them
|
|
let mut rep1 = Replica::new(StorageConfig::InMemory.into_storage()?);
|
|
let mut rep2 = Replica::new(StorageConfig::InMemory.into_storage()?);
|
|
|
|
let tmp_dir = TempDir::new().expect("TempDir failed");
|
|
let mut server = ServerConfig::Local {
|
|
server_dir: tmp_dir.path().to_path_buf(),
|
|
}
|
|
.into_server()?;
|
|
|
|
// add a task on rep1, and sync it to rep2
|
|
let t = rep1.new_task(Status::Pending, "test task".into())?;
|
|
let u = t.get_uuid();
|
|
|
|
rep1.sync(&mut server, false)?;
|
|
rep2.sync(&mut server, false)?;
|
|
|
|
// mark the task as deleted, long in the past, on rep2
|
|
{
|
|
let mut t = rep2.get_task(u)?.unwrap().into_mut(&mut rep2);
|
|
t.delete()?;
|
|
t.set_modified(Utc.ymd(1980, 1, 1).and_hms(0, 0, 0))?;
|
|
}
|
|
|
|
// sync it back to rep1
|
|
rep2.sync(&mut server, false)?;
|
|
rep1.sync(&mut server, false)?;
|
|
|
|
// expire the task on rep1 and check that it is gone locally
|
|
rep1.expire_tasks()?;
|
|
assert!(rep1.get_task(u)?.is_none());
|
|
|
|
// modify the task on rep2
|
|
{
|
|
let mut t = rep2.get_task(u)?.unwrap().into_mut(&mut rep2);
|
|
t.set_description("modified".to_string())?;
|
|
}
|
|
|
|
// sync back and forth
|
|
if delete_first {
|
|
rep1.sync(&mut server, false)?;
|
|
}
|
|
rep2.sync(&mut server, false)?;
|
|
rep1.sync(&mut server, false)?;
|
|
if !delete_first {
|
|
rep2.sync(&mut server, false)?;
|
|
}
|
|
|
|
// check that the task is gone on both replicas
|
|
assert!(rep1.get_task(u)?.is_none());
|
|
assert!(rep2.get_task(u)?.is_none());
|
|
|
|
Ok(())
|
|
}
|