// 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); }