summaryrefslogtreecommitdiff
path: root/spec/lib/banzai/reference_parser/design_parser_spec.rb
blob: c490cf5b36d27fa04fd365c1a7927aefee33e1e2 (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
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Banzai::ReferenceParser::DesignParser, feature_category: :design_management do
  include ReferenceParserHelpers
  include DesignManagementTestHelpers

  let_it_be(:issue) { create(:issue) }
  let_it_be(:design) { create(:design, :with_versions, issue: issue) }
  let_it_be(:user) { create(:user, developer_projects: [issue.project]) }

  subject(:instance) { described_class.new(Banzai::RenderContext.new(issue.project, user)) }

  let(:link) { design_link(design) }

  before do
    enable_design_management
  end

  describe '#nodes_visible_to_user' do
    it_behaves_like 'referenced feature visibility', 'issues' do
      let(:project) { issue.project }
    end

    describe 'specific states' do
      let_it_be(:public_project) { create(:project, :public) }

      let_it_be(:other_project_link) do
        design_link(create(:design, :with_versions))
      end

      let_it_be(:public_link) do
        design_link(create(:design, :with_versions, issue: create(:issue, project: public_project)))
      end

      let_it_be(:public_but_confidential_link) do
        design_link(create(:design, :with_versions, issue: create(:issue, :confidential, project: public_project)))
      end

      subject(:visible_nodes) do
        nodes = [link,
                 other_project_link,
                 public_link,
                 public_but_confidential_link]

        instance.nodes_visible_to_user(user, nodes)
      end

      it 'redacts links we should not have access to' do
        expect(visible_nodes).to contain_exactly(link, public_link)
      end

      context 'design management is not available' do
        before do
          enable_design_management(false)
        end

        it 'redacts all nodes' do
          expect(visible_nodes).to be_empty
        end
      end
    end
  end

  describe '#process' do
    it 'returns the correct designs' do
      frag = document([design, create(:design, :with_versions)])

      expect(subject.process([frag])[:visible]).to contain_exactly(design)
    end
  end

  def design_link(design)
    node = empty_html_link
    node['class'] = 'gfm'
    node['data-reference-type'] = 'design'
    node['data-project'] = design.project.id.to_s
    node['data-issue'] = design.issue.id.to_s
    node['data-design'] = design.id.to_s

    node
  end

  def document(designs)
    frag = Nokogiri::HTML.fragment('')
    designs.each do |design|
      frag.add_child(design_link(design))
    end

    frag
  end
end