Migrate to request specs in /api/v1/statuses/:status_id/favourite (#25626)
				
					
				
			This commit is contained in:
		
							parent
							
								
									6fb4a756ff
								
							
						
					
					
						commit
						19208aa422
					
				
					 2 changed files with 143 additions and 123 deletions
				
			
		| 
						 | 
				
			
			@ -1,123 +0,0 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require 'rails_helper'
 | 
			
		||||
 | 
			
		||||
describe Api::V1::Statuses::FavouritesController do
 | 
			
		||||
  render_views
 | 
			
		||||
 | 
			
		||||
  let(:user)  { Fabricate(:user) }
 | 
			
		||||
  let(:app)   { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') }
 | 
			
		||||
  let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:favourites', application: app) }
 | 
			
		||||
 | 
			
		||||
  context 'with an oauth token' do
 | 
			
		||||
    before do
 | 
			
		||||
      allow(controller).to receive(:doorkeeper_token) { token }
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    describe 'POST #create' do
 | 
			
		||||
      let(:status) { Fabricate(:status, account: user.account) }
 | 
			
		||||
 | 
			
		||||
      before do
 | 
			
		||||
        post :create, params: { status_id: status.id }
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      context 'with public status' do
 | 
			
		||||
        it 'returns http success' do
 | 
			
		||||
          expect(response).to have_http_status(200)
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        it 'updates the favourites count' do
 | 
			
		||||
          expect(status.favourites.count).to eq 1
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        it 'updates the favourited attribute' do
 | 
			
		||||
          expect(user.account.favourited?(status)).to be true
 | 
			
		||||
        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[:favourites_count]).to eq 1
 | 
			
		||||
          expect(hash_body[:favourited]).to be true
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      context 'with private status of not-followed account' do
 | 
			
		||||
        let(:status) { Fabricate(:status, visibility: :private) }
 | 
			
		||||
 | 
			
		||||
        it 'returns http not found' do
 | 
			
		||||
          expect(response).to have_http_status(404)
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    describe 'POST #destroy' do
 | 
			
		||||
      context 'with public status' do
 | 
			
		||||
        let(:status) { Fabricate(:status, account: user.account) }
 | 
			
		||||
 | 
			
		||||
        before do
 | 
			
		||||
          FavouriteService.new.call(user.account, status)
 | 
			
		||||
          post :destroy, params: { status_id: status.id }
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        it 'returns http success' do
 | 
			
		||||
          expect(response).to have_http_status(200)
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        it 'updates the favourites count' do
 | 
			
		||||
          expect(status.favourites.count).to eq 0
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        it 'updates the favourited attribute' do
 | 
			
		||||
          expect(user.account.favourited?(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[:favourites_count]).to eq 0
 | 
			
		||||
          expect(hash_body[:favourited]).to be false
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      context 'with public status when blocked by its author' do
 | 
			
		||||
        let(:status) { Fabricate(:status) }
 | 
			
		||||
 | 
			
		||||
        before do
 | 
			
		||||
          FavouriteService.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 favourite attribute' do
 | 
			
		||||
          expect(user.account.favourited?(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[:favourited]).to be false
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      context 'with private status that was not favourited' do
 | 
			
		||||
        let(:status) { Fabricate(:status, visibility: :private) }
 | 
			
		||||
 | 
			
		||||
        before do
 | 
			
		||||
          post :destroy, params: { status_id: status.id }
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        it 'returns http not found' do
 | 
			
		||||
          expect(response).to have_http_status(404)
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										143
									
								
								spec/requests/api/v1/statuses/favourites_spec.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								spec/requests/api/v1/statuses/favourites_spec.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,143 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require 'rails_helper'
 | 
			
		||||
 | 
			
		||||
RSpec.describe 'Favourites' do
 | 
			
		||||
  let(:user)    { Fabricate(:user) }
 | 
			
		||||
  let(:scopes)  { 'write:favourites' }
 | 
			
		||||
  let(:token)   { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
 | 
			
		||||
  let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }
 | 
			
		||||
 | 
			
		||||
  describe 'POST /api/v1/statuses/:status_id/favourite' do
 | 
			
		||||
    subject do
 | 
			
		||||
      post "/api/v1/statuses/#{status.id}/favourite", headers: headers
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    let(:status) { Fabricate(:status) }
 | 
			
		||||
 | 
			
		||||
    it_behaves_like 'forbidden for wrong scope', 'read read:favourites'
 | 
			
		||||
 | 
			
		||||
    context 'with public status' do
 | 
			
		||||
      it 'favourites the status successfully', :aggregate_failures do
 | 
			
		||||
        subject
 | 
			
		||||
 | 
			
		||||
        expect(response).to have_http_status(200)
 | 
			
		||||
        expect(user.account.favourited?(status)).to be true
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'returns json with updated attributes' do
 | 
			
		||||
        subject
 | 
			
		||||
 | 
			
		||||
        expect(body_as_json).to match(
 | 
			
		||||
          a_hash_including(id: status.id.to_s, favourites_count: 1, favourited: true)
 | 
			
		||||
        )
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    context 'with private status of not-followed account' do
 | 
			
		||||
      let(:status) { Fabricate(:status, visibility: :private) }
 | 
			
		||||
 | 
			
		||||
      it 'returns http not found' do
 | 
			
		||||
        subject
 | 
			
		||||
 | 
			
		||||
        expect(response).to have_http_status(404)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    context 'with private status of followed account' do
 | 
			
		||||
      let(:status) { Fabricate(:status, visibility: :private) }
 | 
			
		||||
 | 
			
		||||
      before do
 | 
			
		||||
        user.account.follow!(status.account)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'favourites the status successfully', :aggregate_failures do
 | 
			
		||||
        subject
 | 
			
		||||
 | 
			
		||||
        expect(response).to have_http_status(200)
 | 
			
		||||
        expect(user.account.favourited?(status)).to be true
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    context 'without an authorization header' do
 | 
			
		||||
      let(:headers) { {} }
 | 
			
		||||
 | 
			
		||||
      it 'returns http unauthorized' do
 | 
			
		||||
        subject
 | 
			
		||||
 | 
			
		||||
        expect(response).to have_http_status(401)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe 'POST /api/v1/statuses/:status_id/unfavourite' do
 | 
			
		||||
    subject do
 | 
			
		||||
      post "/api/v1/statuses/#{status.id}/unfavourite", headers: headers
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    let(:status) { Fabricate(:status) }
 | 
			
		||||
 | 
			
		||||
    it_behaves_like 'forbidden for wrong scope', 'read read:favourites'
 | 
			
		||||
 | 
			
		||||
    context 'with public status' do
 | 
			
		||||
      before do
 | 
			
		||||
        FavouriteService.new.call(user.account, status)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'unfavourites the status successfully', :aggregate_failures do
 | 
			
		||||
        subject
 | 
			
		||||
 | 
			
		||||
        expect(response).to have_http_status(200)
 | 
			
		||||
        expect(user.account.favourited?(status)).to be false
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'returns json with updated attributes' do
 | 
			
		||||
        subject
 | 
			
		||||
 | 
			
		||||
        expect(body_as_json).to match(
 | 
			
		||||
          a_hash_including(id: status.id.to_s, favourites_count: 0, favourited: false)
 | 
			
		||||
        )
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    context 'when the requesting user was blocked by the status author' do
 | 
			
		||||
      before do
 | 
			
		||||
        FavouriteService.new.call(user.account, status)
 | 
			
		||||
        status.account.block!(user.account)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'unfavourites the status successfully', :aggregate_failures do
 | 
			
		||||
        subject
 | 
			
		||||
 | 
			
		||||
        expect(response).to have_http_status(200)
 | 
			
		||||
        expect(user.account.favourited?(status)).to be false
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'returns json with updated attributes' do
 | 
			
		||||
        subject
 | 
			
		||||
 | 
			
		||||
        expect(body_as_json).to match(
 | 
			
		||||
          a_hash_including(id: status.id.to_s, favourites_count: 0, favourited: false)
 | 
			
		||||
        )
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    context 'when status is not favourited' do
 | 
			
		||||
      it 'returns http success' do
 | 
			
		||||
        subject
 | 
			
		||||
 | 
			
		||||
        expect(response).to have_http_status(200)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    context 'with private status that was not favourited' do
 | 
			
		||||
      let(:status) { Fabricate(:status, visibility: :private) }
 | 
			
		||||
 | 
			
		||||
      it 'returns http not found' do
 | 
			
		||||
        subject
 | 
			
		||||
 | 
			
		||||
        expect(response).to have_http_status(404)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
		Reference in a new issue