diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-02-20 16:49:51 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-02-20 16:49:51 +0300 |
commit | 71786ddc8e28fbd3cb3fcc4b3ff15e5962a1c82e (patch) | |
tree | 6a2d93ef3fb2d353bb7739e4b57e6541f51cdd71 /spec/helpers/nav/new_dropdown_helper_spec.rb | |
parent | a7253423e3403b8c08f8a161e5937e1488f5f407 (diff) |
Add latest changes from gitlab-org/gitlab@15-9-stable-eev15.9.0-rc42
Diffstat (limited to 'spec/helpers/nav/new_dropdown_helper_spec.rb')
-rw-r--r-- | spec/helpers/nav/new_dropdown_helper_spec.rb | 189 |
1 files changed, 126 insertions, 63 deletions
diff --git a/spec/helpers/nav/new_dropdown_helper_spec.rb b/spec/helpers/nav/new_dropdown_helper_spec.rb index 3a65131aab0..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( @@ -46,7 +34,8 @@ RSpec.describe Nav::NewDropdownHelper do href: expected_href, data: { track_action: 'click_link_invite_members', - track_label: 'plus_menu_dropdown' + track_label: 'plus_menu_dropdown', + track_property: 'navigation_top' } ) ) @@ -55,34 +44,37 @@ 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: _('GitLab'), + title: _('In GitLab'), menu_item: ::Gitlab::Nav::TopNavMenuItem.build( id: 'general_new_project', title: 'New project/repository', href: '/projects/new', - data: { track_action: 'click_link_new_project', track_label: 'plus_menu_dropdown', qa_selector: 'global_new_project_link' } + data: { + track_action: 'click_link_new_project', + track_label: 'plus_menu_dropdown', + track_property: 'navigation_top', + qa_selector: 'global_new_project_link' + } ) ) ) @@ -93,14 +85,19 @@ 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: _('GitLab'), + title: _('In GitLab'), menu_item: ::Gitlab::Nav::TopNavMenuItem.build( id: 'general_new_group', title: 'New group', href: '/groups/new', - data: { qa_selector: 'global_new_group_link', track_action: 'click_link_new_group', track_label: 'plus_menu_dropdown' } + data: { + track_action: 'click_link_new_group', + track_label: 'plus_menu_dropdown', + track_property: 'navigation_top', + qa_selector: 'global_new_group_link' + } ) ) ) @@ -111,14 +108,19 @@ 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: _('GitLab'), + title: _('In GitLab'), menu_item: ::Gitlab::Nav::TopNavMenuItem.build( id: 'general_new_snippet', title: 'New snippet', href: '/-/snippets/new', - data: { track_action: 'click_link_new_snippet_parent', track_label: 'plus_menu_dropdown', qa_selector: 'global_new_snippet_link' } + data: { + track_action: 'click_link_new_snippet_parent', + track_label: 'plus_menu_dropdown', + track_property: 'navigation_top', + qa_selector: 'global_new_snippet_link' + } ) ) ) @@ -127,36 +129,42 @@ 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: 'This group', + 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' } + data: { + track_action: 'click_link_new_project_group', + track_label: 'plus_menu_dropdown', + track_property: 'navigation_top' + } ) ) ) @@ -167,14 +175,18 @@ 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: 'This group', + title: 'In this group', menu_item: ::Gitlab::Nav::TopNavMenuItem.build( id: 'new_subgroup', title: 'New subgroup', href: "/groups/new?parent_id=#{group.id}#create-group-pane", - data: { track_action: 'click_link_new_subgroup', track_label: 'plus_menu_dropdown' } + data: { + track_action: 'click_link_new_subgroup', + track_label: 'plus_menu_dropdown', + track_property: 'navigation_top' + } ) ) ) @@ -184,17 +196,16 @@ RSpec.describe Nav::NewDropdownHelper do context 'when can invite members' do let(:with_can_admin_in_group) { true } let(:with_invite_members_experiment) { true } - let(:expected_title) { 'This group' } + 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 } @@ -209,21 +220,26 @@ 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: 'This project', + title: 'In this project', menu_item: ::Gitlab::Nav::TopNavMenuItem.build( id: 'new_issue', title: 'New issue', href: "/#{project.path_with_namespace}/-/issues/new", - data: { track_action: 'click_link_new_issue', track_label: 'plus_menu_dropdown', qa_selector: 'new_issue_link' } + data: { + track_action: 'click_link_new_issue', + track_label: 'plus_menu_dropdown', + track_property: 'navigation_top', + qa_selector: 'new_issue_link' + } ) ) ) @@ -234,14 +250,18 @@ 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: 'This project', + title: 'In this project', menu_item: ::Gitlab::Nav::TopNavMenuItem.build( id: 'new_mr', title: 'New merge request', href: "/#{merge_project.path_with_namespace}/-/merge_requests/new", - data: { track_action: 'click_link_new_mr', track_label: 'plus_menu_dropdown' } + data: { + track_action: 'click_link_new_mr', + track_label: 'plus_menu_dropdown', + track_property: 'navigation_top' + } ) ) ) @@ -252,14 +272,18 @@ 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: 'This project', + title: 'In this project', menu_item: ::Gitlab::Nav::TopNavMenuItem.build( id: 'new_snippet', title: 'New snippet', href: "/#{project.path_with_namespace}/-/snippets/new", - data: { track_action: 'click_link_new_snippet_project', track_label: 'plus_menu_dropdown' } + data: { + track_action: 'click_link_new_snippet_project', + track_label: 'plus_menu_dropdown', + track_property: 'navigation_top' + } ) ) ) @@ -269,11 +293,50 @@ RSpec.describe Nav::NewDropdownHelper do context 'when invite members experiment' do let(:with_invite_members_experiment) { true } let(:with_can_admin_project_member) { true } - let(:expected_title) { 'This project' } + 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 |