diff --git a/app/models/account.rb b/app/models/account.rb index 3b3dc09f0e..7170cbe1e2 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -399,6 +399,7 @@ class Account < ApplicationRecord def allow_emoji_reaction?(account) return false if account.nil? + return true unless local? || account.local? show_emoji_reaction?(account) end diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index c13d57c761..5cdc31ecd9 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -246,6 +246,207 @@ RSpec.describe Account do end end + describe '#allow_emoji_reaction?' do + let(:policy) { :allow } + let(:reactioned) { Fabricate(:user, settings: { emoji_reaction_policy: policy }).account } + let(:followee) { Fabricate(:account) } + let(:follower) { Fabricate(:account) } + let(:mutual) { Fabricate(:account) } + let(:anyone) { Fabricate(:account) } + + before do + follower.follow!(reactioned) + reactioned.follow!(followee) + mutual.follow!(reactioned) + reactioned.follow!(mutual) + end + + context 'when policy is arrow' do + it 'allows anyone' do + expect(reactioned.allow_emoji_reaction?(anyone)).to be true + end + + it 'allows followee' do + expect(reactioned.allow_emoji_reaction?(followee)).to be true + end + + it 'allows follower' do + expect(reactioned.allow_emoji_reaction?(follower)).to be true + end + + it 'allows mutual' do + expect(reactioned.allow_emoji_reaction?(mutual)).to be true + end + + it 'allows self' do + expect(reactioned.allow_emoji_reaction?(reactioned)).to be true + end + end + + context 'when policy is following_only' do + let(:policy) { :following_only } + + it 'allows anyone' do + expect(reactioned.allow_emoji_reaction?(anyone)).to be false + end + + it 'allows followee' do + expect(reactioned.allow_emoji_reaction?(followee)).to be true + end + + it 'allows follower' do + expect(reactioned.allow_emoji_reaction?(follower)).to be false + end + + it 'allows mutual' do + expect(reactioned.allow_emoji_reaction?(mutual)).to be true + end + + it 'allows self' do + expect(reactioned.allow_emoji_reaction?(reactioned)).to be true + end + end + + context 'when policy is followers_only' do + let(:policy) { :followers_only } + + it 'allows anyone' do + expect(reactioned.allow_emoji_reaction?(anyone)).to be false + end + + it 'allows followee' do + expect(reactioned.allow_emoji_reaction?(followee)).to be false + end + + it 'allows follower' do + expect(reactioned.allow_emoji_reaction?(follower)).to be true + end + + it 'allows mutual' do + expect(reactioned.allow_emoji_reaction?(mutual)).to be true + end + + it 'allows self' do + expect(reactioned.allow_emoji_reaction?(reactioned)).to be true + end + end + + context 'when policy is mutuals_only' do + let(:policy) { :mutuals_only } + + it 'allows anyone' do + expect(reactioned.allow_emoji_reaction?(anyone)).to be false + end + + it 'allows followee' do + expect(reactioned.allow_emoji_reaction?(followee)).to be false + end + + it 'allows follower' do + expect(reactioned.allow_emoji_reaction?(follower)).to be false + end + + it 'allows mutual' do + expect(reactioned.allow_emoji_reaction?(mutual)).to be true + end + + it 'allows self' do + expect(reactioned.allow_emoji_reaction?(reactioned)).to be true + end + end + + context 'when policy is outside_only' do + let(:policy) { :outside_only } + + it 'allows anyone' do + expect(reactioned.allow_emoji_reaction?(anyone)).to be false + end + + it 'allows followee' do + expect(reactioned.allow_emoji_reaction?(followee)).to be true + end + + it 'allows follower' do + expect(reactioned.allow_emoji_reaction?(follower)).to be true + end + + it 'allows mutual' do + expect(reactioned.allow_emoji_reaction?(mutual)).to be true + end + + it 'allows self' do + expect(reactioned.allow_emoji_reaction?(reactioned)).to be true + end + end + + context 'when policy is block' do + let(:policy) { :block } + + it 'allows anyone' do + expect(reactioned.allow_emoji_reaction?(anyone)).to be false + end + + it 'allows followee' do + expect(reactioned.allow_emoji_reaction?(followee)).to be false + end + + it 'allows follower' do + expect(reactioned.allow_emoji_reaction?(follower)).to be false + end + + it 'allows mutual' do + expect(reactioned.allow_emoji_reaction?(mutual)).to be false + end + + it 'allows self' do + expect(reactioned.allow_emoji_reaction?(reactioned)).to be false + end + end + + context 'when reactioned is remote user' do + let(:reactioned) { Fabricate(:account, domain: 'foo.bar', uri: 'https://foo.bar/actor', settings: { emoji_reaction_policy: :following_only }) } + + it 'allows anyone' do + expect(reactioned.allow_emoji_reaction?(anyone)).to be false + end + + it 'allows followee' do + expect(reactioned.allow_emoji_reaction?(followee)).to be true + end + end + + context 'when reactor is remote user' do + let(:anyone) { Fabricate(:account, domain: 'foo.bar', uri: 'https://foo.bar/actor/anyone') } + let(:policy) { :following_only } + + it 'allows anyone' do + expect(reactioned.allow_emoji_reaction?(anyone)).to be false + end + + it 'allows followee' do + expect(reactioned.allow_emoji_reaction?(followee)).to be true + end + end + + context 'when both are remote user' do + let(:reactioned) { Fabricate(:account, domain: 'foo.bar', uri: 'https://foo.bar/actor', settings: { emoji_reaction_policy: policy }) } + let(:anyone) { Fabricate(:account, domain: 'foo.bar', uri: 'https://foo.bar/actor/anyone') } + let(:followee) { Fabricate(:account, domain: 'foo.bar', uri: 'https://foo.bar/actor/followee') } + + it 'allows anyone' do + expect(reactioned.allow_emoji_reaction?(anyone)).to be true + end + + context 'with blocking' do + let(:policy) { :block } + + it 'allows anyone' do + expect(reactioned.allow_emoji_reaction?(anyone)).to be true + end + end + end + end + describe '#favourited?' do subject { Fabricate(:account) }