This commit is contained in:
Mikhail Kilin
2026-01-31 23:02:53 +03:00
parent af3c36b9a1
commit c5896b7f14
17 changed files with 1899 additions and 567 deletions

View File

@@ -4,74 +4,74 @@ mod helpers;
use helpers::fake_tdclient::FakeTdClient;
use helpers::test_data::TestMessageBuilder;
use tele_tui::types::MessageId;
use tele_tui::types::{ChatId, MessageId};
/// Test: Удаление сообщения убирает его из списка
#[test]
fn test_delete_message_removes_from_list() {
let mut client = FakeTdClient::new();
#[tokio::test]
async fn test_delete_message_removes_from_list() {
let client = FakeTdClient::new();
// Отправляем сообщение
let msg_id = client.send_message(123, "Delete me".to_string(), None);
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_message(123, msg_id);
client.delete_messages(ChatId::new(123), vec![msg.id()], false).await.unwrap();
// Проверяем что удаление записалось
assert_eq!(client.deleted_messages().len(), 1);
assert_eq!(client.deleted_messages()[0], msg_id);
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: Удаление нескольких сообщений
#[test]
fn test_delete_multiple_messages() {
let mut client = FakeTdClient::new();
#[tokio::test]
async fn test_delete_multiple_messages() {
let client = FakeTdClient::new();
// Отправляем 3 сообщения
let msg1_id = client.send_message(123, "Message 1".to_string(), None);
let msg2_id = client.send_message(123, "Message 2".to_string(), None);
let msg3_id = client.send_message(123, "Message 3".to_string(), None);
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_message(123, msg1_id);
client.delete_message(123, msg3_id);
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.deleted_messages().len(), 2);
assert_eq!(client.deleted_messages()[0], msg1_id);
assert_eq!(client.deleted_messages()[1], msg3_id);
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(), MessageId::new(msg2_id));
assert_eq!(messages[0].id(), msg2.id());
assert_eq!(messages[0].content.text, "Message 2");
}
/// Test: Удаление только своих сообщений (проверка через can_be_deleted_for_all_users)
#[test]
fn test_can_only_delete_own_messages_for_all() {
let mut client = FakeTdClient::new();
#[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();
client = client.with_message(123, outgoing_msg);
let 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 client = client.with_message(123, incoming_msg);
// Проверяем флаги удаления
let messages = client.get_messages(123);
@@ -84,55 +84,55 @@ fn test_can_only_delete_own_messages_for_all() {
}
/// Test: Удаление несуществующего сообщения (ничего не происходит)
#[test]
fn test_delete_nonexistent_message() {
let mut client = FakeTdClient::new();
#[tokio::test]
async fn test_delete_nonexistent_message() {
let client = FakeTdClient::new();
// Отправляем одно сообщение
let msg_id = client.send_message(123, "Exists".to_string(), None);
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_message(123, 999);
client.delete_messages(ChatId::new(123), vec![MessageId::new(999)], false).await.unwrap();
// Удаление записалось в историю
assert_eq!(client.deleted_messages().len(), 1);
assert_eq!(client.deleted_messages()[0], 999);
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(), MessageId::new(msg_id));
assert_eq!(messages[0].id(), msg.id());
}
/// Test: Подтверждение удаления (симуляция модалки)
/// FakeTdClient сразу удаляет, но в реальном App должна быть модалка подтверждения
#[test]
fn test_delete_with_confirmation_flow() {
let mut client = FakeTdClient::new();
#[tokio::test]
async fn test_delete_with_confirmation_flow() {
let client = FakeTdClient::new();
let msg_id = client.send_message(123, "To delete".to_string(), None);
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.deleted_messages().len(), 0);
assert_eq!(client.get_deleted_messages().len(), 0);
// Шаг 2: Пользователь подтвердил 'y' -> удаляем
client.delete_message(123, msg_id);
client.delete_messages(ChatId::new(123), vec![msg.id()], false).await.unwrap();
// Проверяем что удалено
assert_eq!(client.get_messages(123).len(), 0);
assert_eq!(client.deleted_messages().len(), 1);
assert_eq!(client.get_deleted_messages().len(), 1);
}
/// Test: Отмена удаления (Esc) - сообщение остаётся
#[test]
fn test_cancel_delete_keeps_message() {
let mut client = FakeTdClient::new();
#[tokio::test]
async fn test_cancel_delete_keeps_message() {
let client = FakeTdClient::new();
let msg_id = client.send_message(123, "Keep me".to_string(), None);
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);
@@ -141,10 +141,10 @@ fn test_cancel_delete_keeps_message() {
// Проверяем что сообщение осталось
assert_eq!(client.get_messages(123).len(), 1);
assert_eq!(client.deleted_messages().len(), 0);
assert_eq!(client.get_deleted_messages().len(), 0);
// Сообщение на месте
let messages = client.get_messages(123);
assert_eq!(messages[0].id(), MessageId::new(msg_id));
assert_eq!(messages[0].id(), msg.id());
assert_eq!(messages[0].content.text, "Keep me");
}