Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/support/shared_examples/services/rate_limited_service_shared_examples.rb')
-rw-r--r--spec/support/shared_examples/services/rate_limited_service_shared_examples.rb73
1 files changed, 73 insertions, 0 deletions
diff --git a/spec/support/shared_examples/services/rate_limited_service_shared_examples.rb b/spec/support/shared_examples/services/rate_limited_service_shared_examples.rb
new file mode 100644
index 00000000000..b79f1a332a6
--- /dev/null
+++ b/spec/support/shared_examples/services/rate_limited_service_shared_examples.rb
@@ -0,0 +1,73 @@
+# frozen_string_literal: true
+
+# shared examples for testing rate limited functionality of a service
+#
+# following resources are expected to be set (example):
+# it_behaves_like 'rate limited service' do
+# let(:key) { :issues_create }
+# let(:key_scope) { %i[project current_user external_author] }
+# let(:application_limit_key) { :issues_create_limit }
+# let(:service) { described_class.new(project: project, current_user: user, params: { title: 'title' }, spam_params: double) }
+# let(:created_model) { Issue }
+# end
+
+RSpec.shared_examples 'rate limited service' do
+ describe '.rate_limiter_scoped_and_keyed' do
+ it 'is set via the rate_limit call' do
+ expect(described_class.rate_limiter_scoped_and_keyed).to be_a(RateLimitedService::RateLimiterScopedAndKeyed)
+
+ expect(described_class.rate_limiter_scoped_and_keyed.key).to eq(key)
+ expect(described_class.rate_limiter_scoped_and_keyed.opts[:scope]).to eq(key_scope)
+ expect(described_class.rate_limiter_scoped_and_keyed.rate_limiter).to eq(Gitlab::ApplicationRateLimiter)
+ end
+ end
+
+ describe '#rate_limiter_bypassed' do
+ it 'is nil by default' do
+ expect(service.rate_limiter_bypassed).to be_nil
+ end
+ end
+
+ describe '#execute' do
+ before do
+ stub_spam_services
+ end
+
+ context 'when rate limiting is in effect', :freeze_time, :clean_gitlab_redis_rate_limiting do
+ let(:user) { create(:user) }
+
+ before do
+ stub_application_setting(application_limit_key => 1)
+ end
+
+ subject do
+ 2.times { service.execute }
+ end
+
+ context 'when too many requests are sent by one user' do
+ it 'raises an error' do
+ expect do
+ subject
+ end.to raise_error(RateLimitedService::RateLimitedError)
+ end
+
+ it 'creates 1 issue' do
+ expect do
+ subject
+ rescue RateLimitedService::RateLimitedError
+ end.to change { created_model.count }.by(1)
+ end
+ end
+
+ context 'when limit is higher than count of issues being created' do
+ before do
+ stub_application_setting(issues_create_limit: 2)
+ end
+
+ it 'creates 2 issues' do
+ expect { subject }.to change { created_model.count }.by(2)
+ end
+ end
+ end
+ end
+end