summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/markdown/upload_link_filter_spec.rb
blob: 9087f823d7f6a018ef832d2be78602d097bcd3e0 (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
# encoding: UTF-8

require 'spec_helper'

module Gitlab::Markdown
  describe UploadLinkFilter, lib: true do
    def filter(doc, contexts = {})
      contexts.reverse_merge!({
        project: project
      })

      described_class.call(doc, contexts)
    end

    def image(path)
      %(<img src="#{path}" />)
    end

    def link(path)
      %(<a href="#{path}">#{path}</a>)
    end

    let(:project) { create(:project) }

    shared_examples :preserve_unchanged do
      it 'does not modify any relative URL in anchor' do
        doc = filter(link('README.md'))
        expect(doc.at_css('a')['href']).to eq 'README.md'
      end

      it 'does not modify any relative URL in image' do
        doc = filter(image('files/images/logo-black.png'))
        expect(doc.at_css('img')['src']).to eq 'files/images/logo-black.png'
      end
    end

    it 'does not raise an exception on invalid URIs' do
      act = link("://foo")
      expect { filter(act) }.not_to raise_error
    end

    context 'with a valid repository' do
      it 'rebuilds relative URL for a link' do
        doc = filter(link('/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg'))
        expect(doc.at_css('a')['href']).
          to eq "#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg"
      end

      it 'rebuilds relative URL for an image' do
        doc = filter(link('/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg'))
        expect(doc.at_css('a')['href']).
          to eq "#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg"
      end

      it 'does not modify absolute URL' do
        doc = filter(link('http://example.com'))
        expect(doc.at_css('a')['href']).to eq 'http://example.com'
      end

      it 'supports Unicode filenames' do
        path = '/uploads/한글.png'
        escaped = Addressable::URI.escape(path)

        # Stub these methods so the file doesn't actually need to be in the repo
        allow_any_instance_of(described_class).
          to receive(:file_exists?).and_return(true)
        allow_any_instance_of(described_class).
          to receive(:image?).with(path).and_return(true)

        doc = filter(image(escaped))
        expect(doc.at_css('img')['src']).to match "#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}/uploads/%ED%95%9C%EA%B8%80.png"
      end
    end
  end
end