1
0

Fortify coverage for Follow model (#32472)

This commit is contained in:
Matt Jankowski 2024-10-23 03:46:55 -04:00 committed by GitHub
parent 1f3722904f
commit c0f46e9031
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -3,27 +3,26 @@
require 'rails_helper' require 'rails_helper'
RSpec.describe Follow do RSpec.describe Follow do
let(:alice) { Fabricate(:account, username: 'alice') } describe 'Associations' do
let(:bob) { Fabricate(:account, username: 'bob') }
describe 'validations' do
subject { described_class.new(account: alice, target_account: bob, rate_limit: true) }
it { is_expected.to belong_to(:account).required } it { is_expected.to belong_to(:account).required }
it { is_expected.to belong_to(:target_account).required } it { is_expected.to belong_to(:target_account).required }
end
it 'is invalid if account already follows too many people' do describe 'Validations' do
alice.update(following_count: FollowLimitValidator::LIMIT) subject { Fabricate.build :follow, rate_limit: true }
expect(subject).to_not be_valid let(:account) { Fabricate(:account) }
expect(subject).to model_have_error_on_field(:base)
context 'when account follows too many people' do
before { account.update(following_count: FollowLimitValidator::LIMIT) }
it { is_expected.to_not allow_value(account).for(:account).against(:base) }
end end
it 'is valid if account is only on the brink of following too many people' do context 'when account is on brink of following too many people' do
alice.update(following_count: FollowLimitValidator::LIMIT - 1) before { account.update(following_count: FollowLimitValidator::LIMIT - 1) }
expect(subject).to be_valid it { is_expected.to allow_value(account).for(:account).against(:base) }
expect(subject).to_not model_have_error_on_field(:base)
end end
end end
@ -54,4 +53,58 @@ RSpec.describe Follow do
expect(account.requested?(target_account)).to be true expect(account.requested?(target_account)).to be true
end end
end end
describe '#local?' do
it { is_expected.to_not be_local }
end
describe 'Callbacks' do
describe 'Setting a URI' do
context 'when URI exists' do
subject { Fabricate.build :follow, uri: 'https://uri/value' }
it 'does not change' do
expect { subject.save }
.to not_change(subject, :uri)
end
end
context 'when URI is blank' do
subject { Fabricate.build :follow, uri: nil }
it 'populates the value' do
expect { subject.save }
.to change(subject, :uri).to(be_present)
end
end
end
describe 'Maintaining counters' do
subject { Fabricate.build :follow, account:, target_account: }
let(:account) { Fabricate :account }
let(:target_account) { Fabricate :account }
before do
account.account_stat.update following_count: 123
target_account.account_stat.update followers_count: 123
end
describe 'saving the follow' do
it 'increments counters' do
expect { subject.save }
.to change(account, :following_count).by(1)
.and(change(target_account, :followers_count).by(1))
end
end
describe 'destroying the follow' do
it 'decrements counters' do
expect { subject.destroy }
.to change(account, :following_count).by(-1)
.and(change(target_account, :followers_count).by(-1))
end
end
end
end
end end