Introduce recent to Follow (#3247)

Introduce recent to Follow, as Account and other models have.
This change also adds specs for the scope and the dependents.
This commit is contained in:
Akihiko Odaki 2017-05-23 20:12:19 +09:00 committed by Eugen Rochko
parent 860ffc0560
commit bf575a1f5e
6 changed files with 41 additions and 6 deletions

View file

@ -4,6 +4,6 @@ class FollowerAccountsController < ApplicationController
include AccountControllerConcern include AccountControllerConcern
def index def index
@follows = Follow.where(target_account: @account).order(id: :desc).page(params[:page]).per(FOLLOW_PER_PAGE).preload(:account) @follows = Follow.where(target_account: @account).recent.page(params[:page]).per(FOLLOW_PER_PAGE).preload(:account)
end end
end end

View file

@ -4,6 +4,6 @@ class FollowingAccountsController < ApplicationController
include AccountControllerConcern include AccountControllerConcern
def index def index
@follows = Follow.where(account: @account).order(id: :desc).page(params[:page]).per(FOLLOW_PER_PAGE).preload(:target_account) @follows = Follow.where(account: @account).recent.page(params[:page]).per(FOLLOW_PER_PAGE).preload(:target_account)
end end
end end

View file

@ -23,4 +23,6 @@ class Follow < ApplicationRecord
has_one :notification, as: :activity, dependent: :destroy has_one :notification, as: :activity, dependent: :destroy
validates :account_id, uniqueness: { scope: :target_account_id } validates :account_id, uniqueness: { scope: :target_account_id }
scope :recent, -> { reorder(id: :desc) }
end end

View file

@ -4,11 +4,21 @@ describe FollowerAccountsController do
render_views render_views
let(:alice) { Fabricate(:account, username: 'alice') } let(:alice) { Fabricate(:account, username: 'alice') }
let(:follower0) { Fabricate(:account) }
let(:follower1) { Fabricate(:account) }
describe 'GET #index' do describe 'GET #index' do
it 'returns http success' do it 'assigns follows' do
follow0 = follower0.follow!(alice)
follow1 = follower1.follow!(alice)
get :index, params: { account_username: alice.username } get :index, params: { account_username: alice.username }
assigned = assigns(:follows).to_a
expect(assigned.size).to eq 2
expect(assigned[0]).to eq follow1
expect(assigned[1]).to eq follow0
expect(response).to have_http_status(:success) expect(response).to have_http_status(:success)
end end
end end

View file

@ -4,11 +4,21 @@ describe FollowingAccountsController do
render_views render_views
let(:alice) { Fabricate(:account, username: 'alice') } let(:alice) { Fabricate(:account, username: 'alice') }
let(:followee0) { Fabricate(:account) }
let(:followee1) { Fabricate(:account) }
describe 'GET #index' do describe 'GET #index' do
it 'returns http success' do it 'assigns followees' do
follow0 = alice.follow!(followee0)
follow1 = alice.follow!(followee1)
get :index, params: { account_username: alice.username } get :index, params: { account_username: alice.username }
assigned = assigns(:follows).to_a
expect(assigned.size).to eq 2
expect(assigned[0]).to eq follow1
expect(assigned[1]).to eq follow0
expect(response).to have_http_status(:success) expect(response).to have_http_status(:success)
end end
end end

View file

@ -4,9 +4,9 @@ RSpec.describe Follow, type: :model do
let(:alice) { Fabricate(:account, username: 'alice') } let(:alice) { Fabricate(:account, username: 'alice') }
let(:bob) { Fabricate(:account, username: 'bob') } let(:bob) { Fabricate(:account, username: 'bob') }
subject { Follow.new(account: alice, target_account: bob) }
describe 'validations' do describe 'validations' do
subject { Follow.new(account: alice, target_account: bob) }
it 'has a valid fabricator' do it 'has a valid fabricator' do
follow = Fabricate.build(:follow) follow = Fabricate.build(:follow)
expect(follow).to be_valid expect(follow).to be_valid
@ -24,4 +24,17 @@ RSpec.describe Follow, type: :model do
expect(follow).to model_have_error_on_field(:target_account) expect(follow).to model_have_error_on_field(:target_account)
end end
end end
describe 'recent' do
it 'sorts so that more recent follows comes earlier' do
follow0 = Follow.create!(account: alice, target_account: bob)
follow1 = Follow.create!(account: bob, target_account: alice)
a = Follow.recent.to_a
expect(a.size).to eq 2
expect(a[0]).to eq follow1
expect(a[1]).to eq follow0
end
end
end end