diff --git a/app/services/emoji_react_service.rb b/app/services/emoji_react_service.rb index 5e30e005d6cafa..f8bc622d1f782f 100644 --- a/app/services/emoji_react_service.rb +++ b/app/services/emoji_react_service.rb @@ -17,14 +17,14 @@ def call(account, status, name) @status = status with_redis_lock("emoji_reaction:#{status.id}") do - @emoji_reaction = EmojiReaction.find_by(account: account, status: status, name: name) - raise Mastodon::ValidationError, I18n.t('reactions.errors.duplication') unless @emoji_reaction.nil? - shortcode, domain = name.split('@') domain = nil if TagManager.instance.local_domain?(domain) custom_emoji = CustomEmoji.find_by(shortcode: shortcode, domain: domain) return if domain.present? && !EmojiReaction.exists?(status: status, custom_emoji: custom_emoji) + @emoji_reaction = EmojiReaction.find_by(account: account, status: status, name: shortcode, custom_emoji: custom_emoji) + raise Mastodon::ValidationError, I18n.t('reactions.errors.duplication') unless @emoji_reaction.nil? + @emoji_reaction = EmojiReaction.create!(account: account, status: status, name: shortcode, custom_emoji: custom_emoji) status.touch # rubocop:disable Rails/SkipsModelValidations diff --git a/spec/services/emoji_react_service_spec.rb b/spec/services/emoji_react_service_spec.rb index bf03eb5bf8cda3..8ba0466ef111e5 100644 --- a/spec/services/emoji_react_service_spec.rb +++ b/spec/services/emoji_react_service_spec.rb @@ -19,15 +19,6 @@ expect(subject.first.custom_emoji_id).to be_nil end - context 'with name duplication on same account' do - before { Fabricate(:emoji_reaction, status: status, name: '😀') } - - it 'react with emoji' do - expect(subject.count).to eq 1 - expect(subject.first.name).to eq '😀' - end - end - context 'when multiple reactions by same account' do let(:name) { '😂' } @@ -139,6 +130,37 @@ end end + context 'with name duplication of unicode emoji on same account' do + before { Fabricate(:emoji_reaction, status: status, name: '😀') } + + it 'react with emoji' do + expect(subject.count).to eq 1 + expect(subject.first.name).to eq '😀' + end + end + + context 'with name duplication of local cuetom emoji on same account' do + let(:name) { 'ohagi' } + let!(:custom_emoji) { Fabricate(:custom_emoji, shortcode: 'ohagi') } + + before { Fabricate(:emoji_reaction, account: sender, status: status, name: 'ohagi', custom_emoji: custom_emoji) } + + it 'react with emoji' do + expect { subject.count }.to raise_error Mastodon::ValidationError + end + end + + context 'with name duplication of remote cuetom emoji on same account' do + let(:name) { 'ohagi@foo.bar' } + let!(:custom_emoji) { Fabricate(:custom_emoji, shortcode: 'ohagi', domain: 'foo.bar', uri: 'https://foo.bar/emoji/ohagi') } + + before { Fabricate(:emoji_reaction, account: sender, status: status, name: 'ohagi', custom_emoji: custom_emoji) } + + it 'react with emoji' do + expect { subject.count }.to raise_error Mastodon::ValidationError + end + end + context 'when has remote followers' do let!(:bob) { Fabricate(:account, domain: 'foo.bar', uri: 'https://foo.bar/actor', inbox_url: 'https://foo.bar/inbox', protocol: 'activitypub') }