about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--app/services/follow_service.rb2
-rw-r--r--spec/services/follow_service_spec.rb34
2 files changed, 36 insertions, 0 deletions
diff --git a/app/services/follow_service.rb b/app/services/follow_service.rb
index 23e721fac..4de75e98d 100644
--- a/app/services/follow_service.rb
+++ b/app/services/follow_service.rb
@@ -12,6 +12,8 @@ class FollowService < BaseService
     raise ActiveRecord::RecordNotFound if target_account.nil? || target_account.id == source_account.id || target_account.suspended?
     raise Mastodon::NotPermittedError  if target_account.blocking?(source_account) || source_account.blocking?(target_account)
 
+    return if source_account.following?(target_account)
+
     if target_account.locked?
       request_follow(source_account, target_account)
     else
diff --git a/spec/services/follow_service_spec.rb b/spec/services/follow_service_spec.rb
index bda5daee1..32dedb3ad 100644
--- a/spec/services/follow_service_spec.rb
+++ b/spec/services/follow_service_spec.rb
@@ -29,6 +29,19 @@ RSpec.describe FollowService do
         expect(sender.following?(bob)).to be true
       end
     end
+
+    describe 'already followed account' do
+      let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account }
+
+      before do
+        sender.follow!(bob)
+        subject.call(sender, bob.acct)
+      end
+
+      it 'keeps a following relation' do
+        expect(sender.following?(bob)).to be true
+      end
+    end
   end
 
   context 'remote account' do
@@ -76,5 +89,26 @@ RSpec.describe FollowService do
         expect(a_request(:post, "http://hub.example.com/")).to have_been_made.once
       end
     end
+
+    describe 'already followed account' do
+      let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', domain: 'example.com', salmon_url: 'http://salmon.example.com', hub_url: 'http://hub.example.com')).account }
+
+      before do
+        sender.follow!(bob)
+        subject.call(sender, bob.acct)
+      end
+
+      it 'keeps a following relation' do
+        expect(sender.following?(bob)).to be true
+      end
+
+      it 'does not send a follow salmon slap' do
+        expect(a_request(:post, "http://salmon.example.com/")).not_to have_been_made
+      end
+
+      it 'does not subscribe to PuSH' do
+        expect(a_request(:post, "http://hub.example.com/")).not_to have_been_made
+      end
+    end
   end
 end