1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347
|
# frozen_string_literal: true
require "spec_helper"
RSpec.describe "User creates issue", feature_category: :team_planning do
include DropzoneHelper
let_it_be(:project) { create(:project_empty_repo, :public) }
let_it_be(:user) { create(:user) }
context "when unauthenticated" do
before do
sign_out(:user)
end
it "redirects to signin then back to new issue after signin", :js do
create(:issue, project: project)
visit project_issues_path(project)
wait_for_all_requests
page.within ".nav-controls" do
click_link "New issue"
end
expect(page).to have_current_path new_user_session_path, ignore_query: true
gitlab_sign_in(create(:user))
expect(page).to have_current_path new_project_issue_path(project), ignore_query: true
end
end
context "when signed in as guest", :js do
before do
project.add_guest(user)
sign_in(user)
visit(new_project_issue_path(project))
end
context 'available metadata' do
it 'allows guest to set issue metadata' do
page.within(".issue-form") do
expect(page).to have_content("Title")
.and have_content("Description")
.and have_content("Type")
.and have_content("Assignee")
.and have_content("Milestone")
.and have_content("Labels")
.and have_content("Due date")
.and have_content("This issue is confidential and should only be visible to team members with at least Reporter access.")
end
end
end
context "when previewing" do
it "previews content" do
form = first(".gfm-form")
textarea = first(".gfm-form textarea")
page.within(form) do
click_button("Preview")
preview = find(".js-vue-md-preview") # this element is findable only when the "Preview" link is clicked.
expect(preview).to have_content("Nothing to preview.")
click_button("Continue editing")
fill_in("Description", with: "Bug fixed :smile:")
click_button("Preview")
expect(preview).to have_css("gl-emoji")
expect(textarea).not_to be_visible
click_button("Continue editing")
fill_in("Description", with: "/confidential")
click_button("Preview")
expect(form).to have_content('Makes this issue confidential.')
end
end
end
context "with labels" do
let(:label_titles) { %w[bug feature enhancement] }
before do
label_titles.each do |title|
create(:label, project: project, title: title)
end
end
it "creates issue" do
issue_title = "500 error on profile"
fill_in("Title", with: issue_title)
click_button _('Select label')
wait_for_all_requests
within_testid('sidebar-labels') do
click_button label_titles.first
click_button _('Close')
wait_for_requests
end
click_button("Create issue")
expect(page).to have_content(issue_title)
.and have_content(user.name)
.and have_content(project.name)
.and have_content(label_titles.first)
end
end
context 'with due date', :js do
it 'saves with due date' do
date = Date.today.at_beginning_of_month
fill_in 'issue_title', with: 'bug 345'
fill_in 'issue_description', with: 'bug description'
find('#issuable-due-date').click
page.within '.pika-single' do
click_button date.day
end
expect(find('#issuable-due-date').value).to eq date.to_s
click_button 'Create issue'
page.within '.issuable-sidebar' do
expect(page).to have_content date.to_fs(:medium)
end
end
end
context 'dropzone upload file', :js do
before do
visit new_project_issue_path(project)
end
it 'uploads file when dragging into textarea' do
dropzone_file Rails.root.join('spec', 'fixtures', 'banana_sample.gif')
expect(page.find_field("issue_description").value).to have_content 'banana_sample'
end
it "doesn't add double newline to end of a single attachment markdown" do
dropzone_file Rails.root.join('spec', 'fixtures', 'banana_sample.gif')
expect(page.find_field("issue_description").value).not_to match(/\n\n$/)
end
it "cancels a file upload correctly", :capybara_ignore_server_errors do
slow_requests do
dropzone_file([Rails.root.join('spec', 'fixtures', 'dk.png')], 0, false)
click_button 'Cancel'
end
expect(page).to have_selector('[data-testid="button-attach-file"]')
expect(page).not_to have_button('Cancel')
expect(page).not_to have_selector('.uploading-progress-container', visible: true)
end
end
context 'form filled by URL parameters', :use_null_store_as_repository_cache do
let(:project) { create(:project, :public, :repository) }
before do
project.repository.create_file(
user,
'.gitlab/issue_templates/bug.md',
'this is a test "bug" template',
message: 'added issue template',
branch_name: 'master')
visit new_project_issue_path(project, issuable_template: 'bug')
end
it 'fills in template' do
expect(find('.js-issuable-selector .dropdown-toggle-text')).to have_content('bug')
end
end
context 'form create handles issue creation by default' do
let_it_be(:project) { create(:project) }
before do
visit new_project_issue_path(project)
end
it 'pre-fills the issue type dropdown with issue type' do
expect(find('.js-issuable-type-filter-dropdown-wrap .gl-button-text')).to have_content('Issue')
end
it 'does not hide the milestone select' do
expect(page).to have_button 'Select milestone'
end
end
context 'form create handles incident creation' do
let_it_be(:project) { create(:project) }
before do
visit new_project_issue_path(project, { issuable_template: 'incident', issue: { issue_type: 'incident' } })
end
it 'does not pre-fill the issue type dropdown with incident type' do
expect(find('.js-issuable-type-filter-dropdown-wrap .gl-button-text')).not_to have_content('Incident')
end
it 'shows the milestone select' do
expect(page).to have_button 'Select milestone'
end
it 'hides the incident help text' do
expect(page).not_to have_text('A modified issue to guide the resolution of incidents.')
end
end
context 'suggestions', :js do
it 'displays list of related issues' do
issue = create(:issue, project: project)
create(:issue, project: project, title: 'test issue')
visit new_project_issue_path(project)
fill_in 'issue_title', with: issue.title
expect(page).to have_selector('.suggestion-item', count: 1)
end
end
it 'clears local storage after creating a new issue', :js do
2.times do
visit new_project_issue_path(project)
wait_for_requests
expect(page).to have_field('Title', with: '')
expect(page).to have_field('Description', with: '')
fill_in 'issue_title', with: 'bug 345'
fill_in 'issue_description', with: 'bug description'
click_button 'Create issue'
end
end
it 'clears local storage after cancelling a new issue creation', :js do
2.times do
visit new_project_issue_path(project)
wait_for_requests
expect(page).to have_field('Title', with: '')
expect(page).to have_field('Description', with: '')
fill_in 'issue_title', with: 'bug 345'
fill_in 'issue_description', with: 'bug description'
click_link 'Cancel'
end
end
end
context 'when signed in as reporter', :js do
let_it_be(:project) { create(:project) }
before_all do
project.add_reporter(user)
end
before do
sign_in(user)
end
context 'form create handles incident creation' do
before do
visit new_project_issue_path(project, { issuable_template: 'incident', issue: { issue_type: 'incident' } })
end
it 'pre-fills the issue type dropdown with incident type' do
expect(find('.js-issuable-type-filter-dropdown-wrap .gl-button-text')).to have_content('Incident')
end
it 'hides the epic select' do
expect(page).not_to have_selector('.epic-dropdown-container')
end
it 'shows the milestone select' do
expect(page).to have_button 'Select milestone'
end
it 'hides the weight input' do
expect(page).not_to have_selector('[data-testid="issuable-weight-input"]')
end
it 'shows the incident help text' do
expect(page).to have_text('A modified issue to guide the resolution of incidents.')
end
end
end
context 'when signed in as a maintainer', :js do
let_it_be(:project) { create(:project) }
before_all do
project.add_maintainer(user)
end
before do
sign_in(user)
visit(new_project_issue_path(project))
end
it_behaves_like 'rich text editor - autocomplete'
it_behaves_like 'rich text editor - code blocks'
it_behaves_like 'rich text editor - common'
it_behaves_like 'rich text editor - copy/paste'
it_behaves_like 'rich text editor - links'
it_behaves_like 'rich text editor - media'
it_behaves_like 'rich text editor - selection'
end
context "when signed in as user with special characters in their name" do
let(:user_special) { create(:user, name: "Jon O'Shea") }
before do
project.add_developer(user_special)
sign_in(user_special)
visit(new_project_issue_path(project))
end
it "will correctly escape user names with an apostrophe when clicking 'Assign to me'", :js do
first('.assign-to-me-link').click
expect(page).to have_content(user_special.name)
expect(page.find('input[name="issue[assignee_ids][]"]', visible: false)['data-meta']).to eq(user_special.name)
end
end
end
|