fixes
Some checks 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

This commit is contained in:
Mikhail Kilin
2026-01-29 01:22:57 +03:00
parent 68a2b7a982
commit 126c7482af
39 changed files with 2861 additions and 74 deletions

243
tests/reactions.rs Normal file
View File

@@ -0,0 +1,243 @@
// 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);
}