mirror of
https://github.com/chatmail/core.git
synced 2026-05-20 23:36:30 +03:00
make chat names always searchable (#3377)
* test contact name changes applied everywhere this test is failing on current master, a changed authname is set to `contact.authname` but not cached at `chat.name`; resulting in `dc_chat_get_name()` returning a name undiscoverable by `dc_get_chatlist(name)`. * fix: update chat.name on contact.authname changes * do read contact.display_name from database only of chat.name is empty * update CHANGELOG
This commit is contained in:
@@ -4,7 +4,10 @@
|
|||||||
|
|
||||||
### Changes
|
### Changes
|
||||||
- refactorings #3373 #3345
|
- refactorings #3373 #3345
|
||||||
|
|
||||||
|
### Fixes
|
||||||
- delete outgoing MDNs found in the Sent folder on Gmail #3372
|
- delete outgoing MDNs found in the Sent folder on Gmail #3372
|
||||||
|
- fix searching one-to-one chats #3377
|
||||||
|
|
||||||
|
|
||||||
## 1.84.0
|
## 1.84.0
|
||||||
|
|||||||
@@ -1041,7 +1041,9 @@ impl Chat {
|
|||||||
if chat.id.is_archived_link() {
|
if chat.id.is_archived_link() {
|
||||||
chat.name = stock_str::archived_chats(context).await;
|
chat.name = stock_str::archived_chats(context).await;
|
||||||
} else {
|
} else {
|
||||||
if chat.typ == Chattype::Single {
|
if chat.typ == Chattype::Single && chat.name.is_empty() {
|
||||||
|
// chat.name is set to contact.display_name on changes,
|
||||||
|
// however, if things went wrong somehow, we do this here explicitly.
|
||||||
let mut chat_name = "Err [Name not found]".to_owned();
|
let mut chat_name = "Err [Name not found]".to_owned();
|
||||||
match get_chat_contacts(context, chat.id).await {
|
match get_chat_contacts(context, chat.id).await {
|
||||||
Ok(contacts) => {
|
Ok(contacts) => {
|
||||||
|
|||||||
117
src/contact.rs
117
src/contact.rs
@@ -562,7 +562,7 @@ impl Contact {
|
|||||||
.await
|
.await
|
||||||
.ok();
|
.ok();
|
||||||
|
|
||||||
if update_name {
|
if update_name || update_authname {
|
||||||
// Update the contact name also if it is used as a group name.
|
// Update the contact name also if it is used as a group name.
|
||||||
// This is one of the few duplicated data, however, getting the chat list is easier this way.
|
// This is one of the few duplicated data, however, getting the chat list is easier this way.
|
||||||
let chat_id: Option<i32> = context.sql.query_get_value(
|
let chat_id: Option<i32> = context.sql.query_get_value(
|
||||||
@@ -1443,7 +1443,8 @@ mod tests {
|
|||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
use crate::chat::send_text_msg;
|
use crate::chat::{get_chat_contacts, send_text_msg, Chat};
|
||||||
|
use crate::chatlist::Chatlist;
|
||||||
use crate::dc_receive_imf::dc_receive_imf;
|
use crate::dc_receive_imf::dc_receive_imf;
|
||||||
use crate::message::Message;
|
use crate::message::Message;
|
||||||
use crate::test_utils::{self, TestContext};
|
use crate::test_utils::{self, TestContext};
|
||||||
@@ -1684,6 +1685,118 @@ mod tests {
|
|||||||
assert!(!contact.is_blocked());
|
assert!(!contact.is_blocked());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[async_std::test]
|
||||||
|
async fn test_contact_name_changes() -> Result<()> {
|
||||||
|
let t = TestContext::new_alice().await;
|
||||||
|
|
||||||
|
// first message creates contact and one-to-one-chat without name set
|
||||||
|
dc_receive_imf(
|
||||||
|
&t,
|
||||||
|
b"From: f@example.org\n\
|
||||||
|
To: alice@example.org\n\
|
||||||
|
Subject: foo\n\
|
||||||
|
Message-ID: <1234-1@example.org>\n\
|
||||||
|
Chat-Version: 1.0\n\
|
||||||
|
Date: Sun, 29 May 2022 08:37:57 +0000\n\
|
||||||
|
\n\
|
||||||
|
hello one\n",
|
||||||
|
false,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
let chat_id = t.get_last_msg().await.get_chat_id();
|
||||||
|
chat_id.accept(&t).await?;
|
||||||
|
assert_eq!(Chat::load_from_db(&t, chat_id).await?.name, "f@example.org");
|
||||||
|
let chatlist = Chatlist::try_load(&t, 0, Some("f@example.org"), None).await?;
|
||||||
|
assert_eq!(chatlist.len(), 1);
|
||||||
|
let contacts = get_chat_contacts(&t, chat_id).await?;
|
||||||
|
let contact_id = contacts.first().unwrap();
|
||||||
|
let contact = Contact::load_from_db(&t, *contact_id).await?;
|
||||||
|
assert_eq!(contact.get_authname(), "");
|
||||||
|
assert_eq!(contact.get_name(), "");
|
||||||
|
assert_eq!(contact.get_display_name(), "f@example.org");
|
||||||
|
assert_eq!(contact.get_name_n_addr(), "f@example.org");
|
||||||
|
let contacts = Contact::get_all(&t, 0, Some("f@example.org")).await?;
|
||||||
|
assert_eq!(contacts.len(), 1);
|
||||||
|
|
||||||
|
// second message inits the name
|
||||||
|
dc_receive_imf(
|
||||||
|
&t,
|
||||||
|
b"From: Flobbyfoo <f@example.org>\n\
|
||||||
|
To: alice@example.org\n\
|
||||||
|
Subject: foo\n\
|
||||||
|
Message-ID: <1234-2@example.org>\n\
|
||||||
|
Chat-Version: 1.0\n\
|
||||||
|
Date: Sun, 29 May 2022 08:38:57 +0000\n\
|
||||||
|
\n\
|
||||||
|
hello two\n",
|
||||||
|
false,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
let chat_id = t.get_last_msg().await.get_chat_id();
|
||||||
|
assert_eq!(Chat::load_from_db(&t, chat_id).await?.name, "Flobbyfoo");
|
||||||
|
let chatlist = Chatlist::try_load(&t, 0, Some("flobbyfoo"), None).await?;
|
||||||
|
assert_eq!(chatlist.len(), 1);
|
||||||
|
let contact = Contact::load_from_db(&t, *contact_id).await?;
|
||||||
|
assert_eq!(contact.get_authname(), "Flobbyfoo");
|
||||||
|
assert_eq!(contact.get_name(), "");
|
||||||
|
assert_eq!(contact.get_display_name(), "Flobbyfoo");
|
||||||
|
assert_eq!(contact.get_name_n_addr(), "Flobbyfoo (f@example.org)");
|
||||||
|
let contacts = Contact::get_all(&t, 0, Some("f@example.org")).await?;
|
||||||
|
assert_eq!(contacts.len(), 1);
|
||||||
|
let contacts = Contact::get_all(&t, 0, Some("flobbyfoo")).await?;
|
||||||
|
assert_eq!(contacts.len(), 1);
|
||||||
|
|
||||||
|
// third message changes the name
|
||||||
|
dc_receive_imf(
|
||||||
|
&t,
|
||||||
|
b"From: Foo Flobby <f@example.org>\n\
|
||||||
|
To: alice@example.org\n\
|
||||||
|
Subject: foo\n\
|
||||||
|
Message-ID: <1234-3@example.org>\n\
|
||||||
|
Chat-Version: 1.0\n\
|
||||||
|
Date: Sun, 29 May 2022 08:39:57 +0000\n\
|
||||||
|
\n\
|
||||||
|
hello three\n",
|
||||||
|
false,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
let chat_id = t.get_last_msg().await.get_chat_id();
|
||||||
|
assert_eq!(Chat::load_from_db(&t, chat_id).await?.name, "Foo Flobby");
|
||||||
|
let chatlist = Chatlist::try_load(&t, 0, Some("Flobbyfoo"), None).await?;
|
||||||
|
assert_eq!(chatlist.len(), 0);
|
||||||
|
let chatlist = Chatlist::try_load(&t, 0, Some("Foo Flobby"), None).await?;
|
||||||
|
assert_eq!(chatlist.len(), 1);
|
||||||
|
let contact = Contact::load_from_db(&t, *contact_id).await?;
|
||||||
|
assert_eq!(contact.get_authname(), "Foo Flobby");
|
||||||
|
assert_eq!(contact.get_name(), "");
|
||||||
|
assert_eq!(contact.get_display_name(), "Foo Flobby");
|
||||||
|
assert_eq!(contact.get_name_n_addr(), "Foo Flobby (f@example.org)");
|
||||||
|
let contacts = Contact::get_all(&t, 0, Some("f@example.org")).await?;
|
||||||
|
assert_eq!(contacts.len(), 1);
|
||||||
|
let contacts = Contact::get_all(&t, 0, Some("flobbyfoo")).await?;
|
||||||
|
assert_eq!(contacts.len(), 0);
|
||||||
|
let contacts = Contact::get_all(&t, 0, Some("Foo Flobby")).await?;
|
||||||
|
assert_eq!(contacts.len(), 1);
|
||||||
|
|
||||||
|
// change name manually
|
||||||
|
let test_id = Contact::create(&t, "Falk", "f@example.org").await?;
|
||||||
|
assert_eq!(*contact_id, test_id);
|
||||||
|
assert_eq!(Chat::load_from_db(&t, chat_id).await?.name, "Falk");
|
||||||
|
let chatlist = Chatlist::try_load(&t, 0, Some("Falk"), None).await?;
|
||||||
|
assert_eq!(chatlist.len(), 1);
|
||||||
|
let contact = Contact::load_from_db(&t, *contact_id).await?;
|
||||||
|
assert_eq!(contact.get_authname(), "Foo Flobby");
|
||||||
|
assert_eq!(contact.get_name(), "Falk");
|
||||||
|
assert_eq!(contact.get_display_name(), "Falk");
|
||||||
|
assert_eq!(contact.get_name_n_addr(), "Falk (f@example.org)");
|
||||||
|
let contacts = Contact::get_all(&t, 0, Some("f@example.org")).await?;
|
||||||
|
assert_eq!(contacts.len(), 1);
|
||||||
|
let contacts = Contact::get_all(&t, 0, Some("falk")).await?;
|
||||||
|
assert_eq!(contacts.len(), 1);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[async_std::test]
|
#[async_std::test]
|
||||||
async fn test_delete() -> Result<()> {
|
async fn test_delete() -> Result<()> {
|
||||||
let alice = TestContext::new_alice().await;
|
let alice = TestContext::new_alice().await;
|
||||||
|
|||||||
Reference in New Issue
Block a user