75 lines
2.7 KiB
Ruby
75 lines
2.7 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
require "rails_helper"
|
||
|
|
||
|
describe Chat::ChatMessageRateLimiter do
|
||
|
fab!(:user) { Fabricate(:user, trust_level: 3) }
|
||
|
let(:limiter) { described_class.new(user) }
|
||
|
|
||
|
before do
|
||
|
freeze_time
|
||
|
RateLimiter.enable
|
||
|
SiteSetting.chat_allowed_messages_for_trust_level_0 = 1
|
||
|
SiteSetting.chat_allowed_messages_for_other_trust_levels = 2
|
||
|
SiteSetting.chat_auto_silence_duration = 30
|
||
|
end
|
||
|
|
||
|
after { limiter.clear! }
|
||
|
|
||
|
it "does nothing when rate limits are not exceeded" do
|
||
|
limiter.run!
|
||
|
expect(user.reload.silenced?).to be false
|
||
|
end
|
||
|
|
||
|
it "silences the user for the correct amount of time when they exceed the limit" do
|
||
|
2.times do
|
||
|
limiter.run!
|
||
|
expect(user.reload.silenced?).to be false
|
||
|
end
|
||
|
|
||
|
expect { limiter.run! }.to raise_error(RateLimiter::LimitExceeded)
|
||
|
|
||
|
expect(user.reload.silenced?).to be true
|
||
|
expect(user.silenced_till).to be_within(0.1).of(30.minutes.from_now)
|
||
|
end
|
||
|
|
||
|
it "silences the user correctly based on trust level" do
|
||
|
user.update(trust_level: 0) # Should only be able to run once without hitting limit
|
||
|
limiter.run!
|
||
|
expect(user.reload.silenced?).to be false
|
||
|
expect { limiter.run! }.to raise_error(RateLimiter::LimitExceeded)
|
||
|
expect(user.reload.silenced?).to be true
|
||
|
end
|
||
|
|
||
|
it "doesn't hit limit if site setting for allowed messages equals 0" do
|
||
|
SiteSetting.chat_allowed_messages_for_other_trust_levels = 0
|
||
|
5.times do
|
||
|
limiter.run!
|
||
|
expect(user.reload.silenced?).to be false
|
||
|
end
|
||
|
end
|
||
|
|
||
|
it "doesn't silence the user even when the limit is broken if auto_silence_duration is set to 0" do
|
||
|
SiteSetting.chat_allowed_messages_for_other_trust_levels = 1
|
||
|
SiteSetting.chat_auto_silence_duration = 0
|
||
|
limiter.run!
|
||
|
expect(user.reload.silenced?).to be false
|
||
|
|
||
|
expect { limiter.run! }.to raise_error(RateLimiter::LimitExceeded)
|
||
|
expect(user.reload.silenced?).to be false
|
||
|
end
|
||
|
|
||
|
it "logs a staff action when the user is silenced" do
|
||
|
SiteSetting.chat_allowed_messages_for_other_trust_levels = 1
|
||
|
limiter.run!
|
||
|
|
||
|
expect { limiter.run! }.to raise_error(RateLimiter::LimitExceeded).and change {
|
||
|
UserHistory.where(
|
||
|
target_user: user,
|
||
|
acting_user: Discourse.system_user,
|
||
|
action: UserHistory.actions[:silence_user],
|
||
|
).count
|
||
|
}.by(1)
|
||
|
end
|
||
|
end
|