summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/gfm/reference_rewriter_spec.rb
blob: f045463c1cbf5b191b140e8e32f5c2214163fd69 (plain)
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
require 'spec_helper'

describe Gitlab::Gfm::ReferenceRewriter do
  let(:text) { 'some text' }
  let(:old_project) { create(:project, name: 'old') }
  let(:new_project) { create(:project, name: 'new') }
  let(:user) { create(:user) }

  before { old_project.team << [user, :guest] }

  describe '#rewrite' do
    subject do
      described_class.new(text, old_project, user).rewrite(new_project)
    end

    context 'multiple issues and merge requests referenced' do
      let!(:issue_first) { create(:issue, project: old_project) }
      let!(:issue_second) { create(:issue, project: old_project) }
      let!(:merge_request) { create(:merge_request, source_project: old_project) }

      context 'plain text description' do
        let(:text) { 'Description that references #1, #2 and !1' }

        it { is_expected.to include issue_first.to_reference(new_project) }
        it { is_expected.to include issue_second.to_reference(new_project) }
        it { is_expected.to include merge_request.to_reference(new_project) }
      end

      context 'description with ignored elements' do
        let(:text) do
          "Hi. This references #1, but not `#2`\n" +
          '<pre>and not !1</pre>'
        end

        it { is_expected.to include issue_first.to_reference(new_project) }
        it { is_expected.not_to include issue_second.to_reference(new_project) }
        it { is_expected.not_to include merge_request.to_reference(new_project) }
      end

      context 'description ambigous elements' do
        context 'url' do
          let(:url) { 'http://gitlab.com/#1' }
          let(:text) { "This references #1, but not #{url}" }

          it { is_expected.to include url }
        end

        context 'code' do
          let(:text) { "#1, but not `[#1]`" }
          it { is_expected.to eq "#{issue_first.to_reference(new_project)}, but not `[#1]`" }
        end

        context 'code reverse' do
          let(:text) { "not `#1`, but #1" }
          it { is_expected.to eq "not `#1`, but #{issue_first.to_reference(new_project)}" }
        end

        context 'code in random order' do
          let(:text) { "#1, `#1`, #1, `#1`" }
          let(:ref) { issue_first.to_reference(new_project) }

          it { is_expected.to eq "#{ref}, `#1`, #{ref}, `#1`" }
        end

        context 'description with project labels' do
          let!(:label) { create(:label, id: 123, name: 'test', project: old_project) }
          let(:project_ref) { old_project.to_reference }

          context 'label referenced by id' do
            let(:text) { '#1 and ~123' }
            it { is_expected.to eq %Q{#{project_ref}#1 and #{project_ref}~123} }
          end

          context 'label referenced by text' do
            let(:text) { '#1 and ~"test"' }
            it { is_expected.to eq %Q{#{project_ref}#1 and #{project_ref}~123} }
          end
        end

        context 'description with group labels' do
          let(:old_group) { create(:group) }
          let!(:group_label) { create(:group_label, id: 321, name: 'group label', group: old_group) }
          let(:project_ref) { old_project.to_reference }

          before do
            old_project.update(namespace: old_group)
          end

          context 'label referenced by id' do
            let(:text) { '#1 and ~321' }
            it { is_expected.to eq %Q{#{project_ref}#1 and #{project_ref}~321} }
          end

          context 'label referenced by text' do
            let(:text) { '#1 and ~"group label"' }
            it { is_expected.to eq %Q{#{project_ref}#1 and #{project_ref}~321} }
          end
        end
      end

      context 'reference contains milestone' do
        let(:milestone) { create(:milestone) }
        let(:text) { "milestone ref: #{milestone.to_reference}" }

        it { is_expected.to eq text }
      end
    end
  end
end