diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-09-20 13:18:24 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-09-20 13:18:24 +0000 |
commit | 0653e08efd039a5905f3fa4f6e9cef9f5d2f799c (patch) | |
tree | 4dcc884cf6d81db44adae4aa99f8ec1233a41f55 /spec/helpers | |
parent | 744144d28e3e7fddc117924fef88de5d9674fe4c (diff) | |
download | gitlab-ce-0653e08efd039a5905f3fa4f6e9cef9f5d2f799c.tar.gz |
Add latest changes from gitlab-org/gitlab@14-3-stable-eev14.3.0-rc42
Diffstat (limited to 'spec/helpers')
20 files changed, 582 insertions, 250 deletions
diff --git a/spec/helpers/analytics/cycle_analytics_helper_spec.rb b/spec/helpers/analytics/cycle_analytics_helper_spec.rb new file mode 100644 index 00000000000..d906646e25c --- /dev/null +++ b/spec/helpers/analytics/cycle_analytics_helper_spec.rb @@ -0,0 +1,61 @@ +# frozen_string_literal: true +require "spec_helper" + +RSpec.describe Analytics::CycleAnalyticsHelper do + describe '#cycle_analytics_initial_data' do + let(:user) { create(:user, name: 'fake user', username: 'fake_user') } + let(:image_path_keys) { [:empty_state_svg_path, :no_data_svg_path, :no_access_svg_path] } + let(:api_path_keys) { [:milestones_path, :labels_path] } + let(:additional_data_keys) { [:full_path, :group_id, :group_path, :project_id, :request_path] } + let(:group) { create(:group) } + + subject(:cycle_analytics_data) { helper.cycle_analytics_initial_data(project, group) } + + before do + project.add_maintainer(user) + end + + context 'when a group is present' do + let(:project) { create(:project, group: group) } + + it "sets the correct data keys" do + expect(cycle_analytics_data.keys) + .to match_array(api_path_keys + image_path_keys + additional_data_keys) + end + + it "sets group paths" do + expect(cycle_analytics_data) + .to include({ + full_path: project.full_path, + group_path: "/#{project.namespace.name}", + group_id: project.namespace.id, + request_path: "/#{project.full_path}/-/value_stream_analytics", + milestones_path: "/groups/#{group.name}/-/milestones.json", + labels_path: "/groups/#{group.name}/-/labels.json" + }) + end + end + + context 'when a group is not present' do + let(:group) { nil } + let(:project) { create(:project) } + + it "sets the correct data keys" do + expect(cycle_analytics_data.keys) + .to match_array(image_path_keys + api_path_keys + additional_data_keys) + end + + it "sets project name space paths" do + expect(cycle_analytics_data) + .to include({ + full_path: project.full_path, + group_path: project.namespace.path, + group_id: project.namespace.id, + request_path: "/#{project.full_path}/-/value_stream_analytics", + milestones_path: "/#{project.full_path}/-/milestones.json", + labels_path: "/#{project.full_path}/-/labels.json" + }) + end + end + end +end diff --git a/spec/helpers/application_settings_helper_spec.rb b/spec/helpers/application_settings_helper_spec.rb index 6d51d85fd64..ef5f6931d02 100644 --- a/spec/helpers/application_settings_helper_spec.rb +++ b/spec/helpers/application_settings_helper_spec.rb @@ -284,4 +284,10 @@ RSpec.describe ApplicationSettingsHelper do end end end + + describe '#sidekiq_job_limiter_modes_for_select' do + subject { helper.sidekiq_job_limiter_modes_for_select } + + it { is_expected.to eq([%w(Track track), %w(Compress compress)]) } + end end diff --git a/spec/helpers/blob_helper_spec.rb b/spec/helpers/blob_helper_spec.rb index c48d609836d..efcb8125f68 100644 --- a/spec/helpers/blob_helper_spec.rb +++ b/spec/helpers/blob_helper_spec.rb @@ -92,6 +92,30 @@ RSpec.describe BlobHelper do end end + describe "#relative_raw_path" do + include FakeBlobHelpers + + let_it_be(:project) { create(:project) } + + before do + assign(:project, project) + end + + [ + %w[/file.md /-/raw/main/], + %w[/test/file.md /-/raw/main/test/], + %w[/another/test/file.md /-/raw/main/another/test/] + ].each do |file_path, expected_path| + it "pointing from '#{file_path}' to '#{expected_path}'" do + blob = fake_blob(path: file_path) + assign(:blob, blob) + assign(:id, "main#{blob.path}") + assign(:path, blob.path) + + expect(helper.parent_dir_raw_path).to eq "/#{project.full_path}#{expected_path}" + end + end + end context 'viewer related' do include FakeBlobHelpers diff --git a/spec/helpers/ci/pipeline_editor_helper_spec.rb b/spec/helpers/ci/pipeline_editor_helper_spec.rb index 3183a0a2394..874937bc4ce 100644 --- a/spec/helpers/ci/pipeline_editor_helper_spec.rb +++ b/spec/helpers/ci/pipeline_editor_helper_spec.rb @@ -42,7 +42,6 @@ RSpec.describe Ci::PipelineEditorHelper do "ci-config-path": project.ci_config_path_or_default, "ci-examples-help-page-path" => help_page_path('ci/examples/index'), "ci-help-page-path" => help_page_path('ci/index'), - "commit-sha" => project.commit.sha, "default-branch" => project.default_branch_or_main, "empty-state-illustration-path" => 'foo', "initial-branch-name" => nil, @@ -69,7 +68,6 @@ RSpec.describe Ci::PipelineEditorHelper do "ci-config-path": project.ci_config_path_or_default, "ci-examples-help-page-path" => help_page_path('ci/examples/index'), "ci-help-page-path" => help_page_path('ci/index'), - "commit-sha" => '', "default-branch" => project.default_branch_or_main, "empty-state-illustration-path" => 'foo', "initial-branch-name" => nil, @@ -97,10 +95,7 @@ RSpec.describe Ci::PipelineEditorHelper do end it 'returns correct values' do - latest_feature_sha = project.repository.commit('feature').sha - expect(pipeline_editor_data['initial-branch-name']).to eq('feature') - expect(pipeline_editor_data['commit-sha']).to eq(latest_feature_sha) end end end diff --git a/spec/helpers/ci/runners_helper_spec.rb b/spec/helpers/ci/runners_helper_spec.rb index 40927d44e24..0f15f8be0a9 100644 --- a/spec/helpers/ci/runners_helper_spec.rb +++ b/spec/helpers/ci/runners_helper_spec.rb @@ -88,6 +88,19 @@ RSpec.describe Ci::RunnersHelper do end end + describe '#group_runners_data_attributes' do + let(:group) { create(:group) } + + it 'returns group data to render a runner list' do + data = group_runners_data_attributes(group) + + expect(data[:registration_token]).to eq(group.runners_token) + expect(data[:group_id]).to eq(group.id) + expect(data[:group_full_path]).to eq(group.full_path) + expect(data[:runner_install_help_page]).to eq('https://docs.gitlab.com/runner/install/') + end + end + describe '#toggle_shared_runners_settings_data' do let_it_be(:group) { create(:group) } diff --git a/spec/helpers/environment_helper_spec.rb b/spec/helpers/environment_helper_spec.rb index 0eecae32cc1..49937a3b53a 100644 --- a/spec/helpers/environment_helper_spec.rb +++ b/spec/helpers/environment_helper_spec.rb @@ -43,7 +43,6 @@ RSpec.describe EnvironmentHelper do external_url: environment.external_url, can_update_environment: true, can_destroy_environment: true, - can_read_environment: true, can_stop_environment: true, can_admin_environment: true, environment_metrics_path: environment_metrics_path(environment), diff --git a/spec/helpers/groups_helper_spec.rb b/spec/helpers/groups_helper_spec.rb index 42da1cb71f1..825d5236b5d 100644 --- a/spec/helpers/groups_helper_spec.rb +++ b/spec/helpers/groups_helper_spec.rb @@ -19,18 +19,6 @@ RSpec.describe GroupsHelper do end end - describe '#group_dependency_proxy_image_prefix' do - let_it_be(:group) { build_stubbed(:group, path: 'GroupWithUPPERcaseLetters') } - - it 'converts uppercase letters to lowercase' do - expect(group_dependency_proxy_image_prefix(group)).to end_with("/groupwithuppercaseletters#{DependencyProxy::URL_SUFFIX}") - end - - it 'removes the protocol' do - expect(group_dependency_proxy_image_prefix(group)).not_to include('http') - end - end - describe '#group_lfs_status' do let_it_be_with_reload(:group) { create(:group) } let_it_be_with_reload(:project) { create(:project, namespace_id: group.id) } @@ -267,61 +255,6 @@ RSpec.describe GroupsHelper do end end - describe '#group_sidebar_links' do - let_it_be(:group) { create(:group, :public) } - let_it_be(:user) { create(:user) } - - before do - group.add_owner(user) - allow(helper).to receive(:current_user) { user } - allow(helper).to receive(:can?) { |*args| Ability.allowed?(*args) } - helper.instance_variable_set(:@group, group) - end - - it 'returns all the expected links' do - links = [ - :overview, :activity, :issues, :labels, :milestones, :merge_requests, - :runners, :group_members, :settings - ] - - expect(helper.group_sidebar_links).to include(*links) - end - - it 'excludes runners when the user cannot admin the group' do - expect(helper).to receive(:current_user) { user } - # TODO Proper policies, such as `read_group_runners, should be implemented per - # See https://gitlab.com/gitlab-org/gitlab/-/issues/334802 - expect(helper).to receive(:can?).twice.with(user, :admin_group, group) { false } - - expect(helper.group_sidebar_links).not_to include(:runners) - end - - it 'excludes runners when the feature "runner_list_group_view_vue_ui" is disabled' do - stub_feature_flags(runner_list_group_view_vue_ui: false) - - expect(helper.group_sidebar_links).not_to include(:runners) - end - - it 'excludes settings when the user can admin the group' do - expect(helper).to receive(:current_user) { user } - expect(helper).to receive(:can?).twice.with(user, :admin_group, group) { false } - - expect(helper.group_sidebar_links).not_to include(:settings) - end - - it 'excludes cross project features when the user cannot read cross project' do - cross_project_features = [:activity, :issues, :labels, :milestones, - :merge_requests] - - allow(Ability).to receive(:allowed?).and_call_original - cross_project_features.each do |feature| - expect(Ability).to receive(:allowed?).with(user, "read_group_#{feature}".to_sym, group) { false } - end - - expect(helper.group_sidebar_links).not_to include(*cross_project_features) - end - end - describe '#parent_group_options' do let_it_be(:current_user) { create(:user) } let_it_be(:group) { create(:group, name: 'group') } @@ -442,67 +375,6 @@ RSpec.describe GroupsHelper do end end - describe '#show_invite_banner?' do - let_it_be(:current_user) { create(:user) } - let_it_be_with_refind(:group) { create(:group) } - let_it_be(:subgroup) { create(:group, parent: group) } - let_it_be(:users) { [current_user, create(:user)] } - - before do - allow(helper).to receive(:current_user) { current_user } - allow(helper).to receive(:can?).with(current_user, :admin_group, group).and_return(can_admin_group) - allow(helper).to receive(:can?).with(current_user, :admin_group, subgroup).and_return(can_admin_group) - users.take(group_members_count).each { |user| group.add_guest(user) } - end - - using RSpec::Parameterized::TableSyntax - - where(:can_admin_group, :group_members_count, :expected_result) do - true | 1 | true - false | 1 | false - true | 2 | false - false | 2 | false - end - - with_them do - context 'for a parent group' do - subject { helper.show_invite_banner?(group) } - - context 'when the group was just created' do - before do - flash[:notice] = "Group #{group.name} was successfully created" - end - - it { is_expected.to be_falsey } - end - - context 'when no flash message' do - it 'returns the expected result' do - expect(subject).to eq(expected_result) - end - end - end - - context 'for a subgroup' do - subject { helper.show_invite_banner?(subgroup) } - - context 'when the subgroup was just created' do - before do - flash[:notice] = "Group #{subgroup.name} was successfully created" - end - - it { is_expected.to be_falsey } - end - - context 'when no flash message' do - it 'returns the expected result' do - expect(subject).to eq(expected_result) - end - end - end - end - end - describe '#render_setting_to_allow_project_access_token_creation?' do let_it_be(:current_user) { create(:user) } let_it_be(:parent) { create(:group) } @@ -541,4 +413,10 @@ RSpec.describe GroupsHelper do expect(helper.can_admin_group_member?(group)).to be(false) end end + + describe '#localized_jobs_to_be_done_choices' do + it 'has a translation for all `jobs_to_be_done` values' do + expect(localized_jobs_to_be_done_choices.keys).to match_array(NamespaceSetting.jobs_to_be_dones.keys) + end + end end diff --git a/spec/helpers/issuables_description_templates_helper_spec.rb b/spec/helpers/issuables_description_templates_helper_spec.rb index 638dd201fc8..55649e9087a 100644 --- a/spec/helpers/issuables_description_templates_helper_spec.rb +++ b/spec/helpers/issuables_description_templates_helper_spec.rb @@ -56,32 +56,17 @@ RSpec.describe IssuablesDescriptionTemplatesHelper, :clean_gitlab_redis_cache do let(:templates) do { "" => [ - { name: "another_issue_template", id: "another_issue_template" }, - { name: "custom_issue_template", id: "custom_issue_template" } + { name: "another_issue_template", id: "another_issue_template", project_id: project.id }, + { name: "custom_issue_template", id: "custom_issue_template", project_id: project.id } ] } end - it 'returns project templates only' do + it 'returns project templates' do expect(helper.issuable_templates_names(Issue.new)).to eq(%w[another_issue_template custom_issue_template]) end end - context 'without matching project templates' do - let(:templates) do - { - "Project Templates" => [ - { name: "another_issue_template", id: "another_issue_template", project_id: non_existing_record_id }, - { name: "custom_issue_template", id: "custom_issue_template", project_id: non_existing_record_id } - ] - } - end - - it 'returns empty array' do - expect(helper.issuable_templates_names(Issue.new)).to eq([]) - end - end - context 'when there are not templates in the project' do let(:templates) { {} } diff --git a/spec/helpers/issuables_helper_spec.rb b/spec/helpers/issuables_helper_spec.rb index ecaee03eeea..3eb3c73cfcc 100644 --- a/spec/helpers/issuables_helper_spec.rb +++ b/spec/helpers/issuables_helper_spec.rb @@ -123,7 +123,7 @@ RSpec.describe IssuablesHelper do end describe '#issuables_state_counter_text' do - let(:user) { create(:user) } + let_it_be(:user) { create(:user) } describe 'state text' do context 'when number of issuables can be generated' do @@ -159,6 +159,38 @@ RSpec.describe IssuablesHelper do .to eq('<span>All</span>') end end + + context 'when count is over the threshold' do + let_it_be(:group) { create(:group) } + + before do + allow(helper).to receive(:issuables_count_for_state).and_return(1100) + allow(helper).to receive(:parent).and_return(group) + stub_const("Gitlab::IssuablesCountForState::THRESHOLD", 1000) + end + + context 'when feature flag cached_issues_state_count is disabled' do + before do + stub_feature_flags(cached_issues_state_count: false) + end + + it 'returns complete count' do + expect(helper.issuables_state_counter_text(:issues, :opened, true)) + .to eq('<span>Open</span> <span class="badge badge-muted badge-pill gl-badge gl-tab-counter-badge sm">1,100</span>') + end + end + + context 'when feature flag cached_issues_state_count is enabled' do + before do + stub_feature_flags(cached_issues_state_count: true) + end + + it 'returns truncated count' do + expect(helper.issuables_state_counter_text(:issues, :opened, true)) + .to eq('<span>Open</span> <span class="badge badge-muted badge-pill gl-badge gl-tab-counter-badge sm">1.1k</span>') + end + end + end end end @@ -285,7 +317,8 @@ RSpec.describe IssuablesHelper do initialDescriptionText: 'issue text', initialTaskStatus: '0 of 0 tasks completed', issueType: 'issue', - iid: issue.iid.to_s + iid: issue.iid.to_s, + isHidden: false } expect(helper.issuable_initial_data(issue)).to match(hash_including(expected_data)) end diff --git a/spec/helpers/issues_helper_spec.rb b/spec/helpers/issues_helper_spec.rb index 9cf3808ab72..f5f26d306fb 100644 --- a/spec/helpers/issues_helper_spec.rb +++ b/spec/helpers/issues_helper_spec.rb @@ -284,7 +284,7 @@ RSpec.describe IssuesHelper do iid: issue.iid, is_issue_author: 'false', issue_type: 'issue', - new_issue_path: new_project_issue_path(project), + new_issue_path: new_project_issue_path(project, { issue: { description: "Related to \##{issue.iid}.\n\n" } }), project_path: project.full_path, report_abuse_path: new_abuse_report_path(user_id: issue.author.id, ref_url: issue_url(issue)), submit_as_spam_path: mark_as_spam_project_issue_path(project, issue) @@ -310,21 +310,21 @@ RSpec.describe IssuesHelper do can_bulk_update: 'true', can_edit: 'true', can_import_issues: 'true', - email: current_user&.notification_email, + email: current_user&.notification_email_or_default, emails_help_page_path: help_page_path('development/emails', anchor: 'email-namespace'), empty_state_svg_path: '#', export_csv_path: export_csv_project_issues_path(project), - has_project_issues: project_issues(project).exists?.to_s, + full_path: project.full_path, + has_any_issues: project_issues(project).exists?.to_s, import_csv_issues_path: '#', initial_email: project.new_issuable_address(current_user, 'issue'), + is_project: 'true', is_signed_in: current_user.present?.to_s, - issues_path: project_issues_path(project), jira_integration_path: help_page_url('integration/jira/issues', anchor: 'view-jira-issues'), markdown_help_path: help_page_path('user/markdown'), max_attachment_size: number_to_human_size(Gitlab::CurrentSettings.max_attachment_size.megabytes), new_issue_path: new_project_issue_path(project, issue: { milestone_id: finder.milestones.first.id }), project_import_jira_path: project_import_jira_path(project), - project_path: project.full_path, quick_actions_help_path: help_page_path('user/project/quick_actions'), reset_path: new_issuable_address_project_path(project, issuable_type: 'issue'), rss_path: '#', @@ -332,11 +332,11 @@ RSpec.describe IssuesHelper do sign_in_path: new_user_session_path } - expect(helper.issues_list_data(project, current_user, finder)).to include(expected) + expect(helper.project_issues_list_data(project, current_user, finder)).to include(expected) end end - describe '#issues_list_data' do + describe '#project_issues_list_data' do context 'when user is signed in' do it_behaves_like 'issues list data' do let(:current_user) { double.as_null_object } @@ -350,6 +350,33 @@ RSpec.describe IssuesHelper do end end + describe '#group_issues_list_data' do + let(:group) { create(:group) } + let(:current_user) { double.as_null_object } + let(:issues) { [] } + + it 'returns expected result' do + allow(helper).to receive(:current_user).and_return(current_user) + allow(helper).to receive(:can?).and_return(true) + allow(helper).to receive(:image_path).and_return('#') + allow(helper).to receive(:url_for).and_return('#') + + expected = { + autocomplete_award_emojis_path: autocomplete_award_emojis_path, + calendar_path: '#', + empty_state_svg_path: '#', + full_path: group.full_path, + has_any_issues: issues.to_a.any?.to_s, + is_signed_in: current_user.present?.to_s, + jira_integration_path: help_page_url('integration/jira/issues', anchor: 'view-jira-issues'), + rss_path: '#', + sign_in_path: new_user_session_path + } + + expect(helper.group_issues_list_data(group, current_user, issues)).to include(expected) + end + end + describe '#issue_manual_ordering_class' do context 'when sorting by relative position' do before do @@ -410,4 +437,55 @@ RSpec.describe IssuesHelper do end end end + + describe '#issue_hidden?' do + context 'when issue is hidden' do + let_it_be(:banned_user) { build(:user, :banned) } + let_it_be(:hidden_issue) { build(:issue, author: banned_user) } + + context 'when `ban_user_feature_flag` feature flag is enabled' do + it 'returns `true`' do + expect(helper.issue_hidden?(hidden_issue)).to eq(true) + end + end + + context 'when `ban_user_feature_flag` feature flag is disabled' do + before do + stub_feature_flags(ban_user_feature_flag: false) + end + + it 'returns `false`' do + expect(helper.issue_hidden?(hidden_issue)).to eq(false) + end + end + end + + context 'when issue is not hidden' do + it 'returns `false`' do + expect(helper.issue_hidden?(issue)).to eq(false) + end + end + end + + describe '#hidden_issue_icon' do + let_it_be(:banned_user) { build(:user, :banned) } + let_it_be(:hidden_issue) { build(:issue, author: banned_user) } + let_it_be(:mock_svg) { '<svg></svg>'.html_safe } + + before do + allow(helper).to receive(:sprite_icon).and_return(mock_svg) + end + + context 'when issue is hidden' do + it 'returns icon with tooltip' do + expect(helper.hidden_issue_icon(hidden_issue)).to eq("<span class=\"has-tooltip\" title=\"This issue is hidden because its author has been banned\">#{mock_svg}</span>") + end + end + + context 'when issue is not hidden' do + it 'returns `nil`' do + expect(helper.hidden_issue_icon(issue)).to be_nil + end + end + end end diff --git a/spec/helpers/learn_gitlab_helper_spec.rb b/spec/helpers/learn_gitlab_helper_spec.rb index cf0d329c36f..1159fd96d59 100644 --- a/spec/helpers/learn_gitlab_helper_spec.rb +++ b/spec/helpers/learn_gitlab_helper_spec.rb @@ -53,7 +53,7 @@ RSpec.describe LearnGitlabHelper do end end - describe '.learn_gitlab_experiment_enabled?' do + describe '.learn_gitlab_enabled?' do using RSpec::Parameterized::TableSyntax let_it_be(:user) { create(:user) } @@ -61,19 +61,16 @@ RSpec.describe LearnGitlabHelper do let(:params) { { namespace_id: project.namespace.to_param, project_id: project } } - subject { helper.learn_gitlab_experiment_enabled?(project) } + subject { helper.learn_gitlab_enabled?(project) } - where(:experiment_a, :experiment_b, :onboarding, :learn_gitlab_available, :result) do - true | false | true | true | true - false | true | true | true | true - false | false | true | true | false - true | true | true | false | false - true | true | false | true | false + where(:onboarding, :learn_gitlab_available, :result) do + true | true | true + true | false | false + false | true | false end with_them do before do - stub_experiment_for_subject(learn_gitlab_a: experiment_a, learn_gitlab_b: experiment_b) allow(OnboardingProgress).to receive(:onboarding?).with(project.namespace).and_return(onboarding) allow_next(LearnGitlab::Project, user).to receive(:available?).and_return(learn_gitlab_available) end @@ -88,10 +85,6 @@ RSpec.describe LearnGitlabHelper do end context 'when not signed in' do - before do - stub_experiment_for_subject(learn_gitlab_a: true, learn_gitlab_b: true) - end - it { is_expected.to eq(false) } end end @@ -106,41 +99,4 @@ RSpec.describe LearnGitlabHelper do expect(sections.values.map { |section| section.keys }).to eq([[:svg]] * 3) end end - - describe '.learn_gitlab_experiment_tracking_category' do - using RSpec::Parameterized::TableSyntax - - let_it_be(:user) { create(:user) } - - subject { helper.learn_gitlab_experiment_tracking_category } - - where(:experiment_a, :experiment_b, :result) do - false | false | nil - false | true | 'Growth::Activation::Experiment::LearnGitLabB' - true | false | 'Growth::Conversion::Experiment::LearnGitLabA' - true | true | 'Growth::Conversion::Experiment::LearnGitLabA' - end - - with_them do - before do - stub_experiment_for_subject(learn_gitlab_a: experiment_a, learn_gitlab_b: experiment_b) - end - - context 'when signed in' do - before do - sign_in(user) - end - - it { is_expected.to eq(result) } - end - end - - context 'when not signed in' do - before do - stub_experiment_for_subject(learn_gitlab_a: true, learn_gitlab_b: true) - end - - it { is_expected.to eq(nil) } - end - end end diff --git a/spec/helpers/nav/new_dropdown_helper_spec.rb b/spec/helpers/nav/new_dropdown_helper_spec.rb index 03b9c538225..64f4d5ff797 100644 --- a/spec/helpers/nav/new_dropdown_helper_spec.rb +++ b/spec/helpers/nav/new_dropdown_helper_spec.rb @@ -51,7 +51,7 @@ RSpec.describe Nav::NewDropdownHelper do title: 'Invite members', href: expected_href, data: { - track_event: 'click_link', + track_action: 'click_link', track_label: 'test_tracking_label', track_property: :invite_members_new_dropdown } @@ -99,12 +99,12 @@ RSpec.describe Nav::NewDropdownHelper do it 'has project menu item' do expect(subject[:menu_sections]).to eq( expected_menu_section( - title: 'GitLab', + title: _('GitLab'), menu_item: ::Gitlab::Nav::TopNavMenuItem.build( id: 'general_new_project', title: 'New project/repository', href: '/projects/new', - data: { track_event: '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', qa_selector: 'global_new_project_link' } ) ) ) @@ -117,12 +117,12 @@ RSpec.describe Nav::NewDropdownHelper do it 'has group menu item' do expect(subject[:menu_sections]).to eq( expected_menu_section( - title: 'GitLab', + title: _('GitLab'), menu_item: ::Gitlab::Nav::TopNavMenuItem.build( id: 'general_new_group', title: 'New group', href: '/groups/new', - data: { track_event: 'click_link_new_group', track_label: 'plus_menu_dropdown' } + data: { track_action: 'click_link_new_group', track_label: 'plus_menu_dropdown' } ) ) ) @@ -135,12 +135,12 @@ RSpec.describe Nav::NewDropdownHelper do it 'has new snippet menu item' do expect(subject[:menu_sections]).to eq( expected_menu_section( - title: 'GitLab', + title: _('GitLab'), menu_item: ::Gitlab::Nav::TopNavMenuItem.build( id: 'general_new_snippet', title: 'New snippet', href: '/-/snippets/new', - data: { track_event: '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', qa_selector: 'global_new_snippet_link' } ) ) ) @@ -178,7 +178,7 @@ RSpec.describe Nav::NewDropdownHelper do id: 'new_project', title: 'New project/repository', href: "/projects/new?namespace_id=#{group.id}", - data: { track_event: 'click_link_new_project_group', track_label: 'plus_menu_dropdown' } + data: { track_action: 'click_link_new_project_group', track_label: 'plus_menu_dropdown' } ) ) ) @@ -196,7 +196,7 @@ RSpec.describe Nav::NewDropdownHelper do id: 'new_subgroup', title: 'New subgroup', href: "/groups/new?parent_id=#{group.id}", - data: { track_event: 'click_link_new_subgroup', track_label: 'plus_menu_dropdown' } + data: { track_action: 'click_link_new_subgroup', track_label: 'plus_menu_dropdown' } ) ) ) @@ -245,7 +245,7 @@ RSpec.describe Nav::NewDropdownHelper do id: 'new_issue', title: 'New issue', href: "/#{project.path_with_namespace}/-/issues/new", - data: { track_event: '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', qa_selector: 'new_issue_link' } ) ) ) @@ -263,7 +263,7 @@ RSpec.describe Nav::NewDropdownHelper do id: 'new_mr', title: 'New merge request', href: "/#{merge_project.path_with_namespace}/-/merge_requests/new", - data: { track_event: 'click_link_new_mr', track_label: 'plus_menu_dropdown' } + data: { track_action: 'click_link_new_mr', track_label: 'plus_menu_dropdown' } ) ) ) @@ -281,7 +281,7 @@ RSpec.describe Nav::NewDropdownHelper do id: 'new_snippet', title: 'New snippet', href: "/#{project.path_with_namespace}/-/snippets/new", - data: { track_event: 'click_link_new_snippet_project', track_label: 'plus_menu_dropdown' } + data: { track_action: 'click_link_new_snippet_project', track_label: 'plus_menu_dropdown' } ) ) ) diff --git a/spec/helpers/nav/top_nav_helper_spec.rb b/spec/helpers/nav/top_nav_helper_spec.rb index 4d6da258536..da7e5d5dce2 100644 --- a/spec/helpers/nav/top_nav_helper_spec.rb +++ b/spec/helpers/nav/top_nav_helper_spec.rb @@ -142,7 +142,7 @@ RSpec.describe Nav::TopNavHelper do expected_primary = ::Gitlab::Nav::TopNavMenuItem.build( css_class: 'qa-projects-dropdown', data: { - track_event: 'click_dropdown', + track_action: 'click_dropdown', track_label: 'projects_dropdown' }, icon: 'project', @@ -248,7 +248,7 @@ RSpec.describe Nav::TopNavHelper do expected_primary = ::Gitlab::Nav::TopNavMenuItem.build( css_class: 'qa-groups-dropdown', data: { - track_event: 'click_dropdown', + track_action: 'click_dropdown', track_label: 'groups_dropdown' }, icon: 'group', diff --git a/spec/helpers/notify_helper_spec.rb b/spec/helpers/notify_helper_spec.rb index e2a7a212b1b..a4193444528 100644 --- a/spec/helpers/notify_helper_spec.rb +++ b/spec/helpers/notify_helper_spec.rb @@ -55,4 +55,53 @@ RSpec.describe NotifyHelper do def reference_link(entity, url) "<a href=\"#{url}\">#{entity.to_reference}</a>" end + + describe '#invited_join_url' do + let_it_be(:member) { create(:project_member) } + + let(:token) { '_token_' } + + context 'when invite_email_preview_text is enabled', :experiment do + before do + stub_experiments(invite_email_preview_text: :control) + end + + it 'has correct params' do + expect(helper.invited_join_url(token, member)) + .to eq("http://test.host/-/invites/#{token}?experiment_name=invite_email_preview_text&invite_type=initial_email") + end + + context 'when invite_email_from is enabled' do + before do + stub_experiments(invite_email_from: :control) + end + + it 'has correct params' do + expect(helper.invited_join_url(token, member)) + .to eq("http://test.host/-/invites/#{token}?experiment_name=invite_email_from&invite_type=initial_email") + end + end + end + + context 'when invite_email_from is enabled' do + before do + stub_experiments(invite_email_from: :control) + end + + it 'has correct params' do + expect(helper.invited_join_url(token, member)) + .to eq("http://test.host/-/invites/#{token}?experiment_name=invite_email_from&invite_type=initial_email") + end + end + + context 'when invite_email_preview_text is disabled' do + before do + stub_feature_flags(invite_email_preview_text: false) + end + + it 'has correct params' do + expect(helper.invited_join_url(token, member)).to eq("http://test.host/-/invites/#{token}?invite_type=initial_email") + end + end + end end diff --git a/spec/helpers/packages_helper_spec.rb b/spec/helpers/packages_helper_spec.rb index bc60c582ff8..06c6cccd488 100644 --- a/spec/helpers/packages_helper_spec.rb +++ b/spec/helpers/packages_helper_spec.rb @@ -223,21 +223,41 @@ RSpec.describe PackagesHelper do describe '#package_details_data' do let_it_be(:package) { create(:package) } + let(:expected_result) do + { + package_id: package.id, + can_delete: 'true', + project_name: project.name, + group_list_url: '' + } + end + before do allow(helper).to receive(:current_user) { project.owner } allow(helper).to receive(:can?) { true } end - it 'when use_presenter is true populate the package key' do - result = helper.package_details_data(project, package, true) + context 'in a project without a group' do + it 'populates presenter data' do + result = helper.package_details_data(project, package) - expect(result[:package]).not_to be_nil + expect(result).to match(hash_including(expected_result)) + end end - it 'when use_presenter is false the package key is nil' do - result = helper.package_details_data(project, package, false) + context 'in a project with a group' do + let_it_be(:group) { create(:group) } + let_it_be(:project_with_group) { create(:project, group: group) } - expect(result[:package]).to be_nil + it 'populates presenter data' do + result = helper.package_details_data(project_with_group, package) + expected = expected_result.merge({ + group_list_url: group_packages_path(project_with_group.group), + project_name: project_with_group.name + }) + + expect(result).to match(hash_including(expected)) + end end end end diff --git a/spec/helpers/profiles_helper_spec.rb b/spec/helpers/profiles_helper_spec.rb index 2ea832f95dc..c3a3c2a0178 100644 --- a/spec/helpers/profiles_helper_spec.rb +++ b/spec/helpers/profiles_helper_spec.rb @@ -13,7 +13,8 @@ RSpec.describe ProfilesHelper do private_email = user.private_commit_email emails = [ - ["Use a private email - #{private_email}", Gitlab::PrivateCommitEmail::TOKEN], + [s_('Use primary email (%{email})') % { email: user.email }, ''], + [s_("Profiles|Use a private email - %{email}").html_safe % { email: private_email }, Gitlab::PrivateCommitEmail::TOKEN], user.email, confirmed_email1.email, confirmed_email2.email @@ -23,20 +24,6 @@ RSpec.describe ProfilesHelper do end end - describe '#selected_commit_email' do - let(:user) { create(:user) } - - it 'returns main email when commit email attribute is nil' do - expect(helper.selected_commit_email(user)).to eq(user.email) - end - - it 'returns DB stored commit_email' do - user.update!(commit_email: Gitlab::PrivateCommitEmail::TOKEN) - - expect(helper.selected_commit_email(user)).to eq(Gitlab::PrivateCommitEmail::TOKEN) - end - end - describe '#email_provider_label' do it "returns nil for users without external email" do user = create(:user) @@ -152,6 +139,22 @@ RSpec.describe ProfilesHelper do end end + describe '#middle_dot_divider_classes' do + using RSpec::Parameterized::TableSyntax + + where(:stacking, :breakpoint, :expected) do + nil | nil | %w(gl-mb-3 gl-display-inline-block middle-dot-divider) + true | nil | %w(gl-mb-3 middle-dot-divider-sm gl-display-block gl-sm-display-inline-block) + nil | :sm | %w(gl-mb-3 gl-display-inline-block middle-dot-divider-sm) + end + + with_them do + it 'returns CSS classes needed to render the middle dot divider' do + expect(helper.middle_dot_divider_classes(stacking, breakpoint)).to eq expected + end + end + end + def stub_cas_omniauth_provider provider = OpenStruct.new( 'name' => 'cas3', diff --git a/spec/helpers/projects_helper_spec.rb b/spec/helpers/projects_helper_spec.rb index 4dac4403f70..85b572d3f68 100644 --- a/spec/helpers/projects_helper_spec.rb +++ b/spec/helpers/projects_helper_spec.rb @@ -498,7 +498,7 @@ RSpec.describe ProjectsHelper do context 'user has a configured commit email' do before do confirmed_email = create(:email, :confirmed, user: user) - user.update!(commit_email: confirmed_email) + user.update!(commit_email: confirmed_email.email) end it 'returns the commit email' do diff --git a/spec/helpers/recaptcha_helper_spec.rb b/spec/helpers/recaptcha_helper_spec.rb index e7f9ba5b73a..8ad91a0a217 100644 --- a/spec/helpers/recaptcha_helper_spec.rb +++ b/spec/helpers/recaptcha_helper_spec.rb @@ -14,7 +14,7 @@ RSpec.describe RecaptchaHelper, type: :helper do it 'returns false' do stub_application_setting(recaptcha_enabled: false) - expect(helper.show_recaptcha_sign_up?).to be(false) + expect(helper.show_recaptcha_sign_up?).to be_falsey end end @@ -22,7 +22,7 @@ RSpec.describe RecaptchaHelper, type: :helper do it 'returns true' do stub_application_setting(recaptcha_enabled: true) - expect(helper.show_recaptcha_sign_up?).to be(true) + expect(helper.show_recaptcha_sign_up?).to be_truthy end end end diff --git a/spec/helpers/routing/pseudonymization_helper_spec.rb b/spec/helpers/routing/pseudonymization_helper_spec.rb new file mode 100644 index 00000000000..10563502555 --- /dev/null +++ b/spec/helpers/routing/pseudonymization_helper_spec.rb @@ -0,0 +1,141 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe ::Routing::PseudonymizationHelper do + let_it_be(:group) { create(:group) } + let_it_be(:subgroup) { create(:group, parent: group) } + let_it_be(:project) { create(:project, group: group) } + let_it_be(:issue) { create(:issue, project: project) } + + let(:merge_request) { create(:merge_request, source_project: project) } + + before do + stub_feature_flags(mask_page_urls: true) + allow(helper).to receive(:group).and_return(group) + allow(helper).to receive(:project).and_return(project) + end + + shared_examples 'masked url' do + it 'generates masked page url' do + expect(helper.masked_page_url).to eq(masked_url) + end + end + + describe 'when url has params to mask' do + context 'with controller for MR' do + let(:masked_url) { "http://test.host/namespace:#{group.id}/project:#{project.id}/-/merge_requests/#{merge_request.id}" } + + before do + allow(Rails.application.routes).to receive(:recognize_path).and_return({ + controller: "projects/merge_requests", + action: "show", + namespace_id: group.name, + project_id: project.name, + id: merge_request.id.to_s + }) + end + + it_behaves_like 'masked url' + end + + context 'with controller for issue' do + let(:masked_url) { "http://test.host/namespace:#{group.id}/project:#{project.id}/-/issues/#{issue.id}" } + + before do + allow(Rails.application.routes).to receive(:recognize_path).and_return({ + controller: "projects/issues", + action: "show", + namespace_id: group.name, + project_id: project.name, + id: issue.id.to_s + }) + end + + it_behaves_like 'masked url' + end + + context 'with controller for groups with subgroups and project' do + let(:masked_url) { "http://test.host/namespace:#{subgroup.id}/project:#{project.id}"} + + before do + allow(helper).to receive(:group).and_return(subgroup) + allow(helper.project).to receive(:namespace).and_return(subgroup) + allow(Rails.application.routes).to receive(:recognize_path).and_return({ + controller: 'projects', + action: 'show', + namespace_id: subgroup.name, + id: project.name + }) + end + + it_behaves_like 'masked url' + end + + context 'with controller for groups and subgroups' do + let(:masked_url) { "http://test.host/namespace:#{subgroup.id}"} + + before do + allow(helper).to receive(:group).and_return(subgroup) + allow(Rails.application.routes).to receive(:recognize_path).and_return({ + controller: 'groups', + action: 'show', + id: subgroup.name + }) + end + + it_behaves_like 'masked url' + end + + context 'with controller for blob with file path' do + let(:masked_url) { "http://test.host/namespace:#{group.id}/project:#{project.id}/-/blob/:repository_path" } + + before do + allow(Rails.application.routes).to receive(:recognize_path).and_return({ + controller: 'projects/blob', + action: 'show', + namespace_id: group.name, + project_id: project.name, + id: 'master/README.md' + }) + end + + it_behaves_like 'masked url' + end + + context 'with non identifiable controller' do + let(:masked_url) { "http://test.host/dashboard/issues?assignee_username=root" } + + before do + controller.request.path = '/dashboard/issues' + controller.request.query_string = 'assignee_username=root' + allow(Rails.application.routes).to receive(:recognize_path).and_return({ + controller: 'dashboard', + action: 'issues' + }) + end + + it_behaves_like 'masked url' + end + end + + describe 'when url has no params to mask' do + let(:root_url) { 'http://test.host' } + + context 'returns root url' do + it 'masked_page_url' do + expect(helper.masked_page_url).to eq(root_url) + end + end + end + + describe 'when feature flag is disabled' do + before do + stub_feature_flags(mask_page_urls: false) + end + + it 'returns nil' do + expect(helper.masked_page_url).to be_nil + end + end +end diff --git a/spec/helpers/user_callouts_helper_spec.rb b/spec/helpers/user_callouts_helper_spec.rb index 5ef1e9d4daf..794ff5ee945 100644 --- a/spec/helpers/user_callouts_helper_spec.rb +++ b/spec/helpers/user_callouts_helper_spec.rb @@ -3,7 +3,7 @@ require "spec_helper" RSpec.describe UserCalloutsHelper do - let_it_be(:user) { create(:user) } + let_it_be(:user, refind: true) { create(:user) } before do allow(helper).to receive(:current_user).and_return(user) @@ -202,4 +202,95 @@ RSpec.describe UserCalloutsHelper do it { is_expected.to be false } end end + + describe '.show_invite_banner?' do + let_it_be(:group) { create(:group) } + + subject { helper.show_invite_banner?(group) } + + context 'when user has the admin ability for the group' do + before do + group.add_owner(user) + end + + context 'when the invite_members_banner has not been dismissed' do + it { is_expected.to eq(true) } + + context 'when a user has dismissed this banner via cookies already' do + before do + helper.request.cookies["invite_#{group.id}_#{user.id}"] = 'true' + end + + it { is_expected.to eq(false) } + + it 'creates the callout from cookie', :aggregate_failures do + expect { subject }.to change { Users::GroupCallout.count }.by(1) + expect(Users::GroupCallout.last).to have_attributes(group_id: group.id, + feature_name: described_class::INVITE_MEMBERS_BANNER) + end + end + + context 'when the group was just created' do + before do + flash[:notice] = "Group #{group.name} was successfully created" + end + + it { is_expected.to eq(false) } + end + + context 'with concerning multiple members' do + let_it_be(:user_2) { create(:user) } + + context 'on current group' do + before do + group.add_guest(user_2) + end + + it { is_expected.to eq(false) } + end + + context 'on current group that is a subgroup' do + let_it_be(:subgroup) { create(:group, parent: group) } + + subject { helper.show_invite_banner?(subgroup) } + + context 'with only one user on parent and this group' do + it { is_expected.to eq(true) } + end + + context 'when another user is on this group' do + before do + subgroup.add_guest(user_2) + end + + it { is_expected.to eq(false) } + end + + context 'when another user is on the parent group' do + before do + group.add_guest(user_2) + end + + it { is_expected.to eq(false) } + end + end + end + end + + context 'when the invite_members_banner has been dismissed' do + before do + create(:group_callout, + user: user, + group: group, + feature_name: described_class::INVITE_MEMBERS_BANNER) + end + + it { is_expected.to eq(false) } + end + end + + context 'when user does not have admin ability for the group' do + it { is_expected.to eq(false) } + end + end end |