expect(admin.role?('moderator')).to be true
end
end
+
+ describe '#disable!' do
+ subject(:user) { Fabricate(:user, disabled: false, current_sign_in_at: current_sign_in_at, last_sign_in_at: nil) }
+ let(:current_sign_in_at) { Time.zone.now }
+
+ before do
+ user.disable!
+ end
+
+ it 'disables user' do
+ expect(user).to have_attributes(disabled: true, current_sign_in_at: nil, last_sign_in_at: current_sign_in_at)
+ end
+ end
+
+ describe '#disable!' do
+ subject(:user) { Fabricate(:user, disabled: false, current_sign_in_at: current_sign_in_at, last_sign_in_at: nil) }
+ let(:current_sign_in_at) { Time.zone.now }
+
+ before do
+ user.disable!
+ end
+
+ it 'disables user' do
+ expect(user).to have_attributes(disabled: true, current_sign_in_at: nil, last_sign_in_at: current_sign_in_at)
+ end
+ end
+
+ describe '#enable!' do
+ subject(:user) { Fabricate(:user, disabled: true) }
+
+ before do
+ user.enable!
+ end
+
+ it 'enables user' do
+ expect(user).to have_attributes(disabled: false)
+ end
+ end
+
+ describe '#confirm!' do
+ subject(:user) { Fabricate(:user, confirmed_at: confirmed_at) }
+
+ before do
+ ActionMailer::Base.deliveries.clear
+ user.confirm!
+ end
+
+ after { ActionMailer::Base.deliveries.clear }
+
+ context 'when user is new' do
+ let(:confirmed_at) { nil }
+
+ it 'confirms user' do
+ expect(user.confirmed_at).to be_present
+ end
+
+ it 'delivers mails' do
+ expect(ActionMailer::Base.deliveries.count).to eq 2
+ end
+ end
+
+ context 'when user is not new' do
+ let(:confirmed_at) { Time.zone.now }
+
+ it 'confirms user' do
+ expect(user.confirmed_at).to be_present
+ end
+
+ it 'does not deliver mail' do
+ expect(ActionMailer::Base.deliveries.count).to eq 0
+ end
+ end
+ end
+
+ describe '#promote!' do
+ subject(:user) { Fabricate(:user, admin: is_admin, moderator: is_moderator) }
+
+ before do
+ user.promote!
+ end
+
+ context 'when user is an admin' do
+ let(:is_admin) { true }
+
+ context 'when user is a moderator' do
+ let(:is_moderator) { true }
+
+ it 'changes moderator filed false' do
+ expect(user).to be_admin
+ expect(user).not_to be_moderator
+ end
+ end
+
+ context 'when user is not a moderator' do
+ let(:is_moderator) { false }
+
+ it 'does not change status' do
+ expect(user).to be_admin
+ expect(user).not_to be_moderator
+ end
+ end
+ end
+
+ context 'when user is not admin' do
+ let(:is_admin) { false }
+
+ context 'when user is a moderator' do
+ let(:is_moderator) { true }
+
+ it 'changes user into an admin' do
+ expect(user).to be_admin
+ expect(user).not_to be_moderator
+ end
+ end
+
+ context 'when user is not a moderator' do
+ let(:is_moderator) { false }
+
+ it 'changes user into a moderator' do
+ expect(user).not_to be_admin
+ expect(user).to be_moderator
+ end
+ end
+ end
+ end
+
+ describe '#demote!' do
+ subject(:user) { Fabricate(:user, admin: admin, moderator: moderator) }
+
+ before do
+ user.demote!
+ end
+
+ context 'when user is an admin' do
+ let(:admin) { true }
+
+ context 'when user is a moderator' do
+ let(:moderator) { true }
+
+ it 'changes user into a moderator' do
+ expect(user).not_to be_admin
+ expect(user).to be_moderator
+ end
+ end
+
+ context 'when user is not a moderator' do
+ let(:moderator) { false }
+
+ it 'changes user into a moderator' do
+ expect(user).not_to be_admin
+ expect(user).to be_moderator
+ end
+ end
+ end
+
+ context 'when user is not an admin' do
+ let(:admin) { false }
+
+ context 'when user is a moderator' do
+ let(:moderator) { true }
+
+ it 'changes user into a plain user' do
+ expect(user).not_to be_admin
+ expect(user).not_to be_moderator
+ end
+ end
+
+ context 'when user is not a moderator' do
+ let(:moderator) { false }
+
+ it 'does not change any fields' do
+ expect(user).not_to be_admin
+ expect(user).not_to be_moderator
+ end
+ end
+ end
+ end
+
+ describe '#active_for_authentication?' do
+ subject { user.active_for_authentication? }
+ let(:user) { Fabricate(:user, disabled: disabled, confirmed_at: confirmed_at) }
+
+ context 'when user is disabled' do
+ let(:disabled) { true }
+
+ context 'when user is confirmed' do
+ let(:confirmed_at) { Time.zone.now }
+
+ it { is_expected.to be false }
+ end
+
+ context 'when user is not confirmed' do
+ let(:confirmed_at) { nil }
+
+ it { is_expected.to be false }
+ end
+ end
+
+ context 'when user is not disabled' do
+ let(:disabled) { false }
+
+ context 'when user is confirmed' do
+ let(:confirmed_at) { Time.zone.now }
+
+ it { is_expected.to be true }
+ end
+
+ context 'when user is not confirmed' do
+ let(:confirmed_at) { nil }
+
+ it { is_expected.to be false }
+ end
+ end
+ end
end