From bdaa4b04c07cd685859e0e6a687e4b91afb7258f Mon Sep 17 00:00:00 2001 From: Mats Rauhala Date: Tue, 6 Oct 2026 13:46:50 +0300 Subject: [PATCH] Test the history --- src/sync.rs | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/sync.rs b/src/sync.rs index 0ff1a71..cb4c6dc 100644 --- a/src/sync.rs +++ b/src/sync.rs @@ -81,6 +81,33 @@ impl ProgressSync { }).await?; Ok(doc) } + + pub async fn get_all_progress(&self, username: &str, document_id: &str) -> Result, SyncError> { + let username = username.to_owned(); + let document_id = document_id.to_owned(); + let docs = self.reader.connection.call(move |conn| -> rusqlite::Result> { + let mut stmt = conn.prepare("select + document_id, progress, percentage, device, device_id, timestamp + from progress + left join users on progress.user_id = users.id + where users.username = :username and progress.document_id = :document_id + order by progress.rowid desc")?; + let x = stmt.query_map(named_params! + { ":username": username, + ":document_id": document_id, + }, |row| { + let document_id : String = row.get(0)?; + let progress : String = row.get(1)?; + let percentage : f32 = row.get(2)?; + let device : String = row.get(3)?; + let device_id : Option = row.get(4)?; + let timestamp : i64 = row.get(5)?; + Ok(Document{ document_id, progress, percentage, device, device_id, timestamp }) + })?.collect::>>()?; + Ok(x) + }).await?; + Ok(docs) + } } #[cfg(test)] @@ -198,4 +225,37 @@ use secrecy::SecretString; assert_eq!(got, Some(doc2)); Ok(()) } + + #[tokio::test] + async fn retains_history() -> anyhow::Result<()> { + let (_t, users, sync) = create_data().await?; + + let username = "foo@example.com"; + let username = users.create_user(username, SecretString::from("password")).await?; + let document_id = "foo".to_string(); + + let doc1 = Document { + document_id: document_id.clone(), + progress: "prog".to_string(), + percentage: 0.5, + device: "kobo".to_string(), + device_id: None, + timestamp: now()?, + }; + let doc2 = Document { + document_id: document_id.clone(), + progress: "prog2".to_string(), + percentage: 0.5, + device: "kobo".to_string(), + device_id: None, + timestamp: now()? + 3, + }; + + sync.set_progress(&username, &doc1).await?; + sync.set_progress(&username, &doc2).await?; + let got = sync.get_all_progress(&username, &document_id).await?; + + assert_eq!(got, vec![doc2, doc1]); + Ok(()) + } }