summaryrefslogtreecommitdiff
path: root/spec/support/helpers/markdown_feature.rb
blob: eea03fb9325be936d931aef7c92cb585b17e8a03 (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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# frozen_string_literal: true

# This is a helper class used by the GitLab Markdown feature spec
#
# Because the feature spec only cares about the output of the Markdown, and the
# test setup and teardown and parsing is fairly expensive, we only want to do it
# once. Unfortunately RSpec will not let you access `let`s in a `before(:all)`
# block, so we fake it by encapsulating all the shared setup in this class.
#
# The class renders `spec/fixtures/markdown.md.erb` using ERB, allowing for
# reference to the factory-created objects.
class MarkdownFeature
  include FactoryBot::Syntax::Methods

  attr_reader :fixture_path

  def initialize(fixture_path = Rails.root.join('spec/fixtures/markdown.md.erb'))
    @fixture_path = fixture_path
  end

  def user
    @user ||= create(:user)
  end

  def group
    @group ||= create(:group).tap do |group|
      group.add_developer(user)
    end
  end

  # Direct references ----------------------------------------------------------

  def project
    @project ||= create(:project, :repository, group: group).tap do |project|
      project.add_maintainer(user)
    end
  end

  def project_wiki
    @project_wiki ||= ProjectWiki.new(project, user)
  end

  def project_wiki_page
    @project_wiki_page ||= build(:wiki_page, wiki: project_wiki)
  end

  def issue
    @issue ||= create(:issue, project: project)
  end

  def merge_request
    @merge_request ||= create(:merge_request, :simple, source_project: project)
  end

  def snippet
    @snippet ||= create(:project_snippet, project: project)
  end

  def commit
    @commit ||= project.commit
  end

  def commit_range
    @commit_range ||= begin
      commit2 = project.commit('HEAD~3')
      CommitRange.new("#{commit.id}...#{commit2.id}", project)
    end
  end

  def simple_label
    @simple_label ||= create(:label, name: 'gfm', project: project)
  end

  def label
    @label ||= create(:label, name: 'awaiting feedback', project: project)
  end

  def simple_milestone
    @simple_milestone ||= create(:milestone, name: 'gfm-milestone', project: project)
  end

  def milestone
    @milestone ||= create(:milestone, name: 'next goal', project: project)
  end

  def group_milestone
    @group_milestone ||= create(:milestone, name: 'group-milestone', group: group)
  end

  # Cross-references -----------------------------------------------------------

  def xproject
    @xproject ||= begin
      group = create(:group, :nested)
      create(:project, :repository, namespace: group) do |project|
        project.add_developer(user)
      end
    end
  end

  def xissue
    @xissue ||= create(:issue, project: xproject)
  end

  def xmerge_request
    @xmerge_request ||= create(:merge_request, :simple, source_project: xproject)
  end

  def xsnippet
    @xsnippet ||= create(:project_snippet, project: xproject)
  end

  def xcommit
    @xcommit ||= xproject.commit
  end

  def xcommit_range
    @xcommit_range ||= begin
      xcommit2 = xproject.commit('HEAD~2')
      CommitRange.new("#{xcommit.id}...#{xcommit2.id}", xproject)
    end
  end

  def xmilestone
    @xmilestone ||= create(:milestone, project: xproject)
  end

  def urls
    Gitlab::Routing.url_helpers
  end

  def raw_markdown
    markdown = File.read(fixture_path)
    ERB.new(markdown).result(binding)
  end
end