label_reference_filter_spec.rb 23.2 KB
Newer Older
1 2
# frozen_string_literal: true

3 4 5
require 'spec_helper'
require 'html/pipeline'

6
describe Banzai::Filter::LabelReferenceFilter do
7 8
  include FilterSpecHelper

9
  let(:project)   { create(:project, :public, name: 'sample-project') }
10 11 12
  let(:label)     { create(:label, project: project) }
  let(:reference) { label.to_reference }

13 14 15 16 17
  it_behaves_like 'HTML text with references' do
    let(:resource) { label }
    let(:resource_text) { resource.title }
  end

18 19 20 21 22 23 24
  it 'requires project context' do
    expect { described_class.call('') }.to raise_error(ArgumentError, /:project/)
  end

  %w(pre code a style).each do |elem|
    it "ignores valid references contained inside '#{elem}' element" do
      exp = act = "<#{elem}>Label #{reference}</#{elem}>"
25
      expect(reference_filter(act).to_html).to eq exp
26 27 28 29
    end
  end

  it 'includes default classes' do
30
    doc = reference_filter("Label #{reference}")
31
    expect(doc.css('a').first.attr('class')).to eq 'gfm gfm-label has-tooltip'
32 33 34
  end

  it 'includes a data-project attribute' do
35
    doc = reference_filter("Label #{reference}")
36 37 38 39 40 41 42
    link = doc.css('a').first

    expect(link).to have_attribute('data-project')
    expect(link.attr('data-project')).to eq project.id.to_s
  end

  it 'includes a data-label attribute' do
43
    doc = reference_filter("See #{reference}")
44 45 46 47 48 49 50
    link = doc.css('a').first

    expect(link).to have_attribute('data-label')
    expect(link.attr('data-label')).to eq label.id.to_s
  end

  it 'supports an :only_path context' do
51
    doc = reference_filter("Label #{reference}", only_path: true)
52 53 54
    link = doc.css('a').first.attr('href')

    expect(link).not_to match %r(https?://)
55
    expect(link).to eq urls.project_issues_path(project, label_name: label.name)
56 57
  end

58 59 60 61 62 63 64 65
  context 'project that does not exist referenced' do
    let(:result) { reference_filter('aaa/bbb~ccc') }

    it 'does not link reference' do
      expect(result.to_html).to eq 'aaa/bbb~ccc'
    end
  end

66 67
  describe 'label span element' do
    it 'includes default classes' do
68
      doc = reference_filter("Label #{reference}")
69
      expect(doc.css('a span').first.attr('class')).to eq 'badge color-label has-tooltip'
70 71 72
    end

    it 'includes a style attribute' do
73
      doc = reference_filter("Label #{reference}")
74 75 76 77 78 79
      expect(doc.css('a span').first.attr('style')).to match(/\Abackground-color: #\h{6}; color: #\h{6}\z/)
    end
  end

  context 'Integer-based references' do
    it 'links to a valid reference' do
80
      doc = reference_filter("See #{reference}")
81

82
      expect(doc.css('a').first.attr('href')).to eq urls
83
        .project_issues_url(project, label_name: label.name)
84 85 86
    end

    it 'links with adjacent text' do
87
      doc = reference_filter("Label (#{reference}.)")
88 89 90 91 92 93
      expect(doc.to_html).to match(%r(\(<a.+><span.+>#{label.name}</span></a>\.\)))
    end

    it 'ignores invalid label IDs' do
      exp = act = "Label #{invalidate_reference(reference)}"

94
      expect(reference_filter(act).to_html).to eq exp
95 96 97 98 99 100 101 102
    end
  end

  context 'String-based single-word references' do
    let(:label)     { create(:label, name: 'gfm', project: project) }
    let(:reference) { "#{Label.reference_prefix}#{label.name}" }

    it 'links to a valid reference' do
103
      doc = reference_filter("See #{reference}")
104

105
      expect(doc.css('a').first.attr('href')).to eq urls
106
        .project_issues_url(project, label_name: label.name)
107 108 109 110
      expect(doc.text).to eq 'See gfm'
    end

    it 'links with adjacent text' do
111 112
      doc = reference_filter("Label (#{reference}).")
      expect(doc.to_html).to match(%r(\(<a.+><span.+>#{label.name}</span></a>\)\.))
113 114 115 116 117
    end

    it 'ignores invalid label names' do
      exp = act = "Label #{Label.reference_prefix}#{label.name.reverse}"

118
      expect(reference_filter(act).to_html).to eq exp
119 120 121
    end
  end

122 123 124 125 126 127 128
  context 'String-based single-word references that begin with a digit' do
    let(:label)     { create(:label, name: '2fa', project: project) }
    let(:reference) { "#{Label.reference_prefix}#{label.name}" }

    it 'links to a valid reference' do
      doc = reference_filter("See #{reference}")

129
      expect(doc.css('a').first.attr('href')).to eq urls
130
        .project_issues_url(project, label_name: label.name)
131 132 133 134
      expect(doc.text).to eq 'See 2fa'
    end

    it 'links with adjacent text' do
135 136
      doc = reference_filter("Label (#{reference}).")
      expect(doc.to_html).to match(%r(\(<a.+><span.+>#{label.name}</span></a>\)\.))
137 138 139 140 141 142 143 144 145
    end

    it 'ignores invalid label names' do
      exp = act = "Label #{Label.reference_prefix}#{label.id}#{label.name.reverse}"

      expect(reference_filter(act).to_html).to eq exp
    end
  end

146
  context 'String-based single-word references with special characters' do
147
    let(:label)     { create(:label, name: '?g.fm&', project: project) }
148 149 150 151 152
    let(:reference) { "#{Label.reference_prefix}#{label.name}" }

    it 'links to a valid reference' do
      doc = reference_filter("See #{reference}")

153
      expect(doc.css('a').first.attr('href')).to eq urls
154
        .project_issues_url(project, label_name: label.name)
155
      expect(doc.text).to eq 'See ?g.fm&'
156 157
    end

158 159 160 161 162
    it 'does not include trailing punctuation', :aggregate_failures do
      ['.', ', ok?', '...', '?', '!', ': is that ok?'].each do |trailing_punctuation|
        doc = filter("Label #{reference}#{trailing_punctuation}")
        expect(doc.to_html).to match(%r(<a.+><span.+>\?g\.fm&amp;</span></a>#{Regexp.escape(trailing_punctuation)}))
      end
163 164 165 166
    end

    it 'ignores invalid label names' do
      act = "Label #{Label.reference_prefix}#{label.name.reverse}"
167
      exp = "Label #{Label.reference_prefix}&amp;mf.g?"
168 169 170 171 172

      expect(reference_filter(act).to_html).to eq exp
    end
  end

173 174
  context 'String-based multi-word references in quotes' do
    let(:label)     { create(:label, name: 'gfm references', project: project) }
175
    let(:reference) { label.to_reference(format: :name) }
176 177

    it 'links to a valid reference' do
178
      doc = reference_filter("See #{reference}")
179

180
      expect(doc.css('a').first.attr('href')).to eq urls
181
        .project_issues_url(project, label_name: label.name)
182 183 184 185
      expect(doc.text).to eq 'See gfm references'
    end

    it 'links with adjacent text' do
186
      doc = reference_filter("Label (#{reference}.)")
187 188 189 190 191 192
      expect(doc.to_html).to match(%r(\(<a.+><span.+>#{label.name}</span></a>\.\)))
    end

    it 'ignores invalid label names' do
      exp = act = %(Label #{Label.reference_prefix}"#{label.name.reverse}")

193
      expect(reference_filter(act).to_html).to eq exp
194 195 196
    end
  end

197 198 199 200 201 202 203
  context 'String-based multi-word references that begin with a digit' do
    let(:label)     { create(:label, name: '2 factor authentication', project: project) }
    let(:reference) { label.to_reference(format: :name) }

    it 'links to a valid reference' do
      doc = reference_filter("See #{reference}")

204
      expect(doc.css('a').first.attr('href')).to eq urls
205
        .project_issues_url(project, label_name: label.name)
206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
      expect(doc.text).to eq 'See 2 factor authentication'
    end

    it 'links with adjacent text' do
      doc = reference_filter("Label (#{reference}.)")
      expect(doc.to_html).to match(%r(\(<a.+><span.+>#{label.name}</span></a>\.\)))
    end

    it 'ignores invalid label names' do
      exp = act = "Label #{Label.reference_prefix}#{label.id}#{label.name.reverse}"

      expect(reference_filter(act).to_html).to eq exp
    end
  end

221
  context 'String-based multi-word references with special characters in quotes' do
222
    let(:label)     { create(:label, name: 'g.fm & references?', project: project) }
223 224 225 226 227
    let(:reference) { label.to_reference(format: :name) }

    it 'links to a valid reference' do
      doc = reference_filter("See #{reference}")

228
      expect(doc.css('a').first.attr('href')).to eq urls
229
        .project_issues_url(project, label_name: label.name)
230
      expect(doc.text).to eq 'See g.fm & references?'
231 232 233 234
    end

    it 'links with adjacent text' do
      doc = reference_filter("Label (#{reference}.)")
235
      expect(doc.to_html).to match(%r(\(<a.+><span.+>g\.fm &amp; references\?</span></a>\.\)))
236 237 238 239
    end

    it 'ignores invalid label names' do
      act = %(Label #{Label.reference_prefix}"#{label.name.reverse}")
240
      exp = %(Label #{Label.reference_prefix}"?secnerefer &amp; mf.g\")
241 242 243 244 245

      expect(reference_filter(act).to_html).to eq exp
    end
  end

246
  context 'References with html entities' do
247
    let!(:label) { create(:label, name: '&lt;html&gt;', project: project) }
248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263

    it 'links to a valid reference' do
      doc = reference_filter('See ~"&lt;html&gt;"')

      expect(doc.css('a').first.attr('href')).to eq urls
        .project_issues_url(project, label_name: label.name)
      expect(doc.text).to eq 'See <html>'
    end

    it 'ignores invalid label names and escapes entities' do
      act = %(Label #{Label.reference_prefix}"&lt;non valid&gt;")

      expect(reference_filter(act).to_html).to eq act
    end
  end

264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279
  describe 'consecutive references' do
    let(:bug) { create(:label, name: 'bug', project: project) }
    let(:feature_proposal) { create(:label, name: 'feature proposal', project: project) }
    let(:technical_debt) { create(:label, name: 'technical debt', project: project) }

    let(:bug_reference) { "#{Label.reference_prefix}#{bug.name}" }
    let(:feature_proposal_reference) { feature_proposal.to_reference(format: :name) }
    let(:technical_debt_reference) { technical_debt.to_reference(format: :name) }

    context 'separated with a comma' do
      let(:references) { "#{bug_reference}, #{feature_proposal_reference}, #{technical_debt_reference}" }

      it 'links to valid references' do
        doc = reference_filter("See #{references}")

        expect(doc.css('a').map { |a| a.attr('href') }).to match_array([
280 281 282
          urls.project_issues_url(project, label_name: bug.name),
          urls.project_issues_url(project, label_name: feature_proposal.name),
          urls.project_issues_url(project, label_name: technical_debt.name)
283 284 285 286 287 288 289 290 291 292 293 294
        ])
        expect(doc.text).to eq 'See bug, feature proposal, technical debt'
      end
    end

    context 'separated with a space' do
      let(:references) { "#{bug_reference} #{feature_proposal_reference} #{technical_debt_reference}" }

      it 'links to valid references' do
        doc = reference_filter("See #{references}")

        expect(doc.css('a').map { |a| a.attr('href') }).to match_array([
295 296 297
          urls.project_issues_url(project, label_name: bug.name),
          urls.project_issues_url(project, label_name: feature_proposal.name),
          urls.project_issues_url(project, label_name: technical_debt.name)
298 299 300 301 302 303
        ])
        expect(doc.text).to eq 'See bug feature proposal technical debt'
      end
    end
  end

304 305 306
  describe 'edge cases' do
    it 'gracefully handles non-references matching the pattern' do
      exp = act = '(format nil "~0f" 3.0) ; 3.0'
307 308 309 310 311 312 313 314 315 316
      expect(reference_filter(act).to_html).to eq exp
    end
  end

  describe 'referencing a label in a link href' do
    let(:reference) { %Q{<a href="#{label.to_reference}">Label</a>} }

    it 'links to a valid reference' do
      doc = reference_filter("See #{reference}")

317
      expect(doc.css('a').first.attr('href')).to eq urls
318
        .project_issues_url(project, label_name: label.name)
319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340
    end

    it 'links with adjacent text' do
      doc = reference_filter("Label (#{reference}.)")
      expect(doc.to_html).to match(%r(\(<a.+>Label</a>\.\)))
    end

    it 'includes a data-project attribute' do
      doc = reference_filter("Label #{reference}")
      link = doc.css('a').first

      expect(link).to have_attribute('data-project')
      expect(link.attr('data-project')).to eq project.id.to_s
    end

    it 'includes a data-label attribute' do
      doc = reference_filter("See #{reference}")
      link = doc.css('a').first

      expect(link).to have_attribute('data-label')
      expect(link.attr('data-label')).to eq label.id.to_s
    end
341
  end
342

343 344
  describe 'group label references' do
    let(:group)       { create(:group) }
345
    let(:project)     { create(:project, :public, namespace: group) }
346 347 348 349 350 351 352 353
    let(:group_label) { create(:group_label, name: 'gfm references', group: group) }

    context 'without project reference' do
      let(:reference) { group_label.to_reference(format: :name) }

      it 'links to a valid reference' do
        doc = reference_filter("See #{reference}", project: project)

354
        expect(doc.css('a').first.attr('href')).to eq urls
355
          .project_issues_url(project, label_name: group_label.name)
356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371
        expect(doc.text).to eq 'See gfm references'
      end

      it 'links with adjacent text' do
        doc = reference_filter("Label (#{reference}.)")
        expect(doc.to_html).to match(%r(\(<a.+><span.+>#{group_label.name}</span></a>\.\)))
      end

      it 'ignores invalid label names' do
        exp = act = %(Label #{Label.reference_prefix}"#{group_label.name.reverse}")

        expect(reference_filter(act).to_html).to eq exp
      end
    end

    context 'with project reference' do
372
      let(:reference) { "#{project.to_reference}#{group_label.to_reference(format: :name)}" }
373 374 375 376

      it 'links to a valid reference' do
        doc = reference_filter("See #{reference}", project: project)

377
        expect(doc.css('a').first.attr('href')).to eq urls
378
          .project_issues_url(project, label_name: group_label.name)
379
        expect(doc.text).to eq "See gfm references"
380 381 382 383 384 385 386 387 388 389 390 391 392 393 394
      end

      it 'links with adjacent text' do
        doc = reference_filter("Label (#{reference}.)")
        expect(doc.to_html).to match(%r(\(<a.+><span.+>#{group_label.name}</span></a>\.\)))
      end

      it 'ignores invalid label names' do
        exp = act = %(Label #{project.to_reference}#{Label.reference_prefix}"#{group_label.name.reverse}")

        expect(reference_filter(act).to_html).to eq exp
      end
    end
  end

395
  describe 'cross-project / cross-namespace complete reference' do
396
    let(:project2)  { create(:project) }
397
    let(:label)     { create(:label, project: project2, color: '#00ff00') }
398
    let(:reference) { "#{project2.full_path}~#{label.name}" }
399
    let!(:result)   { reference_filter("See #{reference}") }
400

401 402
    it 'links to a valid reference' do
      expect(result.css('a').first.attr('href'))
403
        .to eq urls.project_issues_url(project2, label_name: label.name)
404
    end
405

406 407 408
    it 'has valid color' do
      expect(result.css('a span').first.attr('style')).to match /background-color: #00ff00/
    end
409

410
    it 'has valid link text' do
411
      expect(result.css('a').first.text).to eq "#{label.name} in #{project2.full_name}"
412
    end
413

414
    it 'has valid text' do
415
      expect(result.text).to eq "See #{label.name} in #{project2.full_name}"
416 417
    end

418 419
    it 'ignores invalid IDs on the referenced label' do
      exp = act = "See #{invalidate_reference(reference)}"
420

421 422 423 424 425 426
      expect(reference_filter(act).to_html).to eq exp
    end
  end

  describe 'cross-project / same-namespace complete reference' do
    let(:namespace) { create(:namespace) }
427 428
    let(:project)   { create(:project, namespace: namespace) }
    let(:project2)  { create(:project, namespace: namespace) }
429
    let(:label)     { create(:label, project: project2, color: '#00ff00') }
430
    let(:reference) { "#{project2.full_path}~#{label.name}" }
431 432 433 434
    let!(:result)   { reference_filter("See #{reference}") }

    it 'links to a valid reference' do
      expect(result.css('a').first.attr('href'))
435
        .to eq urls.project_issues_url(project2, label_name: label.name)
436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458
    end

    it 'has valid color' do
      expect(result.css('a span').first.attr('style')).to match /background-color: #00ff00/
    end

    it 'has valid link text' do
      expect(result.css('a').first.text).to eq "#{label.name} in #{project2.name}"
    end

    it 'has valid text' do
      expect(result.text).to eq "See #{label.name} in #{project2.name}"
    end

    it 'ignores invalid IDs on the referenced label' do
      exp = act = "See #{invalidate_reference(reference)}"

      expect(reference_filter(act).to_html).to eq exp
    end
  end

  describe 'cross-project shorthand reference' do
    let(:namespace) { create(:namespace) }
459 460
    let(:project)   { create(:project, namespace: namespace) }
    let(:project2)  { create(:project, namespace: namespace) }
461 462 463 464 465 466
    let(:label)     { create(:label, project: project2, color: '#00ff00') }
    let(:reference) { "#{project2.path}~#{label.name}" }
    let!(:result)   { reference_filter("See #{reference}") }

    it 'links to a valid reference' do
      expect(result.css('a').first.attr('href'))
467
        .to eq urls.project_issues_url(project2, label_name: label.name)
468 469 470
    end

    it 'has valid color' do
471 472
      expect(result.css('a span').first.attr('style'))
        .to match /background-color: #00ff00/
473 474 475 476 477 478 479 480 481 482 483 484 485 486
    end

    it 'has valid link text' do
      expect(result.css('a').first.text).to eq "#{label.name} in #{project2.name}"
    end

    it 'has valid text' do
      expect(result.text).to eq "See #{label.name} in #{project2.name}"
    end

    it 'ignores invalid IDs on the referenced label' do
      exp = act = "See #{invalidate_reference(reference)}"

      expect(reference_filter(act).to_html).to eq exp
487 488
    end
  end
489 490

  describe 'cross group label references' do
491
    let(:group)            { create(:group) }
492
    let(:project)          { create(:project, :public, namespace: group) }
493
    let(:another_group)    { create(:group) }
494
    let(:another_project)  { create(:project, :public, namespace: another_group) }
495
    let(:group_label)      { create(:group_label, group: another_group, color: '#00ff00') }
496
    let(:reference)        { "#{another_project.full_path}~#{group_label.name}" }
497
    let!(:result)          { reference_filter("See #{reference}", project: project) }
498

499 500
    it 'points to referenced project issues page' do
      expect(result.css('a').first.attr('href'))
501
        .to eq urls.project_issues_url(another_project, label_name: group_label.name)
502
    end
503

504
    it 'has valid color' do
505 506
      expect(result.css('a span').first.attr('style'))
        .to match /background-color: #00ff00/
507 508 509
    end

    it 'has valid link text' do
510
      expect(result.css('a').first.text)
511
        .to eq "#{group_label.name} in #{another_project.full_name}"
512 513 514
    end

    it 'has valid text' do
515
      expect(result.text)
516
        .to eq "See #{group_label.name} in #{another_project.full_name}"
517 518 519 520 521 522 523
    end

    it 'ignores invalid IDs on the referenced label' do
      exp = act = "See #{invalidate_reference(reference)}"

      expect(reference_filter(act).to_html).to eq exp
    end
524 525 526 527 528 529 530 531 532

    context 'when group name has HTML entities' do
      let(:another_group) { create(:group, name: '<img src=x onerror=alert(1)>', path: 'another_group') }

      it 'escapes the HTML entities' do
        expect(result.text)
          .to eq "See #{group_label.name} in #{another_project.full_name}"
      end
    end
533 534 535 536
  end

  describe 'cross-project / same-group_label complete reference' do
    let(:group)            { create(:group) }
537 538
    let(:project)          { create(:project, :public, namespace: group) }
    let(:another_project)  { create(:project, :public, namespace: group) }
539
    let(:group_label)      { create(:group_label, group: group, color: '#00ff00') }
540
    let(:reference)        { "#{another_project.full_path}~#{group_label.name}" }
541 542 543
    let!(:result)          { reference_filter("See #{reference}", project: project) }

    it 'points to referenced project issues page' do
544
      expect(result.css('a').first.attr('href'))
545
        .to eq urls.project_issues_url(another_project, label_name: group_label.name)
546 547 548
    end

    it 'has valid color' do
549 550
      expect(result.css('a span').first.attr('style'))
        .to match /background-color: #00ff00/
551 552 553
    end

    it 'has valid link text' do
554 555
      expect(result.css('a').first.text)
        .to eq "#{group_label.name} in #{another_project.name}"
556 557 558
    end

    it 'has valid text' do
559 560
      expect(result.text)
        .to eq "See #{group_label.name} in #{another_project.name}"
561 562 563 564 565 566 567 568 569 570 571
    end

    it 'ignores invalid IDs on the referenced label' do
      exp = act = "See #{invalidate_reference(reference)}"

      expect(reference_filter(act).to_html).to eq exp
    end
  end

  describe 'same project / same group_label complete reference' do
    let(:group)       { create(:group) }
572
    let(:project)     { create(:project, :public, namespace: group) }
573
    let(:group_label) { create(:group_label, group: group, color: '#00ff00') }
574
    let(:reference)   { "#{project.full_path}~#{group_label.name}" }
575 576 577 578
    let!(:result)     { reference_filter("See #{reference}", project: project) }

    it 'points to referenced project issues page' do
      expect(result.css('a').first.attr('href'))
579
        .to eq urls.project_issues_url(project, label_name: group_label.name)
580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603
    end

    it 'has valid color' do
      expect(result.css('a span').first.attr('style'))
        .to match /background-color: #00ff00/
    end

    it 'has valid link text' do
      expect(result.css('a').first.text).to eq group_label.name
    end

    it 'has valid text' do
      expect(result.text).to eq "See #{group_label.name}"
    end

    it 'ignores invalid IDs on the referenced label' do
      exp = act = "See #{invalidate_reference(reference)}"

      expect(reference_filter(act).to_html).to eq exp
    end
  end

  describe 'same project / same group_label shorthand reference' do
    let(:group)       { create(:group) }
604
    let(:project)     { create(:project, :public, namespace: group) }
605 606 607 608 609 610
    let(:group_label) { create(:group_label, group: group, color: '#00ff00') }
    let(:reference)   { "#{project.path}~#{group_label.name}" }
    let!(:result)     { reference_filter("See #{reference}", project: project) }

    it 'points to referenced project issues page' do
      expect(result.css('a').first.attr('href'))
611
        .to eq urls.project_issues_url(project, label_name: group_label.name)
612 613 614
    end

    it 'has valid color' do
615 616
      expect(result.css('a span').first.attr('style'))
        .to match /background-color: #00ff00/
617 618 619 620 621 622 623 624 625 626 627 628 629 630
    end

    it 'has valid link text' do
      expect(result.css('a').first.text).to eq group_label.name
    end

    it 'has valid text' do
      expect(result.text).to eq "See #{group_label.name}"
    end

    it 'ignores invalid IDs on the referenced label' do
      exp = act = "See #{invalidate_reference(reference)}"

      expect(reference_filter(act).to_html).to eq exp
631 632
    end
  end
633 634

  describe 'group context' do
635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655
    it 'points to the page defined in label_url_method' do
      group = create(:group)
      label = create(:group_label, group: group)
      reference = "~#{label.name}"

      result = reference_filter("See #{reference}", { project: nil, group: group, label_url_method: :group_url } )

      expect(result.css('a').first.attr('href')).to eq(urls.group_url(group, label_name: label.name))
    end

    it 'finds labels also in ancestor groups' do
      group = create(:group)
      label = create(:group_label, group: group)
      subgroup = create(:group, parent: group)
      reference = "~#{label.name}"

      result = reference_filter("See #{reference}", { project: nil, group: subgroup, label_url_method: :group_url } )

      expect(result.css('a').first.attr('href')).to eq(urls.group_url(subgroup, label_name: label.name))
    end

656 657 658 659 660 661 662 663
    it 'points to referenced project issues page' do
      project = create(:project)
      label = create(:label, project: project)
      reference = "#{project.full_path}~#{label.name}"

      result = reference_filter("See #{reference}", { project: nil, group: create(:group) } )

      expect(result.css('a').first.attr('href')).to eq(urls.project_issues_url(project, label_name: label.name))
664
      expect(result.css('a').first.text).to eq "#{label.name} in #{project.full_name}"
665 666
    end
  end
667
end