// Integration tests for edit message flow mod helpers; use helpers::fake_tdclient::FakeTdClient; use helpers::test_data::TestMessageBuilder; /// Test: Редактирование сообщения изменяет текст #[test] fn test_edit_message_changes_text() { let mut client = FakeTdClient::new(); // Отправляем сообщение let msg_id = client.send_message(123, "Original text".to_string(), None); // Редактируем сообщение client.edit_message(123, msg_id, "Edited text".to_string()); // Проверяем что редактирование записалось assert_eq!(client.edited_messages().len(), 1); assert_eq!(client.edited_messages()[0].message_id, msg_id); assert_eq!(client.edited_messages()[0].new_text, "Edited text"); // Проверяем что текст сообщения изменился let messages = client.get_messages(123); assert_eq!(messages.len(), 1); assert_eq!(messages[0].content, "Edited text"); } /// Test: Редактирование устанавливает edit_date #[test] fn test_edit_message_sets_edit_date() { let mut client = FakeTdClient::new(); // Отправляем сообщение let msg_id = client.send_message(123, "Original".to_string(), None); // Получаем дату до редактирования let messages_before = client.get_messages(123); let date_before = messages_before[0].date; assert_eq!(messages_before[0].edit_date, 0); // Не редактировалось // Редактируем сообщение client.edit_message(123, msg_id, "Edited".to_string()); // Проверяем что 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 } /// Test: Редактирование только своих сообщений (проверка через can_be_edited) #[test] fn test_can_only_edit_own_messages() { let mut client = FakeTdClient::new(); // Наше исходящее сообщение (можно редактировать) let outgoing_msg = TestMessageBuilder::new("My message", 1) .outgoing() .build(); client = client.with_message(123, outgoing_msg); // Входящее сообщение от собеседника (нельзя редактировать) let incoming_msg = TestMessageBuilder::new("Their message", 2) .sender("Alice") .build(); client = client.with_message(123, incoming_msg); // Проверяем флаги let messages = client.get_messages(123); assert_eq!(messages[0].can_be_edited, true); // Наше сообщение assert_eq!(messages[1].can_be_edited, false); // Чужое сообщение } /// Test: Множественные редактирования одного сообщения #[test] fn test_multiple_edits_of_same_message() { let mut client = FakeTdClient::new(); let msg_id = client.send_message(123, "Version 1".to_string(), None); // Первое редактирование client.edit_message(123, msg_id, "Version 2".to_string()); // Второе редактирование client.edit_message(123, msg_id, "Version 3".to_string()); // Третье редактирование client.edit_message(123, msg_id, "Final version".to_string()); // Проверяем что все 3 редактирования записаны assert_eq!(client.edited_messages().len(), 3); assert_eq!(client.edited_messages()[0].new_text, "Version 2"); assert_eq!(client.edited_messages()[1].new_text, "Version 3"); assert_eq!(client.edited_messages()[2].new_text, "Final version"); // Проверяем что сообщение содержит последнюю версию let messages = client.get_messages(123); assert_eq!(messages.len(), 1); assert_eq!(messages[0].content, "Final version"); } /// Test: Редактирование несуществующего сообщения (ничего не происходит) #[test] fn test_edit_nonexistent_message() { let mut client = FakeTdClient::new(); // Пытаемся отредактировать несуществующее сообщение client.edit_message(123, 999, "New text".to_string()); // Редактирование записалось в историю (FakeTdClient всё записывает) assert_eq!(client.edited_messages().len(), 1); // Но в списке сообщений ничего нет let messages = client.get_messages(123); assert_eq!(messages.len(), 0); } /// Test: Отмена редактирования (Esc) - тестируем что можно восстановить original /// В данном случае проверяем что FakeTdClient сохраняет историю edits #[test] fn test_edit_history_tracking() { let mut client = FakeTdClient::new(); let msg_id = client.send_message(123, "Original".to_string(), None); // Симулируем начало редактирования -> изменение -> отмена // Отменять на уровне FakeTdClient нельзя, но можно проверить что original сохранён // Сохраняем original let messages_before = client.get_messages(123); let original = messages_before[0].content.clone(); // Редактируем client.edit_message(123, msg_id, "Edited".to_string()); // Проверяем что изменилось let messages_edited = client.get_messages(123); assert_eq!(messages_edited[0].content, "Edited"); // Можем "отменить" редактирование вернув original client.edit_message(123, msg_id, original); // Проверяем что вернулось let messages_restored = client.get_messages(123); assert_eq!(messages_restored[0].content, "Original"); // История показывает 2 редактирования assert_eq!(client.edited_messages().len(), 2); }