Spec coverage and refactor for the api/v1/accounts controllers (#3451)
This commit is contained in:
		
							parent
							
								
									81ce4e4318
								
							
						
					
					
						commit
						1066fd1ab5
					
				
					 18 changed files with 579 additions and 230 deletions
				
			
		
							
								
								
									
										23
									
								
								app/controllers/api/v1/accounts/credentials_controller.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								app/controllers/api/v1/accounts/credentials_controller.rb
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,23 @@
 | 
				
			||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Api::V1::Accounts::CredentialsController < ApiController
 | 
				
			||||||
 | 
					  before_action -> { doorkeeper_authorize! :write }, only: [:update]
 | 
				
			||||||
 | 
					  before_action :require_user!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def show
 | 
				
			||||||
 | 
					    @account = current_account
 | 
				
			||||||
 | 
					    render 'api/v1/accounts/show'
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def update
 | 
				
			||||||
 | 
					    current_account.update!(account_params)
 | 
				
			||||||
 | 
					    @account = current_account
 | 
				
			||||||
 | 
					    render 'api/v1/accounts/show'
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def account_params
 | 
				
			||||||
 | 
					    params.permit(:display_name, :note, :avatar, :header)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,68 @@
 | 
				
			||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Api::V1::Accounts::FollowerAccountsController < ApiController
 | 
				
			||||||
 | 
					  before_action -> { doorkeeper_authorize! :read }
 | 
				
			||||||
 | 
					  before_action :set_account
 | 
				
			||||||
 | 
					  after_action :insert_pagination_headers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  respond_to :json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def index
 | 
				
			||||||
 | 
					    @accounts = load_accounts
 | 
				
			||||||
 | 
					    render 'api/v1/accounts/index'
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def set_account
 | 
				
			||||||
 | 
					    @account = Account.find(params[:account_id])
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def load_accounts
 | 
				
			||||||
 | 
					    default_accounts.merge(paginated_follows).to_a
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def default_accounts
 | 
				
			||||||
 | 
					    Account.includes(:active_relationships).references(:active_relationships)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def paginated_follows
 | 
				
			||||||
 | 
					    Follow.where(target_account: @account).paginate_by_max_id(
 | 
				
			||||||
 | 
					      limit_param(DEFAULT_ACCOUNTS_LIMIT),
 | 
				
			||||||
 | 
					      params[:max_id],
 | 
				
			||||||
 | 
					      params[:since_id]
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def insert_pagination_headers
 | 
				
			||||||
 | 
					    set_pagination_headers(next_path, prev_path)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def next_path
 | 
				
			||||||
 | 
					    if records_continue?
 | 
				
			||||||
 | 
					      api_v1_account_followers_url pagination_params(max_id: pagination_max_id)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def prev_path
 | 
				
			||||||
 | 
					    unless @accounts.empty?
 | 
				
			||||||
 | 
					      api_v1_account_followers_url pagination_params(since_id: pagination_since_id)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def pagination_max_id
 | 
				
			||||||
 | 
					    @accounts.last.active_relationships.first.id
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def pagination_since_id
 | 
				
			||||||
 | 
					    @accounts.first.active_relationships.first.id
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def records_continue?
 | 
				
			||||||
 | 
					    @accounts.size == limit_param(DEFAULT_ACCOUNTS_LIMIT)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def pagination_params(core_params)
 | 
				
			||||||
 | 
					    params.permit(:limit).merge(core_params)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,68 @@
 | 
				
			||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Api::V1::Accounts::FollowingAccountsController < ApiController
 | 
				
			||||||
 | 
					  before_action -> { doorkeeper_authorize! :read }
 | 
				
			||||||
 | 
					  before_action :set_account
 | 
				
			||||||
 | 
					  after_action :insert_pagination_headers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  respond_to :json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def index
 | 
				
			||||||
 | 
					    @accounts = load_accounts
 | 
				
			||||||
 | 
					    render 'api/v1/accounts/index'
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def set_account
 | 
				
			||||||
 | 
					    @account = Account.find(params[:account_id])
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def load_accounts
 | 
				
			||||||
 | 
					    default_accounts.merge(paginated_follows).to_a
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def default_accounts
 | 
				
			||||||
 | 
					    Account.includes(:passive_relationships).references(:passive_relationships)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def paginated_follows
 | 
				
			||||||
 | 
					    Follow.where(account: @account).paginate_by_max_id(
 | 
				
			||||||
 | 
					      limit_param(DEFAULT_ACCOUNTS_LIMIT),
 | 
				
			||||||
 | 
					      params[:max_id],
 | 
				
			||||||
 | 
					      params[:since_id]
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def insert_pagination_headers
 | 
				
			||||||
 | 
					    set_pagination_headers(next_path, prev_path)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def next_path
 | 
				
			||||||
 | 
					    if records_continue?
 | 
				
			||||||
 | 
					      api_v1_account_following_index_url pagination_params(max_id: pagination_max_id)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def prev_path
 | 
				
			||||||
 | 
					    unless @accounts.empty?
 | 
				
			||||||
 | 
					      api_v1_account_following_index_url pagination_params(since_id: pagination_since_id)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def pagination_max_id
 | 
				
			||||||
 | 
					    @accounts.last.passive_relationships.first.id
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def pagination_since_id
 | 
				
			||||||
 | 
					    @accounts.first.passive_relationships.first.id
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def records_continue?
 | 
				
			||||||
 | 
					    @accounts.size == limit_param(DEFAULT_ACCOUNTS_LIMIT)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def pagination_params(core_params)
 | 
				
			||||||
 | 
					    params.permit(:limit).merge(core_params)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
							
								
								
									
										24
									
								
								app/controllers/api/v1/accounts/relationships_controller.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								app/controllers/api/v1/accounts/relationships_controller.rb
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,24 @@
 | 
				
			||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Api::V1::Accounts::RelationshipsController < ApiController
 | 
				
			||||||
 | 
					  before_action -> { doorkeeper_authorize! :read }
 | 
				
			||||||
 | 
					  before_action :require_user!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  respond_to :json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def index
 | 
				
			||||||
 | 
					    @accounts = Account.where(id: account_ids).select('id')
 | 
				
			||||||
 | 
					    @following = Account.following_map(account_ids, current_user.account_id)
 | 
				
			||||||
 | 
					    @followed_by = Account.followed_by_map(account_ids, current_user.account_id)
 | 
				
			||||||
 | 
					    @blocking = Account.blocking_map(account_ids, current_user.account_id)
 | 
				
			||||||
 | 
					    @muting = Account.muting_map(account_ids, current_user.account_id)
 | 
				
			||||||
 | 
					    @requested = Account.requested_map(account_ids, current_user.account_id)
 | 
				
			||||||
 | 
					    @domain_blocking = Account.domain_blocking_map(account_ids, current_user.account_id)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def account_ids
 | 
				
			||||||
 | 
					    @_account_ids ||= Array(params[:id]).map(&:to_i)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
							
								
								
									
										29
									
								
								app/controllers/api/v1/accounts/search_controller.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								app/controllers/api/v1/accounts/search_controller.rb
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,29 @@
 | 
				
			||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Api::V1::Accounts::SearchController < ApiController
 | 
				
			||||||
 | 
					  before_action -> { doorkeeper_authorize! :read }
 | 
				
			||||||
 | 
					  before_action :require_user!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  respond_to :json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def show
 | 
				
			||||||
 | 
					    @accounts = account_search
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    render 'api/v1/accounts/index'
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def account_search
 | 
				
			||||||
 | 
					    AccountSearchService.new.call(
 | 
				
			||||||
 | 
					      params[:q],
 | 
				
			||||||
 | 
					      limit_param(DEFAULT_ACCOUNTS_LIMIT),
 | 
				
			||||||
 | 
					      resolving_search?,
 | 
				
			||||||
 | 
					      current_account
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def resolving_search?
 | 
				
			||||||
 | 
					    params[:resolve] == 'true'
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
							
								
								
									
										92
									
								
								app/controllers/api/v1/accounts/statuses_controller.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								app/controllers/api/v1/accounts/statuses_controller.rb
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,92 @@
 | 
				
			||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Api::V1::Accounts::StatusesController < ApiController
 | 
				
			||||||
 | 
					  before_action -> { doorkeeper_authorize! :read }
 | 
				
			||||||
 | 
					  before_action :set_account
 | 
				
			||||||
 | 
					  after_action :insert_pagination_headers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  respond_to :json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def index
 | 
				
			||||||
 | 
					    @statuses = load_statuses
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def set_account
 | 
				
			||||||
 | 
					    @account = Account.find(params[:account_id])
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def load_statuses
 | 
				
			||||||
 | 
					    cached_account_statuses.tap do |statuses|
 | 
				
			||||||
 | 
					      set_maps(statuses)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def cached_account_statuses
 | 
				
			||||||
 | 
					    cache_collection account_statuses, Status
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def account_statuses
 | 
				
			||||||
 | 
					    default_statuses.tap do |statuses|
 | 
				
			||||||
 | 
					      statuses.merge!(only_media_scope) if params[:only_media]
 | 
				
			||||||
 | 
					      statuses.merge!(no_replies_scope) if params[:exclude_replies]
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def default_statuses
 | 
				
			||||||
 | 
					    permitted_account_statuses.paginate_by_max_id(
 | 
				
			||||||
 | 
					      limit_param(DEFAULT_STATUSES_LIMIT),
 | 
				
			||||||
 | 
					      params[:max_id],
 | 
				
			||||||
 | 
					      params[:since_id]
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def permitted_account_statuses
 | 
				
			||||||
 | 
					    @account.statuses.permitted_for(@account, current_account)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def only_media_scope
 | 
				
			||||||
 | 
					    Status.where(id: account_media_status_ids)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def account_media_status_ids
 | 
				
			||||||
 | 
					    @account.media_attachments.attached.reorder(nil).select(:status_id).distinct
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def no_replies_scope
 | 
				
			||||||
 | 
					    Status.without_replies
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def pagination_params(core_params)
 | 
				
			||||||
 | 
					    params.permit(:limit, :only_media, :exclude_replies).merge(core_params)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def insert_pagination_headers
 | 
				
			||||||
 | 
					    set_pagination_headers(next_path, prev_path)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def next_path
 | 
				
			||||||
 | 
					    if records_continue?
 | 
				
			||||||
 | 
					      api_v1_account_statuses_url pagination_params(max_id: pagination_max_id)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def prev_path
 | 
				
			||||||
 | 
					    unless @statuses.empty?
 | 
				
			||||||
 | 
					      api_v1_account_statuses_url pagination_params(since_id: pagination_since_id)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def records_continue?
 | 
				
			||||||
 | 
					    @statuses.size == limit_param(DEFAULT_STATUSES_LIMIT)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def pagination_max_id
 | 
				
			||||||
 | 
					    @statuses.last.id
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def pagination_since_id
 | 
				
			||||||
 | 
					    @statuses.first.id
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
| 
						 | 
					@ -1,73 +1,15 @@
 | 
				
			||||||
# frozen_string_literal: true
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Api::V1::AccountsController < ApiController
 | 
					class Api::V1::AccountsController < ApiController
 | 
				
			||||||
  before_action -> { doorkeeper_authorize! :read }, except: [:follow, :unfollow, :block, :unblock, :mute, :unmute, :update_credentials]
 | 
					  before_action -> { doorkeeper_authorize! :read }, except: [:follow, :unfollow, :block, :unblock, :mute, :unmute]
 | 
				
			||||||
  before_action -> { doorkeeper_authorize! :follow }, only: [:follow, :unfollow, :block, :unblock, :mute, :unmute]
 | 
					  before_action -> { doorkeeper_authorize! :follow }, only: [:follow, :unfollow, :block, :unblock, :mute, :unmute]
 | 
				
			||||||
  before_action -> { doorkeeper_authorize! :write }, only: [:update_credentials]
 | 
					  before_action :require_user!, except: [:show]
 | 
				
			||||||
  before_action :require_user!, except: [:show, :following, :followers, :statuses]
 | 
					  before_action :set_account
 | 
				
			||||||
  before_action :set_account, except: [:verify_credentials, :update_credentials, :suggestions, :search]
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  respond_to :json
 | 
					  respond_to :json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def show; end
 | 
					  def show; end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def verify_credentials
 | 
					 | 
				
			||||||
    @account = current_user.account
 | 
					 | 
				
			||||||
    render :show
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  def update_credentials
 | 
					 | 
				
			||||||
    current_account.update!(account_params)
 | 
					 | 
				
			||||||
    @account = current_account
 | 
					 | 
				
			||||||
    render :show
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  def following
 | 
					 | 
				
			||||||
    @accounts = Account.includes(:passive_relationships)
 | 
					 | 
				
			||||||
                       .references(:passive_relationships)
 | 
					 | 
				
			||||||
                       .merge(Follow.where(account: @account)
 | 
					 | 
				
			||||||
                                    .paginate_by_max_id(limit_param(DEFAULT_ACCOUNTS_LIMIT), params[:max_id], params[:since_id]))
 | 
					 | 
				
			||||||
                       .to_a
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    next_path = following_api_v1_account_url(pagination_params(max_id: @accounts.last.passive_relationships.first.id))     if @accounts.size == limit_param(DEFAULT_ACCOUNTS_LIMIT)
 | 
					 | 
				
			||||||
    prev_path = following_api_v1_account_url(pagination_params(since_id: @accounts.first.passive_relationships.first.id)) unless @accounts.empty?
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    set_pagination_headers(next_path, prev_path)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    render :index
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  def followers
 | 
					 | 
				
			||||||
    @accounts = Account.includes(:active_relationships)
 | 
					 | 
				
			||||||
                       .references(:active_relationships)
 | 
					 | 
				
			||||||
                       .merge(Follow.where(target_account: @account)
 | 
					 | 
				
			||||||
                                    .paginate_by_max_id(limit_param(DEFAULT_ACCOUNTS_LIMIT),
 | 
					 | 
				
			||||||
                                                        params[:max_id],
 | 
					 | 
				
			||||||
                                                        params[:since_id]))
 | 
					 | 
				
			||||||
                       .to_a
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    next_path = followers_api_v1_account_url(pagination_params(max_id: @accounts.last.active_relationships.first.id))     if @accounts.size == limit_param(DEFAULT_ACCOUNTS_LIMIT)
 | 
					 | 
				
			||||||
    prev_path = followers_api_v1_account_url(pagination_params(since_id: @accounts.first.active_relationships.first.id)) unless @accounts.empty?
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    set_pagination_headers(next_path, prev_path)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    render :index
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  def statuses
 | 
					 | 
				
			||||||
    @statuses = @account.statuses.permitted_for(@account, current_account).paginate_by_max_id(limit_param(DEFAULT_STATUSES_LIMIT), params[:max_id], params[:since_id])
 | 
					 | 
				
			||||||
    @statuses = @statuses.where(id: MediaAttachment.where(account: @account).where.not(status_id: nil).reorder('').select('distinct status_id')) if params[:only_media]
 | 
					 | 
				
			||||||
    @statuses = @statuses.without_replies if params[:exclude_replies]
 | 
					 | 
				
			||||||
    @statuses = cache_collection(@statuses, Status)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    set_maps(@statuses)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    next_path = statuses_api_v1_account_url(statuses_pagination_params(max_id: @statuses.last.id))    if @statuses.size == limit_param(DEFAULT_STATUSES_LIMIT)
 | 
					 | 
				
			||||||
    prev_path = statuses_api_v1_account_url(statuses_pagination_params(since_id: @statuses.first.id)) unless @statuses.empty?
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    set_pagination_headers(next_path, prev_path)
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  def follow
 | 
					  def follow
 | 
				
			||||||
    FollowService.new.call(current_user.account, @account.acct)
 | 
					    FollowService.new.call(current_user.account, @account.acct)
 | 
				
			||||||
    set_relationship
 | 
					    set_relationship
 | 
				
			||||||
| 
						 | 
					@ -111,24 +53,6 @@ class Api::V1::AccountsController < ApiController
 | 
				
			||||||
    render :relationship
 | 
					    render :relationship
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def relationships
 | 
					 | 
				
			||||||
    ids = params[:id].is_a?(Enumerable) ? params[:id].map(&:to_i) : [params[:id].to_i]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @accounts        = Account.where(id: ids).select('id')
 | 
					 | 
				
			||||||
    @following       = Account.following_map(ids, current_user.account_id)
 | 
					 | 
				
			||||||
    @followed_by     = Account.followed_by_map(ids, current_user.account_id)
 | 
					 | 
				
			||||||
    @blocking        = Account.blocking_map(ids, current_user.account_id)
 | 
					 | 
				
			||||||
    @muting          = Account.muting_map(ids, current_user.account_id)
 | 
					 | 
				
			||||||
    @requested       = Account.requested_map(ids, current_user.account_id)
 | 
					 | 
				
			||||||
    @domain_blocking = Account.domain_blocking_map(ids, current_user.account_id)
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  def search
 | 
					 | 
				
			||||||
    @accounts = AccountSearchService.new.call(params[:q], limit_param(DEFAULT_ACCOUNTS_LIMIT), params[:resolve] == 'true', current_account)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    render :index
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  private
 | 
					  private
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def set_account
 | 
					  def set_account
 | 
				
			||||||
| 
						 | 
					@ -143,16 +67,4 @@ class Api::V1::AccountsController < ApiController
 | 
				
			||||||
    @requested       = Account.requested_map([@account.id], current_user.account_id)
 | 
					    @requested       = Account.requested_map([@account.id], current_user.account_id)
 | 
				
			||||||
    @domain_blocking = Account.domain_blocking_map([@account.id], current_user.account_id)
 | 
					    @domain_blocking = Account.domain_blocking_map([@account.id], current_user.account_id)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					 | 
				
			||||||
  def pagination_params(core_params)
 | 
					 | 
				
			||||||
    params.permit(:limit).merge(core_params)
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  def statuses_pagination_params(core_params)
 | 
					 | 
				
			||||||
    params.permit(:limit, :only_media, :exclude_replies).merge(core_params)
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  def account_params
 | 
					 | 
				
			||||||
    params.permit(:display_name, :note, :avatar, :header)
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -169,19 +169,18 @@ Rails.application.routes.draw do
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      namespace :accounts do
 | 
				
			||||||
 | 
					        get :verify_credentials, to: 'credentials#show'
 | 
				
			||||||
 | 
					        patch :update_credentials, to: 'credentials#update'
 | 
				
			||||||
 | 
					        resource :search, only: :show, controller: :search
 | 
				
			||||||
 | 
					        resources :relationships, only: :index
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
      resources :accounts, only: [:show] do
 | 
					      resources :accounts, only: [:show] do
 | 
				
			||||||
        collection do
 | 
					        resources :statuses, only: :index, controller: 'accounts/statuses'
 | 
				
			||||||
          get :relationships
 | 
					        resources :followers, only: :index, controller: 'accounts/follower_accounts'
 | 
				
			||||||
          get :verify_credentials
 | 
					        resources :following, only: :index, controller: 'accounts/following_accounts'
 | 
				
			||||||
          patch :update_credentials
 | 
					 | 
				
			||||||
          get :search
 | 
					 | 
				
			||||||
        end
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        member do
 | 
					        member do
 | 
				
			||||||
          get :statuses
 | 
					 | 
				
			||||||
          get :followers
 | 
					 | 
				
			||||||
          get :following
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          post :follow
 | 
					          post :follow
 | 
				
			||||||
          post :unfollow
 | 
					          post :unfollow
 | 
				
			||||||
          post :block
 | 
					          post :block
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,55 @@
 | 
				
			||||||
 | 
					require 'rails_helper'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe Api::V1::Accounts::CredentialsController do
 | 
				
			||||||
 | 
					  render_views
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let(:user)  { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
 | 
				
			||||||
 | 
					  let(:token) { double acceptable?: true, resource_owner_id: user.id }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  before do
 | 
				
			||||||
 | 
					    allow(controller).to receive(:doorkeeper_token) { token }
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'GET #show' do
 | 
				
			||||||
 | 
					    it 'returns http success' do
 | 
				
			||||||
 | 
					      get :show
 | 
				
			||||||
 | 
					      expect(response).to have_http_status(:success)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'PATCH #update' do
 | 
				
			||||||
 | 
					    describe 'with valid data' do
 | 
				
			||||||
 | 
					      before do
 | 
				
			||||||
 | 
					        patch :update, params: {
 | 
				
			||||||
 | 
					          display_name: "Alice Isn't Dead",
 | 
				
			||||||
 | 
					          note: "Hi!\n\nToot toot!",
 | 
				
			||||||
 | 
					          avatar: fixture_file_upload('files/avatar.gif', 'image/gif'),
 | 
				
			||||||
 | 
					          header: fixture_file_upload('files/attachment.jpg', 'image/jpeg'),
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it 'returns http success' do
 | 
				
			||||||
 | 
					        expect(response).to have_http_status(:success)
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it 'updates account info' do
 | 
				
			||||||
 | 
					        user.account.reload
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        expect(user.account.display_name).to eq("Alice Isn't Dead")
 | 
				
			||||||
 | 
					        expect(user.account.note).to eq("Hi!\n\nToot toot!")
 | 
				
			||||||
 | 
					        expect(user.account.avatar).to exist
 | 
				
			||||||
 | 
					        expect(user.account.header).to exist
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    describe 'with invalid data' do
 | 
				
			||||||
 | 
					      before do
 | 
				
			||||||
 | 
					        patch :update, params: { note: 'This is too long. ' * 10 }
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it 'returns http unprocessable entity' do
 | 
				
			||||||
 | 
					        expect(response).to have_http_status(:unprocessable_entity)
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,21 @@
 | 
				
			||||||
 | 
					require 'rails_helper'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe Api::V1::Accounts::FollowerAccountsController do
 | 
				
			||||||
 | 
					  render_views
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let(:user)  { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
 | 
				
			||||||
 | 
					  let(:token) { double acceptable?: true, resource_owner_id: user.id }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  before do
 | 
				
			||||||
 | 
					    Fabricate(:follow, target_account: user.account)
 | 
				
			||||||
 | 
					    allow(controller).to receive(:doorkeeper_token) { token }
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'GET #index' do
 | 
				
			||||||
 | 
					    it 'returns http success' do
 | 
				
			||||||
 | 
					      get :index, params: { account_id: user.account.id, limit: 1 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(response).to have_http_status(:success)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,21 @@
 | 
				
			||||||
 | 
					require 'rails_helper'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe Api::V1::Accounts::FollowingAccountsController do
 | 
				
			||||||
 | 
					  render_views
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let(:user)  { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
 | 
				
			||||||
 | 
					  let(:token) { double acceptable?: true, resource_owner_id: user.id }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  before do
 | 
				
			||||||
 | 
					    Fabricate(:follow, account: user.account)
 | 
				
			||||||
 | 
					    allow(controller).to receive(:doorkeeper_token) { token }
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'GET #index' do
 | 
				
			||||||
 | 
					    it 'returns http success' do
 | 
				
			||||||
 | 
					      get :index, params: { account_id: user.account.id, limit: 1 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(response).to have_http_status(:success)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,69 @@
 | 
				
			||||||
 | 
					require 'rails_helper'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe Api::V1::Accounts::RelationshipsController do
 | 
				
			||||||
 | 
					  render_views
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let(:user)  { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
 | 
				
			||||||
 | 
					  let(:token) { double acceptable?: true, resource_owner_id: user.id }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  before do
 | 
				
			||||||
 | 
					    allow(controller).to receive(:doorkeeper_token) { token }
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'GET #index' do
 | 
				
			||||||
 | 
					    let(:simon) { Fabricate(:user, email: 'simon@example.com', account: Fabricate(:account, username: 'simon')).account }
 | 
				
			||||||
 | 
					    let(:lewis) { Fabricate(:user, email: 'lewis@example.com', account: Fabricate(:account, username: 'lewis')).account }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    before do
 | 
				
			||||||
 | 
					      user.account.follow!(simon)
 | 
				
			||||||
 | 
					      lewis.follow!(user.account)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    context 'provided only one ID' do
 | 
				
			||||||
 | 
					      before do
 | 
				
			||||||
 | 
					        get :index, params: { id: simon.id }
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it 'returns http success' do
 | 
				
			||||||
 | 
					        expect(response).to have_http_status(:success)
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it 'returns JSON with correct data' do
 | 
				
			||||||
 | 
					        json = body_as_json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        expect(json).to be_a Enumerable
 | 
				
			||||||
 | 
					        expect(json.first[:following]).to be true
 | 
				
			||||||
 | 
					        expect(json.first[:followed_by]).to be false
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    context 'provided multiple IDs' do
 | 
				
			||||||
 | 
					      before do
 | 
				
			||||||
 | 
					        get :index, params: { id: [simon.id, lewis.id] }
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it 'returns http success' do
 | 
				
			||||||
 | 
					        expect(response).to have_http_status(:success)
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it 'returns JSON with correct data' do
 | 
				
			||||||
 | 
					        json = body_as_json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        expect(json).to be_a Enumerable
 | 
				
			||||||
 | 
					        expect(json.first[:id]).to be simon.id
 | 
				
			||||||
 | 
					        expect(json.first[:following]).to be true
 | 
				
			||||||
 | 
					        expect(json.first[:followed_by]).to be false
 | 
				
			||||||
 | 
					        expect(json.first[:muting]).to be false
 | 
				
			||||||
 | 
					        expect(json.first[:requested]).to be false
 | 
				
			||||||
 | 
					        expect(json.first[:domain_blocking]).to be false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        expect(json.second[:id]).to be lewis.id
 | 
				
			||||||
 | 
					        expect(json.second[:following]).to be false
 | 
				
			||||||
 | 
					        expect(json.second[:followed_by]).to be true
 | 
				
			||||||
 | 
					        expect(json.second[:muting]).to be false
 | 
				
			||||||
 | 
					        expect(json.second[:requested]).to be false
 | 
				
			||||||
 | 
					        expect(json.second[:domain_blocking]).to be false
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
							
								
								
									
										20
									
								
								spec/controllers/api/v1/accounts/search_controller_spec.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								spec/controllers/api/v1/accounts/search_controller_spec.rb
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,20 @@
 | 
				
			||||||
 | 
					require 'rails_helper'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RSpec.describe Api::V1::Accounts::SearchController, type: :controller do
 | 
				
			||||||
 | 
					  render_views
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let(:user)  { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
 | 
				
			||||||
 | 
					  let(:token) { double acceptable?: true, resource_owner_id: user.id }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  before do
 | 
				
			||||||
 | 
					    allow(controller).to receive(:doorkeeper_token) { token }
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'GET #show' do
 | 
				
			||||||
 | 
					    it 'returns http success' do
 | 
				
			||||||
 | 
					      get :show, params: { q: 'query' }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(response).to have_http_status(:success)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
							
								
								
									
										38
									
								
								spec/controllers/api/v1/accounts/statuses_controller_spec.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								spec/controllers/api/v1/accounts/statuses_controller_spec.rb
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,38 @@
 | 
				
			||||||
 | 
					require 'rails_helper'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe Api::V1::Accounts::StatusesController do
 | 
				
			||||||
 | 
					  render_views
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let(:user)  { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
 | 
				
			||||||
 | 
					  let(:token) { double acceptable?: true, resource_owner_id: user.id }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  before do
 | 
				
			||||||
 | 
					    allow(controller).to receive(:doorkeeper_token) { token }
 | 
				
			||||||
 | 
					    Fabricate(:status, account: user.account)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'GET #index' do
 | 
				
			||||||
 | 
					    it 'returns http success' do
 | 
				
			||||||
 | 
					      get :index, params: { account_id: user.account.id, limit: 1 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(response).to have_http_status(:success)
 | 
				
			||||||
 | 
					      expect(response.headers['Link'].links.size).to eq(2)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'GET #index with only media' do
 | 
				
			||||||
 | 
					    it 'returns http success' do
 | 
				
			||||||
 | 
					      get :index, params: { account_id: user.account.id, only_media: true }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(response).to have_http_status(:success)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'GET #index with exclude replies' do
 | 
				
			||||||
 | 
					    it 'returns http success' do
 | 
				
			||||||
 | 
					      get :index, params: { account_id: user.account.id, exclude_replies: true }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(response).to have_http_status(:success)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
| 
						 | 
					@ -17,78 +17,6 @@ RSpec.describe Api::V1::AccountsController, type: :controller do
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  describe 'GET #search' do
 | 
					 | 
				
			||||||
    it 'returns http success' do
 | 
					 | 
				
			||||||
      get :search, params: { q: 'query' }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      expect(response).to have_http_status(:success)
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  describe 'GET #verify_credentials' do
 | 
					 | 
				
			||||||
    it 'returns http success' do
 | 
					 | 
				
			||||||
      get :verify_credentials
 | 
					 | 
				
			||||||
      expect(response).to have_http_status(:success)
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  describe 'PATCH #update_credentials' do
 | 
					 | 
				
			||||||
    describe 'with valid data' do
 | 
					 | 
				
			||||||
      before do
 | 
					 | 
				
			||||||
        patch :update_credentials, params: {
 | 
					 | 
				
			||||||
          display_name: "Alice Isn't Dead",
 | 
					 | 
				
			||||||
          note: "Hi!\n\nToot toot!",
 | 
					 | 
				
			||||||
          avatar: fixture_file_upload('files/avatar.gif', 'image/gif'),
 | 
					 | 
				
			||||||
          header: fixture_file_upload('files/attachment.jpg', 'image/jpeg'),
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      it 'returns http success' do
 | 
					 | 
				
			||||||
        expect(response).to have_http_status(:success)
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      it 'updates account info' do
 | 
					 | 
				
			||||||
        user.account.reload
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        expect(user.account.display_name).to eq("Alice Isn't Dead")
 | 
					 | 
				
			||||||
        expect(user.account.note).to eq("Hi!\n\nToot toot!")
 | 
					 | 
				
			||||||
        expect(user.account.avatar).to exist
 | 
					 | 
				
			||||||
        expect(user.account.header).to exist
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    describe 'with invalid data' do
 | 
					 | 
				
			||||||
      before do
 | 
					 | 
				
			||||||
        patch :update_credentials, params: { note: 'This is too long. ' * 10 }
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      it 'returns http unprocessable entity' do
 | 
					 | 
				
			||||||
        expect(response).to have_http_status(:unprocessable_entity)
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  describe 'GET #statuses' do
 | 
					 | 
				
			||||||
    it 'returns http success' do
 | 
					 | 
				
			||||||
      get :statuses, params: { id: user.account.id }
 | 
					 | 
				
			||||||
      expect(response).to have_http_status(:success)
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  describe 'GET #followers' do
 | 
					 | 
				
			||||||
    it 'returns http success' do
 | 
					 | 
				
			||||||
      get :followers, params: { id: user.account.id }
 | 
					 | 
				
			||||||
      expect(response).to have_http_status(:success)
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  describe 'GET #following' do
 | 
					 | 
				
			||||||
    it 'returns http success' do
 | 
					 | 
				
			||||||
      get :following, params: { id: user.account.id }
 | 
					 | 
				
			||||||
      expect(response).to have_http_status(:success)
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  describe 'POST #follow' do
 | 
					  describe 'POST #follow' do
 | 
				
			||||||
    let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account }
 | 
					    let(:other_account) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -197,61 +125,4 @@ RSpec.describe Api::V1::AccountsController, type: :controller do
 | 
				
			||||||
      expect(user.account.muting?(other_account)).to be false
 | 
					      expect(user.account.muting?(other_account)).to be false
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					 | 
				
			||||||
  describe 'GET #relationships' do
 | 
					 | 
				
			||||||
    let(:simon) { Fabricate(:user, email: 'simon@example.com', account: Fabricate(:account, username: 'simon')).account }
 | 
					 | 
				
			||||||
    let(:lewis) { Fabricate(:user, email: 'lewis@example.com', account: Fabricate(:account, username: 'lewis')).account }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    before do
 | 
					 | 
				
			||||||
      user.account.follow!(simon)
 | 
					 | 
				
			||||||
      lewis.follow!(user.account)
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    context 'provided only one ID' do
 | 
					 | 
				
			||||||
      before do
 | 
					 | 
				
			||||||
        get :relationships, params: { id: simon.id }
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      it 'returns http success' do
 | 
					 | 
				
			||||||
        expect(response).to have_http_status(:success)
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      it 'returns JSON with correct data' do
 | 
					 | 
				
			||||||
        json = body_as_json
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        expect(json).to be_a Enumerable
 | 
					 | 
				
			||||||
        expect(json.first[:following]).to be true
 | 
					 | 
				
			||||||
        expect(json.first[:followed_by]).to be false
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    context 'provided multiple IDs' do
 | 
					 | 
				
			||||||
      before do
 | 
					 | 
				
			||||||
        get :relationships, params: { id: [simon.id, lewis.id] }
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      it 'returns http success' do
 | 
					 | 
				
			||||||
        expect(response).to have_http_status(:success)
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      it 'returns JSON with correct data' do
 | 
					 | 
				
			||||||
        json = body_as_json
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        expect(json).to be_a Enumerable
 | 
					 | 
				
			||||||
        expect(json.first[:id]).to be simon.id
 | 
					 | 
				
			||||||
        expect(json.first[:following]).to be true
 | 
					 | 
				
			||||||
        expect(json.first[:followed_by]).to be false
 | 
					 | 
				
			||||||
        expect(json.first[:muting]).to be false
 | 
					 | 
				
			||||||
        expect(json.first[:requested]).to be false
 | 
					 | 
				
			||||||
        expect(json.first[:domain_blocking]).to be false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        expect(json.second[:id]).to be lewis.id
 | 
					 | 
				
			||||||
        expect(json.second[:following]).to be false
 | 
					 | 
				
			||||||
        expect(json.second[:followed_by]).to be true
 | 
					 | 
				
			||||||
        expect(json.second[:muting]).to be false
 | 
					 | 
				
			||||||
        expect(json.second[:requested]).to be false
 | 
					 | 
				
			||||||
        expect(json.second[:domain_blocking]).to be false
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,45 @@
 | 
				
			||||||
require 'rails_helper'
 | 
					require 'rails_helper'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
describe 'API routes' do
 | 
					describe 'API routes' do
 | 
				
			||||||
 | 
					  describe 'Credentials routes' do
 | 
				
			||||||
 | 
					    it 'routes to verify credentials' do
 | 
				
			||||||
 | 
					      expect(get('/api/v1/accounts/verify_credentials')).
 | 
				
			||||||
 | 
					        to route_to('api/v1/accounts/credentials#show')
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it 'routes to update credentials' do
 | 
				
			||||||
 | 
					      expect(patch('/api/v1/accounts/update_credentials')).
 | 
				
			||||||
 | 
					        to route_to('api/v1/accounts/credentials#update')
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'Account routes' do
 | 
				
			||||||
 | 
					    it 'routes to statuses' do
 | 
				
			||||||
 | 
					      expect(get('/api/v1/accounts/user/statuses')).
 | 
				
			||||||
 | 
					        to route_to('api/v1/accounts/statuses#index', account_id: 'user')
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it 'routes to followers' do
 | 
				
			||||||
 | 
					      expect(get('/api/v1/accounts/user/followers')).
 | 
				
			||||||
 | 
					        to route_to('api/v1/accounts/follower_accounts#index', account_id: 'user')
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it 'routes to following' do
 | 
				
			||||||
 | 
					      expect(get('/api/v1/accounts/user/following')).
 | 
				
			||||||
 | 
					        to route_to('api/v1/accounts/following_accounts#index', account_id: 'user')
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it 'routes to search' do
 | 
				
			||||||
 | 
					      expect(get('/api/v1/accounts/search')).
 | 
				
			||||||
 | 
					        to route_to('api/v1/accounts/search#show')
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it 'routes to relationships' do
 | 
				
			||||||
 | 
					      expect(get('/api/v1/accounts/relationships')).
 | 
				
			||||||
 | 
					        to route_to('api/v1/accounts/relationships#index')
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
  describe 'Timeline routes' do
 | 
					  describe 'Timeline routes' do
 | 
				
			||||||
    it 'routes to home timeline' do
 | 
					    it 'routes to home timeline' do
 | 
				
			||||||
      expect(get('/api/v1/timelines/home')).
 | 
					      expect(get('/api/v1/timelines/home')).
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue