discourse/spec/services/user_suspender_spec.rb

88 lines
2.6 KiB
Ruby

# frozen_string_literal: true
RSpec.describe UserSuspender do
fab!(:user) { Fabricate(:user, trust_level: 0) }
fab!(:post) { Fabricate(:post, user: user) }
fab!(:admin)
describe "suspend" do
subject(:suspend_user) { suspender.suspend }
let(:suspender) do
UserSuspender.new(
user,
suspended_till: 5.hours.from_now,
reason: "because",
by_user: admin,
post_id: post.id,
message: "you have been suspended",
)
end
it "suspends the user correctly" do
freeze_time
suspend_user
expect(user.reload).to be_suspended
expect(user.suspended_till).to be_within_one_second_of(5.hours.from_now)
expect(user.suspended_at).to be_within_one_second_of(Time.zone.now)
end
it "creates a staff action log" do
expect do suspend_user end.to change {
UserHistory.where(
action: UserHistory.actions[:suspend_user],
acting_user_id: admin.id,
target_user_id: user.id,
).count
}.from(0).to(1)
end
it "logs the user out" do
messages = MessageBus.track_publish("/logout/#{user.id}") { suspend_user }
expect(messages.size).to eq(1)
expect(messages[0].user_ids).to eq([user.id])
expect(messages[0].data).to eq(user.id)
end
it "fires a user_suspended event" do
freeze_time
events = DiscourseEvent.track_events(:user_suspended) { suspend_user }
expect(events.size).to eq(1)
params = events[0][:params].first
expect(params[:user].id).to eq(user.id)
expect(params[:reason]).to eq("because")
expect(params[:message]).to eq("you have been suspended")
expect(params[:suspended_till]).to be_within_one_second_of(5.hours.from_now)
expect(params[:suspended_at]).to eq(Time.zone.now)
end
context "when a message is provided" do
it "enqueues a critical user email job" do
expect do suspend_user end.to change { Jobs::CriticalUserEmail.jobs.size }.from(0).to(1)
job = Jobs::CriticalUserEmail.jobs.first
expect(job["args"].first["user_id"]).to eq(user.id)
expect(job["args"].first["user_history_id"]).to eq(suspender.user_history.id)
end
end
context "when a message is not provided" do
let(:suspender) do
UserSuspender.new(
user,
suspended_till: 5.hours.from_now,
reason: "because",
by_user: admin,
post_id: post.id,
message: nil,
)
end
it "doesn't enqueue a critical user email job" do
expect do suspend_user end.not_to change { Jobs::CriticalUserEmail.jobs.size }.from(0)
end
end
end
end