2019-04-29 19:27:42 -05:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2019-01-03 11:03:01 -06:00
|
|
|
require 'rails_helper'
|
|
|
|
|
|
|
|
RSpec.describe ReviewableUser, type: :model do
|
|
|
|
|
2019-05-06 22:12:20 -05:00
|
|
|
fab!(:moderator) { Fabricate(:moderator) }
|
2019-04-03 11:04:05 -05:00
|
|
|
let(:user) do
|
|
|
|
user = Fabricate(:user)
|
|
|
|
user.activate
|
|
|
|
user
|
|
|
|
end
|
2019-05-06 22:12:20 -05:00
|
|
|
fab!(:admin) { Fabricate(:admin) }
|
2019-01-03 11:03:01 -06:00
|
|
|
|
|
|
|
context "actions_for" do
|
2019-05-06 22:12:20 -05:00
|
|
|
fab!(:reviewable) { Fabricate(:reviewable) }
|
2019-04-17 10:26:43 -05:00
|
|
|
it "returns correct actions in the pending state" do
|
2019-01-03 11:03:01 -06:00
|
|
|
actions = reviewable.actions_for(Guardian.new(moderator))
|
2019-04-17 10:26:43 -05:00
|
|
|
expect(actions.has?(:approve_user)).to eq(true)
|
|
|
|
expect(actions.has?(:reject_user_delete)).to eq(true)
|
|
|
|
expect(actions.has?(:reject_user_block)).to eq(true)
|
2019-01-03 11:03:01 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
it "doesn't return anything in the approved state" do
|
|
|
|
reviewable.status = Reviewable.statuses[:approved]
|
|
|
|
actions = reviewable.actions_for(Guardian.new(moderator))
|
2019-04-17 10:26:43 -05:00
|
|
|
expect(actions.has?(:approve_user)).to eq(false)
|
|
|
|
expect(actions.has?(:reject_user_delete)).to eq(false)
|
2019-01-03 11:03:01 -06:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "#update_fields" do
|
2019-05-06 22:12:20 -05:00
|
|
|
fab!(:moderator) { Fabricate(:moderator) }
|
|
|
|
fab!(:reviewable) { Fabricate(:reviewable) }
|
2019-01-03 11:03:01 -06:00
|
|
|
|
|
|
|
it "doesn't raise errors with an empty update" do
|
|
|
|
expect(reviewable.update_fields(nil, moderator)).to eq(true)
|
|
|
|
expect(reviewable.update_fields({}, moderator)).to eq(true)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-04-03 15:41:04 -05:00
|
|
|
context "when a user is deleted" do
|
|
|
|
it "should reject the reviewable" do
|
2019-04-11 10:11:35 -05:00
|
|
|
SiteSetting.must_approve_users = true
|
2019-04-03 15:41:04 -05:00
|
|
|
Jobs::CreateUserReviewable.new.execute(user_id: user.id)
|
|
|
|
reviewable = Reviewable.find_by(target: user)
|
|
|
|
expect(reviewable.pending?).to eq(true)
|
|
|
|
|
|
|
|
UserDestroyer.new(Discourse.system_user).destroy(user)
|
|
|
|
expect(reviewable.reload.rejected?).to eq(true)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-01-03 11:03:01 -06:00
|
|
|
context "perform" do
|
2019-05-06 22:12:20 -05:00
|
|
|
fab!(:reviewable) { Fabricate(:reviewable) }
|
2019-01-03 11:03:01 -06:00
|
|
|
context "approve" do
|
|
|
|
it "allows us to approve a user" do
|
2019-04-17 10:26:43 -05:00
|
|
|
result = reviewable.perform(moderator, :approve_user)
|
2019-01-03 11:03:01 -06:00
|
|
|
expect(result.success?).to eq(true)
|
|
|
|
|
|
|
|
expect(reviewable.pending?).to eq(false)
|
|
|
|
expect(reviewable.approved?).to eq(true)
|
|
|
|
expect(reviewable.target.approved?).to eq(true)
|
|
|
|
expect(reviewable.target.approved_by_id).to eq(moderator.id)
|
|
|
|
expect(reviewable.target.approved_at).to be_present
|
|
|
|
expect(reviewable.version > 0).to eq(true)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "allows us to reject a user" do
|
2019-04-17 10:26:43 -05:00
|
|
|
result = reviewable.perform(moderator, :reject_user_delete)
|
2019-01-03 11:03:01 -06:00
|
|
|
expect(result.success?).to eq(true)
|
|
|
|
|
|
|
|
expect(reviewable.pending?).to eq(false)
|
|
|
|
expect(reviewable.rejected?).to eq(true)
|
|
|
|
|
|
|
|
# Rejecting deletes the user record
|
|
|
|
reviewable.reload
|
|
|
|
expect(reviewable.target).to be_blank
|
|
|
|
end
|
2019-03-29 12:52:53 -05:00
|
|
|
|
2019-04-17 10:26:43 -05:00
|
|
|
it "allows us to reject and block a user" do
|
|
|
|
email = reviewable.target.email
|
|
|
|
ip = reviewable.target.ip_address
|
|
|
|
|
|
|
|
result = reviewable.perform(moderator, :reject_user_block)
|
|
|
|
expect(result.success?).to eq(true)
|
|
|
|
|
|
|
|
expect(reviewable.pending?).to eq(false)
|
|
|
|
expect(reviewable.rejected?).to eq(true)
|
|
|
|
|
|
|
|
# Rejecting deletes the user record
|
|
|
|
reviewable.reload
|
|
|
|
expect(reviewable.target).to be_blank
|
|
|
|
|
|
|
|
expect(ScreenedEmail.should_block?(email)).to eq(true)
|
|
|
|
expect(ScreenedIpAddress.should_block?(ip)).to eq(true)
|
|
|
|
end
|
|
|
|
|
2019-03-29 12:52:53 -05:00
|
|
|
it "allows us to reject a user who has posts" do
|
|
|
|
Fabricate(:post, user: reviewable.target)
|
2019-04-17 10:26:43 -05:00
|
|
|
result = reviewable.perform(moderator, :reject_user_delete)
|
2019-03-29 12:52:53 -05:00
|
|
|
expect(result.success?).to eq(true)
|
|
|
|
|
|
|
|
expect(reviewable.pending?).to eq(false)
|
|
|
|
expect(reviewable.rejected?).to eq(true)
|
|
|
|
|
|
|
|
# Rejecting deletes the user record
|
|
|
|
reviewable.reload
|
|
|
|
expect(reviewable.target).to be_present
|
|
|
|
expect(reviewable.target.approved).to eq(false)
|
|
|
|
end
|
2019-04-10 10:00:14 -05:00
|
|
|
|
|
|
|
it "allows us to reject a user who has been deleted" do
|
|
|
|
reviewable.target.destroy!
|
|
|
|
reviewable.reload
|
2019-04-17 10:26:43 -05:00
|
|
|
result = reviewable.perform(moderator, :reject_user_delete)
|
2019-04-10 10:00:14 -05:00
|
|
|
expect(result.success?).to eq(true)
|
|
|
|
expect(reviewable.rejected?).to eq(true)
|
|
|
|
expect(reviewable.target).to be_blank
|
|
|
|
end
|
2019-01-03 11:03:01 -06:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-04-16 13:42:47 -05:00
|
|
|
describe "changing must_approve_users" do
|
|
|
|
it "will approve any existing users" do
|
|
|
|
user = Fabricate(:user)
|
|
|
|
expect(user).not_to be_approved
|
|
|
|
SiteSetting.must_approve_users = true
|
|
|
|
expect(user.reload).to be_approved
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-01-03 11:03:01 -06:00
|
|
|
describe 'when must_approve_users is true' do
|
|
|
|
before do
|
|
|
|
SiteSetting.must_approve_users = true
|
2019-04-03 11:04:05 -05:00
|
|
|
Jobs.run_immediately!
|
2019-01-03 11:03:01 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
it "creates the ReviewableUser for a user, with moderator access" do
|
|
|
|
reviewable = ReviewableUser.find_by(target: user)
|
|
|
|
expect(reviewable).to be_present
|
|
|
|
expect(reviewable.reviewable_by_moderator).to eq(true)
|
|
|
|
end
|
|
|
|
|
|
|
|
context "email jobs" do
|
|
|
|
let(:reviewable) { ReviewableUser.find_by(target: user) }
|
|
|
|
before do
|
|
|
|
reviewable
|
|
|
|
|
|
|
|
# We can ignore these notifications for the purpose of this test
|
|
|
|
Jobs.stubs(:enqueue).with(:notify_reviewable, has_key(:reviewable_id))
|
|
|
|
end
|
|
|
|
|
|
|
|
after do
|
2019-04-17 10:26:43 -05:00
|
|
|
ReviewableUser.find_by(target: user).perform(admin, :approve_user)
|
2019-01-03 11:03:01 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
it "enqueues a 'signup after approval' email if must_approve_users is true" do
|
|
|
|
Jobs.expects(:enqueue).with(
|
|
|
|
:critical_user_email, has_entries(type: :signup_after_approval)
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "doesn't enqueue a 'signup after approval' email if must_approve_users is false" do
|
|
|
|
SiteSetting.must_approve_users = false
|
|
|
|
Jobs.expects(:enqueue).with(
|
|
|
|
:critical_user_email, has_entries(type: :signup_after_approval)
|
|
|
|
).never
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'triggers a extensibility event' do
|
|
|
|
user && admin # bypass the user_created event
|
|
|
|
event = DiscourseEvent.track_events {
|
2019-04-17 10:26:43 -05:00
|
|
|
ReviewableUser.find_by(target: user).perform(admin, :approve_user)
|
2019-01-03 11:03:01 -06:00
|
|
|
}.first
|
|
|
|
|
|
|
|
expect(event[:event_name]).to eq(:user_approved)
|
|
|
|
expect(event[:params].first).to eq(user)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'triggers a extensibility event' do
|
|
|
|
user && admin # bypass the user_created event
|
|
|
|
event = DiscourseEvent.track_events {
|
2019-04-17 10:26:43 -05:00
|
|
|
ReviewableUser.find_by(target: user).perform(admin, :approve_user)
|
2019-01-03 11:03:01 -06:00
|
|
|
}.first
|
|
|
|
|
|
|
|
expect(event[:event_name]).to eq(:user_approved)
|
|
|
|
expect(event[:params].first).to eq(user)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|