diff --git a/src/app/chat_state.rs b/src/app/chat_state.rs index cf5b06d..55b1bbf 100644 --- a/src/app/chat_state.rs +++ b/src/app/chat_state.rs @@ -134,11 +134,6 @@ impl ChatState { matches!(self, ChatState::PinnedMessages { .. }) } - /// Проверка: находимся в обычном режиме - pub fn is_normal(&self) -> bool { - matches!(self, ChatState::Normal) - } - /// Возвращает ID выбранного сообщения (если есть) pub fn selected_message_id(&self) -> Option { match self { diff --git a/src/constants.rs b/src/constants.rs index bdd70da..032c191 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -16,25 +16,6 @@ pub const MAX_CHATS: usize = 200; /// Максимальное количество user_ids для хранения в чате pub const MAX_CHAT_USER_IDS: usize = 500; -// ============================================================================ -// UI Constants -// ============================================================================ - -/// Количество колонок в emoji picker сетке -pub const EMOJI_PICKER_COLUMNS: usize = 8; - -/// Количество рядов в emoji picker сетке -pub const EMOJI_PICKER_ROWS: usize = 6; - -/// Максимальная высота поля ввода (в строках) -pub const MAX_INPUT_HEIGHT: usize = 10; - -/// Минимальная ширина терминала для корректного отображения -pub const MIN_TERMINAL_WIDTH: u16 = 80; - -/// Минимальная высота терминала для корректного отображения -pub const MIN_TERMINAL_HEIGHT: u16 = 20; - // ============================================================================ // Performance // ============================================================================ @@ -52,18 +33,5 @@ pub const LAZY_LOAD_USERS_PER_TICK: usize = 5; // TDLib // ============================================================================ -/// Лимит количества чатов для загрузки через TDLib за раз -pub const TDLIB_CHAT_LIMIT: i32 = 50; - /// Лимит количества сообщений для загрузки через TDLib за раз pub const TDLIB_MESSAGE_LIMIT: i32 = 50; - -// ============================================================================ -// Formatting -// ============================================================================ - -/// Максимальная длина имени пользователя для отображения -pub const MAX_USERNAME_DISPLAY_LENGTH: usize = 20; - -/// Отступ для wrap текста сообщений -pub const MESSAGE_TEXT_INDENT: usize = 2; diff --git a/src/error.rs b/src/error.rs deleted file mode 100644 index d069788..0000000 --- a/src/error.rs +++ /dev/null @@ -1,101 +0,0 @@ -/// Error types for tele-tui application -/// -/// Provides type-safe error handling across the application, -/// replacing generic String errors with structured variants. - -#[derive(Debug, thiserror::Error)] -pub enum TeletuiError { - /// TDLib-related errors - #[error("TDLib error: {0}")] - TdLib(String), - - /// Configuration errors - #[error("Configuration error: {0}")] - Config(String), - - /// Network connectivity errors - #[error("Network error: {0}")] - Network(String), - - /// Authentication errors - #[error("Authentication error: {0}")] - Auth(String), - - /// Invalid timezone format - #[error("Invalid timezone format: {0}")] - InvalidTimezone(String), - - /// Invalid color value - #[error("Invalid color: {0}")] - InvalidColor(String), - - /// Message operation errors - #[error("Message error: {0}")] - Message(String), - - /// Chat operation errors - #[error("Chat error: {0}")] - Chat(String), - - /// User operation errors - #[error("User error: {0}")] - User(String), - - /// File system errors - #[error("IO error: {0}")] - Io(#[from] std::io::Error), - - /// TOML parsing errors - #[error("TOML error: {0}")] - Toml(#[from] toml::de::Error), - - /// JSON parsing errors - #[error("JSON error: {0}")] - Json(#[from] serde_json::Error), - - /// Clipboard errors - #[error("Clipboard error: {0}")] - Clipboard(String), - - /// Generic error for cases not covered by specific variants - #[error("{0}")] - Other(String), -} - -/// Result type alias using TeletuiError -pub type Result = std::result::Result; - -/// Helper trait for converting String errors to TeletuiError -pub trait IntoTeletuiError { - fn into_teletui_error(self, variant: ErrorVariant) -> TeletuiError; -} - -impl IntoTeletuiError for String { - fn into_teletui_error(self, variant: ErrorVariant) -> TeletuiError { - match variant { - ErrorVariant::TdLib => TeletuiError::TdLib(self), - ErrorVariant::Config => TeletuiError::Config(self), - ErrorVariant::Network => TeletuiError::Network(self), - ErrorVariant::Auth => TeletuiError::Auth(self), - ErrorVariant::Message => TeletuiError::Message(self), - ErrorVariant::Chat => TeletuiError::Chat(self), - ErrorVariant::User => TeletuiError::User(self), - ErrorVariant::Clipboard => TeletuiError::Clipboard(self), - ErrorVariant::Other => TeletuiError::Other(self), - } - } -} - -/// Error variant selector for conversion -#[derive(Debug, Clone, Copy)] -pub enum ErrorVariant { - TdLib, - Config, - Network, - Auth, - Message, - Chat, - User, - Clipboard, - Other, -} diff --git a/src/lib.rs b/src/lib.rs index 272c854..670db97 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,7 +4,6 @@ pub mod app; pub mod config; pub mod constants; -pub mod error; pub mod formatting; pub mod input; pub mod message_grouping; diff --git a/src/main.rs b/src/main.rs index 0aca410..dffcd49 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,6 @@ mod app; mod config; mod constants; -mod error; mod formatting; mod input; mod tdlib; diff --git a/src/tdlib/chats.rs b/src/tdlib/chats.rs index cede8e5..2ab2f91 100644 --- a/src/tdlib/chats.rs +++ b/src/tdlib/chats.rs @@ -1,10 +1,9 @@ -use crate::constants::TDLIB_CHAT_LIMIT; use crate::types::{ChatId, UserId}; use std::time::Instant; use tdlib_rs::enums::{ChatAction, ChatList, ChatType}; use tdlib_rs::functions; -use super::types::{ChatInfo, FolderInfo, MessageInfo, ProfileInfo}; +use super::types::{ChatInfo, FolderInfo, ProfileInfo}; /// Менеджер чатов TDLib. /// @@ -183,10 +182,7 @@ impl ChatManager { Err(e) => return Err(format!("Ошибка получения чата: {:?}", e)), }; - let chat = match chat_enum { - tdlib_rs::enums::Chat::Chat(c) => c, - _ => return Err("Неожиданный тип чата".to_string()), - }; + let tdlib_rs::enums::Chat::Chat(chat) = chat_enum; let chat_type_str = match &chat.r#type { ChatType::Private(_) => "Личный чат", diff --git a/src/tdlib/client.rs b/src/tdlib/client.rs index d3f1141..4c43433 100644 --- a/src/tdlib/client.rs +++ b/src/tdlib/client.rs @@ -62,18 +62,28 @@ pub struct TdClient { impl TdClient { /// Creates a new TDLib client instance. /// - /// Reads API credentials from environment variables `API_ID` and `API_HASH`. + /// Reads API credentials from: + /// 1. ~/.config/tele-tui/credentials file + /// 2. Environment variables `API_ID` and `API_HASH` (fallback) + /// /// Initializes all managers and sets initial network state to Connecting. /// /// # Returns /// /// A new `TdClient` instance ready for authentication. pub fn new() -> Self { - let api_id = env::var("API_ID") - .unwrap_or_else(|_| "0".to_string()) - .parse() - .unwrap_or(0); - let api_hash = env::var("API_HASH").unwrap_or_default(); + // Пробуем загрузить credentials из Config (файл или env) + let (api_id, api_hash) = crate::config::Config::load_credentials() + .unwrap_or_else(|_| { + // Fallback на прямое чтение из env (старое поведение) + let api_id = env::var("API_ID") + .unwrap_or_else(|_| "0".to_string()) + .parse() + .unwrap_or(0); + let api_hash = env::var("API_HASH").unwrap_or_default(); + (api_id, api_hash) + }); + let client_id = tdlib_rs::create_client(); Self { @@ -91,15 +101,6 @@ impl TdClient { // Делегирование к auth - /// Checks if the user is authenticated. - /// - /// # Returns - /// - /// `true` if authentication is complete, `false` otherwise. - pub fn is_authenticated(&self) -> bool { - self.auth.is_authenticated() - } - /// Sends phone number for authentication. /// /// This is the first step of the authentication flow. @@ -213,10 +214,6 @@ impl TdClient { self.chat_manager.send_chat_action(chat_id, action).await } - pub fn get_typing_text(&self) -> Option { - self.chat_manager.get_typing_text() - } - pub fn clear_stale_typing_status(&mut self) -> bool { self.chat_manager.clear_stale_typing_status() } @@ -318,10 +315,6 @@ impl TdClient { } // Делегирование к user_cache - pub async fn get_user_name(&self, user_id: UserId) -> String { - self.user_cache.get_user_name(user_id).await - } - pub fn get_user_status_by_chat_id(&self, chat_id: ChatId) -> Option<&UserOnlineStatus> { self.user_cache.get_status_by_chat_id(chat_id) } @@ -360,7 +353,6 @@ impl TdClient { pub async fn get_me(&self) -> Result { match functions::get_me(self.client_id).await { Ok(tdlib_rs::enums::User::User(user)) => Ok(user.id), - Ok(_) => Err("Неожиданный тип пользователя".to_string()), Err(e) => Err(format!("Ошибка получения текущего пользователя: {:?}", e)), } } @@ -451,33 +443,6 @@ impl TdClient { &mut self.user_cache } - /// Инициализация TDLib - pub async fn init(&mut self) -> Result<(), String> { - let result = functions::set_tdlib_parameters( - false, // use_test_dc - "tdlib_data".to_string(), // database_directory - "".to_string(), // files_directory - "".to_string(), // database_encryption_key - true, // use_file_database - true, // use_chat_info_database - true, // use_message_database - false, // use_secret_chats - self.api_id, // api_id - self.api_hash.clone(), // api_hash - "en".to_string(), // system_language_code - "Desktop".to_string(), // device_model - "".to_string(), // system_version - env!("CARGO_PKG_VERSION").to_string(), // application_version - self.client_id, - ) - .await; - - match result { - Ok(_) => Ok(()), - Err(e) => Err(format!("Failed to set TDLib parameters: {:?}", e)), - } - } - /// Обрабатываем одно обновление от TDLib pub fn handle_update(&mut self, update: Update) { match update { @@ -845,10 +810,7 @@ impl TdClient { fn add_or_update_chat(&mut self, td_chat_enum: &TdChat) { // Pattern match to get inner Chat struct - let td_chat = match td_chat_enum { - TdChat::Chat(chat) => chat, - _ => return, - }; + let TdChat::Chat(td_chat) = td_chat_enum; // Пропускаем удалённые аккаунты if td_chat.title == "Deleted Account" || td_chat.title.is_empty() { diff --git a/src/tdlib/messages.rs b/src/tdlib/messages.rs index bedf9cd..3508524 100644 --- a/src/tdlib/messages.rs +++ b/src/tdlib/messages.rs @@ -1,8 +1,8 @@ use crate::constants::{MAX_MESSAGES_IN_CHAT, TDLIB_MESSAGE_LIMIT}; use crate::types::{ChatId, MessageId}; -use tdlib_rs::enums::{ChatAction, InputMessageContent, InputMessageReplyTo, MessageContent, MessageSender, SearchMessagesFilter, TextParseMode}; +use tdlib_rs::enums::{InputMessageContent, InputMessageReplyTo, MessageContent, MessageSender, SearchMessagesFilter, TextParseMode}; use tdlib_rs::functions; -use tdlib_rs::types::{Chat as TdChat, FormattedText, InputMessageReplyToMessage, InputMessageText, Message as TdMessage, TextEntity, TextParseModeMarkdown}; +use tdlib_rs::types::{FormattedText, InputMessageReplyToMessage, InputMessageText, Message as TdMessage, TextParseModeMarkdown}; use super::types::{ForwardInfo, MessageBuilder, MessageInfo, ReactionInfo, ReplyInfo}; @@ -178,7 +178,6 @@ impl MessageManager { sleep(Duration::from_millis(200)).await; } } - Ok(_) => return Err("Неожиданный тип сообщений".to_string()), Err(e) => return Err(format!("Ошибка загрузки истории: {:?}", e)), } } @@ -237,7 +236,6 @@ impl MessageManager { } Ok(messages) } - Ok(_) => Err("Неожиданный тип сообщений".to_string()), Err(e) => Err(format!("Ошибка загрузки старых сообщений: {:?}", e)), } } @@ -286,7 +284,6 @@ impl MessageManager { } Ok(pinned_messages) } - Ok(_) => Err("Неожиданный тип результата поиска".to_string()), Err(e) => Err(format!("Ошибка загрузки закреплённых: {:?}", e)), } } @@ -362,7 +359,6 @@ impl MessageManager { } Ok(search_results) } - Ok(_) => Err("Неожиданный тип результата поиска".to_string()), Err(e) => Err(format!("Ошибка поиска: {:?}", e)), } } @@ -464,10 +460,9 @@ impl MessageManager { if let Some(reply) = reply_info { msg_info.interactions.reply_to = Some(reply); } - + Ok(msg_info) } - Ok(_) => Err("Неожиданный тип сообщения".to_string()), Err(e) => Err(format!("Ошибка отправки сообщения: {:?}", e)), } } @@ -523,7 +518,6 @@ impl MessageManager { .convert_message(&msg) .await .ok_or_else(|| "Не удалось конвертировать отредактированное сообщение".to_string()), - Ok(_) => Err("Неожиданный тип сообщения".to_string()), Err(e) => Err(format!("Ошибка редактирования: {:?}", e)), } } @@ -832,8 +826,8 @@ impl MessageManager { if let Ok(original_msg_enum) = functions::get_message(chat_id.as_i64(), message_id.as_i64(), self.client_id).await { - if let tdlib_rs::enums::Message::Message(original_msg) = original_msg_enum { - if let Some(orig_info) = self.convert_message(&original_msg).await { + let tdlib_rs::enums::Message::Message(original_msg) = original_msg_enum; + if let Some(orig_info) = self.convert_message(&original_msg).await { // Update the reply info for msg in &mut self.current_chat_messages { if let Some(ref mut reply) = msg.interactions.reply_to { @@ -848,7 +842,6 @@ impl MessageManager { } } } - } } } } diff --git a/src/tdlib/mod.rs b/src/tdlib/mod.rs index 2802eb1..fcf7418 100644 --- a/src/tdlib/mod.rs +++ b/src/tdlib/mod.rs @@ -11,8 +11,7 @@ pub mod users; pub use auth::AuthState; pub use client::TdClient; pub use types::{ - ChatInfo, FolderInfo, ForwardInfo, MessageBuilder, MessageInfo, NetworkState, ProfileInfo, - ReactionInfo, ReplyInfo, UserOnlineStatus, + ChatInfo, MessageBuilder, MessageInfo, NetworkState, ProfileInfo, ReplyInfo, UserOnlineStatus, }; // Re-export ChatAction для удобства diff --git a/src/tdlib/reactions.rs b/src/tdlib/reactions.rs index 0cff83b..5aa285a 100644 --- a/src/tdlib/reactions.rs +++ b/src/tdlib/reactions.rs @@ -70,7 +70,7 @@ impl ReactionManager { ) -> Result, String> { // Получаем сообщение let msg_result = functions::get_message(chat_id.as_i64(), message_id.as_i64(), self.client_id).await; - let msg = match msg_result { + let _msg = match msg_result { Ok(m) => m, Err(e) => return Err(format!("Ошибка получения сообщения: {:?}", e)), }; diff --git a/src/tdlib/types.rs b/src/tdlib/types.rs index 45881a4..6c8fbb6 100644 --- a/src/tdlib/types.rs +++ b/src/tdlib/types.rs @@ -160,10 +160,6 @@ impl MessageInfo { self.metadata.date } - pub fn edit_date(&self) -> i32 { - self.metadata.edit_date - } - pub fn is_edited(&self) -> bool { self.metadata.edit_date > 0 } @@ -308,12 +304,6 @@ impl MessageBuilder { self } - /// Пометить сообщение как отредактированное (edit_date = date + 60) - pub fn edited(mut self) -> Self { - self.edit_date = self.date + 60; - self - } - /// Пометить сообщение как прочитанное pub fn read(mut self) -> Self { self.is_read = true; @@ -362,12 +352,6 @@ impl MessageBuilder { self } - /// Добавить одну реакцию - pub fn add_reaction(mut self, reaction: ReactionInfo) -> Self { - self.reactions.push(reaction); - self - } - /// Построить MessageInfo из данных builder'а pub fn build(self) -> MessageInfo { MessageInfo::new( @@ -430,11 +414,11 @@ mod tests { let message = MessageBuilder::new(MessageId::new(789)) .text("Original text") .date(1640000000) - .edited() + .edit_date(1640000060) .build(); assert!(message.is_edited()); - assert_eq!(message.edit_date(), 1640000060); + assert_eq!(message.metadata.edit_date, 1640000060); } #[test] @@ -464,7 +448,7 @@ mod tests { let message = MessageBuilder::new(MessageId::new(300)) .text("Cool message") - .add_reaction(reaction.clone()) + .reactions(vec![reaction.clone()]) .build(); assert_eq!(message.reactions().len(), 1); diff --git a/src/tdlib/users.rs b/src/tdlib/users.rs index 4b432c7..641a36b 100644 --- a/src/tdlib/users.rs +++ b/src/tdlib/users.rs @@ -152,21 +152,6 @@ impl UserCache { } } - /// Получить username пользователя - pub fn get_username(&mut self, user_id: &UserId) -> Option<&String> { - self.user_usernames.get(user_id) - } - - /// Получить имя пользователя - pub fn get_name(&mut self, user_id: &UserId) -> Option<&String> { - self.user_names.get(user_id) - } - - /// Получить user_id по chat_id - pub fn get_user_id_by_chat(&self, chat_id: ChatId) -> Option { - self.chat_user_ids.get(&chat_id).copied() - } - /// Получить статус пользователя по chat_id pub fn get_status_by_chat_id(&self, chat_id: ChatId) -> Option<&UserOnlineStatus> { let user_id = self.chat_user_ids.get(&chat_id)?; @@ -181,21 +166,20 @@ impl UserCache { /// /// * `user_enum` - Обновление пользователя от TDLib pub fn handle_user_update(&mut self, user_enum: &User) { - if let User::User(user) = user_enum { - let user_id = user.id; + let User::User(user) = user_enum; + let user_id = user.id; - // Сохраняем username - if let Some(username) = user.usernames.as_ref().map(|u| u.editable_username.clone()) { - self.user_usernames.insert(UserId::new(user_id), username); - } - - // Сохраняем имя - let display_name = format!("{} {}", user.first_name, user.last_name).trim().to_string(); - self.user_names.insert(UserId::new(user_id), display_name); - - // Обновляем статус - self.update_status(UserId::new(user_id), &user.status); + // Сохраняем username + if let Some(username) = user.usernames.as_ref().map(|u| u.editable_username.clone()) { + self.user_usernames.insert(UserId::new(user_id), username); } + + // Сохраняем имя + let display_name = format!("{} {}", user.first_name, user.last_name).trim().to_string(); + self.user_names.insert(UserId::new(user_id), display_name); + + // Обновляем статус + self.update_status(UserId::new(user_id), &user.status); } /// Обновляет онлайн-статус пользователя. @@ -216,11 +200,6 @@ impl UserCache { self.user_statuses.insert(user_id, online_status); } - /// Сохранить связь chat_id -> user_id - pub fn register_private_chat(&mut self, chat_id: ChatId, user_id: UserId) { - self.chat_user_ids.insert(chat_id, user_id); - } - /// Получает имя пользователя из кэша или загружает из TDLib. /// /// Сначала проверяет кэш, затем при необходимости загружает из API. diff --git a/src/ui/components/message_bubble.rs b/src/ui/components/message_bubble.rs index a20bf8f..948b957 100644 --- a/src/ui/components/message_bubble.rs +++ b/src/ui/components/message_bubble.rs @@ -15,12 +15,5 @@ // // Пока этот файл служит placeholder'ом для будущего рефакторинга. -use crate::tdlib::MessageInfo; - -/// Placeholder для функции рендеринга пузыря сообщения -/// -/// TODO: Реализовать после выполнения P3.8 и P3.9 -pub fn render_message_bubble(_message: &MessageInfo) { - // Будет реализовано позже - unimplemented!("Message bubble rendering requires P3.8 and P3.9 first") -} +// Placeholder file - функция render_message_bubble удалена как неиспользуемая. +// Рендеринг сообщений находится в src/ui/messages.rs diff --git a/src/ui/components/mod.rs b/src/ui/components/mod.rs index 113b4b2..c9e4941 100644 --- a/src/ui/components/mod.rs +++ b/src/ui/components/mod.rs @@ -7,8 +7,6 @@ pub mod chat_list_item; pub mod emoji_picker; // Экспорт основных функций -pub use modal::render_modal; pub use input_field::render_input_field; -pub use message_bubble::render_message_bubble; pub use chat_list_item::render_chat_list_item; pub use emoji_picker::render_emoji_picker; diff --git a/tests/chat_list.rs b/tests/chat_list.rs index dc3dbea..ea3ad06 100644 --- a/tests/chat_list.rs +++ b/tests/chat_list.rs @@ -177,10 +177,10 @@ fn snapshot_chat_with_online_status() { // Устанавливаем онлайн-статус для чата напрямую let chat_id = ChatId::new(123); let user_id = tele_tui::types::UserId::new(123); - + // Регистрируем чат как приватный - app.td_client.user_cache.register_private_chat(chat_id, user_id); - + app.td_client.user_cache.chat_user_ids.insert(chat_id, user_id); + // Устанавливаем онлайн-статус app.td_client.user_cache.user_statuses.insert(user_id, UserOnlineStatus::Online); diff --git a/tests/e2e_user_journey.rs b/tests/e2e_user_journey.rs index b07ffaf..fd7b582 100644 --- a/tests/e2e_user_journey.rs +++ b/tests/e2e_user_journey.rs @@ -293,7 +293,7 @@ async fn test_user_journey_edit_during_conversation() { let edited_history = client.get_chat_history(ChatId::new(555), 50).await.unwrap(); assert_eq!(edited_history.len(), 1); assert_eq!(edited_history[0].text(), "I'll be there at 5pm tomorrow"); - assert!(edited_history[0].edit_date() > 0, "Должна быть установлена дата редактирования"); + assert!(edited_history[0].metadata.edit_date > 0, "Должна быть установлена дата редактирования"); // 6. Проверяем историю редактирований assert_eq!(client.get_edited_messages().len(), 1); diff --git a/tests/edit_message.rs b/tests/edit_message.rs index e103570..66881b8 100644 --- a/tests/edit_message.rs +++ b/tests/edit_message.rs @@ -39,15 +39,15 @@ async fn test_edit_message_sets_edit_date() { // Получаем дату до редактирования let messages_before = client.get_messages(123); let date_before = messages_before[0].date(); - assert_eq!(messages_before[0].edit_date(), 0); // Не редактировалось + assert_eq!(messages_before[0].metadata.edit_date, 0); // Не редактировалось // Редактируем сообщение client.edit_message(ChatId::new(123), msg.id(), "Edited".to_string()).await.unwrap(); // Проверяем что edit_date установлена let messages_after = client.get_messages(123); - assert!(messages_after[0].edit_date() > 0); - assert!(messages_after[0].edit_date() > date_before); // edit_date после date + assert!(messages_after[0].metadata.edit_date > 0); + assert!(messages_after[0].metadata.edit_date > date_before); // edit_date после date } /// Test: Редактирование только своих сообщений (проверка через can_be_edited) diff --git a/tests/helpers/fake_tdclient.rs b/tests/helpers/fake_tdclient.rs index d01121e..ac0f2b8 100644 --- a/tests/helpers/fake_tdclient.rs +++ b/tests/helpers/fake_tdclient.rs @@ -2,7 +2,8 @@ use std::collections::HashMap; use std::sync::{Arc, Mutex}; -use tele_tui::tdlib::{ChatInfo, FolderInfo, MessageInfo, NetworkState, ProfileInfo, ReplyInfo, ReactionInfo}; +use tele_tui::tdlib::{ChatInfo, MessageInfo, NetworkState, ProfileInfo, ReplyInfo}; +use tele_tui::tdlib::types::{FolderInfo, ReactionInfo}; use tele_tui::types::{ChatId, MessageId, UserId}; use tokio::sync::mpsc; @@ -817,7 +818,7 @@ mod tests { let edited = client.get_edited_messages(); assert_eq!(edited.len(), 1); assert_eq!(client.get_messages(123)[0].text(), "Hello World"); - assert!(client.get_messages(123)[0].edit_date() > 0); + assert!(client.get_messages(123)[0].metadata.edit_date > 0); } #[tokio::test] diff --git a/tests/helpers/test_data.rs b/tests/helpers/test_data.rs index 88df4ff..02a7ac4 100644 --- a/tests/helpers/test_data.rs +++ b/tests/helpers/test_data.rs @@ -1,6 +1,7 @@ // Test data builders and fixtures -use tele_tui::tdlib::{ChatInfo, ForwardInfo, MessageInfo, ProfileInfo, ReactionInfo, ReplyInfo}; +use tele_tui::tdlib::{ChatInfo, MessageInfo, ProfileInfo, ReplyInfo}; +use tele_tui::tdlib::types::{ForwardInfo, ReactionInfo}; use tele_tui::types::{ChatId, MessageId}; /// Builder для создания тестового чата @@ -176,7 +177,6 @@ impl TestMessageBuilder { pub fn forwarded_from(mut self, sender: &str) -> Self { self.forward_from = Some(ForwardInfo { sender_name: sender.to_string(), - date: self.date - 3600, }); self } diff --git a/tests/reply_forward.rs b/tests/reply_forward.rs index a1d4343..ac439b3 100644 --- a/tests/reply_forward.rs +++ b/tests/reply_forward.rs @@ -4,7 +4,8 @@ mod helpers; use helpers::fake_tdclient::FakeTdClient; use helpers::test_data::TestMessageBuilder; -use tele_tui::tdlib::{ForwardInfo, ReplyInfo}; +use tele_tui::tdlib::ReplyInfo; +use tele_tui::tdlib::types::ForwardInfo; use tele_tui::types::{ChatId, MessageId}; /// Test: Reply создаёт сообщение с reply_to @@ -106,7 +107,6 @@ async fn test_forward_creates_message_with_forward_from() { let forward = messages[0].forward_from().unwrap(); assert_eq!(forward.sender_name, "Bob"); - assert!(forward.date > 0); // Дата установлена } /// Test: Forward показывает "↪ Переслано от ..."