#![cfg(feature = "server-local")]
use taskchampion::chrono::{TimeZone, Utc};
use taskchampion::storage::inmemory::InMemoryStorage;
use taskchampion::{Operations, Replica, ServerConfig, Status, Uuid};
use tempfile::TempDir;
#[tokio::test]
async fn update_and_delete_sync_delete_first() -> anyhow::Result<()> {
update_and_delete_sync(true).await
}
#[tokio::test]
async fn update_and_delete_sync_update_first() -> anyhow::Result<()> {
update_and_delete_sync(false).await
}
async fn update_and_delete_sync(delete_first: bool) -> anyhow::Result<()> {
let mut rep1 = Replica::new(InMemoryStorage::new());
let mut rep2 = Replica::new(InMemoryStorage::new());
let tmp_dir = TempDir::new().expect("TempDir failed");
let mut server = ServerConfig::Local {
server_dir: tmp_dir.path().to_path_buf(),
}
.into_server()
.await?;
let mut ops = Operations::new();
let u = Uuid::new_v4();
let mut t = rep1.create_task(u, &mut ops).await?;
t.set_description("test task".into(), &mut ops)?;
t.set_status(Status::Pending, &mut ops)?;
t.set_entry(Some(Utc::now()), &mut ops)?;
rep1.commit_operations(ops).await?;
rep1.sync(&mut server, false).await?;
rep2.sync(&mut server, false).await?;
{
let mut ops = Operations::new();
let mut t = rep2.get_task(u).await?.unwrap();
t.set_status(Status::Deleted, &mut ops)?;
t.set_modified(Utc.with_ymd_and_hms(1980, 1, 1, 0, 0, 0).unwrap(), &mut ops)?;
rep2.commit_operations(ops).await?;
}
rep2.sync(&mut server, false).await?;
rep1.sync(&mut server, false).await?;
rep1.expire_tasks().await?;
assert!(rep1.get_task(u).await?.is_none());
{
let mut ops = Operations::new();
let mut t = rep2.get_task(u).await?.unwrap();
t.set_description("modified".to_string(), &mut ops)?;
rep2.commit_operations(ops).await?;
}
if delete_first {
rep1.sync(&mut server, false).await?;
}
rep2.sync(&mut server, false).await?;
rep1.sync(&mut server, false).await?;
if !delete_first {
rep2.sync(&mut server, false).await?;
}
assert!(rep1.get_task(u).await?.is_none());
assert!(rep2.get_task(u).await?.is_none());
Ok(())
}