gitlab_markdown_helper_spec.rb 4.84 KB
Newer Older
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
1
require 'spec_helper'
Riyad Preukschas's avatar
Riyad Preukschas committed
2

randx's avatar
randx committed
3
describe GitlabMarkdownHelper do
4
  include ApplicationHelper
Douwe Maan's avatar
Douwe Maan committed
5

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
6
  let!(:project) { create(:project) }
Robert Speicher's avatar
Robert Speicher committed
7

8
  let(:user)          { create(:user, username: 'gfm') }
9
  let(:commit)        { project.commit }
Robert Speicher's avatar
Robert Speicher committed
10
  let(:issue)         { create(:issue, project: project) }
11
  let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
Andrew8xx8's avatar
Andrew8xx8 committed
12
  let(:snippet)       { create(:project_snippet, project: project) }
Robert Speicher's avatar
Robert Speicher committed
13

Douwe Maan's avatar
Douwe Maan committed
14 15 16
  # Helper expects a current_user method.
  let(:current_user) { user }

Riyad Preukschas's avatar
Riyad Preukschas committed
17
  before do
Robert Speicher's avatar
Robert Speicher committed
18 19
    # Helper expects a @project instance variable
    @project = project
Riyad Preukschas's avatar
Riyad Preukschas committed
20 21 22
  end

  describe "#gfm" do
Robert Speicher's avatar
Robert Speicher committed
23
    it "should forward HTML options to links" do
24
      expect(gfm("Fixed in #{commit.id}", { project: @project }, class: 'foo')).
25
        to have_selector('a.gfm.foo')
26 27
    end

Robert Speicher's avatar
Robert Speicher committed
28
    describe "referencing multiple objects" do
29
      let(:actual) { "#{merge_request.to_reference} -> #{commit.to_reference} -> #{issue.to_reference}" }
Robert Speicher's avatar
Robert Speicher committed
30 31

      it "should link to the merge request" do
Vinnie Okada's avatar
Vinnie Okada committed
32
        expected = namespace_project_merge_request_path(project.namespace, project, merge_request)
33
        expect(gfm(actual)).to match(expected)
Riyad Preukschas's avatar
Riyad Preukschas committed
34 35
      end

Robert Speicher's avatar
Robert Speicher committed
36
      it "should link to the commit" do
Vinnie Okada's avatar
Vinnie Okada committed
37
        expected = namespace_project_commit_path(project.namespace, project, commit)
38
        expect(gfm(actual)).to match(expected)
Riyad Preukschas's avatar
Riyad Preukschas committed
39 40
      end

Robert Speicher's avatar
Robert Speicher committed
41
      it "should link to the issue" do
Vinnie Okada's avatar
Vinnie Okada committed
42
        expected = namespace_project_issue_path(project.namespace, project, issue)
43
        expect(gfm(actual)).to match(expected)
Riyad Preukschas's avatar
Riyad Preukschas committed
44 45
      end
    end
Robert Speicher's avatar
Robert Speicher committed
46
  end
Riyad Preukschas's avatar
Riyad Preukschas committed
47

48
  describe '#link_to_gfm' do
Vinnie Okada's avatar
Vinnie Okada committed
49
    let(:commit_path) { namespace_project_commit_path(project.namespace, project, commit) }
Robert Speicher's avatar
Robert Speicher committed
50
    let(:issues)      { create_list(:issue, 2, project: project) }
Riyad Preukschas's avatar
Riyad Preukschas committed
51

52
    it 'should handle references nested in links with all the text' do
53
      actual = link_to_gfm("This should finally fix #{issues[0].to_reference} and #{issues[1].to_reference} for real", commit_path)
54
      doc = Nokogiri::HTML.parse(actual)
Riyad Preukschas's avatar
Riyad Preukschas committed
55

56 57 58
      # Make sure we didn't create invalid markup
      expect(doc.errors).to be_empty

Robert Speicher's avatar
Robert Speicher committed
59
      # Leading commit link
60 61
      expect(doc.css('a')[0].attr('href')).to eq commit_path
      expect(doc.css('a')[0].text).to eq 'This should finally fix '
Riyad Preukschas's avatar
Riyad Preukschas committed
62

Robert Speicher's avatar
Robert Speicher committed
63
      # First issue link
64 65
      expect(doc.css('a')[1].attr('href')).
        to eq namespace_project_issue_path(project.namespace, project, issues[0])
66
      expect(doc.css('a')[1].text).to eq issues[0].to_reference
67

Robert Speicher's avatar
Robert Speicher committed
68
      # Internal commit link
69 70
      expect(doc.css('a')[2].attr('href')).to eq commit_path
      expect(doc.css('a')[2].text).to eq ' and '
71

Robert Speicher's avatar
Robert Speicher committed
72
      # Second issue link
73 74
      expect(doc.css('a')[3].attr('href')).
        to eq namespace_project_issue_path(project.namespace, project, issues[1])
75
      expect(doc.css('a')[3].text).to eq issues[1].to_reference
Robert Speicher's avatar
Robert Speicher committed
76 77

      # Trailing commit link
78 79
      expect(doc.css('a')[4].attr('href')).to eq commit_path
      expect(doc.css('a')[4].text).to eq ' for real'
80 81
    end

82
    it 'should forward HTML options' do
Robert Speicher's avatar
Robert Speicher committed
83
      actual = link_to_gfm("Fixed in #{commit.id}", commit_path, class: 'foo')
84 85 86 87 88 89
      doc = Nokogiri::HTML.parse(actual)

      expect(doc.css('a')).to satisfy do |v|
        # 'foo' gets added to all links
        v.all? { |a| a.attr('class').match(/foo$/) }
      end
90
    end
91 92

    it "escapes HTML passed in as the body" do
93
      actual = "This is a <h1>test</h1> - see #{issues[0].to_reference}"
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
94 95
      expect(link_to_gfm(actual, commit_path)).
        to match('&lt;h1&gt;test&lt;/h1&gt;')
96
    end
97 98 99 100 101 102

    it 'ignores reference links when they are the entire body' do
      text = issues[0].to_reference
      act = link_to_gfm(text, '/foo')
      expect(act).to eq %Q(<a href="/foo">#{issues[0].to_reference}</a>)
    end
103
  end
104

105
  describe '#render_wiki_content' do
106
    before do
skv's avatar
skv committed
107
      @wiki = double('WikiPage')
108
      allow(@wiki).to receive(:content).and_return('wiki content')
109 110
    end

Ben Bodenmiller's avatar
Ben Bodenmiller committed
111
    it "should use GitLab Flavored Markdown for markdown files" do
112
      allow(@wiki).to receive(:format).and_return(:markdown)
113

114
      expect(helper).to receive(:markdown).with('wiki content')
115 116 117 118

      helper.render_wiki_content(@wiki)
    end

119 120 121 122 123 124 125 126
    it "should use Asciidoctor for asciidoc files" do
      allow(@wiki).to receive(:format).and_return(:asciidoc)

      expect(helper).to receive(:asciidoc).with('wiki content')

      helper.render_wiki_content(@wiki)
    end

127
    it "should use the Gollum renderer for all other file types" do
128
      allow(@wiki).to receive(:format).and_return(:rdoc)
skv's avatar
skv committed
129
      formatted_content_stub = double('formatted_content')
130 131
      expect(formatted_content_stub).to receive(:html_safe)
      allow(@wiki).to receive(:formatted_content).and_return(formatted_content_stub)
132 133 134 135

      helper.render_wiki_content(@wiki)
    end
  end
136 137 138 139

  describe 'random_markdown_tip' do
    it 'returns a random Markdown tip' do
      stub_const("#{described_class}::MARKDOWN_TIPS", ['Random tip'])
Darby's avatar
Darby committed
140
      expect(random_markdown_tip).to eq 'Random tip'
141 142
    end
  end
Riyad Preukschas's avatar
Riyad Preukschas committed
143
end