diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-02-16 06:11:08 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-02-16 06:11:08 +0300 |
commit | f0abe9dd95232062d37f2f5bf832224272b7497c (patch) | |
tree | a32766ee919a7710d705f859a3303f1557bdd825 /spec/helpers/nav | |
parent | e97635ea6c5bdb695188b3ad75edd5f5842387b4 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/helpers/nav')
-rw-r--r-- | spec/helpers/nav/new_dropdown_helper_spec.rb | 114 |
1 files changed, 70 insertions, 44 deletions
diff --git a/spec/helpers/nav/new_dropdown_helper_spec.rb b/spec/helpers/nav/new_dropdown_helper_spec.rb index 2a69f8a56b3..3a66fe474ab 100644 --- a/spec/helpers/nav/new_dropdown_helper_spec.rb +++ b/spec/helpers/nav/new_dropdown_helper_spec.rb @@ -2,41 +2,29 @@ require 'spec_helper' -RSpec.describe Nav::NewDropdownHelper do +RSpec.describe Nav::NewDropdownHelper, feature_category: :navigation do describe '#new_dropdown_view_model' do - let_it_be(:user) { build_stubbed(:user) } - + let(:user) { build_stubbed(:user) } let(:current_user) { user } let(:current_project) { nil } let(:current_group) { nil } - let(:with_can_create_project) { false } let(:with_can_create_group) { false } let(:with_can_create_snippet) { false } - let(:subject) { helper.new_dropdown_view_model(project: current_project, group: current_group) } - - def expected_menu_section(title:, menu_item:) - [ - { - title: title, - menu_items: [menu_item] - } - ] - end + subject(:view_model) { helper.new_dropdown_view_model(project: current_project, group: current_group) } before do allow(helper).to receive(:current_user) { current_user } - allow(helper).to receive(:can?) { false } - + allow(helper).to receive(:can?).and_return(false) allow(user).to receive(:can_create_project?) { with_can_create_project } allow(user).to receive(:can_create_group?) { with_can_create_group } allow(user).to receive(:can?).with(:create_snippet) { with_can_create_snippet } end - shared_examples 'invite member link shared example' do + shared_examples 'invite member item' do it 'shows invite member link with emoji' do - expect(subject[:menu_sections]).to eq( + expect(view_model[:menu_sections]).to eq( expected_menu_section( title: expected_title, menu_item: ::Gitlab::Nav::TopNavMenuItem.build( @@ -56,27 +44,25 @@ RSpec.describe Nav::NewDropdownHelper do end it 'has title' do - expect(subject[:title]).to eq('Create new...') + expect(view_model[:title]).to eq('Create new...') end context 'when current_user is nil (anonymous)' do let(:current_user) { nil } - it 'is nil' do - expect(subject).to be_nil - end + it { is_expected.to be_nil } end context 'when group and project are nil' do it 'has no menu sections' do - expect(subject[:menu_sections]).to eq([]) + expect(view_model[:menu_sections]).to eq([]) end context 'when can create project' do let(:with_can_create_project) { true } it 'has project menu item' do - expect(subject[:menu_sections]).to eq( + expect(view_model[:menu_sections]).to eq( expected_menu_section( title: _('In GitLab'), menu_item: ::Gitlab::Nav::TopNavMenuItem.build( @@ -99,7 +85,7 @@ RSpec.describe Nav::NewDropdownHelper do let(:with_can_create_group) { true } it 'has group menu item' do - expect(subject[:menu_sections]).to eq( + expect(view_model[:menu_sections]).to eq( expected_menu_section( title: _('In GitLab'), menu_item: ::Gitlab::Nav::TopNavMenuItem.build( @@ -122,7 +108,7 @@ RSpec.describe Nav::NewDropdownHelper do let(:with_can_create_snippet) { true } it 'has new snippet menu item' do - expect(subject[:menu_sections]).to eq( + expect(view_model[:menu_sections]).to eq( expected_menu_section( title: _('In GitLab'), menu_item: ::Gitlab::Nav::TopNavMenuItem.build( @@ -143,29 +129,31 @@ RSpec.describe Nav::NewDropdownHelper do end context 'with persisted group' do - let_it_be(:group) { build_stubbed(:group) } - + let(:group) { build_stubbed(:group) } let(:current_group) { group } let(:with_can_create_projects_in_group) { false } let(:with_can_create_subgroup_in_group) { false } let(:with_can_admin_in_group) { false } before do - allow(group).to receive(:persisted?) { true } - allow(helper).to receive(:can?).with(current_user, :create_projects, group) { with_can_create_projects_in_group } - allow(helper).to receive(:can?).with(current_user, :create_subgroup, group) { with_can_create_subgroup_in_group } - allow(helper).to receive(:can?).with(current_user, :admin_group_member, group) { with_can_admin_in_group } + allow(group).to receive(:persisted?).and_return(true) + allow(helper) + .to receive(:can?).with(current_user, :create_projects, group) { with_can_create_projects_in_group } + allow(helper) + .to receive(:can?).with(current_user, :create_subgroup, group) { with_can_create_subgroup_in_group } + allow(helper) + .to receive(:can?).with(current_user, :admin_group_member, group) { with_can_admin_in_group } end it 'has no menu sections' do - expect(subject[:menu_sections]).to eq([]) + expect(view_model[:menu_sections]).to eq([]) end context 'when can create projects in group' do let(:with_can_create_projects_in_group) { true } it 'has new project menu item' do - expect(subject[:menu_sections]).to eq( + expect(view_model[:menu_sections]).to eq( expected_menu_section( title: 'In this group', menu_item: ::Gitlab::Nav::TopNavMenuItem.build( @@ -187,7 +175,7 @@ RSpec.describe Nav::NewDropdownHelper do let(:with_can_create_subgroup_in_group) { true } it 'has new subgroup menu item' do - expect(subject[:menu_sections]).to eq( + expect(view_model[:menu_sections]).to eq( expected_menu_section( title: 'In this group', menu_item: ::Gitlab::Nav::TopNavMenuItem.build( @@ -211,14 +199,13 @@ RSpec.describe Nav::NewDropdownHelper do let(:expected_title) { 'In this group' } let(:expected_href) { "/groups/#{group.full_path}/-/group_members" } - it_behaves_like 'invite member link shared example' + it_behaves_like 'invite member item' end end context 'with persisted project' do - let_it_be(:project) { build_stubbed(:project) } - let_it_be(:merge_project) { build_stubbed(:project) } - + let(:project) { build_stubbed(:project) } + let(:merge_project) { build_stubbed(:project) } let(:current_project) { project } let(:with_show_new_issue_link) { false } let(:with_merge_project) { nil } @@ -233,14 +220,14 @@ RSpec.describe Nav::NewDropdownHelper do end it 'has no menu sections' do - expect(subject[:menu_sections]).to eq([]) + expect(view_model[:menu_sections]).to eq([]) end context 'with show_new_issue_link?' do let(:with_show_new_issue_link) { true } it 'shows new issue menu item' do - expect(subject[:menu_sections]).to eq( + expect(view_model[:menu_sections]).to eq( expected_menu_section( title: 'In this project', menu_item: ::Gitlab::Nav::TopNavMenuItem.build( @@ -263,7 +250,7 @@ RSpec.describe Nav::NewDropdownHelper do let(:with_merge_project) { merge_project } it 'shows merge project' do - expect(subject[:menu_sections]).to eq( + expect(view_model[:menu_sections]).to eq( expected_menu_section( title: 'In this project', menu_item: ::Gitlab::Nav::TopNavMenuItem.build( @@ -285,7 +272,7 @@ RSpec.describe Nav::NewDropdownHelper do let(:with_can_create_snippet_in_project) { true } it 'shows new snippet' do - expect(subject[:menu_sections]).to eq( + expect(view_model[:menu_sections]).to eq( expected_menu_section( title: 'In this project', menu_item: ::Gitlab::Nav::TopNavMenuItem.build( @@ -309,8 +296,47 @@ RSpec.describe Nav::NewDropdownHelper do let(:expected_title) { 'In this project' } let(:expected_href) { "/#{project.path_with_namespace}/-/project_members" } - it_behaves_like 'invite member link shared example' + it_behaves_like 'invite member item' + end + end + + context 'with persisted group and project' do + let(:project) { build_stubbed(:project) } + let(:group) { build_stubbed(:group) } + let(:current_project) { project } + let(:current_group) { group } + + before do + allow(helper).to receive(:show_new_issue_link?).with(project).and_return(true) + allow(helper).to receive(:can?).with(current_user, :create_projects, group).and_return(true) + end + + it 'gives precedence to group over project' do + group_section = expected_menu_section( + title: 'In this group', + menu_item: ::Gitlab::Nav::TopNavMenuItem.build( + id: 'new_project', + title: 'New project/repository', + href: "/projects/new?namespace_id=#{group.id}", + data: { + track_action: 'click_link_new_project_group', + track_label: 'plus_menu_dropdown', + track_property: 'navigation_top' + } + ) + ) + + expect(view_model[:menu_sections]).to eq(group_section) end end + + def expected_menu_section(title:, menu_item:) + [ + { + title: title, + menu_items: [menu_item] + } + ] + end end end |