debian-mirror-gitlab/spec/helpers/issuables_helper_spec.rb

387 lines
12 KiB
Ruby
Raw Normal View History

2019-07-07 11:18:12 +05:30
# frozen_string_literal: true
2016-09-13 17:45:13 +05:30
require 'spec_helper'
2020-07-28 23:09:34 +05:30
RSpec.describe IssuablesHelper do
2016-09-13 17:45:13 +05:30
let(:label) { build_stubbed(:label) }
let(:label2) { build_stubbed(:label) }
2017-08-17 22:00:37 +05:30
describe '#users_dropdown_label' do
2019-03-02 22:35:43 +05:30
let(:user) { build_stubbed(:user) }
let(:user2) { build_stubbed(:user) }
2017-08-17 22:00:37 +05:30
it 'returns unassigned' do
expect(users_dropdown_label([])).to eq('Unassigned')
end
it 'returns selected user\'s name' do
expect(users_dropdown_label([user])).to eq(user.name)
end
it 'returns selected user\'s name and counter' do
expect(users_dropdown_label([user, user2])).to eq("#{user.name} + 1 more")
end
end
2018-11-18 11:00:15 +05:30
describe '#group_dropdown_label' do
2019-03-02 22:35:43 +05:30
let(:group) { create(:group) }
2018-11-18 11:00:15 +05:30
let(:default) { 'default label' }
it 'returns default group label when group_id is nil' do
expect(group_dropdown_label(nil, default)).to eq('default label')
end
it 'returns "any group" when group_id is 0' do
expect(group_dropdown_label('0', default)).to eq('Any group')
end
it 'returns group full path when a group was found for the provided id' do
expect(group_dropdown_label(group.id, default)).to eq(group.full_name)
end
it 'returns default label when a group was not found for the provided id' do
2020-04-22 19:07:51 +05:30
expect(group_dropdown_label(non_existing_record_id, default)).to eq('default label')
2018-11-18 11:00:15 +05:30
end
end
2016-11-03 12:29:30 +05:30
describe '#issuables_state_counter_text' do
let(:user) { create(:user) }
describe 'state text' do
before do
allow(helper).to receive(:issuables_count_for_state).and_return(42)
end
it 'returns "Open" when state is :opened' do
2018-05-09 12:01:36 +05:30
expect(helper.issuables_state_counter_text(:issues, :opened, true))
2018-11-08 19:23:39 +05:30
.to eq('<span>Open</span> <span class="badge badge-pill">42</span>')
2016-11-03 12:29:30 +05:30
end
it 'returns "Closed" when state is :closed' do
2018-05-09 12:01:36 +05:30
expect(helper.issuables_state_counter_text(:issues, :closed, true))
2018-11-08 19:23:39 +05:30
.to eq('<span>Closed</span> <span class="badge badge-pill">42</span>')
2016-11-03 12:29:30 +05:30
end
it 'returns "Merged" when state is :merged' do
2018-05-09 12:01:36 +05:30
expect(helper.issuables_state_counter_text(:merge_requests, :merged, true))
2018-11-08 19:23:39 +05:30
.to eq('<span>Merged</span> <span class="badge badge-pill">42</span>')
2016-11-03 12:29:30 +05:30
end
it 'returns "All" when state is :all' do
2018-05-09 12:01:36 +05:30
expect(helper.issuables_state_counter_text(:merge_requests, :all, true))
2018-11-08 19:23:39 +05:30
.to eq('<span>All</span> <span class="badge badge-pill">42</span>')
2016-11-03 12:29:30 +05:30
end
end
end
2017-08-17 22:00:37 +05:30
describe '#issuable_reference' do
context 'when show_full_reference truthy' do
it 'display issuable full reference' do
assign(:show_full_reference, true)
issue = build_stubbed(:issue)
expect(helper.issuable_reference(issue)).to eql(issue.to_reference(full: true))
end
end
context 'when show_full_reference falsey' do
context 'when @group present' do
it 'display issuable reference to @group' do
project = build_stubbed(:project)
assign(:show_full_reference, nil)
assign(:group, project.namespace)
issue = build_stubbed(:issue)
expect(helper.issuable_reference(issue)).to eql(issue.to_reference(project.namespace))
end
end
context 'when @project present' do
it 'display issuable reference to @project' do
project = build_stubbed(:project)
assign(:show_full_reference, nil)
assign(:group, nil)
assign(:project, project)
issue = build_stubbed(:issue)
expect(helper.issuable_reference(issue)).to eql(issue.to_reference(project))
end
end
end
end
2017-09-10 17:25:29 +05:30
describe '#updated_at_by' do
let(:user) { create(:user) }
let(:unedited_issuable) { create(:issue) }
2018-03-17 18:26:18 +05:30
let(:edited_issuable) { create(:issue, last_edited_by: user, created_at: 3.days.ago, updated_at: 1.day.ago, last_edited_at: 2.days.ago) }
2017-09-10 17:25:29 +05:30
let(:edited_updated_at_by) do
{
2018-03-17 18:26:18 +05:30
updatedAt: edited_issuable.last_edited_at.to_time.iso8601,
2017-09-10 17:25:29 +05:30
updatedBy: {
name: user.name,
path: user_path(user)
}
}
end
it { expect(helper.updated_at_by(unedited_issuable)).to eq({}) }
it { expect(helper.updated_at_by(edited_issuable)).to eq(edited_updated_at_by) }
context 'when updated by a deleted user' do
let(:edited_updated_at_by) do
{
2018-03-17 18:26:18 +05:30
updatedAt: edited_issuable.last_edited_at.to_time.iso8601,
2017-09-10 17:25:29 +05:30
updatedBy: {
name: User.ghost.name,
path: user_path(User.ghost)
}
}
end
before do
2020-10-24 23:57:45 +05:30
user.destroy!
2017-09-10 17:25:29 +05:30
end
it 'returns "Ghost user" as edited_by' do
expect(helper.updated_at_by(edited_issuable.reload)).to eq(edited_updated_at_by)
end
end
end
2018-03-17 18:26:18 +05:30
describe '#issuable_initial_data' do
let(:user) { create(:user) }
before do
allow(helper).to receive(:current_user).and_return(user)
allow(helper).to receive(:can?).and_return(true)
2019-03-02 22:35:43 +05:30
stub_commonmark_sourcepos_disabled
2018-03-17 18:26:18 +05:30
end
2019-07-07 11:18:12 +05:30
it 'returns the correct data for an issue' do
2018-03-17 18:26:18 +05:30
issue = create(:issue, author: user, description: 'issue text')
@project = issue.project
expected_data = {
2020-04-08 14:13:33 +05:30
endpoint: "/#{@project.full_path}/-/issues/#{issue.iid}",
updateEndpoint: "/#{@project.full_path}/-/issues/#{issue.iid}.json",
2018-03-27 19:54:05 +05:30
canUpdate: true,
canDestroy: true,
issuableRef: "##{issue.iid}",
markdownPreviewPath: "/#{@project.full_path}/preview_markdown",
markdownDocsPath: '/help/user/markdown',
2019-03-02 22:35:43 +05:30
lockVersion: issue.lock_version,
2018-03-27 19:54:05 +05:30
projectPath: @project.path,
projectNamespace: @project.namespace.path,
initialTitleHtml: issue.title,
initialTitleText: issue.title,
initialDescriptionHtml: '<p dir="auto">issue text</p>',
initialDescriptionText: 'issue text',
2020-11-24 15:15:51 +05:30
initialTaskStatus: '0 of 0 tasks completed',
issueType: 'issue',
iid: issue.iid.to_s
2018-03-17 18:26:18 +05:30
}
2019-07-07 11:18:12 +05:30
expect(helper.issuable_initial_data(issue)).to match(hash_including(expected_data))
2018-03-17 18:26:18 +05:30
end
2019-09-30 21:07:59 +05:30
2020-01-01 13:55:28 +05:30
describe '#sentryIssueIdentifier' do
let(:issue) { create(:issue, author: user) }
before do
assign(:project, issue.project)
end
it 'sets sentryIssueIdentifier to nil with no sentry issue ' do
expect(helper.issuable_initial_data(issue)[:sentryIssueIdentifier])
.to be_nil
end
it 'sets sentryIssueIdentifier to sentry_issue_identifier' do
sentry_issue = create(:sentry_issue, issue: issue)
expect(helper.issuable_initial_data(issue)[:sentryIssueIdentifier])
.to eq(sentry_issue.sentry_issue_identifier)
end
end
2019-09-30 21:07:59 +05:30
describe '#zoomMeetingUrl in issue' do
2019-12-26 22:10:19 +05:30
let(:issue) { create(:issue, author: user) }
2019-09-30 21:07:59 +05:30
before do
assign(:project, issue.project)
end
2019-12-26 22:10:19 +05:30
shared_examples 'sets zoomMeetingUrl to nil' do
specify do
expect(helper.issuable_initial_data(issue)[:zoomMeetingUrl])
.to be_nil
2019-09-30 21:07:59 +05:30
end
end
2019-12-26 22:10:19 +05:30
context 'with no "added" zoom mettings' do
it_behaves_like 'sets zoomMeetingUrl to nil'
context 'with multiple removed meetings' do
before do
create(:zoom_meeting, issue: issue, issue_status: :removed)
create(:zoom_meeting, issue: issue, issue_status: :removed)
end
2019-09-30 21:07:59 +05:30
2019-12-26 22:10:19 +05:30
it_behaves_like 'sets zoomMeetingUrl to nil'
2019-09-30 21:07:59 +05:30
end
end
2019-12-26 22:10:19 +05:30
context 'with "added" zoom meeting' do
before do
create(:zoom_meeting, issue: issue)
2019-09-30 21:07:59 +05:30
end
2019-12-26 22:10:19 +05:30
shared_examples 'sets zoomMeetingUrl to canonical meeting url' do
specify do
expect(helper.issuable_initial_data(issue))
.to include(zoomMeetingUrl: 'https://zoom.us/j/123456789')
end
end
it_behaves_like 'sets zoomMeetingUrl to canonical meeting url'
context 'with muliple "removed" zoom meetings' do
before do
create(:zoom_meeting, issue: issue, issue_status: :removed)
create(:zoom_meeting, issue: issue, issue_status: :removed)
end
it_behaves_like 'sets zoomMeetingUrl to canonical meeting url'
2019-09-30 21:07:59 +05:30
end
end
end
2018-03-17 18:26:18 +05:30
end
2019-12-04 20:38:33 +05:30
describe '#assignee_sidebar_data' do
let(:user) { create(:user) }
let(:merge_request) { nil }
2020-01-01 13:55:28 +05:30
2019-12-04 20:38:33 +05:30
subject { helper.assignee_sidebar_data(user, merge_request: merge_request) }
it 'returns hash of assignee data' do
is_expected.to eql({
avatar_url: user.avatar_url,
name: user.name,
username: user.username
})
end
context 'with merge_request' do
let(:merge_request) { build_stubbed(:merge_request) }
where(can_merge: [true, false])
with_them do
before do
allow(merge_request).to receive(:can_be_merged_by?).and_return(can_merge)
end
it { is_expected.to include({ can_merge: can_merge })}
end
end
end
2020-07-28 23:09:34 +05:30
2021-01-03 14:25:43 +05:30
describe '#reviewer_sidebar_data' do
let(:user) { create(:user) }
subject { helper.reviewer_sidebar_data(user, merge_request: merge_request) }
context 'without merge_request' do
let(:merge_request) { nil }
it 'returns hash of reviewer data' do
is_expected.to eql({
avatar_url: user.avatar_url,
name: user.name,
username: user.username
})
end
end
context 'with merge_request' do
let(:merge_request) { build(:merge_request) }
where(can_merge: [true, false])
with_them do
before do
allow(merge_request).to receive(:can_be_merged_by?).and_return(can_merge)
end
it { is_expected.to include({ can_merge: can_merge })}
end
end
end
2020-07-28 23:09:34 +05:30
describe '#issuable_squash_option?' do
using RSpec::Parameterized::TableSyntax
where(:issuable_persisted, :squash, :squash_enabled_by_default, :expectation) do
true | true | true | true
true | false | true | false
false | false | false | false
false | false | true | true
false | true | false | false
false | true | true | true
end
with_them do
it 'returns the correct value' do
project = double(
squash_enabled_by_default?: squash_enabled_by_default
)
issuable = double(persisted?: issuable_persisted, squash: squash)
expect(helper.issuable_squash_option?(issuable, project)).to eq(expectation)
end
end
end
2020-08-18 19:51:02 +05:30
describe '#sidebar_milestone_tooltip_label' do
it 'escapes HTML in the milestone title' do
milestone = build(:milestone, title: '&lt;img onerror=alert(1)&gt;')
expect(helper.sidebar_milestone_tooltip_label(milestone)).to eq('&lt;img onerror=alert(1)&gt;<br/>Milestone')
end
end
2021-01-03 14:25:43 +05:30
describe '#serialize_issuable' do
context 'when it is a merge request' do
let(:merge_request) { build(:merge_request) }
let(:user) { build(:user) }
before do
allow(helper).to receive(:current_user) { user }
end
it 'has suggest_pipeline experiment enabled' do
allow(helper).to receive(:experiment_enabled?).with(:suggest_pipeline) { true }
expect_next_instance_of(MergeRequestSerializer) do |serializer|
expect(serializer).to receive(:represent).with(merge_request, { serializer: 'widget', experiment_enabled: :suggest_pipeline })
end
helper.serialize_issuable(merge_request, serializer: 'widget')
end
it 'suggest_pipeline experiment disabled' do
allow(helper).to receive(:experiment_enabled?).with(:suggest_pipeline) { false }
expect_next_instance_of(MergeRequestSerializer) do |serializer|
expect(serializer).to receive(:represent).with(merge_request, { serializer: 'widget' })
end
helper.serialize_issuable(merge_request, serializer: 'widget')
end
end
end
2016-09-13 17:45:13 +05:30
end