refactor: implement trait-based DI for TdClient and fix stack overflow
Implement complete trait-based dependency injection pattern for TdClient to enable testing with FakeTdClient mock. Fix critical stack overflow bugs caused by infinite recursion in trait implementations. Breaking Changes: - App is now generic: App<T: TdClientTrait = TdClient> - All UI and input handlers are generic over TdClientTrait - TdClient methods now accessed through trait interface New Files: - src/tdlib/trait.rs: TdClientTrait definition with 40+ methods - src/tdlib/client_impl.rs: TdClientTrait impl for TdClient - tests/helpers/fake_tdclient_impl.rs: TdClientTrait impl for FakeTdClient Critical Fixes: - Fix stack overflow in send_message, edit_message, delete_messages - Fix stack overflow in forward_messages, current_chat_messages - Fix stack overflow in current_pinned_message - All methods now call message_manager directly to avoid recursion Testing: - FakeTdClient supports configurable auth_state for auth screen tests - Added pinned message support in FakeTdClient - All 196+ tests passing (188 tests + 8 benchmarks) Dependencies: - Added async-trait = "0.1" Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -261,18 +261,17 @@ async fn test_insert_char_at_cursor_position() {
|
||||
/// Test: Навигация вверх по сообщениям из пустого инпута
|
||||
#[tokio::test]
|
||||
async fn test_up_arrow_selects_last_message_when_input_empty() {
|
||||
let mut app = TestAppBuilder::new()
|
||||
.with_chats(vec![create_test_chat("Chat 1", 101)])
|
||||
.selected_chat(101)
|
||||
.build();
|
||||
|
||||
// Добавляем сообщения
|
||||
let messages = vec![
|
||||
TestMessageBuilder::new("Msg 1", 1).outgoing().build(),
|
||||
TestMessageBuilder::new("Msg 2", 2).outgoing().build(),
|
||||
TestMessageBuilder::new("Msg 3", 3).outgoing().build(),
|
||||
];
|
||||
app.td_client.message_manager.current_chat_messages = messages;
|
||||
|
||||
let mut app = TestAppBuilder::new()
|
||||
.with_chats(vec![create_test_chat("Chat 1", 101)])
|
||||
.selected_chat(101)
|
||||
.with_messages(101, messages)
|
||||
.build();
|
||||
|
||||
// Инпут пустой
|
||||
assert_eq!(app.message_input, "");
|
||||
|
||||
Reference in New Issue
Block a user