summaryrefslogtreecommitdiff
path: root/spec/lib/banzai/filter/video_link_filter_spec.rb
blob: a0b0ba309f54b2ff0fe20598f68a40562d398509 (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
110
111
112
113
114
115
116
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Banzai::Filter::VideoLinkFilter do
  def filter(doc, contexts = {})
    contexts.reverse_merge!({
      project: project
    })

    described_class.call(doc, contexts)
  end

  def link_to_image(path)
    return '<img/>' if path.nil?

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

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

  shared_examples 'a video element' do
    let(:image) { link_to_image(src) }

    it 'replaces the image tag with a video tag' do
      container = filter(image).children.first

      expect(container.name).to eq 'span'
      expect(container['class']).to eq 'media-container video-container'

      video, link = container.children

      expect(video.name).to eq 'video'
      expect(video['src']).to eq src
      expect(video['width']).to eq "400"
      expect(video['preload']).to eq 'metadata'

      expect(link.name).to eq 'a'
      expect(link['href']).to eq src
      expect(link['target']).to eq '_blank'
    end
  end

  shared_examples 'an unchanged element' do |ext|
    it 'leaves the document unchanged' do
      element = filter(link_to_image(src)).children.first

      expect(element.name).to eq 'img'
      expect(element['src']).to eq src
    end
  end

  context 'when the element src has a video extension' do
    Gitlab::FileTypeDetection::SAFE_VIDEO_EXT.each do |ext|
      it_behaves_like 'a video element' do
        let(:src) { "/path/video.#{ext}" }
      end

      it_behaves_like 'a video element' do
        let(:src) { "/path/video.#{ext.upcase}" }
      end
    end
  end

  context 'when the element has no src attribute' do
    let(:src) { nil }

    it_behaves_like 'an unchanged element'
  end

  context 'when the element src is an image' do
    let(:src) { '/path/my_image.jpg' }

    it_behaves_like 'an unchanged element'
  end

  context 'when the element src has an invalid file extension' do
    let(:src) { '/path/my_video.somemp4' }

    it_behaves_like 'an unchanged element'
  end

  context 'when data-canonical-src is empty' do
    let(:image) { %(<img src="#{src}" data-canonical-src=""/>) }

    context 'and src is a video' do
      let(:src) { '/path/video.mp4' }

      it_behaves_like 'a video element'
    end

    context 'and src is an image' do
      let(:src) { '/path/my_image.jpg' }

      it_behaves_like 'an unchanged element'
    end
  end

  context 'when data-canonical-src is set' do
    it 'uses the correct src' do
      proxy_src = 'https://assets.example.com/6d8b63'
      canonical_src = 'http://example.com/test.mp4'
      image = %(<img src="#{proxy_src}" data-canonical-src="#{canonical_src}"/>)
      container = filter(image).children.first

      expect(container['class']).to eq 'media-container video-container'

      video, link = container.children

      expect(video['src']).to eq proxy_src
      expect(video['data-canonical-src']).to eq canonical_src

      expect(link['href']).to eq proxy_src
    end
  end
end