]> cat aescling's git repositories - mastodon.git/commitdiff
Fix not being able to unbookmark toots when blocked by their author (#14604)
authorThibG <thib@sitedethib.com>
Wed, 19 Aug 2020 17:02:06 +0000 (19:02 +0200)
committerGitHub <noreply@github.com>
Wed, 19 Aug 2020 17:02:06 +0000 (19:02 +0200)
* Fix not being able to unbookmark toots when blocked by their author

* Add tests

app/controllers/api/v1/statuses/bookmarks_controller.rb
spec/controllers/api/v1/statuses/bookmarks_controller_spec.rb

index 3954af3c9bf2f16e9dd9574f7884c88e221c1889..19963c002ad3d46043052f6afc17d85ce9060b4d 100644 (file)
@@ -5,7 +5,7 @@ class Api::V1::Statuses::BookmarksController < Api::BaseController
 
   before_action -> { doorkeeper_authorize! :write, :'write:bookmarks' }
   before_action :require_user!
-  before_action :set_status
+  before_action :set_status, only: [:create]
 
   def create
     current_account.bookmarks.find_or_create_by!(account: current_account, status: @status)
@@ -13,10 +13,20 @@ class Api::V1::Statuses::BookmarksController < Api::BaseController
   end
 
   def destroy
-    bookmark = current_account.bookmarks.find_by(status: @status)
+    bookmark = current_account.bookmarks.find_by(status_id: params[:status_id])
+
+    if bookmark
+      @status = bookmark.status
+    else
+      @status = Status.find(params[:status_id])
+      authorize @status, :show?
+    end
+
     bookmark&.destroy!
 
     render json: @status, serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new([@status], current_account.id, bookmarks_map: { @status.id => false })
+  rescue Mastodon::NotPermittedError
+    not_found
   end
 
   private
index aa5ca433fb794e38c1c80b24cfa7da74429174e3..7c75a4f7383d4bb1833628d0851c348120bf954f 100644 (file)
@@ -72,6 +72,31 @@ describe Api::V1::Statuses::BookmarksController do
         end
       end
 
+      context 'with public status when blocked by its author' do
+        let(:status) { Fabricate(:status) }
+
+        before do
+          Bookmark.find_or_create_by!(account: user.account, status: status)
+          status.account.block!(user.account)
+          post :destroy, params: { status_id: status.id }
+        end
+
+        it 'returns http success' do
+          expect(response).to have_http_status(200)
+        end
+
+        it 'updates the bookmarked attribute' do
+          expect(user.account.bookmarked?(status)).to be false
+        end
+
+        it 'returns json with updated attributes' do
+          hash_body = body_as_json
+
+          expect(hash_body[:id]).to eq status.id.to_s
+          expect(hash_body[:bookmarked]).to be false
+        end
+      end
+
       context 'with private status that was not bookmarked' do
         let(:status) { Fabricate(:status, visibility: :private) }