diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-07-19 18:09:10 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-07-19 18:09:10 +0300 |
commit | 9c8e8b5ffc6e11d827fa42f2dce5f90c4dc19493 (patch) | |
tree | fef494515627439a22a06addc7ff5f57d418778a /spec/helpers | |
parent | 690c904b5e340f14c04f93ff688b647b46f7d1a2 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/helpers')
-rw-r--r-- | spec/helpers/users/callouts_helper_spec.rb | 56 | ||||
-rw-r--r-- | spec/helpers/web_hooks/web_hooks_helper_spec.rb | 120 |
2 files changed, 176 insertions, 0 deletions
diff --git a/spec/helpers/users/callouts_helper_spec.rb b/spec/helpers/users/callouts_helper_spec.rb index 71a8d340b30..2c148aabead 100644 --- a/spec/helpers/users/callouts_helper_spec.rb +++ b/spec/helpers/users/callouts_helper_spec.rb @@ -222,4 +222,60 @@ RSpec.describe Users::CalloutsHelper do it { is_expected.to be true } end end + + describe '#web_hook_disabled_dismissed?' do + context 'without a project' do + it 'is false' do + expect(helper).not_to be_web_hook_disabled_dismissed(nil) + end + end + + context 'with a project' do + let_it_be(:project) { create(:project) } + + context 'the web-hook failure callout has never been dismissed' do + it 'is false' do + expect(helper).not_to be_web_hook_disabled_dismissed(project) + end + end + + context 'the web-hook failure callout has been dismissed', :freeze_time do + before do + create(:namespace_callout, + feature_name: described_class::WEB_HOOK_DISABLED, + user: user, + namespace: project.namespace, + dismissed_at: 1.week.ago) + end + + it 'is true' do + expect(helper).to be_web_hook_disabled_dismissed(project) + end + + context 'when there was an older failure', :clean_gitlab_redis_shared_state do + let(:key) { "web_hooks:last_failure:project-#{project.id}" } + + before do + Gitlab::Redis::SharedState.with { |r| r.set(key, 1.month.ago.iso8601) } + end + + it 'is true' do + expect(helper).to be_web_hook_disabled_dismissed(project) + end + end + + context 'when there has been a more recent failure', :clean_gitlab_redis_shared_state do + let(:key) { "web_hooks:last_failure:project-#{project.id}" } + + before do + Gitlab::Redis::SharedState.with { |r| r.set(key, 1.day.ago.iso8601) } + end + + it 'is false' do + expect(helper).not_to be_web_hook_disabled_dismissed(project) + end + end + end + end + end end diff --git a/spec/helpers/web_hooks/web_hooks_helper_spec.rb b/spec/helpers/web_hooks/web_hooks_helper_spec.rb new file mode 100644 index 00000000000..473f33a982f --- /dev/null +++ b/spec/helpers/web_hooks/web_hooks_helper_spec.rb @@ -0,0 +1,120 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe WebHooks::WebHooksHelper do + let_it_be_with_reload(:project) { create(:project) } + + let(:current_user) { nil } + let(:callout_dismissed) { false } + let(:web_hooks_disable_failed) { false } + let(:webhooks_failed_callout) { false } + + before do + allow(helper).to receive(:current_user).and_return(current_user) + allow(helper).to receive(:web_hook_disabled_dismissed?).with(project).and_return(callout_dismissed) + + stub_feature_flags( + webhooks_failed_callout: webhooks_failed_callout, + web_hooks_disable_failed: web_hooks_disable_failed + ) + end + + shared_context 'user is logged in' do + let(:current_user) { create(:user) } + end + + shared_context 'webhooks_failed_callout is enabled' do + let(:webhooks_failed_callout) { true } + end + + shared_context 'webhooks_failed_callout is enabled for this project' do + let(:webhooks_failed_callout) { project } + end + + shared_context 'web_hooks_disable_failed is enabled' do + let(:web_hooks_disable_failed) { true } + end + + shared_context 'web_hooks_disable_failed is enabled for this project' do + let(:web_hooks_disable_failed) { project } + end + + shared_context 'the user has permission' do + before do + project.add_maintainer(current_user) + end + end + + shared_context 'the user dismissed the callout' do + let(:callout_dismissed) { true } + end + + shared_context 'a hook has failed' do + before do + create(:project_hook, :permanently_disabled, project: project) + end + end + + describe '#show_project_hook_failed_callout?' do + context 'all conditions are met' do + include_context 'user is logged in' + include_context 'webhooks_failed_callout is enabled' + include_context 'web_hooks_disable_failed is enabled' + include_context 'the user has permission' + include_context 'a hook has failed' + + it 'is true' do + expect(helper).to be_show_project_hook_failed_callout(project: project) + end + + it 'caches the DB calls until the TTL', :use_clean_rails_memory_store_caching, :request_store do + helper.show_project_hook_failed_callout?(project: project) + + travel_to((described_class::EXPIRY_TTL - 1.second).from_now) do + expect do + helper.show_project_hook_failed_callout?(project: project) + end.not_to exceed_query_limit(0) + end + + travel_to((described_class::EXPIRY_TTL + 1.second).from_now) do + expect do + helper.show_project_hook_failed_callout?(project: project) + end.to exceed_query_limit(0) + end + end + end + + context 'all conditions are met, project scoped flags' do + include_context 'user is logged in' + include_context 'webhooks_failed_callout is enabled for this project' + include_context 'web_hooks_disable_failed is enabled for this project' + include_context 'the user has permission' + include_context 'a hook has failed' + + it 'is true' do + expect(helper).to be_show_project_hook_failed_callout(project: project) + end + end + + context 'one condition is not met' do + contexts = [ + 'user is logged in', + 'webhooks_failed_callout is enabled', + 'web_hooks_disable_failed is enabled', + 'the user has permission', + 'a hook has failed' + ] + + contexts.each do |name| + context "namely #{name}" do + contexts.each { |ctx| include_context(ctx) unless ctx == name } + + it 'is false' do + expect(helper).not_to be_show_project_hook_failed_callout(project: project) + end + end + end + end + end +end |