summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Kozono <mkozono@gmail.com>2017-08-31 22:58:05 -0700
committerMichael Kozono <mkozono@gmail.com>2017-09-06 12:07:20 -0700
commit8437a24ff46220e2813ce3d82a52062dd259276b (patch)
treec132cfe1a881a9aa7b2eb5794e0c983ebf9dfce9
parentc93e8f246a3ade5e60e770533393ed1a6df91731 (diff)
downloadgitlab-ce-8437a24ff46220e2813ce3d82a52062dd259276b.tar.gz
Vary share lock setting UI
…based on whether the current user owns the parent group and whether the parent group or current group is share locked.
-rw-r--r--app/helpers/groups_helper.rb32
-rw-r--r--app/views/groups/edit.html.haml4
-rw-r--r--spec/views/groups/edit.html.haml_spec.rb140
3 files changed, 174 insertions, 2 deletions
diff --git a/app/helpers/groups_helper.rb b/app/helpers/groups_helper.rb
index eab1feb8a1f..1ced92e0828 100644
--- a/app/helpers/groups_helper.rb
+++ b/app/helpers/groups_helper.rb
@@ -65,6 +65,22 @@ module GroupsHelper
{ group_name: group.name }
end
+ def share_with_group_lock_disabled
+ return false unless @group.has_parent?
+ return false unless @group.parent.share_with_group_lock?
+ return false unless @group.share_with_group_lock?
+ return false if @group.has_owner?(current_user)
+ return true
+ end
+
+ def share_with_group_lock_help_text
+ return default_help unless @group.has_parent?
+ return default_help unless @group.parent.share_with_group_lock?
+ return parent_locked_and_has_been_overridden unless @group.share_with_group_lock?
+ return parent_locked_but_you_can_override if @group.has_owner?(current_user)
+ return parent_locked_so_ask_the_owner
+ end
+
private
def group_title_link(group, hidable: false, show_avatar: false)
@@ -80,4 +96,20 @@ module GroupsHelper
output.html_safe
end
end
+
+ def default_help
+ "This setting will be applied to all subgroups unless overridden by a group owner."
+ end
+
+ def parent_locked_but_you_can_override
+ "This setting is applied on #{@group.parent.name}. You can override the setting or remove the share lock from the parent group."
+ end
+
+ def parent_locked_so_ask_the_owner
+ "This setting is applied on #{@group.parent.name}. To share this group with another group, ask the owner to override the setting or remove the share lock from the parent group."
+ end
+
+ def parent_locked_and_has_been_overridden
+ "This setting is applied on #{@group.parent.name} and has been overridden on this subgroup."
+ end
end
diff --git a/app/views/groups/edit.html.haml b/app/views/groups/edit.html.haml
index b53f0b90b9c..fb7825b82fc 100644
--- a/app/views/groups/edit.html.haml
+++ b/app/views/groups/edit.html.haml
@@ -33,13 +33,13 @@
.col-sm-10
.checkbox
= f.label :share_with_group_lock do
- = f.check_box :share_with_group_lock
+ = f.check_box :share_with_group_lock, disabled: share_with_group_lock_disabled
%strong
Prevent sharing a project within
= @group.name
with other groups
%br/
- %span.descr This setting will be applied to all subgroups unless overridden by a group owner
+ %span.descr= share_with_group_lock_help_text
= render 'group_admin_settings', f: f
diff --git a/spec/views/groups/edit.html.haml_spec.rb b/spec/views/groups/edit.html.haml_spec.rb
new file mode 100644
index 00000000000..613368049e1
--- /dev/null
+++ b/spec/views/groups/edit.html.haml_spec.rb
@@ -0,0 +1,140 @@
+require 'spec_helper'
+
+describe 'groups/edit.html.haml' do
+ include Devise::Test::ControllerHelpers
+
+ describe 'Share lock option' do
+ let(:root_owner) { create(:user) }
+ let(:root_group) { create(:group) }
+ let(:expected_label) { default_label }
+ let(:expected_help) { default_help }
+
+ before do
+ root_group.add_owner(root_owner)
+ end
+
+ shared_examples_for 'share lock option' do |checkbox_options|
+ it 'should have the correct label, help text, and checkbox options' do
+ assign(:group, test_group)
+ allow(view).to receive(:can?).and_return(true)
+ allow(view).to receive(:can_change_group_visibility_level?).and_return(false)
+ allow(view).to receive(:current_user).and_return(test_user)
+
+ render
+
+ expect(rendered).to have_content(expected_label)
+ expect(rendered).to have_css('.descr', text: expected_help)
+ expect(rendered).to have_field('group_share_with_group_lock', checkbox_options)
+ end
+ end
+
+ context 'for a root group' do
+ let(:test_group) { root_group }
+ let(:test_user) { root_owner }
+
+ it_behaves_like 'share lock option', { disabled: false, checked: false }
+ end
+
+ context 'for a subgroup', :nested_groups do
+ let!(:subgroup) { create(:group, parent: root_group) }
+ let(:sub_owner) { create(:user) }
+ let(:test_group) { subgroup }
+
+ context 'when the root_group has "Share lock" disabled' do
+ context 'when the subgroup has "Share lock" disabled' do
+ context 'as the root_owner' do
+ let(:test_user) { root_owner }
+
+ it_behaves_like 'share lock option', { disabled: false, checked: false }
+ end
+
+ context 'as the sub_owner' do
+ let(:test_user) { sub_owner }
+
+ it_behaves_like 'share lock option', { disabled: false, checked: false }
+ end
+ end
+
+ context 'when the subgroup has "Share lock" enabled' do
+ before do
+ subgroup.update_column(:share_with_group_lock, true)
+ end
+
+ context 'as the root_owner' do
+ let(:test_user) { root_owner }
+
+ it_behaves_like 'share lock option', { disabled: false, checked: true }
+ end
+
+ context 'as the sub_owner' do
+ let(:test_user) { sub_owner }
+
+ it_behaves_like 'share lock option', { disabled: false, checked: true }
+ end
+ end
+ end
+
+ context 'when the root_group has "Share lock" enabled' do
+ before do
+ root_group.update_column(:share_with_group_lock, true)
+ end
+
+ context 'when the subgroup has "Share lock" disabled (parent overridden)' do
+ context 'as the root_owner' do
+ let(:test_user) { root_owner }
+ let(:expected_help) { parent_locked_and_has_been_overridden }
+
+ it_behaves_like 'share lock option', { disabled: false, checked: false }
+ end
+
+ context 'as the sub_owner' do
+ let(:test_user) { sub_owner }
+ let(:expected_help) { parent_locked_and_has_been_overridden }
+
+ it_behaves_like 'share lock option', { disabled: false, checked: false }
+ end
+ end
+
+ context 'when the subgroup has "Share lock" enabled (same as parent)' do
+ before do
+ subgroup.update_column(:share_with_group_lock, true)
+ end
+
+ context 'as the root_owner' do
+ let(:test_user) { root_owner }
+ let(:expected_help) { parent_locked_but_you_can_override }
+
+ it_behaves_like 'share lock option', { disabled: false, checked: true }
+ end
+
+ context 'as the sub_owner' do
+ let(:test_user) { sub_owner }
+ let(:expected_help) { parent_locked_so_ask_the_owner }
+
+ it_behaves_like 'share lock option', { disabled: true, checked: true }
+ end
+ end
+ end
+ end
+
+ def default_label
+ "Prevent sharing a project within #{test_group.name} with other groups"
+ end
+
+ def default_help
+ "This setting will be applied to all subgroups unless overridden by a group owner."
+ end
+
+ def parent_locked_but_you_can_override
+ "This setting is applied on #{test_group.parent.name}. You can override the setting or remove the share lock from the parent group."
+ end
+
+ def parent_locked_so_ask_the_owner
+ "This setting is applied on #{test_group.parent.name}. To share this group with another group, ask the owner to override the setting or remove the share lock from the parent group."
+ end
+
+ def parent_locked_and_has_been_overridden
+ "This setting is applied on #{test_group.parent.name} and has been overridden on this subgroup."
+ end
+ end
+end