Files
telegram-tui/tests/reactions.rs
Mikhail Kilin 264f183510
Some checks failed
ci/woodpecker/pr/check Pipeline failed
CI / Check (pull_request) Has been cancelled
CI / Format (pull_request) Has been cancelled
CI / Clippy (pull_request) Has been cancelled
CI / Build (macos-latest) (pull_request) Has been cancelled
CI / Build (ubuntu-latest) (pull_request) Has been cancelled
CI / Build (windows-latest) (pull_request) Has been cancelled
style: auto-format entire codebase with cargo fmt (stable rustfmt.toml)
2026-02-22 17:09:51 +03:00

277 lines
9.0 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;
use tele_tui::types::ChatId;
/// Test: Добавление реакции к сообщению
#[tokio::test]
async fn test_add_reaction_to_message() {
let client = FakeTdClient::new();
// Отправляем сообщение
let msg = client
.send_message(ChatId::new(123), "React to this!".to_string(), None, None)
.await
.unwrap();
// Добавляем реакцию
client
.toggle_reaction(ChatId::new(123), msg.id(), "👍".to_string())
.await
.unwrap();
// Проверяем что реакция записалась
let messages = client.get_messages(123);
assert_eq!(messages.len(), 1);
assert_eq!(messages[0].reactions().len(), 1);
assert_eq!(messages[0].reactions()[0].emoji, "👍");
assert_eq!(messages[0].reactions()[0].count, 1);
assert_eq!(messages[0].reactions()[0].is_chosen, true);
}
/// Test: Удаление реакции (toggle) - вторичное нажатие
#[tokio::test]
async fn test_toggle_reaction_removes_it() {
let client = FakeTdClient::new();
// Создаём сообщение с нашей реакцией
let msg = TestMessageBuilder::new("Message", 100)
.reaction("👍", 1, true) // chosen=true - наша реакция
.build();
let 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);
let msg_id = messages_before[0].id();
// Toggle - удаляем свою реакцию
client
.toggle_reaction(ChatId::new(123), msg_id, "👍".to_string())
.await
.unwrap();
let messages_after = client.get_messages(123);
assert_eq!(messages_after[0].reactions().len(), 0);
}
/// Test: Множественные реакции на одно сообщение
#[tokio::test]
async fn test_multiple_reactions_on_one_message() {
let client = FakeTdClient::new();
let msg = client
.send_message(ChatId::new(123), "Many reactions".to_string(), None, None)
.await
.unwrap();
// Добавляем несколько разных реакций
client
.toggle_reaction(ChatId::new(123), msg.id(), "👍".to_string())
.await
.unwrap();
client
.toggle_reaction(ChatId::new(123), msg.id(), "❤️".to_string())
.await
.unwrap();
client
.toggle_reaction(ChatId::new(123), msg.id(), "😂".to_string())
.await
.unwrap();
client
.toggle_reaction(ChatId::new(123), msg.id(), "🔥".to_string())
.await
.unwrap();
// Проверяем что все 4 реакции записались
let messages = client.get_messages(123);
let reactions = &messages[0].reactions();
assert_eq!(reactions.len(), 4);
assert_eq!(reactions[0].emoji, "👍");
assert_eq!(reactions[1].emoji, "❤️");
assert_eq!(reactions[2].emoji, "😂");
assert_eq!(reactions[3].emoji, "🔥");
}
/// Test: Реакции от разных пользователей (count > 1)
#[tokio::test]
async fn test_reactions_from_multiple_users() {
let client = FakeTdClient::new();
// Создаём сообщение с реакцией от 3 пользователей
let msg = TestMessageBuilder::new("Popular message", 100)
.reaction("👍", 3, false) // 3 человека, но не мы
.build();
let 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)
#[tokio::test]
async fn test_own_reaction_is_chosen() {
let client = FakeTdClient::new();
// Создаём сообщение с нашей реакцией
let msg = TestMessageBuilder::new("I reacted", 100)
.reaction("❤️", 1, true) // chosen=true
.build();
let 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)
#[tokio::test]
async fn test_other_reaction_not_chosen() {
let client = FakeTdClient::new();
// Создаём сообщение с чужой реакцией
let msg = TestMessageBuilder::new("They reacted", 100)
.reaction("😂", 2, false) // chosen=false
.build();
let 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: Счётчик реакций увеличивается
#[tokio::test]
async fn test_reaction_counter_increases() {
let client = FakeTdClient::new();
// Начальное сообщение с 1 реакцией от кого-то
let msg = TestMessageBuilder::new("Growing", 100)
.reaction("👍", 1, false)
.build();
let client = client.with_message(123, msg);
let messages_before = client.get_messages(123);
assert_eq!(messages_before[0].reactions()[0].count, 1);
let msg_id = messages_before[0].id();
// Мы добавляем свою реакцию - счётчик должен увеличиться
client
.toggle_reaction(ChatId::new(123), msg_id, "👍".to_string())
.await
.unwrap();
let messages = client.get_messages(123);
assert_eq!(messages[0].reactions()[0].count, 2);
assert_eq!(messages[0].reactions()[0].is_chosen, true);
}
/// Test: Обновление реакции - мы добавили свою к существующим
#[tokio::test]
async fn test_update_reaction_we_add_ours() {
let client = FakeTdClient::new();
// Изначально: 2 человека, но не мы
let msg_before = TestMessageBuilder::new("Update", 100)
.reaction("🔥", 2, false)
.build();
let client = client.with_message(123, msg_before);
let messages_before = client.get_messages(123);
assert_eq!(messages_before[0].reactions()[0].count, 2);
assert_eq!(messages_before[0].reactions()[0].is_chosen, false);
let msg_id = messages_before[0].id();
// Добавляем нашу реакцию
client
.toggle_reaction(ChatId::new(123), msg_id, "🔥".to_string())
.await
.unwrap();
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
#[tokio::test]
async fn test_single_reaction_shows_only_emoji() {
let client = FakeTdClient::new();
let msg = TestMessageBuilder::new("Single", 100)
.reaction("❤️", 1, true)
.build();
let 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: Реакции на несколько сообщений
#[tokio::test]
async fn test_reactions_on_multiple_messages() {
let 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();
let 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);
}