Files
telegram-tui/tests/reactions.rs
Mikhail Kilin 644e36597d fixes
2026-01-31 03:48:50 +03:00

244 lines
8.3 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Integration tests for reactions flow
mod helpers;
use helpers::fake_tdclient::FakeTdClient;
use helpers::test_data::TestMessageBuilder;
/// Test: Добавление реакции к сообщению
#[test]
fn test_add_reaction_to_message() {
let mut client = FakeTdClient::new();
// Отправляем сообщение
let msg_id = client.send_message(123, "React to this!".to_string(), None);
// Добавляем реакцию
client.add_reaction(msg_id, "👍".to_string());
// Проверяем что реакция записалась
let reactions = client.reactions.get(&msg_id);
assert!(reactions.is_some());
assert_eq!(reactions.unwrap().len(), 1);
assert_eq!(reactions.unwrap()[0], "👍");
}
/// Test: Удаление реакции (toggle) - вторичное нажатие
#[test]
fn test_toggle_reaction_removes_it() {
let mut client = FakeTdClient::new();
// Создаём сообщение с нашей реакцией
let msg = TestMessageBuilder::new("Message", 100)
.reaction("👍", 1, true) // chosen=true - наша реакция
.build();
client = client.with_message(123, msg);
// Проверяем что реакция есть
let messages_before = client.get_messages(123);
assert_eq!(messages_before[0].reactions().len(), 1);
assert_eq!(messages_before[0].reactions()[0].is_chosen, true);
// Симулируем удаление реакции (в реальном App это toggle)
// FakeTdClient просто записывает что реакция была "убрана"
// Для теста можем удалить из списка вручную или расширить FakeTdClient
// Создаём сообщение без реакции (после toggle)
let msg_after = TestMessageBuilder::new("Message", 100).build();
// Заменяем в клиенте
client.messages.insert(123, vec![msg_after]);
let messages_after = client.get_messages(123);
assert_eq!(messages_after[0].reactions().len(), 0);
}
/// Test: Множественные реакции на одно сообщение
#[test]
fn test_multiple_reactions_on_one_message() {
let mut client = FakeTdClient::new();
let msg_id = client.send_message(123, "Many reactions".to_string(), None);
// Добавляем несколько разных реакций
client.add_reaction(msg_id, "👍".to_string());
client.add_reaction(msg_id, "❤️".to_string());
client.add_reaction(msg_id, "😂".to_string());
client.add_reaction(msg_id, "🔥".to_string());
// Проверяем что все 4 реакции записались
let reactions = client.reactions.get(&msg_id).unwrap();
assert_eq!(reactions.len(), 4);
assert_eq!(reactions[0], "👍");
assert_eq!(reactions[1], "❤️");
assert_eq!(reactions[2], "😂");
assert_eq!(reactions[3], "🔥");
}
/// Test: Реакции от разных пользователей (count > 1)
#[test]
fn test_reactions_from_multiple_users() {
let mut client = FakeTdClient::new();
// Создаём сообщение с реакцией от 3 пользователей
let msg = TestMessageBuilder::new("Popular message", 100)
.reaction("👍", 3, false) // 3 человека, но не мы
.build();
client = client.with_message(123, msg);
let messages = client.get_messages(123);
let reaction = &messages[0].reactions()[0];
assert_eq!(reaction.emoji, "👍");
assert_eq!(reaction.count, 3);
assert_eq!(reaction.is_chosen, false);
}
/// Test: Своя реакция (is_chosen = true)
#[test]
fn test_own_reaction_is_chosen() {
let mut client = FakeTdClient::new();
// Создаём сообщение с нашей реакцией
let msg = TestMessageBuilder::new("I reacted", 100)
.reaction("❤️", 1, true) // chosen=true
.build();
client = client.with_message(123, msg);
let messages = client.get_messages(123);
let reaction = &messages[0].reactions()[0];
assert_eq!(reaction.is_chosen, true);
// В UI это будет отображаться в рамках: [❤️]
}
/// Test: Чужая реакция (is_chosen = false)
#[test]
fn test_other_reaction_not_chosen() {
let mut client = FakeTdClient::new();
// Создаём сообщение с чужой реакцией
let msg = TestMessageBuilder::new("They reacted", 100)
.reaction("😂", 2, false) // chosen=false
.build();
client = client.with_message(123, msg);
let messages = client.get_messages(123);
let reaction = &messages[0].reactions()[0];
assert_eq!(reaction.is_chosen, false);
// В UI это будет отображаться без рамок: 😂 2
}
/// Test: Счётчик реакций увеличивается
#[test]
fn test_reaction_counter_increases() {
let mut client = FakeTdClient::new();
// Начальное сообщение с 1 реакцией
let msg_v1 = TestMessageBuilder::new("Growing", 100)
.reaction("👍", 1, false)
.build();
client = client.with_message(123, msg_v1);
// Симулируем обновление: теперь 5 человек
let msg_v2 = TestMessageBuilder::new("Growing", 100)
.reaction("👍", 5, false)
.build();
client.messages.insert(123, vec![msg_v2]);
let messages = client.get_messages(123);
assert_eq!(messages[0].reactions()[0].count, 5);
}
/// Test: Обновление реакции - мы добавили свою к существующим
#[test]
fn test_update_reaction_we_add_ours() {
let mut client = FakeTdClient::new();
// Изначально: 2 человека, но не мы
let msg_before = TestMessageBuilder::new("Update", 100)
.reaction("🔥", 2, false)
.build();
client = client.with_message(123, msg_before);
// После добавления нашей: 3 человека, в том числе мы
let msg_after = TestMessageBuilder::new("Update", 100)
.reaction("🔥", 3, true) // is_chosen=true теперь
.build();
client.messages.insert(123, vec![msg_after]);
let messages = client.get_messages(123);
let reaction = &messages[0].reactions()[0];
assert_eq!(reaction.count, 3);
assert_eq!(reaction.is_chosen, true);
}
/// Test: Реакция с count=1 отображается только emoji
#[test]
fn test_single_reaction_shows_only_emoji() {
let mut client = FakeTdClient::new();
let msg = TestMessageBuilder::new("Single", 100)
.reaction("❤️", 1, true)
.build();
client = client.with_message(123, msg);
let messages = client.get_messages(123);
let reaction = &messages[0].reactions()[0];
assert_eq!(reaction.count, 1);
// В UI: если count=1, показываем только emoji без цифры
// Логика рендеринга: count > 1 ? "emoji count" : "emoji"
}
/// Test: Реакции на несколько сообщений
#[test]
fn test_reactions_on_multiple_messages() {
let mut client = FakeTdClient::new();
let msg1 = TestMessageBuilder::new("First", 100)
.reaction("👍", 2, false)
.build();
let msg2 = TestMessageBuilder::new("Second", 101)
.reaction("❤️", 1, true)
.build();
let msg3 = TestMessageBuilder::new("Third", 102)
.reaction("😂", 5, false)
.reaction("🔥", 3, true) // Две разные реакции
.build();
client = client
.with_message(123, msg1)
.with_message(123, msg2)
.with_message(123, msg3);
let messages = client.get_messages(123);
// Первое: 1 реакция
assert_eq!(messages[0].reactions().len(), 1);
assert_eq!(messages[0].reactions()[0].emoji, "👍");
// Второе: 1 реакция
assert_eq!(messages[1].reactions().len(), 1);
assert_eq!(messages[1].reactions()[0].emoji, "❤️");
// Третье: 2 реакции
assert_eq!(messages[2].reactions().len(), 2);
assert_eq!(messages[2].reactions()[0].emoji, "😂");
assert_eq!(messages[2].reactions()[1].emoji, "🔥");
assert_eq!(messages[2].reactions()[1].is_chosen, true);
}