From 5a7be1bf3c86756ee17d6f776785d37f51170583 Mon Sep 17 00:00:00 2001 From: Joseph Snyder Date: Thu, 18 Aug 2022 09:43:52 -0400 Subject: [PATCH 1/5] Introduce backend updates for toggle of diff preview Add a column to both the project and the namespace settings which will control whether a comment on a line in a merge request will show the code section that goes with the comment. Add necessary parts of "back end" code to utilize this column. Front end will follow after this merge. Changelog: added --- app/controllers/groups_controller.rb | 1 + app/models/namespace.rb | 3 +- app/models/namespace_setting.rb | 7 +++ app/models/project.rb | 3 ++ app/models/project_setting.rb | 13 ++++++ app/policies/group_policy.rb | 1 + app/policies/project_policy.rb | 1 + ..._preview_in_email_to_namespace_settings.rb | 9 ++++ ...ff_preview_in_email_to_project_settings.rb | 9 ++++ db/schema_migrations/20220603125200 | 1 + db/schema_migrations/20220817122907 | 1 + db/structure.sql | 2 + lib/api/helpers/projects_helpers.rb | 2 + spec/models/namespace_setting_spec.rb | 43 +++++++++++++++++++ spec/models/project_setting_spec.rb | 36 ++++++++++++++++ spec/requests/api/project_attributes.yml | 2 + 16 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20220603125200_add_show_diff_preview_in_email_to_namespace_settings.rb create mode 100644 db/migrate/20220817122907_re_add_show_diff_preview_in_email_to_project_settings.rb create mode 100644 db/schema_migrations/20220603125200 create mode 100644 db/schema_migrations/20220817122907 diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 32b187c32606c9..aefbb43f3df46d 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -276,6 +276,7 @@ def group_params_attributes :avatar, :description, :emails_disabled, + :show_diff_preview_in_email, :mentions_disabled, :lfs_enabled, :name, diff --git a/app/models/namespace.rb b/app/models/namespace.rb index c678dbfa6311ff..e8cd477c9b8631 100644 --- a/app/models/namespace.rb +++ b/app/models/namespace.rb @@ -128,7 +128,8 @@ class Namespace < ApplicationRecord delegate :avatar_url, to: :owner, allow_nil: true delegate :prevent_sharing_groups_outside_hierarchy, :prevent_sharing_groups_outside_hierarchy=, to: :namespace_settings, allow_nil: true - + delegate :show_diff_preview_in_email, :show_diff_preview_in_email?, :show_diff_preview_in_email=, + to: :namespace_settings after_save :schedule_sync_event_worker, if: -> { saved_change_to_id? || saved_change_to_parent_id? } after_save :reload_namespace_details diff --git a/app/models/namespace_setting.rb b/app/models/namespace_setting.rb index fa9b525d4fe99a..ef75db485ba2a4 100644 --- a/app/models/namespace_setting.rb +++ b/app/models/namespace_setting.rb @@ -58,6 +58,13 @@ def prevent_sharing_groups_outside_hierarchy namespace.root_ancestor.prevent_sharing_groups_outside_hierarchy end + # any ancestor can hide diff content in emails + def show_diff_preview_in_email? + return namespace.parent.show_diff_preview_in_email? && namespace.show_diff_preview_in_email if namespace.has_parent? + + show_diff_preview_in_email + end + private def normalize_default_branch_name diff --git a/app/models/project.rb b/app/models/project.rb index 3053055bd771eb..d8d08cbffcccc7 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -462,6 +462,9 @@ def self.integration_association_name(name) :warn_about_potentially_unwanted_characters, :warn_about_potentially_unwanted_characters=, to: :project_setting, allow_nil: true + delegate :show_diff_preview_in_email, :show_diff_preview_in_email=, :show_diff_preview_in_email?, + to: :project_setting + delegate :squash_always?, :squash_never?, :squash_enabled_by_default?, :squash_readonly?, to: :project_setting delegate :squash_option, :squash_option=, to: :project_setting delegate :mr_default_target_self, :mr_default_target_self=, to: :project_setting diff --git a/app/models/project_setting.rb b/app/models/project_setting.rb index 59d2e3deb4f033..a216de32ab8f61 100644 --- a/app/models/project_setting.rb +++ b/app/models/project_setting.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class ProjectSetting < ApplicationRecord + include ::Gitlab::Utils::StrongMemoize + ALLOWED_TARGET_PLATFORMS = %w(ios osx tvos watchos android).freeze belongs_to :project, inverse_of: :project_setting @@ -47,6 +49,17 @@ def human_squash_option end end + def show_diff_preview_in_email? + strong_memoize(:show_diff_preview_in_email) do + # disabling in the namespace overrides the project setting + if project.group + super && project.group&.show_diff_preview_in_email? + else + !!super + end + end + end + private def validates_mr_default_target_self diff --git a/app/policies/group_policy.rb b/app/policies/group_policy.rb index a264ff48c08e16..bee32d789aca45 100644 --- a/app/policies/group_policy.rb +++ b/app/policies/group_policy.rb @@ -193,6 +193,7 @@ class GroupPolicy < Namespaces::GroupProjectNamespaceSharedPolicy enable :set_note_created_at enable :set_emails_disabled enable :change_prevent_sharing_groups_outside_hierarchy + enable :set_show_diff_preview_in_email enable :change_new_user_signups_cap enable :update_default_branch_protection enable :create_deploy_token diff --git a/app/policies/project_policy.rb b/app/policies/project_policy.rb index f4f7275a78a35e..ccdad8e6be1716 100644 --- a/app/policies/project_policy.rb +++ b/app/policies/project_policy.rb @@ -267,6 +267,7 @@ class ProjectPolicy < BasePolicy enable :set_note_created_at enable :set_emails_disabled enable :set_show_default_award_emojis + enable :set_show_diff_preview_in_email enable :set_warn_about_potentially_unwanted_characters enable :register_project_runners diff --git a/db/migrate/20220603125200_add_show_diff_preview_in_email_to_namespace_settings.rb b/db/migrate/20220603125200_add_show_diff_preview_in_email_to_namespace_settings.rb new file mode 100644 index 00000000000000..ad32d58984075f --- /dev/null +++ b/db/migrate/20220603125200_add_show_diff_preview_in_email_to_namespace_settings.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class AddShowDiffPreviewInEmailToNamespaceSettings < Gitlab::Database::Migration[2.0] + enable_lock_retries! + + def change + add_column :namespace_settings, :show_diff_preview_in_email, :boolean, default: true, null: false + end +end diff --git a/db/migrate/20220817122907_re_add_show_diff_preview_in_email_to_project_settings.rb b/db/migrate/20220817122907_re_add_show_diff_preview_in_email_to_project_settings.rb new file mode 100644 index 00000000000000..bb5649e3a99774 --- /dev/null +++ b/db/migrate/20220817122907_re_add_show_diff_preview_in_email_to_project_settings.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class ReAddShowDiffPreviewInEmailToProjectSettings < Gitlab::Database::Migration[2.0] + enable_lock_retries! + + def change + add_column :project_settings, :show_diff_preview_in_email, :boolean, default: true, null: false + end +end diff --git a/db/schema_migrations/20220603125200 b/db/schema_migrations/20220603125200 new file mode 100644 index 00000000000000..5da1d1992ab70e --- /dev/null +++ b/db/schema_migrations/20220603125200 @@ -0,0 +1 @@ +7631f2c1f9b2647ae6de47675305a2d5c1b213229c85b6f161412f83884bad87 \ No newline at end of file diff --git a/db/schema_migrations/20220817122907 b/db/schema_migrations/20220817122907 new file mode 100644 index 00000000000000..fb6951e19d54e2 --- /dev/null +++ b/db/schema_migrations/20220817122907 @@ -0,0 +1 @@ +4db4f50d2e23527516eccdeae60059803df7add21ca7a2c40f1670dba9744496 \ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index 9a2b98050460dc..8aea782ba4b718 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -17825,6 +17825,7 @@ CREATE TABLE namespace_settings ( include_for_free_user_cap_preview boolean DEFAULT false NOT NULL, unique_project_download_limit_allowlist text[] DEFAULT '{}'::text[] NOT NULL, auto_ban_user_on_excessive_projects_download boolean DEFAULT false NOT NULL, + show_diff_preview_in_email boolean DEFAULT true NOT NULL, CONSTRAINT check_0ba93c78c7 CHECK ((char_length(default_branch_name) <= 255)), CONSTRAINT namespace_settings_unique_project_download_limit_allowlist_size CHECK ((cardinality(unique_project_download_limit_allowlist) <= 100)) ); @@ -19936,6 +19937,7 @@ CREATE TABLE project_settings ( target_platforms character varying[] DEFAULT '{}'::character varying[] NOT NULL, enforce_auth_checks_on_uploads boolean DEFAULT true NOT NULL, selective_code_owner_removals boolean DEFAULT false NOT NULL, + show_diff_preview_in_email boolean DEFAULT true NOT NULL, CONSTRAINT check_3a03e7557a CHECK ((char_length(previous_default_branch) <= 4096)), CONSTRAINT check_b09644994b CHECK ((char_length(squash_commit_template) <= 500)), CONSTRAINT check_bde223416c CHECK ((show_default_award_emojis IS NOT NULL)), diff --git a/lib/api/helpers/projects_helpers.rb b/lib/api/helpers/projects_helpers.rb index 40da4a4f8e82b9..7ca3f55b5a2c7e 100644 --- a/lib/api/helpers/projects_helpers.rb +++ b/lib/api/helpers/projects_helpers.rb @@ -39,6 +39,7 @@ module ProjectsHelpers optional :emails_disabled, type: Boolean, desc: 'Disable email notifications' optional :show_default_award_emojis, type: Boolean, desc: 'Show default award emojis' + optional :show_diff_preview_in_email, type: Boolean, desc: 'Include the code diff preview in merge request notification emails' optional :warn_about_potentially_unwanted_characters, type: Boolean, desc: 'Warn about Potentially Unwanted Characters' optional :enforce_auth_checks_on_uploads, type: Boolean, desc: 'Enforce auth check on uploads' optional :shared_runners_enabled, type: Boolean, desc: 'Flag indication if shared runners are enabled for that project' @@ -159,6 +160,7 @@ def self.update_params_at_least_one_of :request_access_enabled, :resolve_outdated_diff_discussions, :restrict_user_defined_variables, + :show_diff_preview_in_email, :security_and_compliance_access_level, :squash_option, :shared_runners_enabled, diff --git a/spec/models/namespace_setting_spec.rb b/spec/models/namespace_setting_spec.rb index 25234db5734e0c..8b795405285560 100644 --- a/spec/models/namespace_setting_spec.rb +++ b/spec/models/namespace_setting_spec.rb @@ -127,4 +127,47 @@ end end end + + describe '#show_diff_preview_in_email?' do + context 'when not a subgroup' do + it 'returns false' do + settings = create(:namespace_settings, show_diff_preview_in_email: false) + group = create(:group, namespace_settings: settings ) + + expect(group.show_diff_preview_in_email?).to be_falsey + end + + it 'returns true' do + settings = create(:namespace_settings, show_diff_preview_in_email: true) + group = create(:group, namespace_settings: settings ) + + expect(group.show_diff_preview_in_email?).to be_truthy + end + + it 'does not query the db when there is no parent group' do + group = create(:group) + + expect { group.show_diff_preview_in_email? }.not_to exceed_query_limit(0) + end + end + + context 'when an ancestor has disabled diff previews' do + let(:settings) { create(:namespace_settings, show_diff_preview_in_email: false) } + let(:grandparent) { create(:group, namespace_settings: settings) } + let(:parent) { create(:group, parent: grandparent) } + let!(:group) { create(:group, parent: parent) } + + it 'returns false' do + expect(group.show_diff_preview_in_email?).to be_falsey + end + + context 'when all ancestors have enabled diff previews' do + it 'returns true' do + grandparent.update_attribute(:show_diff_preview_in_email, true) + + expect(group.show_diff_preview_in_email?).to be_truthy + end + end + end + end end diff --git a/spec/models/project_setting_spec.rb b/spec/models/project_setting_spec.rb index fb1601a5f9c1c7..e2569bc3fb4e58 100644 --- a/spec/models/project_setting_spec.rb +++ b/spec/models/project_setting_spec.rb @@ -63,4 +63,40 @@ def valid_target_platform_combinations target_platforms.permutation(n).to_a end end + + describe '#show_diff_preview_in_email?' do + context 'when not a subgroup' do + it 'returns false' do + settings = create(:project_setting, show_diff_preview_in_email: false) + project = create(:project, project_setting: settings) + expect(project).not_to be_show_diff_preview_in_email + end + + it 'returns true' do + settings = create(:project_setting, show_diff_preview_in_email: true) + project = create(:project, project_setting: settings) + + expect(project).to be_show_diff_preview_in_email + end + end + + context 'when a parent group has disabled diff previews' do + let(:namespace_settings) { create(:namespace_settings, show_diff_preview_in_email: false) } + let(:project_settings) { create(:project_setting, show_diff_preview_in_email: true) } + let(:group) { create(:group, namespace_settings: namespace_settings) } + let!(:project) { create(:project, namespace_id: group.id, project_setting: project_settings) } + + it 'returns false' do + expect(project).not_to be_show_diff_preview_in_email + end + + context 'when all ancestors have enabled diff previews' do + it 'returns true' do + group.update_attribute(:show_diff_preview_in_email, true) + + expect(project).to be_show_diff_preview_in_email + end + end + end + end end diff --git a/spec/requests/api/project_attributes.yml b/spec/requests/api/project_attributes.yml index 670035187cb96a..1335fa02aaf49f 100644 --- a/spec/requests/api/project_attributes.yml +++ b/spec/requests/api/project_attributes.yml @@ -154,11 +154,13 @@ project_setting: - project_id - push_rule_id - show_default_award_emojis + - show_diff_preview_in_email - updated_at - cve_id_request_enabled - mr_default_target_self - target_platforms - selective_code_owner_removals + - show_diff_preview_in_email build_service_desk_setting: # service_desk_setting unexposed_attributes: -- GitLab From b3e0b0005a225d2e30bcc0419213def48e04d2a9 Mon Sep 17 00:00:00 2001 From: Kerri Miller Date: Thu, 25 Aug 2022 15:09:51 +0000 Subject: [PATCH 2/5] Apply suggested fix to properly fix spacing in namespace.rb --- app/models/namespace.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/models/namespace.rb b/app/models/namespace.rb index e8cd477c9b8631..d519ceb658d6dd 100644 --- a/app/models/namespace.rb +++ b/app/models/namespace.rb @@ -130,6 +130,7 @@ class Namespace < ApplicationRecord to: :namespace_settings, allow_nil: true delegate :show_diff_preview_in_email, :show_diff_preview_in_email?, :show_diff_preview_in_email=, to: :namespace_settings + after_save :schedule_sync_event_worker, if: -> { saved_change_to_id? || saved_change_to_parent_id? } after_save :reload_namespace_details -- GitLab From c5ca46f572bb0315d23d1efc523aa2d297a536e3 Mon Sep 17 00:00:00 2001 From: Joseph Snyder Date: Thu, 25 Aug 2022 14:15:52 -0400 Subject: [PATCH 3/5] Properly place show_diff_in_email in schema file Place the entry for diff previews in email in the proper place within the db/structure.sql file. --- db/structure.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/structure.sql b/db/structure.sql index 8aea782ba4b718..b558d104ee973d 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -17818,6 +17818,7 @@ CREATE TABLE namespace_settings ( subgroup_runner_token_expiration_interval integer, project_runner_token_expiration_interval integer, exclude_from_free_user_cap boolean DEFAULT false NOT NULL, + show_diff_preview_in_email boolean DEFAULT true NOT NULL, enabled_git_access_protocol smallint DEFAULT 0 NOT NULL, unique_project_download_limit smallint DEFAULT 0 NOT NULL, unique_project_download_limit_interval_in_seconds integer DEFAULT 0 NOT NULL, @@ -17825,7 +17826,6 @@ CREATE TABLE namespace_settings ( include_for_free_user_cap_preview boolean DEFAULT false NOT NULL, unique_project_download_limit_allowlist text[] DEFAULT '{}'::text[] NOT NULL, auto_ban_user_on_excessive_projects_download boolean DEFAULT false NOT NULL, - show_diff_preview_in_email boolean DEFAULT true NOT NULL, CONSTRAINT check_0ba93c78c7 CHECK ((char_length(default_branch_name) <= 255)), CONSTRAINT namespace_settings_unique_project_download_limit_allowlist_size CHECK ((cardinality(unique_project_download_limit_allowlist) <= 100)) ); -- GitLab From 49a556e5c974dc3adcd471be84f5a0ac65a69ecd Mon Sep 17 00:00:00 2001 From: Joseph Snyder Date: Fri, 26 Aug 2022 09:10:41 -0400 Subject: [PATCH 4/5] Add suggested update to namespace_settings Add a scope to reduce the amount of database calls used as we check for the setting. --- app/models/namespace_setting.rb | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/app/models/namespace_setting.rb b/app/models/namespace_setting.rb index ef75db485ba2a4..d73b7730ef3c87 100644 --- a/app/models/namespace_setting.rb +++ b/app/models/namespace_setting.rb @@ -25,6 +25,8 @@ class NamespaceSetting < ApplicationRecord before_validation :normalize_default_branch_name + scope :ancestor_show_diff_preview_in_email, -> (namespace) { where(namespace_id: namespace.self_and_ancestors).select(:show_diff_preview_in_email) } + chronic_duration_attr :runner_token_expiration_interval_human_readable, :runner_token_expiration_interval chronic_duration_attr :subgroup_runner_token_expiration_interval_human_readable, :subgroup_runner_token_expiration_interval chronic_duration_attr :project_runner_token_expiration_interval_human_readable, :project_runner_token_expiration_interval @@ -58,11 +60,14 @@ def prevent_sharing_groups_outside_hierarchy namespace.root_ancestor.prevent_sharing_groups_outside_hierarchy end - # any ancestor can hide diff content in emails def show_diff_preview_in_email? - return namespace.parent.show_diff_preview_in_email? && namespace.show_diff_preview_in_email if namespace.has_parent? + return show_diff_preview_in_email unless namespace.has_parent? + + all_ancestors_allow_diff_preview_in_email? + end - show_diff_preview_in_email + def all_ancestors_allow_diff_preview_in_email? + !self.class.ancestor_show_diff_preview_in_email(namespace).collect(&:show_diff_preview_in_email).include? false end private -- GitLab From 9993a415b817b5cf461ed1f930c2a56e94ce74b1 Mon Sep 17 00:00:00 2001 From: Joseph Snyder Date: Tue, 30 Aug 2022 10:45:53 -0400 Subject: [PATCH 5/5] Additional review fixes Make the spec descriptions have better flow and better describe the content of each part of the test. Update memoization formatting to follow new suggestion. Add new command for all ancestors query to perform the search entirely in the database. Remove the unneeded scope attribute and make the ancestor searching function private --- app/models/namespace_setting.rb | 8 +++--- app/models/project_setting.rb | 12 ++++----- spec/models/namespace_setting_spec.rb | 17 +++++++------ spec/models/project_setting_spec.rb | 35 ++++++++++++++++++--------- 4 files changed, 41 insertions(+), 31 deletions(-) diff --git a/app/models/namespace_setting.rb b/app/models/namespace_setting.rb index d73b7730ef3c87..6a87fba57acfdd 100644 --- a/app/models/namespace_setting.rb +++ b/app/models/namespace_setting.rb @@ -25,8 +25,6 @@ class NamespaceSetting < ApplicationRecord before_validation :normalize_default_branch_name - scope :ancestor_show_diff_preview_in_email, -> (namespace) { where(namespace_id: namespace.self_and_ancestors).select(:show_diff_preview_in_email) } - chronic_duration_attr :runner_token_expiration_interval_human_readable, :runner_token_expiration_interval chronic_duration_attr :subgroup_runner_token_expiration_interval_human_readable, :subgroup_runner_token_expiration_interval chronic_duration_attr :project_runner_token_expiration_interval_human_readable, :project_runner_token_expiration_interval @@ -66,12 +64,12 @@ def show_diff_preview_in_email? all_ancestors_allow_diff_preview_in_email? end + private + def all_ancestors_allow_diff_preview_in_email? - !self.class.ancestor_show_diff_preview_in_email(namespace).collect(&:show_diff_preview_in_email).include? false + !self.class.where(namespace_id: namespace.self_and_ancestors, show_diff_preview_in_email: false).exists? end - private - def normalize_default_branch_name self.default_branch_name = default_branch_name.presence end diff --git a/app/models/project_setting.rb b/app/models/project_setting.rb index a216de32ab8f61..f5c346eda30566 100644 --- a/app/models/project_setting.rb +++ b/app/models/project_setting.rb @@ -50,15 +50,13 @@ def human_squash_option end def show_diff_preview_in_email? - strong_memoize(:show_diff_preview_in_email) do - # disabling in the namespace overrides the project setting - if project.group - super && project.group&.show_diff_preview_in_email? - else - !!super - end + if project.group + super && project.group&.show_diff_preview_in_email? + else + !!super end end + strong_memoize_attr :show_diff_preview_in_email private diff --git a/spec/models/namespace_setting_spec.rb b/spec/models/namespace_setting_spec.rb index 8b795405285560..9fce65c9a5fb87 100644 --- a/spec/models/namespace_setting_spec.rb +++ b/spec/models/namespace_setting_spec.rb @@ -151,20 +151,23 @@ end end - context 'when an ancestor has disabled diff previews' do - let(:settings) { create(:namespace_settings, show_diff_preview_in_email: false) } + context 'when a group has parent groups' do let(:grandparent) { create(:group, namespace_settings: settings) } let(:parent) { create(:group, parent: grandparent) } let!(:group) { create(:group, parent: parent) } - it 'returns false' do - expect(group.show_diff_preview_in_email?).to be_falsey + context "when a parent group has disabled diff previews" do + let(:settings) { create(:namespace_settings, show_diff_preview_in_email: false) } + + it 'returns false' do + expect(group.show_diff_preview_in_email?).to be_falsey + end end - context 'when all ancestors have enabled diff previews' do - it 'returns true' do - grandparent.update_attribute(:show_diff_preview_in_email, true) + context 'when all parent groups have enabled diff previews' do + let(:settings) { create(:namespace_settings, show_diff_preview_in_email: true) } + it 'returns true' do expect(group.show_diff_preview_in_email?).to be_truthy end end diff --git a/spec/models/project_setting_spec.rb b/spec/models/project_setting_spec.rb index e2569bc3fb4e58..a09ae7ec7aed6e 100644 --- a/spec/models/project_setting_spec.rb +++ b/spec/models/project_setting_spec.rb @@ -65,32 +65,43 @@ def valid_target_platform_combinations end describe '#show_diff_preview_in_email?' do - context 'when not a subgroup' do - it 'returns false' do - settings = create(:project_setting, show_diff_preview_in_email: false) - project = create(:project, project_setting: settings) - expect(project).not_to be_show_diff_preview_in_email + context 'when a project is a top-level namespace' do + let(:project_settings ) { create(:project_setting, show_diff_preview_in_email: false) } + let(:project) { create(:project, project_setting: project_settings) } + + context 'when show_diff_preview_in_email is disabled' do + it 'returns false' do + expect(project).not_to be_show_diff_preview_in_email + end end - it 'returns true' do - settings = create(:project_setting, show_diff_preview_in_email: true) - project = create(:project, project_setting: settings) + context 'when show_diff_preview_in_email is enabled' do + let(:project_settings ) { create(:project_setting, show_diff_preview_in_email: true) } + + it 'returns true' do + settings = create(:project_setting, show_diff_preview_in_email: true) + project = create(:project, project_setting: settings) - expect(project).to be_show_diff_preview_in_email + expect(project).to be_show_diff_preview_in_email + end end end - context 'when a parent group has disabled diff previews' do + context 'when a parent group has a parent group' do let(:namespace_settings) { create(:namespace_settings, show_diff_preview_in_email: false) } let(:project_settings) { create(:project_setting, show_diff_preview_in_email: true) } let(:group) { create(:group, namespace_settings: namespace_settings) } let!(:project) { create(:project, namespace_id: group.id, project_setting: project_settings) } - it 'returns false' do - expect(project).not_to be_show_diff_preview_in_email + context 'when show_diff_preview_in_email is disabled for the parent group' do + it 'returns false' do + expect(project).not_to be_show_diff_preview_in_email + end end context 'when all ancestors have enabled diff previews' do + let(:namespace_settings) { create(:namespace_settings, show_diff_preview_in_email: true) } + it 'returns true' do group.update_attribute(:show_diff_preview_in_email, true) -- GitLab