before_action -> { doorkeeper_authorize! :write, :'write:statuses' }
before_action :require_user!
- before_action :set_reblog
+ before_action :set_reblog, only: [:create]
override_rate_limit_headers :create, family: :statuses
end
def destroy
- @status = current_account.statuses.find_by(reblog_of_id: @reblog.id)
+ @status = current_account.statuses.find_by(reblog_of_id: params[:status_id])
if @status
authorize @status, :unreblog?
@status.discard
RemovalWorker.perform_async(@status.id)
+ @reblog = @status.reblog
+ else
+ @reblog = Status.find(params[:status_id])
+ authorize @reblog, :show?
end
render json: @reblog, serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new([@status], current_account.id, reblogs_map: { @reblog.id => false })
+ rescue Mastodon::NotPermittedError
+ not_found
end
private
end
end
+ context 'with public status when blocked by its author' do
+ let(:status) { Fabricate(:status, account: user.account) }
+
+ before do
+ ReblogService.new.call(user.account, 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 reblogs count' do
+ expect(status.reblogs.count).to eq 0
+ end
+
+ it 'updates the reblogged attribute' do
+ expect(user.account.reblogged?(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[:reblogs_count]).to eq 0
+ expect(hash_body[:reblogged]).to be false
+ end
+ end
+
context 'with private status that was not reblogged' do
let(:status) { Fabricate(:status, visibility: :private) }