From 08f2fcb72b6457b14fa7d2f9bbc9812f0de751c0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?KMY=EF=BC=88=E9=9B=AA=E3=81=82=E3=81=99=E3=81=8B=EF=BC=89?=
 <tt@kmycode.net>
Date: Fri, 15 Dec 2023 10:18:43 +0900
Subject: [PATCH] =?UTF-8?q?Test:=20=E3=82=B9=E3=82=BF=E3=83=B3=E3=83=97?=
 =?UTF-8?q?=E9=96=A2=E4=BF=82=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88=E3=82=92?=
 =?UTF-8?q?=E5=85=B1=E9=80=9A=E5=8C=96=20(#361)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 spec/models/account_spec.rb | 184 ++++++++----------------------------
 1 file changed, 42 insertions(+), 142 deletions(-)

diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb
index 80e27c6b36..60c964fee4 100644
--- a/spec/models/account_spec.rb
+++ b/spec/models/account_spec.rb
@@ -270,162 +270,62 @@ RSpec.describe Account do
       reactioned.follow!(mutual)
     end
 
-    context 'when policy is arrow' do
-      it 'allows anyone' do
-        expect(reactioned.allow_emoji_reaction?(anyone)).to be true
-      end
+    shared_examples 'with policy' do |override_policy, anyone_r, followee_r, follower_r, mutual_r, self_r| # rubocop:disable Metrics/ParameterLists
+      context "when policy is #{override_policy}" do
+        let(:policy) { override_policy }
 
-      it 'allows followee' do
-        expect(reactioned.allow_emoji_reaction?(followee)).to be true
-      end
+        it 'allows anyone' do
+          expect(reactioned.allow_emoji_reaction?(anyone)).to be anyone_r
+        end
 
-      it 'allows follower' do
-        expect(reactioned.allow_emoji_reaction?(follower)).to be true
-      end
+        it 'allows followee' do
+          expect(reactioned.allow_emoji_reaction?(followee)).to be followee_r
+        end
 
-      it 'allows mutual' do
-        expect(reactioned.allow_emoji_reaction?(mutual)).to be true
-      end
+        it 'allows follower' do
+          expect(reactioned.allow_emoji_reaction?(follower)).to be follower_r
+        end
 
-      it 'allows self' do
-        expect(reactioned.allow_emoji_reaction?(reactioned)).to be true
+        it 'allows mutual' do
+          expect(reactioned.allow_emoji_reaction?(mutual)).to be mutual_r
+        end
+
+        it 'allows self' do
+          expect(reactioned.allow_emoji_reaction?(reactioned)).to be self_r
+        end
       end
     end
 
-    context 'when policy is following_only' do
-      let(:policy) { :following_only }
+    it_behaves_like 'with policy', :allow, true, true, true, true, true
+    it_behaves_like 'with policy', :outside_only, false, true, true, true, true
+    it_behaves_like 'with policy', :following_only, false, true, false, true, true
+    it_behaves_like 'with policy', :followers_only, false, false, true, true, true
+    it_behaves_like 'with policy', :mutuals_only, false, false, false, true, true
+    it_behaves_like 'with policy', :block, false, false, false, false, false
 
-      it 'allows anyone' do
-        expect(reactioned.allow_emoji_reaction?(anyone)).to be false
-      end
+    shared_examples 'allow local only' do |override_policy|
+      context "when policy is #{override_policy} but allow local only" do
+        let(:policy) { override_policy }
+        let(:allow_local) { true }
+        let(:local) { Fabricate(:user).account }
+        let(:remote) { Fabricate(:account, domain: 'example.com', uri: 'https://example.com/actor') }
 
-      it 'allows followee' do
-        expect(reactioned.allow_emoji_reaction?(followee)).to be true
-      end
+        before do
+          local.follow!(remote) if override_policy == :following_only
+        end
 
-      it 'allows follower' do
-        expect(reactioned.allow_emoji_reaction?(follower)).to be false
-      end
+        it 'does not allow remote' do
+          expect(reactioned.allow_emoji_reaction?(remote)).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
+        it 'allows local' do
+          expect(reactioned.allow_emoji_reaction?(local)).to be true
+        end
       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 policy is block but allow local only' do
-      let(:policy) { :block }
-      let(:allow_local) { true }
-      let(:local) { Fabricate(:user).account }
-      let(:remote) { Fabricate(:account, domain: 'example.com', uri: 'https://example.com/actor') }
-
-      it 'does not allow remote' do
-        expect(reactioned.allow_emoji_reaction?(remote)).to be false
-      end
-
-      it 'allows local' do
-        expect(reactioned.allow_emoji_reaction?(local)).to be true
-      end
-    end
+    it_behaves_like 'allow local only', :following_only
+    it_behaves_like 'allow local only', :block
 
     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 }) }