// Integration tests for delete message flow mod helpers; use helpers::fake_tdclient::FakeTdClient; use helpers::test_data::TestMessageBuilder; use tele_tui::types::{ChatId, MessageId}; /// Test: Удаление сообщения убирает его из списка #[tokio::test] async fn test_delete_message_removes_from_list() { let client = FakeTdClient::new(); // Отправляем сообщение let msg = client.send_message(ChatId::new(123), "Delete me".to_string(), None, None).await.unwrap(); // Проверяем что сообщение есть assert_eq!(client.get_messages(123).len(), 1); // Удаляем сообщение client.delete_messages(ChatId::new(123), vec![msg.id()], false).await.unwrap(); // Проверяем что удаление записалось assert_eq!(client.get_deleted_messages().len(), 1); assert_eq!(client.get_deleted_messages()[0].message_ids[0], msg.id()); // Проверяем что сообщение удалено из списка assert_eq!(client.get_messages(123).len(), 0); } /// Test: Удаление нескольких сообщений #[tokio::test] async fn test_delete_multiple_messages() { let client = FakeTdClient::new(); // Отправляем 3 сообщения let msg1 = client.send_message(ChatId::new(123), "Message 1".to_string(), None, None).await.unwrap(); let msg2 = client.send_message(ChatId::new(123), "Message 2".to_string(), None, None).await.unwrap(); let msg3 = client.send_message(ChatId::new(123), "Message 3".to_string(), None, None).await.unwrap(); assert_eq!(client.get_messages(123).len(), 3); // Удаляем первое и третье client.delete_messages(ChatId::new(123), vec![msg1.id()], false).await.unwrap(); client.delete_messages(ChatId::new(123), vec![msg3.id()], false).await.unwrap(); // Проверяем историю удалений assert_eq!(client.get_deleted_messages().len(), 2); assert_eq!(client.get_deleted_messages()[0].message_ids[0], msg1.id()); assert_eq!(client.get_deleted_messages()[1].message_ids[0], msg3.id()); // Проверяем что осталось только второе сообщение let messages = client.get_messages(123); assert_eq!(messages.len(), 1); assert_eq!(messages[0].id(), msg2.id()); assert_eq!(messages[0].content.text, "Message 2"); } /// Test: Удаление только своих сообщений (проверка через can_be_deleted_for_all_users) #[tokio::test] async fn test_can_only_delete_own_messages_for_all() { let client = FakeTdClient::new(); // Наше исходящее сообщение (можно удалить для всех) let outgoing_msg = TestMessageBuilder::new("My message", 1).outgoing().build(); let client = client.with_message(123, outgoing_msg); // Входящее сообщение от собеседника (можно удалить только для себя) let incoming_msg = TestMessageBuilder::new("Their message", 2) .sender("Alice") .build(); let client = client.with_message(123, incoming_msg); // Проверяем флаги удаления let messages = client.get_messages(123); assert_eq!(messages[0].can_be_deleted_for_all_users(), true); // Наше assert_eq!(messages[1].can_be_deleted_for_all_users(), false); // Чужое // Оба можно удалить для себя assert_eq!(messages[0].can_be_deleted_only_for_self(), true); assert_eq!(messages[1].can_be_deleted_only_for_self(), true); } /// Test: Удаление несуществующего сообщения (ничего не происходит) #[tokio::test] async fn test_delete_nonexistent_message() { let client = FakeTdClient::new(); // Отправляем одно сообщение let msg = client.send_message(ChatId::new(123), "Exists".to_string(), None, None).await.unwrap(); assert_eq!(client.get_messages(123).len(), 1); // Пытаемся удалить несуществующее client.delete_messages(ChatId::new(123), vec![MessageId::new(999)], false).await.unwrap(); // Удаление записалось в историю assert_eq!(client.get_deleted_messages().len(), 1); assert_eq!(client.get_deleted_messages()[0].message_ids[0], MessageId::new(999)); // Но существующее сообщение осталось let messages = client.get_messages(123); assert_eq!(messages.len(), 1); assert_eq!(messages[0].id(), msg.id()); } /// Test: Подтверждение удаления (симуляция модалки) /// FakeTdClient сразу удаляет, но в реальном App должна быть модалка подтверждения #[tokio::test] async fn test_delete_with_confirmation_flow() { let client = FakeTdClient::new(); let msg = client.send_message(ChatId::new(123), "To delete".to_string(), None, None).await.unwrap(); // Шаг 1: Пользователь нажал 'd' -> показывается модалка (в App) // В FakeTdClient просто проверяем что сообщение ещё есть assert_eq!(client.get_messages(123).len(), 1); assert_eq!(client.get_deleted_messages().len(), 0); // Шаг 2: Пользователь подтвердил 'y' -> удаляем client.delete_messages(ChatId::new(123), vec![msg.id()], false).await.unwrap(); // Проверяем что удалено assert_eq!(client.get_messages(123).len(), 0); assert_eq!(client.get_deleted_messages().len(), 1); } /// Test: Отмена удаления (Esc) - сообщение остаётся #[tokio::test] async fn test_cancel_delete_keeps_message() { let client = FakeTdClient::new(); let msg = client.send_message(ChatId::new(123), "Keep me".to_string(), None, None).await.unwrap(); // Шаг 1: Пользователь нажал 'd' -> показалась модалка assert_eq!(client.get_messages(123).len(), 1); // Шаг 2: Пользователь нажал 'Esc' -> НЕ вызываем delete_message // Проверяем что сообщение осталось assert_eq!(client.get_messages(123).len(), 1); assert_eq!(client.get_deleted_messages().len(), 0); // Сообщение на месте let messages = client.get_messages(123); assert_eq!(messages[0].id(), msg.id()); assert_eq!(messages[0].content.text, "Keep me"); }