diff --git a/app/controllers/telegram_bot_updates_controller.rb b/app/controllers/telegram_bot_updates_controller.rb index 1f343b8..5ccaa3d 100644 --- a/app/controllers/telegram_bot_updates_controller.rb +++ b/app/controllers/telegram_bot_updates_controller.rb @@ -28,13 +28,15 @@ private end def handle_user(user) - TelegramUser.create!( - remote_telegram_id: user[:id], - is_bot: user[:is_bot], - first_name: user[:first_name], - last_name: user[:last_name], - username: user[:username], - language_code: user[:language_code], - ) + telegram_user = + TelegramUser.find_or_initialize_by remote_telegram_id: user[:id] + + telegram_user.is_bot = user[:is_bot] + telegram_user.first_name = user[:first_name] + telegram_user.last_name = user[:last_name] + telegram_user.username = user[:username] + telegram_user.language_code = user[:language_code] + + telegram_user.save! end end diff --git a/spec/requests/telegram_bot_updates/create_spec.rb b/spec/requests/telegram_bot_updates/create_spec.rb index 13f6a9f..7be9c14 100644 --- a/spec/requests/telegram_bot_updates/create_spec.rb +++ b/spec/requests/telegram_bot_updates/create_spec.rb @@ -86,4 +86,55 @@ RSpec.describe 'POST /telegram_bot_updates' do end end end + + context 'when message "from" attribute is set and ' \ + 'Telegram user already exist' do + let! :telegram_user do + create :telegram_user, remote_telegram_id: remote_telegram_id + end + + def make_request + post '/telegram_bot_updates', + params: { telegram_bot_id: telegram_bot.id, + secret: telegram_bot.secret, + message: { from: telegram_user_attributes } } + end + + let :telegram_user_attributes do + { + id: remote_telegram_id, + is_bot: is_bot, + first_name: first_name, + last_name: last_name, + username: username, + language_code: language_code, + } + end + + let(:remote_telegram_id) { rand 1..1_000_000 } + let(:is_bot) { [false, true].sample } + let(:first_name) { Faker::Name.first_name } + let(:last_name) { Faker::Name.last_name } + let(:username) { Faker::Internet.username } + let(:language_code) { I18n.available_locales.sample.to_s } + + specify do + expect { make_request }.not_to change(TelegramUser, :count).from(1) + end + + context 'after request' do + before { make_request } + + specify do + expect(TelegramUser.last).to have_attributes( + remote_telegram_id: remote_telegram_id, + is_bot: is_bot, + first_name: first_name, + last_name: last_name, + username: username, + language_code: language_code, + ) + end + end + end end