filter_issues_spec.rb 29.0 KB
Newer Older
C
Clement Ho 已提交
1
require 'spec_helper'
2

3
describe 'Filter issues', js: true do
4
  include Devise::Test::IntegrationHelpers
C
Clement Ho 已提交
5
  include FilteredSearchHelpers
6

C
Clement Ho 已提交
7
  let!(:group) { create(:group) }
8
  let!(:project) { create(:project, group: group) }
9
  let!(:user) { create(:user, username: 'joe', name: 'Joe') }
10
  let!(:user2) { create(:user, username: 'jane') }
C
Clement Ho 已提交
11 12
  let!(:label) { create(:label, project: project) }
  let!(:wontfix) { create(:label, project: project, title: "Won't fix") }
13

C
Clement Ho 已提交
14
  let!(:bug_label) { create(:label, project: project, title: 'bug') }
15
  let!(:caps_sensitive_label) { create(:label, project: project, title: 'CaPs') }
16
  let!(:milestone) { create(:milestone, title: "8", project: project, start_date: 2.days.ago) }
C
Clement Ho 已提交
17
  let!(:multiple_words_label) { create(:label, project: project, title: "Two words") }
C
Clement Ho 已提交
18

C
Clement Ho 已提交
19
  let!(:closed_issue) { create(:issue, title: 'bug that is closed', project: project, state: :closed) }
C
Clement Ho 已提交
20

C
Clement Ho 已提交
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
  def expect_no_issues_list
    page.within '.issues-list' do
      expect(page).not_to have_selector('.issue')
    end
  end

  def expect_issues_list_count(open_count, closed_count = 0)
    all_count = open_count + closed_count

    expect(page).to have_issuable_counts(open: open_count, closed: closed_count, all: all_count)
    page.within '.issues-list' do
      expect(page).to have_selector('.issue', count: open_count)
    end
  end

P
Phil Hughes 已提交
36 37 38 39
  def select_search_at_index(pos)
    evaluate_script("el = document.querySelector('.filtered-search'); el.focus(); el.setSelectionRange(#{pos}, #{pos});")
  end

40 41
  before do
    project.team << [user, :master]
C
Clement Ho 已提交
42
    project.team << [user2, :master]
43
    group.add_developer(user)
C
Clement Ho 已提交
44
    group.add_developer(user2)
45

46 47 48 49 50 51 52 53
    sign_in(user)

    create(:issue, project: project)
    create(:issue, project: project, title: "Bug report 1")
    create(:issue, project: project, title: "Bug report 2")
    create(:issue, project: project, title: "issue with 'single quotes'")
    create(:issue, project: project, title: "issue with \"double quotes\"")
    create(:issue, project: project, title: "issue with !@\#{$%^&*()-+")
54 55 56
    create(:issue, project: project, title: "issue by assignee", milestone: milestone, author: user, assignees: [user])
    create(:issue, project: project, title: "issue by assignee with searchTerm", milestone: milestone, author: user, assignees: [user])

C
Clement Ho 已提交
57 58 59 60 61
    issue = create(:issue,
      title: "Bug 2",
      project: project,
      milestone: milestone,
      author: user,
62
      assignees: [user])
C
Clement Ho 已提交
63 64
    issue.labels << bug_label

C
Clement Ho 已提交
65 66 67 68 69
    issue_with_caps_label = create(:issue,
      title: "issue by assignee with searchTerm and label",
      project: project,
      milestone: milestone,
      author: user,
70
      assignees: [user])
C
Clement Ho 已提交
71 72
    issue_with_caps_label.labels << caps_sensitive_label

C
Clement Ho 已提交
73
    issue_with_everything = create(:issue,
74
      title: "Bug report foo was possible",
C
Clement Ho 已提交
75 76 77
      project: project,
      milestone: milestone,
      author: user,
78
      assignees: [user])
C
Clement Ho 已提交
79 80 81
    issue_with_everything.labels << bug_label
    issue_with_everything.labels << caps_sensitive_label

C
Clement Ho 已提交
82 83 84
    multiple_words_label_issue = create(:issue, title: "Issue with multiple words label", project: project)
    multiple_words_label_issue.labels << multiple_words_label

85
    future_milestone = create(:milestone, title: "future", project: project, due_date: Time.now + 1.month)
C
Clement Ho 已提交
86 87

    create(:issue,
88 89 90 91
      title: "Issue with future milestone",
      milestone: future_milestone,
      project: project)

92
    visit project_issues_path(project)
C
Clement Ho 已提交
93
  end
94

C
Clement Ho 已提交
95
  describe 'filter issues by author' do
C
Clement Ho 已提交
96
    context 'only author' do
C
Clement Ho 已提交
97
      it 'filters issues by searched author' do
98
        input_filtered_search("author:@#{user.username}")
C
Clement Ho 已提交
99

100 101 102
        wait_for_requests

        expect_tokens([author_token(user.name)])
C
Clement Ho 已提交
103
        expect_issues_list_count(5)
C
Clement Ho 已提交
104
        expect_filtered_search_input_empty
C
Clement Ho 已提交
105
      end
106 107
    end

C
Clement Ho 已提交
108
    context 'author with other filters' do
C
Clement Ho 已提交
109
      let(:search_term) { 'issue' }
C
Clement Ho 已提交
110

C
Clement Ho 已提交
111
      it 'filters issues by searched author and text' do
C
Clement Ho 已提交
112
        input_filtered_search("author:@#{user.username} #{search_term}")
C
Clement Ho 已提交
113

114 115 116
        wait_for_requests

        expect_tokens([author_token(user.name)])
C
Clement Ho 已提交
117
        expect_issues_list_count(3)
C
Clement Ho 已提交
118
        expect_filtered_search_input(search_term)
119 120
      end

C
Clement Ho 已提交
121
      it 'filters issues by searched author, assignee and text' do
C
Clement Ho 已提交
122
        input_filtered_search("author:@#{user.username} assignee:@#{user.username} #{search_term}")
C
Clement Ho 已提交
123

124 125 126
        wait_for_requests

        expect_tokens([author_token(user.name), assignee_token(user.name)])
C
Clement Ho 已提交
127
        expect_issues_list_count(3)
C
Clement Ho 已提交
128
        expect_filtered_search_input(search_term)
129 130
      end

C
Clement Ho 已提交
131
      it 'filters issues by searched author, assignee, label, and text' do
C
Clement Ho 已提交
132
        input_filtered_search("author:@#{user.username} assignee:@#{user.username} label:~#{caps_sensitive_label.title} #{search_term}")
C
Clement Ho 已提交
133

134 135
        wait_for_requests

C
Clement Ho 已提交
136
        expect_tokens([
137 138 139
          author_token(user.name),
          assignee_token(user.name),
          label_token(caps_sensitive_label.title)
C
Clement Ho 已提交
140
        ])
C
Clement Ho 已提交
141
        expect_issues_list_count(1)
C
Clement Ho 已提交
142
        expect_filtered_search_input(search_term)
C
Clement Ho 已提交
143
      end
144

C
Clement Ho 已提交
145
      it 'filters issues by searched author, assignee, label, milestone and text' do
C
Clement Ho 已提交
146
        input_filtered_search("author:@#{user.username} assignee:@#{user.username} label:~#{caps_sensitive_label.title} milestone:%#{milestone.title} #{search_term}")
C
Clement Ho 已提交
147

148 149
        wait_for_requests

C
Clement Ho 已提交
150
        expect_tokens([
151 152 153 154
          author_token(user.name),
          assignee_token(user.name),
          label_token(caps_sensitive_label.title),
          milestone_token(milestone.title)
C
Clement Ho 已提交
155
        ])
C
Clement Ho 已提交
156
        expect_issues_list_count(1)
C
Clement Ho 已提交
157
        expect_filtered_search_input(search_term)
158 159 160
      end
    end
  end
A
Arinde Eniola 已提交
161

C
Clement Ho 已提交
162
  describe 'filter issues by assignee' do
C
Clement Ho 已提交
163
    context 'only assignee' do
C
Clement Ho 已提交
164
      it 'filters issues by searched assignee' do
C
Clement Ho 已提交
165
        input_filtered_search("assignee:@#{user.username}")
C
Clement Ho 已提交
166

167 168 169
        wait_for_requests

        expect_tokens([assignee_token(user.name)])
C
Clement Ho 已提交
170
        expect_issues_list_count(5)
C
Clement Ho 已提交
171
        expect_filtered_search_input_empty
C
Clement Ho 已提交
172
      end
A
Arinde Eniola 已提交
173

C
Clement Ho 已提交
174
      it 'filters issues by no assignee' do
C
Clement Ho 已提交
175
        input_filtered_search('assignee:none')
C
Clement Ho 已提交
176

177
        expect_tokens([assignee_token('none')])
C
Clement Ho 已提交
178
        expect_issues_list_count(8, 1)
C
Clement Ho 已提交
179
        expect_filtered_search_input_empty
C
Clement Ho 已提交
180
      end
A
Arinde Eniola 已提交
181 182
    end

C
Clement Ho 已提交
183
    context 'assignee with other filters' do
C
Clement Ho 已提交
184 185
      let(:search_term) { 'searchTerm' }

C
Clement Ho 已提交
186
      it 'filters issues by searched assignee and text' do
C
Clement Ho 已提交
187
        input_filtered_search("assignee:@#{user.username} #{search_term}")
C
Clement Ho 已提交
188

189 190 191
        wait_for_requests

        expect_tokens([assignee_token(user.name)])
C
Clement Ho 已提交
192
        expect_issues_list_count(2)
C
Clement Ho 已提交
193
        expect_filtered_search_input(search_term)
C
Clement Ho 已提交
194
      end
A
Arinde Eniola 已提交
195

C
Clement Ho 已提交
196
      it 'filters issues by searched assignee, author and text' do
C
Clement Ho 已提交
197
        input_filtered_search("assignee:@#{user.username} author:@#{user.username} #{search_term}")
C
Clement Ho 已提交
198

199 200 201
        wait_for_requests

        expect_tokens([assignee_token(user.name), author_token(user.name)])
C
Clement Ho 已提交
202
        expect_issues_list_count(2)
C
Clement Ho 已提交
203
        expect_filtered_search_input(search_term)
C
Clement Ho 已提交
204
      end
A
Arinde Eniola 已提交
205

C
Clement Ho 已提交
206
      it 'filters issues by searched assignee, author, label, text' do
C
Clement Ho 已提交
207
        input_filtered_search("assignee:@#{user.username} author:@#{user.username} label:~#{caps_sensitive_label.title} #{search_term}")
C
Clement Ho 已提交
208

209 210
        wait_for_requests

C
Clement Ho 已提交
211
        expect_tokens([
212 213 214
          assignee_token(user.name),
          author_token(user.name),
          label_token(caps_sensitive_label.title)
C
Clement Ho 已提交
215
        ])
C
Clement Ho 已提交
216
        expect_issues_list_count(1)
C
Clement Ho 已提交
217
        expect_filtered_search_input(search_term)
C
Clement Ho 已提交
218
      end
A
Arinde Eniola 已提交
219

C
Clement Ho 已提交
220
      it 'filters issues by searched assignee, author, label, milestone and text' do
C
Clement Ho 已提交
221
        input_filtered_search("assignee:@#{user.username} author:@#{user.username} label:~#{caps_sensitive_label.title} milestone:%#{milestone.title} #{search_term}")
C
Clement Ho 已提交
222

C
Clement Ho 已提交
223
        expect_tokens([
224 225 226 227
          assignee_token(user.name),
          author_token(user.name),
          label_token(caps_sensitive_label.title),
          milestone_token(milestone.title)
C
Clement Ho 已提交
228
        ])
C
Clement Ho 已提交
229
        expect_issues_list_count(1)
C
Clement Ho 已提交
230
        expect_filtered_search_input(search_term)
C
Clement Ho 已提交
231 232
      end
    end
C
Clement Ho 已提交
233
  end
P
Phil Hughes 已提交
234

C
Clement Ho 已提交
235
  describe 'filter issues by label' do
C
Clement Ho 已提交
236 237
    let(:search_term) { 'bug' }

C
Clement Ho 已提交
238
    context 'only label' do
C
Clement Ho 已提交
239
      it 'filters issues by searched label' do
C
Clement Ho 已提交
240
        input_filtered_search("label:~#{bug_label.title}")
C
Clement Ho 已提交
241

242
        expect_tokens([label_token(bug_label.title)])
C
Clement Ho 已提交
243
        expect_issues_list_count(2)
C
Clement Ho 已提交
244
        expect_filtered_search_input_empty
245
      end
P
Phil Hughes 已提交
246

C
Clement Ho 已提交
247
      it 'filters issues by no label' do
C
Clement Ho 已提交
248
        input_filtered_search('label:none')
C
Clement Ho 已提交
249

250
        expect_tokens([label_token('none', false)])
C
Clement Ho 已提交
251
        expect_issues_list_count(9, 1)
C
Clement Ho 已提交
252
        expect_filtered_search_input_empty
253
      end
254

C
Clement Ho 已提交
255
      it 'filters issues by multiple labels' do
C
Clement Ho 已提交
256
        input_filtered_search("label:~#{bug_label.title} label:~#{caps_sensitive_label.title}")
C
Clement Ho 已提交
257

C
Clement Ho 已提交
258
        expect_tokens([
259 260
          label_token(bug_label.title),
          label_token(caps_sensitive_label.title)
C
Clement Ho 已提交
261
        ])
C
Clement Ho 已提交
262
        expect_issues_list_count(1)
C
Clement Ho 已提交
263
        expect_filtered_search_input_empty
C
Clement Ho 已提交
264
      end
C
Clement Ho 已提交
265 266 267 268 269

      it 'filters issues by label containing special characters' do
        special_label = create(:label, project: project, title: '!@#{$%^&*()-+[]<>?/:{}|\}')
        special_issue = create(:issue, title: "Issue with special character label", project: project)
        special_issue.labels << special_label
C
Clement Ho 已提交
270

C
Clement Ho 已提交
271
        input_filtered_search("label:~#{special_label.title}")
272 273

        expect_tokens([label_token(special_label.title)])
C
Clement Ho 已提交
274
        expect_issues_list_count(1)
C
Clement Ho 已提交
275
        expect_filtered_search_input_empty
C
Clement Ho 已提交
276 277 278
      end

      it 'does not show issues' do
C
Clement Ho 已提交
279
        new_label = create(:label, project: project, title: 'new_label')
C
Clement Ho 已提交
280

C
Clement Ho 已提交
281
        input_filtered_search("label:~#{new_label.title}")
C
Clement Ho 已提交
282

283
        expect_tokens([label_token(new_label.title)])
C
Clement Ho 已提交
284
        expect_no_issues_list()
C
Clement Ho 已提交
285
        expect_filtered_search_input_empty
C
Clement Ho 已提交
286 287 288
      end
    end

C
Clement Ho 已提交
289
    context 'label with multiple words' do
C
Clement Ho 已提交
290 291 292 293 294
      it 'special characters' do
        special_multiple_label = create(:label, project: project, title: "Utmost |mp0rt@nce")
        special_multiple_issue = create(:issue, title: "Issue with special character multiple words label", project: project)
        special_multiple_issue.labels << special_multiple_label

C
Clement Ho 已提交
295
        input_filtered_search("label:~'#{special_multiple_label.title}'")
C
Clement Ho 已提交
296

297
        # Check for search results (which makes sure that the page has changed)
C
Clement Ho 已提交
298
        expect_issues_list_count(1)
C
Clement Ho 已提交
299

300 301 302
        # filtered search defaults quotations to double quotes
        expect_tokens([label_token("\"#{special_multiple_label.title}\"")])

C
Clement Ho 已提交
303
        expect_filtered_search_input_empty
C
Clement Ho 已提交
304 305 306
      end

      it 'single quotes' do
C
Clement Ho 已提交
307
        input_filtered_search("label:~'#{multiple_words_label.title}'")
C
Clement Ho 已提交
308

C
Clement Ho 已提交
309
        expect_issues_list_count(1)
310
        expect_tokens([label_token("\"#{multiple_words_label.title}\"")])
C
Clement Ho 已提交
311
        expect_filtered_search_input_empty
C
Clement Ho 已提交
312 313 314
      end

      it 'double quotes' do
C
Clement Ho 已提交
315
        input_filtered_search("label:~\"#{multiple_words_label.title}\"")
C
Clement Ho 已提交
316

317
        expect_tokens([label_token("\"#{multiple_words_label.title}\"")])
C
Clement Ho 已提交
318
        expect_issues_list_count(1)
C
Clement Ho 已提交
319
        expect_filtered_search_input_empty
C
Clement Ho 已提交
320 321 322
      end

      it 'single quotes containing double quotes' do
323 324 325
        double_quotes_label = create(:label, project: project, title: 'won"t fix')
        double_quotes_label_issue = create(:issue, title: "Issue with double quotes label", project: project)
        double_quotes_label_issue.labels << double_quotes_label
C
Clement Ho 已提交
326

C
Clement Ho 已提交
327
        input_filtered_search("label:~'#{double_quotes_label.title}'")
C
Clement Ho 已提交
328

329
        expect_tokens([label_token("'#{double_quotes_label.title}'")])
330
        expect_issues_list_count(1)
C
Clement Ho 已提交
331
        expect_filtered_search_input_empty
C
Clement Ho 已提交
332 333 334 335 336 337 338
      end

      it 'double quotes containing single quotes' do
        single_quotes_label = create(:label, project: project, title: "won't fix")
        single_quotes_label_issue = create(:issue, title: "Issue with single quotes label", project: project)
        single_quotes_label_issue.labels << single_quotes_label

C
Clement Ho 已提交
339
        input_filtered_search("label:~\"#{single_quotes_label.title}\"")
C
Clement Ho 已提交
340

341
        expect_tokens([label_token("\"#{single_quotes_label.title}\"")])
C
Clement Ho 已提交
342
        expect_issues_list_count(1)
C
Clement Ho 已提交
343
        expect_filtered_search_input_empty
C
Clement Ho 已提交
344
      end
345
    end
346

C
Clement Ho 已提交
347
    context 'label with other filters' do
C
Clement Ho 已提交
348
      it 'filters issues by searched label and text' do
C
Clement Ho 已提交
349
        input_filtered_search("label:~#{caps_sensitive_label.title} #{search_term}")
C
Clement Ho 已提交
350

351
        expect_tokens([label_token(caps_sensitive_label.title)])
C
Clement Ho 已提交
352
        expect_issues_list_count(1)
C
Clement Ho 已提交
353
        expect_filtered_search_input(search_term)
P
Phil Hughes 已提交
354 355
      end

C
Clement Ho 已提交
356
      it 'filters issues by searched label, author and text' do
C
Clement Ho 已提交
357
        input_filtered_search("label:~#{caps_sensitive_label.title} author:@#{user.username} #{search_term}")
C
Clement Ho 已提交
358

359 360 361
        wait_for_requests

        expect_tokens([label_token(caps_sensitive_label.title), author_token(user.name)])
C
Clement Ho 已提交
362
        expect_issues_list_count(1)
C
Clement Ho 已提交
363
        expect_filtered_search_input(search_term)
C
Clement Ho 已提交
364
      end
P
Phil Hughes 已提交
365

C
Clement Ho 已提交
366
      it 'filters issues by searched label, author, assignee and text' do
C
Clement Ho 已提交
367
        input_filtered_search("label:~#{caps_sensitive_label.title} author:@#{user.username} assignee:@#{user.username} #{search_term}")
C
Clement Ho 已提交
368

369 370
        wait_for_requests

C
Clement Ho 已提交
371
        expect_tokens([
372 373 374
          label_token(caps_sensitive_label.title),
          author_token(user.name),
          assignee_token(user.name)
C
Clement Ho 已提交
375
        ])
C
Clement Ho 已提交
376
        expect_issues_list_count(1)
C
Clement Ho 已提交
377
        expect_filtered_search_input(search_term)
C
Clement Ho 已提交
378
      end
379

C
Clement Ho 已提交
380
      it 'filters issues by searched label, author, assignee, milestone and text' do
C
Clement Ho 已提交
381
        input_filtered_search("label:~#{caps_sensitive_label.title} author:@#{user.username} assignee:@#{user.username} milestone:%#{milestone.title} #{search_term}")
C
Clement Ho 已提交
382

C
Clement Ho 已提交
383
        expect_tokens([
384 385 386 387
          label_token(caps_sensitive_label.title),
          author_token(user.name),
          assignee_token(user.name),
          milestone_token(milestone.title)
C
Clement Ho 已提交
388
        ])
C
Clement Ho 已提交
389
        expect_issues_list_count(1)
C
Clement Ho 已提交
390
        expect_filtered_search_input(search_term)
C
Clement Ho 已提交
391 392
      end
    end
P
Phil Hughes 已提交
393

C
Clement Ho 已提交
394
    context 'multiple labels with other filters' do
C
Clement Ho 已提交
395
      it 'filters issues by searched label, label2, and text' do
C
Clement Ho 已提交
396
        input_filtered_search("label:~#{bug_label.title} label:~#{caps_sensitive_label.title} #{search_term}")
C
Clement Ho 已提交
397

C
Clement Ho 已提交
398
        expect_tokens([
399 400
          label_token(bug_label.title),
          label_token(caps_sensitive_label.title)
C
Clement Ho 已提交
401
        ])
C
Clement Ho 已提交
402
        expect_issues_list_count(1)
C
Clement Ho 已提交
403
        expect_filtered_search_input(search_term)
C
Clement Ho 已提交
404
      end
P
Phil Hughes 已提交
405

C
Clement Ho 已提交
406
      it 'filters issues by searched label, label2, author and text' do
C
Clement Ho 已提交
407
        input_filtered_search("label:~#{bug_label.title} label:~#{caps_sensitive_label.title} author:@#{user.username} #{search_term}")
C
Clement Ho 已提交
408

409 410
        wait_for_requests

C
Clement Ho 已提交
411
        expect_tokens([
412 413 414
          label_token(bug_label.title),
          label_token(caps_sensitive_label.title),
          author_token(user.name)
C
Clement Ho 已提交
415
        ])
C
Clement Ho 已提交
416
        expect_issues_list_count(1)
C
Clement Ho 已提交
417
        expect_filtered_search_input(search_term)
C
Clement Ho 已提交
418
      end
419

C
Clement Ho 已提交
420
      it 'filters issues by searched label, label2, author, assignee and text' do
C
Clement Ho 已提交
421
        input_filtered_search("label:~#{bug_label.title} label:~#{caps_sensitive_label.title} author:@#{user.username} assignee:@#{user.username} #{search_term}")
C
Clement Ho 已提交
422

423 424
        wait_for_requests

C
Clement Ho 已提交
425
        expect_tokens([
426 427 428 429
          label_token(bug_label.title),
          label_token(caps_sensitive_label.title),
          author_token(user.name),
          assignee_token(user.name)
C
Clement Ho 已提交
430
        ])
C
Clement Ho 已提交
431
        expect_issues_list_count(1)
C
Clement Ho 已提交
432
        expect_filtered_search_input(search_term)
C
Clement Ho 已提交
433
      end
P
Phil Hughes 已提交
434

C
Clement Ho 已提交
435
      it 'filters issues by searched label, label2, author, assignee, milestone and text' do
C
Clement Ho 已提交
436
        input_filtered_search("label:~#{bug_label.title} label:~#{caps_sensitive_label.title} author:@#{user.username} assignee:@#{user.username} milestone:%#{milestone.title} #{search_term}")
C
Clement Ho 已提交
437

438 439
        wait_for_requests

C
Clement Ho 已提交
440
        expect_tokens([
441 442 443 444 445
          label_token(bug_label.title),
          label_token(caps_sensitive_label.title),
          author_token(user.name),
          assignee_token(user.name),
          milestone_token(milestone.title)
C
Clement Ho 已提交
446
        ])
C
Clement Ho 已提交
447
        expect_issues_list_count(1)
C
Clement Ho 已提交
448
        expect_filtered_search_input(search_term)
C
Clement Ho 已提交
449
      end
450 451
    end

C
Clement Ho 已提交
452
    context 'issue label clicked' do
C
Clement Ho 已提交
453
      before do
T
Taurie Davis 已提交
454
        find('.issues-list .issue .issue-main-info .issuable-info a .label', text: multiple_words_label.title).click
C
Clement Ho 已提交
455 456 457 458 459 460 461
      end

      it 'filters' do
        expect_issues_list_count(1)
      end

      it 'displays in search bar' do
462
        expect_tokens([label_token("\"#{multiple_words_label.title}\"")])
C
Clement Ho 已提交
463
        expect_filtered_search_input_empty
C
Clement Ho 已提交
464 465
      end
    end
P
Phil Hughes 已提交
466 467
  end

C
Clement Ho 已提交
468
  describe 'filter issues by milestone' do
C
Clement Ho 已提交
469
    context 'only milestone' do
C
Clement Ho 已提交
470
      it 'filters issues by searched milestone' do
471
        input_filtered_search("milestone:%#{milestone.title}")
C
Clement Ho 已提交
472

473
        expect_tokens([milestone_token(milestone.title)])
C
Clement Ho 已提交
474
        expect_issues_list_count(5)
C
Clement Ho 已提交
475
        expect_filtered_search_input_empty
C
Clement Ho 已提交
476
      end
A
Arinde Eniola 已提交
477

C
Clement Ho 已提交
478
      it 'filters issues by no milestone' do
479
        input_filtered_search("milestone:none")
C
Clement Ho 已提交
480

481
        expect_tokens([milestone_token('none', false)])
C
Clement Ho 已提交
482
        expect_issues_list_count(7, 1)
C
Clement Ho 已提交
483
        expect_filtered_search_input_empty
C
Clement Ho 已提交
484
      end
A
Arinde Eniola 已提交
485

C
Clement Ho 已提交
486
      it 'filters issues by upcoming milestones' do
487
        input_filtered_search("milestone:upcoming")
C
Clement Ho 已提交
488

489
        expect_tokens([milestone_token('upcoming', false)])
490
        expect_issues_list_count(1)
C
Clement Ho 已提交
491
        expect_filtered_search_input_empty
C
Clement Ho 已提交
492
      end
A
Arinde Eniola 已提交
493

494 495 496
      it 'filters issues by started milestones' do
        input_filtered_search("milestone:started")

497
        expect_tokens([milestone_token('started', false)])
498 499 500 501
        expect_issues_list_count(5)
        expect_filtered_search_input_empty
      end

C
Clement Ho 已提交
502 503 504
      it 'filters issues by milestone containing special characters' do
        special_milestone = create(:milestone, title: '!@\#{$%^&*()}', project: project)
        create(:issue, title: "Issue with special character milestone", project: project, milestone: special_milestone)
C
Clement Ho 已提交
505

C
Clement Ho 已提交
506
        input_filtered_search("milestone:%#{special_milestone.title}")
C
Clement Ho 已提交
507

508
        expect_tokens([milestone_token(special_milestone.title)])
C
Clement Ho 已提交
509
        expect_issues_list_count(1)
C
Clement Ho 已提交
510
        expect_filtered_search_input_empty
C
Clement Ho 已提交
511 512 513 514
      end

      it 'does not show issues' do
        new_milestone = create(:milestone, title: "new", project: project)
C
Clement Ho 已提交
515

C
Clement Ho 已提交
516
        input_filtered_search("milestone:%#{new_milestone.title}")
C
Clement Ho 已提交
517

518
        expect_tokens([milestone_token(new_milestone.title)])
C
Clement Ho 已提交
519
        expect_no_issues_list()
C
Clement Ho 已提交
520
        expect_filtered_search_input_empty
C
Clement Ho 已提交
521
      end
A
Arinde Eniola 已提交
522 523
    end

C
Clement Ho 已提交
524
    context 'milestone with other filters' do
C
Clement Ho 已提交
525
      let(:search_term) { 'bug' }
C
Clement Ho 已提交
526

C
Clement Ho 已提交
527
      it 'filters issues by searched milestone and text' do
C
Clement Ho 已提交
528
        input_filtered_search("milestone:%#{milestone.title} #{search_term}")
C
Clement Ho 已提交
529

530
        expect_tokens([milestone_token(milestone.title)])
C
Clement Ho 已提交
531
        expect_issues_list_count(2)
C
Clement Ho 已提交
532
        expect_filtered_search_input(search_term)
A
Arinde Eniola 已提交
533 534
      end

C
Clement Ho 已提交
535
      it 'filters issues by searched milestone, author and text' do
C
Clement Ho 已提交
536
        input_filtered_search("milestone:%#{milestone.title} author:@#{user.username} #{search_term}")
C
Clement Ho 已提交
537

538 539
        wait_for_requests

C
Clement Ho 已提交
540
        expect_tokens([
541 542
          milestone_token(milestone.title),
          author_token(user.name)
C
Clement Ho 已提交
543
        ])
C
Clement Ho 已提交
544
        expect_issues_list_count(2)
C
Clement Ho 已提交
545
        expect_filtered_search_input(search_term)
A
Arinde Eniola 已提交
546 547
      end

C
Clement Ho 已提交
548
      it 'filters issues by searched milestone, author, assignee and text' do
C
Clement Ho 已提交
549
        input_filtered_search("milestone:%#{milestone.title} author:@#{user.username} assignee:@#{user.username} #{search_term}")
C
Clement Ho 已提交
550

551 552
        wait_for_requests

C
Clement Ho 已提交
553
        expect_tokens([
554 555 556
          milestone_token(milestone.title),
          author_token(user.name),
          assignee_token(user.name)
C
Clement Ho 已提交
557
        ])
C
Clement Ho 已提交
558
        expect_issues_list_count(2)
C
Clement Ho 已提交
559
        expect_filtered_search_input(search_term)
C
Clement Ho 已提交
560
      end
A
Arinde Eniola 已提交
561

C
Clement Ho 已提交
562
      it 'filters issues by searched milestone, author, assignee, label and text' do
C
Clement Ho 已提交
563 564
        input_filtered_search("milestone:%#{milestone.title} author:@#{user.username} assignee:@#{user.username} label:~#{bug_label.title} #{search_term}")

565 566
        wait_for_requests

C
Clement Ho 已提交
567
        expect_tokens([
568 569 570 571
          milestone_token(milestone.title),
          author_token(user.name),
          assignee_token(user.name),
          label_token(bug_label.title)
C
Clement Ho 已提交
572
        ])
C
Clement Ho 已提交
573
        expect_issues_list_count(2)
C
Clement Ho 已提交
574
        expect_filtered_search_input(search_term)
A
Arinde Eniola 已提交
575 576
      end
    end
C
Clement Ho 已提交
577
  end
P
Phil Hughes 已提交
578

C
Clement Ho 已提交
579
  describe 'filter issues by text' do
C
Clement Ho 已提交
580
    context 'only text' do
581
      it 'filters issues by searched text' do
C
Clement Ho 已提交
582 583
        search = 'Bug'
        input_filtered_search(search)
C
Clement Ho 已提交
584

C
Clement Ho 已提交
585
        expect_issues_list_count(4, 1)
C
Clement Ho 已提交
586
        expect_filtered_search_input(search)
P
Phil Hughes 已提交
587 588
      end

C
Clement Ho 已提交
589
      it 'filters issues by multiple searched text' do
C
Clement Ho 已提交
590 591
        search = 'Bug report'
        input_filtered_search(search)
C
Clement Ho 已提交
592

C
Clement Ho 已提交
593
        expect_issues_list_count(3)
C
Clement Ho 已提交
594
        expect_filtered_search_input(search)
P
Phil Hughes 已提交
595 596
      end

C
Clement Ho 已提交
597
      it 'filters issues by case insensitive searched text' do
C
Clement Ho 已提交
598 599
        search = 'bug report'
        input_filtered_search(search)
C
Clement Ho 已提交
600

C
Clement Ho 已提交
601
        expect_issues_list_count(3)
C
Clement Ho 已提交
602
        expect_filtered_search_input(search)
P
Phil Hughes 已提交
603 604
      end

C
Clement Ho 已提交
605
      it 'filters issues by searched text containing single quotes' do
C
Clement Ho 已提交
606 607
        search = '\'single quotes\''
        input_filtered_search(search)
C
Clement Ho 已提交
608

C
Clement Ho 已提交
609
        expect_issues_list_count(1)
C
Clement Ho 已提交
610
        expect_filtered_search_input(search)
P
Phil Hughes 已提交
611 612
      end

C
Clement Ho 已提交
613
      it 'filters issues by searched text containing double quotes' do
C
Clement Ho 已提交
614 615
        search = '"double quotes"'
        input_filtered_search(search)
C
Clement Ho 已提交
616

C
Clement Ho 已提交
617
        expect_issues_list_count(1)
C
Clement Ho 已提交
618
        expect_filtered_search_input(search)
C
Clement Ho 已提交
619
      end
P
Phil Hughes 已提交
620

C
Clement Ho 已提交
621
      it 'filters issues by searched text containing special characters' do
C
Clement Ho 已提交
622 623
        search = '!@#{$%^&*()-+'
        input_filtered_search(search)
C
Clement Ho 已提交
624

C
Clement Ho 已提交
625
        expect_issues_list_count(1)
C
Clement Ho 已提交
626
        expect_filtered_search_input(search)
C
Clement Ho 已提交
627
      end
P
Phil Hughes 已提交
628

C
Clement Ho 已提交
629
      it 'does not show any issues' do
C
Clement Ho 已提交
630 631
        search = 'testing'
        input_filtered_search(search)
C
Clement Ho 已提交
632

C
Clement Ho 已提交
633
        expect_no_issues_list()
C
Clement Ho 已提交
634
        expect_filtered_search_input(search)
P
Phil Hughes 已提交
635
      end
C
Clement Ho 已提交
636
    end
P
Phil Hughes 已提交
637

C
Clement Ho 已提交
638
    context 'searched text with other filters' do
C
Clement Ho 已提交
639
      it 'filters issues by searched text and author' do
C
Clement Ho 已提交
640
        # After searching, all search terms are placed at the end
641
        input_filtered_search("bug author:@#{user.username}")
C
Clement Ho 已提交
642

C
Clement Ho 已提交
643
        expect_issues_list_count(2)
C
Clement Ho 已提交
644
        expect_filtered_search_input('bug')
C
Clement Ho 已提交
645
      end
P
Phil Hughes 已提交
646

C
Clement Ho 已提交
647
      it 'filters issues by searched text, author and more text' do
648
        input_filtered_search("bug author:@#{user.username} report")
C
Clement Ho 已提交
649

C
Clement Ho 已提交
650
        expect_issues_list_count(1)
C
Clement Ho 已提交
651
        expect_filtered_search_input('bug report')
C
Clement Ho 已提交
652
      end
P
Phil Hughes 已提交
653

C
Clement Ho 已提交
654
      it 'filters issues by searched text, author and assignee' do
655
        input_filtered_search("bug author:@#{user.username} assignee:@#{user.username}")
C
Clement Ho 已提交
656

C
Clement Ho 已提交
657
        expect_issues_list_count(2)
C
Clement Ho 已提交
658
        expect_filtered_search_input('bug')
C
Clement Ho 已提交
659
      end
P
Phil Hughes 已提交
660

C
Clement Ho 已提交
661
      it 'filters issues by searched text, author, more text and assignee' do
662
        input_filtered_search("bug author:@#{user.username} report assignee:@#{user.username}")
C
Clement Ho 已提交
663

C
Clement Ho 已提交
664
        expect_issues_list_count(1)
C
Clement Ho 已提交
665
        expect_filtered_search_input('bug report')
P
Phil Hughes 已提交
666
      end
667

C
Clement Ho 已提交
668
      it 'filters issues by searched text, author, more text, assignee and even more text' do
669
        input_filtered_search("bug author:@#{user.username} report assignee:@#{user.username} foo")
C
Clement Ho 已提交
670

C
Clement Ho 已提交
671
        expect_issues_list_count(1)
672
        expect_filtered_search_input('bug report foo')
C
Clement Ho 已提交
673
      end
674

C
Clement Ho 已提交
675
      it 'filters issues by searched text, author, assignee and label' do
676
        input_filtered_search("bug author:@#{user.username} assignee:@#{user.username} label:~#{bug_label.title}")
C
Clement Ho 已提交
677

C
Clement Ho 已提交
678
        expect_issues_list_count(2)
C
Clement Ho 已提交
679
        expect_filtered_search_input('bug')
C
Clement Ho 已提交
680
      end
681

C
Clement Ho 已提交
682
      it 'filters issues by searched text, author, text, assignee, text, label and text' do
683
        input_filtered_search("bug author:@#{user.username} assignee:@#{user.username} report label:~#{bug_label.title} foo")
C
Clement Ho 已提交
684

C
Clement Ho 已提交
685
        expect_issues_list_count(1)
686
        expect_filtered_search_input('bug report foo')
C
Clement Ho 已提交
687
      end
688

C
Clement Ho 已提交
689
      it 'filters issues by searched text, author, assignee, label and milestone' do
690
        input_filtered_search("bug author:@#{user.username} assignee:@#{user.username} label:~#{bug_label.title} milestone:%#{milestone.title}")
C
Clement Ho 已提交
691

C
Clement Ho 已提交
692
        expect_issues_list_count(2)
C
Clement Ho 已提交
693
        expect_filtered_search_input('bug')
694 695
      end

C
Clement Ho 已提交
696
      it 'filters issues by searched text, author, text, assignee, text, label, text, milestone and text' do
697
        input_filtered_search("bug author:@#{user.username} assignee:@#{user.username} report label:~#{bug_label.title} milestone:%#{milestone.title} foo")
C
Clement Ho 已提交
698

C
Clement Ho 已提交
699
        expect_issues_list_count(1)
700
        expect_filtered_search_input('bug report foo')
701 702
      end

C
Clement Ho 已提交
703
      it 'filters issues by searched text, author, assignee, multiple labels and milestone' do
704
        input_filtered_search("bug author:@#{user.username} assignee:@#{user.username} label:~#{bug_label.title} label:~#{caps_sensitive_label.title} milestone:%#{milestone.title}")
C
Clement Ho 已提交
705

C
Clement Ho 已提交
706
        expect_issues_list_count(1)
C
Clement Ho 已提交
707
        expect_filtered_search_input('bug')
708 709
      end

C
Clement Ho 已提交
710
      it 'filters issues by searched text, author, text, assignee, text, label1, text, label2, text, milestone and text' do
711
        input_filtered_search("bug author:@#{user.username} assignee:@#{user.username} report label:~#{bug_label.title} label:~#{caps_sensitive_label.title} milestone:%#{milestone.title} foo")
C
Clement Ho 已提交
712

C
Clement Ho 已提交
713
        expect_issues_list_count(1)
714
        expect_filtered_search_input('bug report foo')
715 716
      end
    end
C
Clement Ho 已提交
717

C
Clement Ho 已提交
718
    context 'sorting' do
C
Clement Ho 已提交
719
      it 'sorts by oldest updated' do
C
Clement Ho 已提交
720 721 722 723
        create(:issue,
          title: '3 days ago',
          project: project,
          author: user,
C
Clement Ho 已提交
724 725 726
          created_at: 3.days.ago,
          updated_at: 3.days.ago)

C
Clement Ho 已提交
727 728 729 730
        old_issue = create(:issue,
          title: '5 days ago',
          project: project,
          author: user,
C
Clement Ho 已提交
731 732 733 734
          created_at: 5.days.ago,
          updated_at: 5.days.ago)

        input_filtered_search('days ago')
C
Clement Ho 已提交
735

C
Clement Ho 已提交
736 737
        expect_issues_list_count(2)

E
Eric Eastwood 已提交
738
        sort_toggle = find('.filtered-search-wrapper .dropdown-toggle')
C
Clement Ho 已提交
739
        sort_toggle.click
C
Clement Ho 已提交
740

E
Eric Eastwood 已提交
741
        find('.filtered-search-wrapper .dropdown-menu li a', text: 'Oldest updated').click
742
        wait_for_requests
C
Clement Ho 已提交
743

C
Clement Ho 已提交
744 745 746 747 748
        expect(find('.issues-list .issue:first-of-type .issue-title-text a')).to have_content(old_issue.title)
      end
    end
  end

C
Clement Ho 已提交
749
  describe 'retains filter when switching issue states' do
C
Clement Ho 已提交
750 751
    before do
      input_filtered_search('bug')
C
Clement Ho 已提交
752

C
Clement Ho 已提交
753 754
      # This ensures that the search is performed
      expect_issues_list_count(4, 1)
C
Clement Ho 已提交
755 756 757
    end

    it 'open state' do
758
      find('.issues-state-filters [data-state="closed"]').click
759
      wait_for_requests
C
Clement Ho 已提交
760

761
      find('.issues-state-filters [data-state="opened"]').click
762
      wait_for_requests
C
Clement Ho 已提交
763 764 765 766 767

      expect(page).to have_selector('.issues-list .issue', count: 4)
    end

    it 'closed state' do
768
      find('.issues-state-filters [data-state="closed"]').click
769
      wait_for_requests
C
Clement Ho 已提交
770

C
Clement Ho 已提交
771 772 773 774 775
      expect(page).to have_selector('.issues-list .issue', count: 1)
      expect(find('.issues-list .issue:first-of-type .issue-title-text a')).to have_content(closed_issue.title)
    end

    it 'all state' do
776
      find('.issues-state-filters [data-state="all"]').click
777
      wait_for_requests
C
Clement Ho 已提交
778

C
Clement Ho 已提交
779
      expect(page).to have_selector('.issues-list .issue', count: 5)
C
Clement Ho 已提交
780
    end
781
  end
782

783 784
  describe 'RSS feeds' do
    it 'updates atom feed link for project issues' do
785
      visit project_issues_path(project, milestone_title: milestone.title, assignee_id: user.id)
A
Annabel Dunstone Gray 已提交
786
      link = find_link('Subscribe')
C
Clement Ho 已提交
787
      params = CGI.parse(URI.parse(link[:href]).query)
788
      auto_discovery_link = find('link[type="application/atom+xml"]', visible: false)
C
Clement Ho 已提交
789
      auto_discovery_params = CGI.parse(URI.parse(auto_discovery_link[:href]).query)
C
Clement Ho 已提交
790

791
      expect(params).to include('rss_token' => [user.rss_token])
C
Clement Ho 已提交
792
      expect(params).to include('milestone_title' => [milestone.title])
793
      expect(params).to include('assignee_id' => [user.id.to_s])
794
      expect(auto_discovery_params).to include('rss_token' => [user.rss_token])
C
Clement Ho 已提交
795
      expect(auto_discovery_params).to include('milestone_title' => [milestone.title])
796 797
      expect(auto_discovery_params).to include('assignee_id' => [user.id.to_s])
    end
798

799
    it 'updates atom feed link for group issues' do
C
Clement Ho 已提交
800
      visit issues_group_path(group, milestone_title: milestone.title, assignee_id: user.id)
801
      link = find('.nav-controls a', text: 'Subscribe')
C
Clement Ho 已提交
802
      params = CGI.parse(URI.parse(link[:href]).query)
803
      auto_discovery_link = find('link[type="application/atom+xml"]', visible: false)
C
Clement Ho 已提交
804
      auto_discovery_params = CGI.parse(URI.parse(auto_discovery_link[:href]).query)
C
Clement Ho 已提交
805

806
      expect(params).to include('rss_token' => [user.rss_token])
C
Clement Ho 已提交
807
      expect(params).to include('milestone_title' => [milestone.title])
808
      expect(params).to include('assignee_id' => [user.id.to_s])
809
      expect(auto_discovery_params).to include('rss_token' => [user.rss_token])
C
Clement Ho 已提交
810
      expect(auto_discovery_params).to include('milestone_title' => [milestone.title])
811 812
      expect(auto_discovery_params).to include('assignee_id' => [user.id.to_s])
    end
813
  end
A
Alfredo Sumaran 已提交
814 815 816

  context 'URL has a trailing slash' do
    before do
817
      visit "#{project_issues_path(project)}/"
A
Alfredo Sumaran 已提交
818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835
    end

    it 'milestone dropdown loads milestones' do
      input_filtered_search("milestone:", submit: false)

      within('#js-dropdown-milestone') do
        expect(page).to have_selector('.filter-dropdown .filter-dropdown-item', count: 2)
      end
    end

    it 'label dropdown load labels' do
      input_filtered_search("label:", submit: false)

      within('#js-dropdown-label') do
        expect(page).to have_selector('.filter-dropdown .filter-dropdown-item', count: 5)
      end
    end
  end
836
end