reference_extractor_spec.rb 5.5 KB
Newer Older
1 2 3 4
require 'spec_helper'

describe Gitlab::ReferenceExtractor do
  it 'extracts username references' do
5
    subject.analyze('this contains a @user reference', nil)
6
    expect(subject.users).to eq([{ project: nil, id: 'user' }])
7 8 9
  end

  it 'extracts issue references' do
10
    subject.analyze('this one talks about issue #1234', nil)
11
    expect(subject.issues).to eq([{ project: nil, id: '1234' }])
12 13
  end

14
  it 'extracts JIRA issue references' do
15
    subject.analyze('this one talks about issue JIRA-1234', nil)
16
    expect(subject.issues).to eq([{ project: nil, id: 'JIRA-1234' }])
17 18
  end

19
  it 'extracts merge request references' do
20
    subject.analyze("and here's !43, a merge request", nil)
21
    expect(subject.merge_requests).to eq([{ project: nil, id: '43' }])
22 23 24
  end

  it 'extracts snippet ids' do
25
    subject.analyze('snippets like $12 get extracted as well', nil)
26
    expect(subject.snippets).to eq([{ project: nil, id: '12' }])
27 28 29
  end

  it 'extracts commit shas' do
30
    subject.analyze('commit shas 98cf0ae3 are pulled out as Strings', nil)
31
    expect(subject.commits).to eq([{ project: nil, id: '98cf0ae3' }])
32 33
  end

34 35 36 37 38
  it 'extracts commit ranges' do
    subject.analyze('here you go, a commit range: 98cf0ae3...98cf0ae4', nil)
    expect(subject.commit_ranges).to eq([{ project: nil, id: '98cf0ae3...98cf0ae4' }])
  end

39
  it 'extracts multiple references and preserves their order' do
40
    subject.analyze('@me and @you both care about this', nil)
41
    expect(subject.users).to eq([
42 43
      { project: nil, id: 'me' },
      { project: nil, id: 'you' }
44
    ])
45 46 47
  end

  it 'leaves the original note unmodified' do
48 49
    text = 'issue #123 is just the worst, @user'
    subject.analyze(text, nil)
50
    expect(text).to eq('issue #123 is just the worst, @user')
51 52
  end

53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
  it 'extracts no references for <pre>..</pre> blocks' do
    subject.analyze("<pre>def puts '#1 issue'\nend\n</pre>```", nil)
    expect(subject.issues).to be_blank
  end

  it 'extracts no references for <code>..</code> blocks' do
    subject.analyze("<code>def puts '!1 request'\nend\n</code>```", nil)
    expect(subject.merge_requests).to be_blank
  end

  it 'extracts no references for code blocks with language' do
    subject.analyze("this code:\n```ruby\ndef puts '#1 issue'\nend\n```", nil)
    expect(subject.issues).to be_blank
  end

  it 'extracts issue references for invalid code blocks' do
    subject.analyze('test: ```this one talks about issue #1234```', nil)
    expect(subject.issues).to eq([{ project: nil, id: '1234' }])
  end

73 74
  it 'handles all possible kinds of references' do
    accessors = Gitlab::Markdown::TYPES.map { |t| "#{t}s".to_sym }
75
    expect(subject).to respond_to(*accessors)
76 77 78
  end

  context 'with a project' do
D
Dmitriy Zaporozhets 已提交
79
    let(:project) { create(:project) }
80 81 82 83 84 85 86 87 88

    it 'accesses valid user objects on the project team' do
      @u_foo = create(:user, username: 'foo')
      @u_bar = create(:user, username: 'bar')
      create(:user, username: 'offteam')

      project.team << [@u_foo, :reporter]
      project.team << [@u_bar, :guest]

89
      subject.analyze('@foo, @baduser, @bar, and @offteam', project)
90
      expect(subject.users_for(project)).to eq([@u_foo, @u_bar])
91 92 93 94 95 96
    end

    it 'accesses valid issue objects' do
      @i0 = create(:issue, project: project)
      @i1 = create(:issue, project: project)

97
      subject.analyze("##{@i0.iid}, ##{@i1.iid}, and #999.", project)
98
      expect(subject.issues_for(project)).to eq([@i0, @i1])
99 100 101 102 103 104
    end

    it 'accesses valid merge requests' do
      @m0 = create(:merge_request, source_project: project, target_project: project, source_branch: 'aaa')
      @m1 = create(:merge_request, source_project: project, target_project: project, source_branch: 'bbb')

105
      subject.analyze("!999, !#{@m1.iid}, and !#{@m0.iid}.", project)
106
      expect(subject.merge_requests_for(project)).to eq([@m1, @m0])
107 108 109 110 111 112 113
    end

    it 'accesses valid snippets' do
      @s0 = create(:project_snippet, project: project)
      @s1 = create(:project_snippet, project: project)
      @s2 = create(:project_snippet)

114
      subject.analyze("$#{@s0.id}, $999, $#{@s2.id}, $#{@s1.id}", project)
115
      expect(subject.snippets_for(project)).to eq([@s0, @s1])
116 117 118
    end

    it 'accesses valid commits' do
119
      commit = project.repository.commit('master')
120

121 122
      subject.analyze("this references commits #{commit.sha[0..6]} and 012345",
                      project)
123
      extracted = subject.commits_for(project)
124 125 126
      expect(extracted.size).to eq(1)
      expect(extracted[0].sha).to eq(commit.sha)
      expect(extracted[0].message).to eq(commit.message)
127
    end
128 129 130 131 132 133 134 135 136 137 138 139 140 141

    it 'accesses valid commit ranges' do
      commit = project.repository.commit('master')
      earlier_commit = project.repository.commit('master~2')

      subject.analyze("this references commits #{earlier_commit.sha[0..6]}...#{commit.sha[0..6]}",
                      project)
      extracted = subject.commit_ranges_for(project)
      expect(extracted.size).to eq(1)
      expect(extracted[0][0].sha).to eq(earlier_commit.sha)
      expect(extracted[0][0].message).to eq(earlier_commit.message)
      expect(extracted[0][1].sha).to eq(commit.sha)
      expect(extracted[0][1].message).to eq(commit.message)
    end
142
  end
143 144 145 146 147 148 149 150 151 152 153 154 155 156

  context 'with a project with an underscore' do
    let(:project) { create(:project, path: 'test_project') }
    let(:issue) { create(:issue, project: project) }

    it 'handles project issue references' do
      subject.analyze("this refers issue #{project.path_with_namespace}##{issue.iid}",
          project)
      extracted = subject.issues_for(project)
      expect(extracted.size).to eq(1)
      expect(extracted).to eq([issue])
    end

  end
157
end