2019-10-12 21:52:04 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2016-09-13 17:45:13 +05:30
|
|
|
require 'spec_helper'
|
|
|
|
|
2023-03-04 22:38:38 +05:30
|
|
|
RSpec.describe 'issuable templates', :js, feature_category: :projects do
|
2018-03-17 18:26:18 +05:30
|
|
|
include ProjectForksHelper
|
2023-07-09 08:55:56 +05:30
|
|
|
include CookieHelper
|
2018-03-17 18:26:18 +05:30
|
|
|
|
2016-09-13 17:45:13 +05:30
|
|
|
let(:user) { create(:user) }
|
2017-09-10 17:25:29 +05:30
|
|
|
let(:project) { create(:project, :public, :repository) }
|
2018-03-17 18:26:18 +05:30
|
|
|
let(:issue_form_location) { '#content-body .issuable-details .detail-page-description' }
|
2016-09-13 17:45:13 +05:30
|
|
|
|
|
|
|
before do
|
2018-11-18 11:00:15 +05:30
|
|
|
project.add_maintainer(user)
|
2017-09-10 17:25:29 +05:30
|
|
|
sign_in user
|
2023-07-09 08:55:56 +05:30
|
|
|
set_cookie('new-actions-popover-viewed', 'true')
|
2016-09-13 17:45:13 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
context 'user creates an issue using templates' do
|
|
|
|
let(:template_content) { 'this is a test "bug" template' }
|
2016-09-29 09:46:39 +05:30
|
|
|
let(:longtemplate_content) { %Q(this\n\n\n\n\nis\n\n\n\n\na\n\n\n\n\nbug\n\n\n\n\ntemplate) }
|
2017-08-17 22:00:37 +05:30
|
|
|
let(:issue) { create(:issue, author: user, assignees: [user], project: project) }
|
2016-11-03 12:29:30 +05:30
|
|
|
let(:description_addition) { ' appending to description' }
|
2016-09-13 17:45:13 +05:30
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
before do
|
2017-08-17 22:00:37 +05:30
|
|
|
project.repository.create_file(
|
|
|
|
user,
|
|
|
|
'.gitlab/issue_templates/bug.md',
|
|
|
|
template_content,
|
|
|
|
message: 'added issue template',
|
|
|
|
branch_name: 'master')
|
|
|
|
project.repository.create_file(
|
|
|
|
user,
|
|
|
|
'.gitlab/issue_templates/test.md',
|
|
|
|
longtemplate_content,
|
|
|
|
message: 'added issue template',
|
|
|
|
branch_name: 'master')
|
2018-03-17 18:26:18 +05:30
|
|
|
visit project_issue_path project, issue
|
|
|
|
page.find('.js-issuable-edit').click
|
|
|
|
fill_in :'issuable-title', with: 'test issue title'
|
2016-09-13 17:45:13 +05:30
|
|
|
end
|
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
it 'user selects "bug" template' do
|
2016-09-13 17:45:13 +05:30
|
|
|
select_template 'bug'
|
2017-09-10 17:25:29 +05:30
|
|
|
wait_for_requests
|
2018-03-17 18:26:18 +05:30
|
|
|
assert_template(page_part: issue_form_location)
|
2016-09-13 17:45:13 +05:30
|
|
|
save_changes
|
|
|
|
end
|
2016-09-29 09:46:39 +05:30
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
it 'user selects "bug" template and then "no template"' do
|
2016-11-03 12:29:30 +05:30
|
|
|
select_template 'bug'
|
2017-09-10 17:25:29 +05:30
|
|
|
wait_for_requests
|
2016-11-03 12:29:30 +05:30
|
|
|
select_option 'No template'
|
2018-03-17 18:26:18 +05:30
|
|
|
assert_template(expected_content: '', page_part: issue_form_location)
|
2016-11-03 12:29:30 +05:30
|
|
|
save_changes('')
|
|
|
|
end
|
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
it 'user selects "bug" template, edits description and then selects "reset template"' do
|
2016-11-03 12:29:30 +05:30
|
|
|
select_template 'bug'
|
2017-09-10 17:25:29 +05:30
|
|
|
wait_for_requests
|
2018-03-17 18:26:18 +05:30
|
|
|
find_field('issue-description').send_keys(description_addition)
|
|
|
|
assert_template(expected_content: template_content + description_addition, page_part: issue_form_location)
|
2016-11-03 12:29:30 +05:30
|
|
|
select_option 'Reset template'
|
2018-03-17 18:26:18 +05:30
|
|
|
assert_template(page_part: issue_form_location)
|
2016-11-03 12:29:30 +05:30
|
|
|
save_changes
|
|
|
|
end
|
2016-09-13 17:45:13 +05:30
|
|
|
end
|
|
|
|
|
2016-11-03 12:29:30 +05:30
|
|
|
context 'user creates an issue using templates, with a prior description' do
|
|
|
|
let(:prior_description) { 'test issue description' }
|
|
|
|
let(:template_content) { 'this is a test "bug" template' }
|
2017-08-17 22:00:37 +05:30
|
|
|
let(:issue) { create(:issue, author: user, assignees: [user], project: project) }
|
2016-11-03 12:29:30 +05:30
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
before do
|
2017-08-17 22:00:37 +05:30
|
|
|
project.repository.create_file(
|
|
|
|
user,
|
|
|
|
'.gitlab/issue_templates/bug.md',
|
|
|
|
template_content,
|
|
|
|
message: 'added issue template',
|
|
|
|
branch_name: 'master')
|
2018-03-17 18:26:18 +05:30
|
|
|
visit project_issue_path project, issue
|
|
|
|
page.find('.js-issuable-edit').click
|
|
|
|
fill_in :'issuable-title', with: 'test issue title'
|
|
|
|
fill_in :'issue-description', with: prior_description
|
2016-11-03 12:29:30 +05:30
|
|
|
end
|
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
it 'user selects "bug" template' do
|
2016-11-03 12:29:30 +05:30
|
|
|
select_template 'bug'
|
2017-09-10 17:25:29 +05:30
|
|
|
wait_for_requests
|
2018-03-17 18:26:18 +05:30
|
|
|
assert_template(page_part: issue_form_location)
|
2016-11-03 12:29:30 +05:30
|
|
|
save_changes
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-08-27 11:52:29 +05:30
|
|
|
context 'user creates an issue with a default template from the repo' do
|
|
|
|
let(:template_content) { 'this is the default template' }
|
|
|
|
|
|
|
|
before do
|
|
|
|
project.repository.create_file(
|
|
|
|
user,
|
|
|
|
'.gitlab/issue_templates/default.md',
|
|
|
|
template_content,
|
|
|
|
message: 'added default issue template',
|
|
|
|
branch_name: 'master'
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'does not overwrite autosaved description' do
|
|
|
|
visit new_project_issue_path project
|
|
|
|
wait_for_requests
|
|
|
|
|
|
|
|
assert_template # default template is loaded the first time
|
|
|
|
|
|
|
|
fill_in 'issue_description', with: 'my own description', fill_options: { clear: :backspace }
|
|
|
|
|
|
|
|
visit new_project_issue_path project
|
|
|
|
wait_for_requests
|
|
|
|
|
|
|
|
assert_template(expected_content: 'my own description')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-09-13 17:45:13 +05:30
|
|
|
context 'user creates a merge request using templates' do
|
|
|
|
let(:template_content) { 'this is a test "feature-proposal" template' }
|
2019-12-21 20:55:43 +05:30
|
|
|
let(:bug_template_content) { 'this is merge request bug template' }
|
|
|
|
let(:template_override_warning) { 'Applying a template will replace the existing issue description.' }
|
|
|
|
let(:updated_description) { 'updated merge request description' }
|
2021-03-11 19:13:27 +05:30
|
|
|
let(:merge_request) { create(:merge_request, source_project: project) }
|
2016-09-13 17:45:13 +05:30
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
before do
|
2017-08-17 22:00:37 +05:30
|
|
|
project.repository.create_file(
|
|
|
|
user,
|
|
|
|
'.gitlab/merge_request_templates/feature-proposal.md',
|
|
|
|
template_content,
|
|
|
|
message: 'added merge request template',
|
|
|
|
branch_name: 'master')
|
2019-12-21 20:55:43 +05:30
|
|
|
project.repository.create_file(
|
|
|
|
user,
|
|
|
|
'.gitlab/merge_request_templates/bug.md',
|
|
|
|
bug_template_content,
|
|
|
|
message: 'added merge request bug template',
|
|
|
|
branch_name: 'master')
|
2017-09-10 17:25:29 +05:30
|
|
|
visit edit_project_merge_request_path project, merge_request
|
2016-09-13 17:45:13 +05:30
|
|
|
fill_in :'merge_request[title]', with: 'test merge request title'
|
|
|
|
end
|
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
it 'user selects "feature-proposal" template' do
|
2016-09-13 17:45:13 +05:30
|
|
|
select_template 'feature-proposal'
|
2017-09-10 17:25:29 +05:30
|
|
|
wait_for_requests
|
2017-08-17 22:00:37 +05:30
|
|
|
assert_template
|
2016-09-13 17:45:13 +05:30
|
|
|
save_changes
|
|
|
|
end
|
2019-12-21 20:55:43 +05:30
|
|
|
|
|
|
|
context 'changes template' do
|
|
|
|
before do
|
|
|
|
select_template 'bug'
|
|
|
|
wait_for_requests
|
|
|
|
fill_in :'merge_request[description]', with: updated_description
|
|
|
|
select_template 'feature-proposal'
|
|
|
|
expect(page).to have_content template_override_warning
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'user selects "bug" template, then updates description, then selects "feature-proposal" template, then cancels template change' do
|
|
|
|
page.find('.js-template-warning .js-close-btn.js-cancel-btn').click
|
|
|
|
expect(find('textarea')['value']).to eq(updated_description)
|
|
|
|
expect(page).not_to have_content template_override_warning
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'user selects "bug" template, then updates description, then selects "feature-proposal" template, then dismiss the template warning' do
|
|
|
|
page.find('.js-template-warning .js-close-btn.js-dismiss-btn').click
|
|
|
|
expect(find('textarea')['value']).to eq(updated_description)
|
|
|
|
expect(page).not_to have_content template_override_warning
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'user selects "bug" template, then updates description, then selects "feature-proposal" template, then applies template change' do
|
|
|
|
page.find('.js-template-warning .js-override-template').click
|
|
|
|
wait_for_requests
|
|
|
|
assert_template
|
|
|
|
end
|
|
|
|
end
|
2016-09-13 17:45:13 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
context 'user creates a merge request from a forked project using templates' do
|
|
|
|
let(:template_content) { 'this is a test "feature-proposal" template' }
|
|
|
|
let(:fork_user) { create(:user) }
|
2018-03-17 18:26:18 +05:30
|
|
|
let(:forked_project) { fork_project(project, fork_user, repository: true) }
|
2021-03-11 19:13:27 +05:30
|
|
|
let(:merge_request) { create(:merge_request, source_project: forked_project, target_project: project) }
|
2016-09-13 17:45:13 +05:30
|
|
|
|
2018-11-08 19:23:39 +05:30
|
|
|
before do
|
2017-09-10 17:25:29 +05:30
|
|
|
sign_out(:user)
|
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
project.add_developer(fork_user)
|
2017-09-10 17:25:29 +05:30
|
|
|
|
|
|
|
sign_in(fork_user)
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
project.repository.create_file(
|
|
|
|
fork_user,
|
|
|
|
'.gitlab/merge_request_templates/feature-proposal.md',
|
|
|
|
template_content,
|
|
|
|
message: 'added merge request template',
|
|
|
|
branch_name: 'master')
|
2017-09-10 17:25:29 +05:30
|
|
|
visit edit_project_merge_request_path project, merge_request
|
2016-09-13 17:45:13 +05:30
|
|
|
fill_in :'merge_request[title]', with: 'test merge request title'
|
|
|
|
end
|
|
|
|
|
2016-09-29 09:46:39 +05:30
|
|
|
context 'feature proposal template' do
|
|
|
|
context 'template exists in target project' do
|
2018-11-08 19:23:39 +05:30
|
|
|
it 'user selects template' do
|
2016-09-29 09:46:39 +05:30
|
|
|
select_template 'feature-proposal'
|
2017-09-10 17:25:29 +05:30
|
|
|
wait_for_requests
|
2017-08-17 22:00:37 +05:30
|
|
|
assert_template
|
2016-09-29 09:46:39 +05:30
|
|
|
save_changes
|
|
|
|
end
|
|
|
|
end
|
2016-09-13 17:45:13 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
def assert_template(expected_content: template_content, page_part: '#content-body')
|
|
|
|
page.within(page_part) do
|
|
|
|
expect(find('textarea')['value']).to eq(expected_content)
|
|
|
|
end
|
2016-09-13 17:45:13 +05:30
|
|
|
end
|
|
|
|
|
2016-11-03 12:29:30 +05:30
|
|
|
def save_changes(expected_content = template_content)
|
2016-09-13 17:45:13 +05:30
|
|
|
click_button "Save changes"
|
2016-11-03 12:29:30 +05:30
|
|
|
expect(page).to have_content expected_content
|
2016-09-13 17:45:13 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
def select_template(name)
|
2017-08-17 22:00:37 +05:30
|
|
|
find('.js-issuable-selector').click
|
|
|
|
|
|
|
|
find('.js-issuable-selector-wrap .dropdown-content a', text: name, match: :first).click
|
2016-09-13 17:45:13 +05:30
|
|
|
end
|
2016-11-03 12:29:30 +05:30
|
|
|
|
|
|
|
def select_option(name)
|
2017-08-17 22:00:37 +05:30
|
|
|
find('.js-issuable-selector').click
|
|
|
|
|
|
|
|
find('.js-issuable-selector-wrap .dropdown-footer-list a', text: name, match: :first).click
|
2016-11-03 12:29:30 +05:30
|
|
|
end
|
2016-09-13 17:45:13 +05:30
|
|
|
end
|