1# frozen_string_literal: true
2
3require 'spec_helper'
4
5RSpec.describe 'groups/edit.html.haml' do
6  include Devise::Test::ControllerHelpers
7
8  describe '"Share with group lock" setting' do
9    let(:root_owner) { create(:user) }
10    let(:root_group) { create(:group) }
11
12    before do
13      root_group.add_owner(root_owner)
14    end
15
16    shared_examples_for '"Share with group lock" setting' do |checkbox_options|
17      it 'has the correct label, help text, and checkbox options' do
18        assign(:group, test_group)
19        allow(view).to receive(:can?).with(test_user, :admin_group, test_group).and_return(true)
20        allow(view).to receive(:can_change_group_visibility_level?).and_return(false)
21        allow(view).to receive(:current_user).and_return(test_user)
22        expect(view).to receive(:can_change_share_with_group_lock?).and_return(!checkbox_options[:disabled])
23        expect(view).to receive(:share_with_group_lock_help_text).and_return('help text here')
24
25        render
26
27        expect(rendered).to have_content("Prevent sharing a project within #{test_group.name} with other groups")
28        expect(rendered).to have_content('help text here')
29        expect(rendered).to have_field('group_share_with_group_lock', **checkbox_options)
30      end
31    end
32
33    context 'for a root group' do
34      let(:test_group) { root_group }
35      let(:test_user) { root_owner }
36
37      it_behaves_like '"Share with group lock" setting', { disabled: false, checked: false }
38    end
39
40    context 'for a subgroup' do
41      let!(:subgroup) { create(:group, parent: root_group) }
42      let(:sub_owner) { create(:user) }
43      let(:test_group) { subgroup }
44
45      context 'when the root_group has "Share with group lock" disabled' do
46        context 'when the subgroup has "Share with group lock" disabled' do
47          context 'as the root_owner' do
48            let(:test_user) { root_owner }
49
50            it_behaves_like '"Share with group lock" setting', { disabled: false, checked: false }
51          end
52
53          context 'as the sub_owner' do
54            let(:test_user) { sub_owner }
55
56            it_behaves_like '"Share with group lock" setting', { disabled: false, checked: false }
57          end
58        end
59
60        context 'when the subgroup has "Share with group lock" enabled' do
61          before do
62            subgroup.update_column(:share_with_group_lock, true)
63          end
64
65          context 'as the root_owner' do
66            let(:test_user) { root_owner }
67
68            it_behaves_like '"Share with group lock" setting', { disabled: false, checked: true }
69          end
70
71          context 'as the sub_owner' do
72            let(:test_user) { sub_owner }
73
74            it_behaves_like '"Share with group lock" setting', { disabled: false, checked: true }
75          end
76        end
77      end
78
79      context 'when the root_group has "Share with group lock" enabled' do
80        before do
81          root_group.update_column(:share_with_group_lock, true)
82        end
83
84        context 'when the subgroup has "Share with group lock" disabled (parent overridden)' do
85          context 'as the root_owner' do
86            let(:test_user) { root_owner }
87
88            it_behaves_like '"Share with group lock" setting', { disabled: false, checked: false }
89          end
90
91          context 'as the sub_owner' do
92            let(:test_user) { sub_owner }
93
94            it_behaves_like '"Share with group lock" setting', { disabled: false, checked: false }
95          end
96        end
97
98        context 'when the subgroup has "Share with group lock" enabled (same as parent)' do
99          before do
100            subgroup.update_column(:share_with_group_lock, true)
101          end
102
103          context 'as the root_owner' do
104            let(:test_user) { root_owner }
105
106            it_behaves_like '"Share with group lock" setting', { disabled: false, checked: true }
107          end
108
109          context 'as the sub_owner' do
110            let(:test_user) { sub_owner }
111
112            it_behaves_like '"Share with group lock" setting', { disabled: true, checked: true }
113          end
114        end
115      end
116    end
117  end
118end
119