BigW Consortium Gitlab

object_renderer_spec.rb 4.12 KB
Newer Older
1 2 3 4 5 6
require 'spec_helper'

describe Banzai::ObjectRenderer do
  let(:project) { create(:empty_project) }
  let(:user) { project.owner }

7
  def fake_object(attrs = {})
8
    object = double(attrs.merge("new_record?" => true, "destroyed?" => true))
9 10 11 12 13 14
    allow(object).to receive(:markdown_cache_field_for).with(:note).and_return(:note_html)
    allow(object).to receive(:banzai_render_context).with(:note).and_return(project: nil, author: nil)
    allow(object).to receive(:update_column).with(:note_html, anything).and_return(true)
    object
  end

15 16 17
  describe '#render' do
    it 'renders and redacts an Array of objects' do
      renderer = described_class.new(project, user)
18
      object = fake_object(note: 'hello', note_html: nil)
19 20 21 22 23 24 25 26

      expect(renderer).to receive(:render_objects).with([object], :note).
        and_call_original

      expect(renderer).to receive(:redact_documents).
        with(an_instance_of(Array)).
        and_call_original

27
      expect(object).to receive(:redacted_note_html=).with('<p dir="auto">hello</p>')
28
      expect(object).to receive(:user_visible_reference_count=).with(0)
29 30 31 32 33 34 35

      renderer.render([object], :note)
    end
  end

  describe '#render_objects' do
    it 'renders an Array of objects' do
36
      object = fake_object(note: 'hello', note_html: nil)
37

38 39
      renderer = described_class.new(project, user)

40
      expect(renderer).to receive(:render_attributes).with([object], :note).
41 42 43 44 45 46 47 48 49 50
        and_call_original

      rendered = renderer.render_objects([object], :note)

      expect(rendered).to be_an_instance_of(Array)
      expect(rendered[0]).to be_an_instance_of(Nokogiri::HTML::DocumentFragment)
    end
  end

  describe '#redact_documents' do
51
    it 'redacts a set of documents and returns them as an Array of Hashes' do
52 53 54 55 56 57 58 59 60
      doc = Nokogiri::HTML.fragment('<p>hello</p>')
      renderer = described_class.new(project, user)

      expect_any_instance_of(Banzai::Redactor).to receive(:redact).
        with([doc]).
        and_call_original

      redacted = renderer.redact_documents([doc])

61 62 63
      expect(redacted.count).to eq(1)
      expect(redacted.first[:visible_reference_count]).to eq(0)
      expect(redacted.first[:document].to_html).to eq('<p>hello</p>')
64 65 66 67
    end
  end

  describe '#context_for' do
68
    let(:object) { fake_object(note: 'hello') }
69 70 71 72 73 74
    let(:renderer) { described_class.new(project, user) }

    it 'returns a Hash' do
      expect(renderer.context_for(object, :note)).to be_an_instance_of(Hash)
    end

75 76
    it 'includes the banzai render context for the object' do
      expect(object).to receive(:banzai_render_context).with(:note).and_return(foo: :bar)
77
      context = renderer.context_for(object, :note)
78 79
      expect(context).to have_key(:foo)
      expect(context[:foo]).to eq(:bar)
80 81 82
    end
  end

83 84
  describe '#render_attributes' do
    it 'renders the attribute of a list of objects' do
85 86
      objects = [fake_object(note: 'hello', note_html: nil), fake_object(note: 'bye', note_html: nil)]
      renderer = described_class.new(project, user)
87

88 89 90
      objects.each do |object|
        expect(Banzai).to receive(:render_field).with(object, :note).and_call_original
      end
91 92 93 94

      docs = renderer.render_attributes(objects, :note)

      expect(docs[0]).to be_an_instance_of(Nokogiri::HTML::DocumentFragment)
95
      expect(docs[0].to_html).to eq('<p dir="auto">hello</p>')
96 97

      expect(docs[1]).to be_an_instance_of(Nokogiri::HTML::DocumentFragment)
98
      expect(docs[1].to_html).to eq('<p dir="auto">bye</p>')
99
    end
100 101 102 103 104 105 106

    it 'returns when no objects to render' do
      objects = []
      renderer = described_class.new(project, user, pipeline: :note)

      expect(renderer.render_attributes(objects, :note)).to eq([])
    end
107 108 109 110
  end

  describe '#base_context' do
    let(:context) do
111
      described_class.new(project, user, foo: :bar).base_context
112 113 114 115 116 117 118
    end

    it 'returns a Hash' do
      expect(context).to be_an_instance_of(Hash)
    end

    it 'includes the custom attributes' do
119
      expect(context[:foo]).to eq(:bar)
120 121 122 123 124 125 126 127 128 129 130
    end

    it 'includes the current user' do
      expect(context[:current_user]).to eq(user)
    end

    it 'includes the current project' do
      expect(context[:project]).to eq(project)
    end
  end
end