Fix: Dont overwrite equal drafts (#6212)

This PR prevents overwriting drafts when the text and file are the same.

close #6211

---------

Co-authored-by: l <link2xt@testrun.org>
This commit is contained in:
Sebastian Klähn
2024-11-17 09:54:50 +01:00
committed by GitHub
parent 60163cb121
commit 399716a761

View File

@@ -922,24 +922,27 @@ impl ChatId {
&& old_draft.chat_id == self && old_draft.chat_id == self
&& old_draft.state == MessageState::OutDraft && old_draft.state == MessageState::OutDraft
{ {
context let affected_rows = context
.sql .sql.execute(
.execute( "UPDATE msgs
"UPDATE msgs SET timestamp=?1,type=?2,txt=?3,txt_normalized=?4,param=?5,mime_in_reply_to=?6
SET timestamp=?,type=?,txt=?,txt_normalized=?,param=?,mime_in_reply_to=? WHERE id=?7
WHERE id=?;", AND (type <> ?2
( OR txt <> ?3
time(), OR txt_normalized <> ?4
msg.viewtype, OR param <> ?5
&msg.text, OR mime_in_reply_to <> ?6);",
message::normalize_text(&msg.text), (
msg.param.to_string(), time(),
msg.in_reply_to.as_deref().unwrap_or_default(), msg.viewtype,
msg.id, &msg.text,
), message::normalize_text(&msg.text),
) msg.param.to_string(),
.await?; msg.in_reply_to.as_deref().unwrap_or_default(),
return Ok(true); msg.id,
),
).await?;
return Ok(affected_rows > 0);
} }
} }
} }
@@ -7696,4 +7699,19 @@ mod tests {
Ok(()) Ok(())
} }
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn test_do_not_overwrite_draft() -> Result<()> {
let mut tcm = TestContextManager::new();
let alice = tcm.alice().await;
let mut msg = Message::new_text("This is a draft message".to_string());
let self_chat = alice.get_self_chat().await.id;
self_chat.set_draft(&alice, Some(&mut msg)).await.unwrap();
let draft1 = self_chat.get_draft(&alice).await?.unwrap();
SystemTime::shift(Duration::from_secs(1));
self_chat.set_draft(&alice, Some(&mut msg)).await.unwrap();
let draft2 = self_chat.get_draft(&alice).await?.unwrap();
assert_eq!(draft1.timestamp_sort, draft2.timestamp_sort);
Ok(())
}
} }