brainstem 1.0.0.pre.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/Gemfile.lock +1 -1
- data/README.md +383 -32
- data/bin/brainstem +6 -0
- data/brainstem.gemspec +2 -0
- data/docs/api_doc_generator.markdown +175 -0
- data/docs/brainstem_executable.markdown +32 -0
- data/docs/docgen.png +0 -0
- data/docs/docgen_ascii.txt +63 -0
- data/docs/executable.png +0 -0
- data/docs/executable_ascii.txt +10 -0
- data/lib/brainstem/api_docs.rb +146 -0
- data/lib/brainstem/api_docs/abstract_collection.rb +116 -0
- data/lib/brainstem/api_docs/atlas.rb +158 -0
- data/lib/brainstem/api_docs/builder.rb +167 -0
- data/lib/brainstem/api_docs/controller.rb +122 -0
- data/lib/brainstem/api_docs/controller_collection.rb +40 -0
- data/lib/brainstem/api_docs/endpoint.rb +234 -0
- data/lib/brainstem/api_docs/endpoint_collection.rb +58 -0
- data/lib/brainstem/api_docs/exceptions.rb +8 -0
- data/lib/brainstem/api_docs/formatters/abstract_formatter.rb +64 -0
- data/lib/brainstem/api_docs/formatters/markdown/controller_formatter.rb +76 -0
- data/lib/brainstem/api_docs/formatters/markdown/endpoint_collection_formatter.rb +73 -0
- data/lib/brainstem/api_docs/formatters/markdown/endpoint_formatter.rb +169 -0
- data/lib/brainstem/api_docs/formatters/markdown/helper.rb +76 -0
- data/lib/brainstem/api_docs/formatters/markdown/presenter_formatter.rb +200 -0
- data/lib/brainstem/api_docs/introspectors/abstract_introspector.rb +100 -0
- data/lib/brainstem/api_docs/introspectors/rails_introspector.rb +232 -0
- data/lib/brainstem/api_docs/presenter.rb +225 -0
- data/lib/brainstem/api_docs/presenter_collection.rb +97 -0
- data/lib/brainstem/api_docs/resolver.rb +73 -0
- data/lib/brainstem/api_docs/sinks/abstract_sink.rb +37 -0
- data/lib/brainstem/api_docs/sinks/controller_presenter_multifile_sink.rb +93 -0
- data/lib/brainstem/api_docs/sinks/stdout_sink.rb +44 -0
- data/lib/brainstem/cli.rb +146 -0
- data/lib/brainstem/cli/abstract_command.rb +97 -0
- data/lib/brainstem/cli/generate_api_docs_command.rb +169 -0
- data/lib/brainstem/concerns/controller_dsl.rb +300 -0
- data/lib/brainstem/concerns/controller_param_management.rb +30 -9
- data/lib/brainstem/concerns/formattable.rb +38 -0
- data/lib/brainstem/concerns/inheritable_configuration.rb +3 -2
- data/lib/brainstem/concerns/optional.rb +43 -0
- data/lib/brainstem/concerns/presenter_dsl.rb +76 -15
- data/lib/brainstem/controller_methods.rb +6 -3
- data/lib/brainstem/dsl/association.rb +6 -3
- data/lib/brainstem/dsl/associations_block.rb +6 -3
- data/lib/brainstem/dsl/base_block.rb +2 -4
- data/lib/brainstem/dsl/conditional.rb +7 -3
- data/lib/brainstem/dsl/conditionals_block.rb +4 -4
- data/lib/brainstem/dsl/configuration.rb +184 -8
- data/lib/brainstem/dsl/field.rb +6 -3
- data/lib/brainstem/dsl/fields_block.rb +2 -3
- data/lib/brainstem/help_text.txt +8 -0
- data/lib/brainstem/presenter.rb +27 -6
- data/lib/brainstem/presenter_validator.rb +5 -2
- data/lib/brainstem/time_classes.rb +1 -1
- data/lib/brainstem/version.rb +1 -1
- data/spec/brainstem/api_docs/abstract_collection_spec.rb +156 -0
- data/spec/brainstem/api_docs/atlas_spec.rb +353 -0
- data/spec/brainstem/api_docs/builder_spec.rb +100 -0
- data/spec/brainstem/api_docs/controller_collection_spec.rb +92 -0
- data/spec/brainstem/api_docs/controller_spec.rb +225 -0
- data/spec/brainstem/api_docs/endpoint_collection_spec.rb +144 -0
- data/spec/brainstem/api_docs/endpoint_spec.rb +346 -0
- data/spec/brainstem/api_docs/formatters/abstract_formatter_spec.rb +30 -0
- data/spec/brainstem/api_docs/formatters/markdown/controller_formatter_spec.rb +126 -0
- data/spec/brainstem/api_docs/formatters/markdown/endpoint_collection_formatter_spec.rb +85 -0
- data/spec/brainstem/api_docs/formatters/markdown/endpoint_formatter_spec.rb +261 -0
- data/spec/brainstem/api_docs/formatters/markdown/helper_spec.rb +100 -0
- data/spec/brainstem/api_docs/formatters/markdown/presenter_formatter_spec.rb +485 -0
- data/spec/brainstem/api_docs/introspectors/abstract_introspector_spec.rb +192 -0
- data/spec/brainstem/api_docs/introspectors/rails_introspector_spec.rb +170 -0
- data/spec/brainstem/api_docs/presenter_collection_spec.rb +84 -0
- data/spec/brainstem/api_docs/presenter_spec.rb +519 -0
- data/spec/brainstem/api_docs/resolver_spec.rb +72 -0
- data/spec/brainstem/api_docs/sinks/abstract_sink_spec.rb +16 -0
- data/spec/brainstem/api_docs/sinks/controller_presenter_multifile_sink_spec.rb +56 -0
- data/spec/brainstem/api_docs/sinks/stdout_sink_spec.rb +22 -0
- data/spec/brainstem/api_docs_spec.rb +58 -0
- data/spec/brainstem/cli/abstract_command_spec.rb +91 -0
- data/spec/brainstem/cli/generate_api_docs_command_spec.rb +125 -0
- data/spec/brainstem/cli_spec.rb +67 -0
- data/spec/brainstem/concerns/controller_dsl_spec.rb +471 -0
- data/spec/brainstem/concerns/controller_param_management_spec.rb +36 -16
- data/spec/brainstem/concerns/formattable_spec.rb +30 -0
- data/spec/brainstem/concerns/inheritable_configuration_spec.rb +104 -4
- data/spec/brainstem/concerns/optional_spec.rb +48 -0
- data/spec/brainstem/concerns/presenter_dsl_spec.rb +202 -31
- data/spec/brainstem/dsl/association_spec.rb +18 -2
- data/spec/brainstem/dsl/conditional_spec.rb +25 -2
- data/spec/brainstem/dsl/configuration_spec.rb +1 -1
- data/spec/brainstem/dsl/field_spec.rb +18 -2
- data/spec/brainstem/presenter_collection_spec.rb +10 -2
- data/spec/brainstem/presenter_spec.rb +32 -0
- data/spec/brainstem/presenter_validator_spec.rb +12 -7
- data/spec/dummy/rails.rb +49 -0
- data/spec/shared/atlas_taker.rb +18 -0
- data/spec/shared/formattable.rb +14 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/spec_helpers/db.rb +1 -1
- data/spec/spec_helpers/presenters.rb +20 -14
- metadata +106 -6
@@ -0,0 +1,346 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'brainstem/api_docs/endpoint'
|
3
|
+
|
4
|
+
module Brainstem
|
5
|
+
module ApiDocs
|
6
|
+
describe Endpoint do
|
7
|
+
let(:lorem) { "lorem ipsum dolor sit amet" }
|
8
|
+
let(:atlas) { Object.new }
|
9
|
+
let(:options) { {} }
|
10
|
+
subject { described_class.new(atlas, options) }
|
11
|
+
|
12
|
+
|
13
|
+
describe "#initialize" do
|
14
|
+
it "yields self if given a block" do
|
15
|
+
block = Proc.new { |s| s.path = "bork bork" }
|
16
|
+
expect(described_class.new(atlas, &block).path).to eq "bork bork"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
describe "#merge_http_methods!" do
|
22
|
+
let(:options) { { http_methods: %w(GET) } }
|
23
|
+
|
24
|
+
it "adds http methods that are not already present" do
|
25
|
+
|
26
|
+
expect(subject.http_methods).to eq %w(GET)
|
27
|
+
subject.merge_http_methods!(%w(POST PATCH GET))
|
28
|
+
expect(subject.http_methods).to eq %w(GET POST PATCH)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
describe "configured fields" do
|
34
|
+
let(:const) do
|
35
|
+
Class.new do
|
36
|
+
def self.brainstem_model_name
|
37
|
+
:widget
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
let(:controller) { Object.new }
|
43
|
+
let(:action) { :show }
|
44
|
+
|
45
|
+
let(:lorem) { "lorem ipsum dolor sit amet" }
|
46
|
+
let(:default_config) { {} }
|
47
|
+
let(:show_config) { {} }
|
48
|
+
let(:nodoc) { false }
|
49
|
+
|
50
|
+
let(:configuration) {
|
51
|
+
{
|
52
|
+
:_default => default_config,
|
53
|
+
:show => show_config,
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
let(:options) { { controller: controller, action: action } }
|
58
|
+
|
59
|
+
before do
|
60
|
+
stub(controller).configuration { configuration }
|
61
|
+
stub(controller).const { const }
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
describe "#nodoc?" do
|
66
|
+
let(:show_config) { { nodoc: nodoc } }
|
67
|
+
|
68
|
+
context "when nodoc" do
|
69
|
+
let(:nodoc) { true }
|
70
|
+
|
71
|
+
it "is true" do
|
72
|
+
expect(subject.nodoc?).to eq true
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context "when documentable" do
|
77
|
+
it "is false" do
|
78
|
+
expect(subject.nodoc?).to eq false
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
describe "#title" do
|
85
|
+
context "when present" do
|
86
|
+
let(:show_config) { { title: { info: lorem, nodoc: nodoc } } }
|
87
|
+
|
88
|
+
context "when nodoc" do
|
89
|
+
let(:nodoc) { true }
|
90
|
+
|
91
|
+
it "uses the action name" do
|
92
|
+
expect(subject.title).to eq "Show"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context "when documentable" do
|
97
|
+
it "formats the title as an h4" do
|
98
|
+
expect(subject.title).to eq lorem
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
context "when absent" do
|
104
|
+
it "falls back to the action name" do
|
105
|
+
expect(subject.title).to eq "Show"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
describe "#description" do
|
112
|
+
context "when present" do
|
113
|
+
let(:show_config) { { description: { info: lorem, nodoc: nodoc } } }
|
114
|
+
|
115
|
+
context "when nodoc" do
|
116
|
+
let(:nodoc) { true }
|
117
|
+
|
118
|
+
it "shows nothing" do
|
119
|
+
expect(subject.description).to be_empty
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
context "when not nodoc" do
|
124
|
+
it "shows the description" do
|
125
|
+
expect(subject.description).to eq lorem
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
context "when not present" do
|
131
|
+
it "shows nothing" do
|
132
|
+
expect(subject.description).to be_empty
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
describe "#valid_params" do
|
139
|
+
it "returns the valid_params key from action or default" do
|
140
|
+
mock(subject).key_with_default_fallback(:valid_params)
|
141
|
+
subject.valid_params
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
|
146
|
+
describe "#root_param_keys" do
|
147
|
+
let(:nested_param) { { title: { nodoc: nodoc, root: :sprocket } } }
|
148
|
+
let(:proc_nested_param) { { title: { nodoc: nodoc, root: Proc.new { |klass| klass.brainstem_model_name } } } }
|
149
|
+
let(:root_param) { { title: { nodoc: nodoc } } }
|
150
|
+
let(:default_config) { { valid_params: which_param } }
|
151
|
+
|
152
|
+
context "non-nested params" do
|
153
|
+
let(:which_param) { root_param }
|
154
|
+
|
155
|
+
context "when nodoc" do
|
156
|
+
let(:nodoc) { true }
|
157
|
+
|
158
|
+
it "rejects the key" do
|
159
|
+
expect(subject.root_param_keys).to be_empty
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
context "when not nodoc" do
|
164
|
+
it "lists it as a root param" do
|
165
|
+
expect(subject.root_param_keys).to have_key(:title)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
|
171
|
+
context "nested params" do
|
172
|
+
let(:which_param) { nested_param }
|
173
|
+
|
174
|
+
context "when nodoc" do
|
175
|
+
let(:nodoc) { true }
|
176
|
+
|
177
|
+
it "rejects the key" do
|
178
|
+
expect(subject.root_param_keys).to be_empty
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
context "when not nodoc" do
|
183
|
+
it "lists it as a nested param" do
|
184
|
+
expect(subject.root_param_keys).to eq({ sprocket: [ :title ] })
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
|
190
|
+
context "proc nested params" do
|
191
|
+
let(:which_param) { proc_nested_param }
|
192
|
+
|
193
|
+
context "when nodoc" do
|
194
|
+
let(:nodoc) { true }
|
195
|
+
|
196
|
+
it "rejects the key" do
|
197
|
+
expect(subject.root_param_keys).to be_empty
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
context "when not nodoc" do
|
202
|
+
it "evaluates the proc in the controller's context and lists it as a nested param" do
|
203
|
+
mock.proxy(const).brainstem_model_name
|
204
|
+
expect(subject.root_param_keys).to eq({ widget: [ :title ] })
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
|
211
|
+
describe "#valid_presents" do
|
212
|
+
it "returns the presents key from action or default" do
|
213
|
+
mock(subject).key_with_default_fallback(:presents)
|
214
|
+
subject.valid_presents
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
|
219
|
+
describe "#contextual_documentation" do
|
220
|
+
let(:show_config) { { title: { info: info, nodoc: nodoc } } }
|
221
|
+
let(:info) { lorem }
|
222
|
+
|
223
|
+
context "when has the key" do
|
224
|
+
let(:key) { :title }
|
225
|
+
|
226
|
+
context "when not nodoc" do
|
227
|
+
context "when has info" do
|
228
|
+
it "is truthy" do
|
229
|
+
expect(subject.contextual_documentation(key)).to be_truthy
|
230
|
+
end
|
231
|
+
|
232
|
+
it "is the info" do
|
233
|
+
expect(subject.contextual_documentation(key)).to eq lorem
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
context "when has no info" do
|
238
|
+
let(:info) { nil }
|
239
|
+
|
240
|
+
it "is falsey" do
|
241
|
+
expect(subject.contextual_documentation(key)).to be_falsey
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
context "when nodoc" do
|
247
|
+
let(:nodoc) { true }
|
248
|
+
|
249
|
+
it "is falsey" do
|
250
|
+
expect(subject.contextual_documentation(key)).to be_falsey
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
context "when doesn't have the key" do
|
256
|
+
let(:key) { :herp }
|
257
|
+
|
258
|
+
it "is falsey" do
|
259
|
+
expect(subject.contextual_documentation(key)).to be_falsey
|
260
|
+
end
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
|
265
|
+
describe "#key_with_default_fallback" do
|
266
|
+
let(:default_config) { { info: "default" } }
|
267
|
+
|
268
|
+
context "when it has the key in the action config" do
|
269
|
+
let(:show_config) { { info: "show" } }
|
270
|
+
|
271
|
+
it "returns that" do
|
272
|
+
expect(subject.key_with_default_fallback(:info)).to eq "show"
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
context "when it has the key only in the default config" do
|
277
|
+
it "returns that" do
|
278
|
+
expect(subject.key_with_default_fallback(:info)).to eq "default"
|
279
|
+
end
|
280
|
+
end
|
281
|
+
end
|
282
|
+
end
|
283
|
+
|
284
|
+
|
285
|
+
describe "#sort" do
|
286
|
+
actions = %w(index show create update delete articuno zapdos moltres)
|
287
|
+
|
288
|
+
actions.each do |axn|
|
289
|
+
let(axn.to_sym) { described_class.new(atlas, action: axn.to_sym) }
|
290
|
+
end
|
291
|
+
|
292
|
+
let(:axns) { actions.map {|axn| send(axn.to_sym) } }
|
293
|
+
|
294
|
+
it "orders appropriately" do
|
295
|
+
sorted = axns.reverse.sort
|
296
|
+
expect(sorted[0]).to eq index
|
297
|
+
expect(sorted[1]).to eq show
|
298
|
+
expect(sorted[2]).to eq create
|
299
|
+
expect(sorted[3]).to eq update
|
300
|
+
expect(sorted[4]).to eq delete
|
301
|
+
expect(sorted[5]).to eq articuno
|
302
|
+
expect(sorted[6]).to eq moltres
|
303
|
+
expect(sorted[7]).to eq zapdos
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
|
308
|
+
describe "#presenter_title" do
|
309
|
+
let(:presenter) { mock!.title.returns(lorem).subject }
|
310
|
+
let(:options) { { presenter: presenter } }
|
311
|
+
|
312
|
+
it "returns the presenter's title" do
|
313
|
+
expect(subject.presenter_title).to eq lorem
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
|
318
|
+
describe "#relative_presenter_path_from_controller" do
|
319
|
+
let(:presenter) {
|
320
|
+
mock!
|
321
|
+
.suggested_filename_link(:markdown)
|
322
|
+
.returns("objects/sprocket_widget")
|
323
|
+
.subject
|
324
|
+
}
|
325
|
+
|
326
|
+
let(:controller) {
|
327
|
+
mock!
|
328
|
+
.suggested_filename_link(:markdown)
|
329
|
+
.returns("controllers/api/v1/sprocket_widgets_controller")
|
330
|
+
.subject
|
331
|
+
}
|
332
|
+
|
333
|
+
let(:options) { { presenter: presenter, controller: controller } }
|
334
|
+
|
335
|
+
it "returns a relative path" do
|
336
|
+
expect(subject.relative_presenter_path_from_controller(:markdown)).to \
|
337
|
+
eq "../../../objects/sprocket_widget"
|
338
|
+
end
|
339
|
+
end
|
340
|
+
|
341
|
+
|
342
|
+
it_behaves_like "formattable"
|
343
|
+
it_behaves_like "atlas taker"
|
344
|
+
end
|
345
|
+
end
|
346
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'brainstem/api_docs/formatters/abstract_formatter'
|
3
|
+
|
4
|
+
module Brainstem
|
5
|
+
module ApiDocs
|
6
|
+
module Formatters
|
7
|
+
describe AbstractFormatter do
|
8
|
+
subject { AbstractFormatter.new }
|
9
|
+
|
10
|
+
describe ".call" do
|
11
|
+
it "instantiates a new instance and calls it, passing the instance all args" do
|
12
|
+
mock(described_class).new(1, 2, {}) do |instance|
|
13
|
+
mock(Object.new).call
|
14
|
+
end
|
15
|
+
|
16
|
+
described_class.call(1, 2, {})
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
describe "#call" do
|
22
|
+
it "is not implemented" do
|
23
|
+
expect { subject.call }.to raise_error NotImplementedError
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'brainstem/api_docs/formatters/markdown/controller_formatter'
|
3
|
+
require 'brainstem/api_docs/controller'
|
4
|
+
|
5
|
+
module Brainstem
|
6
|
+
module ApiDocs
|
7
|
+
module Formatters
|
8
|
+
module Markdown
|
9
|
+
describe ControllerFormatter do
|
10
|
+
let(:const) { Object.new }
|
11
|
+
let(:atlas) { Object.new }
|
12
|
+
let(:controller) { Controller.new(atlas, const: const) }
|
13
|
+
let(:configuration) { {} }
|
14
|
+
|
15
|
+
let(:endpoint_1) { Object.new }
|
16
|
+
let(:endpoints) { [ endpoint_1 ] }
|
17
|
+
let(:nodoc) { false }
|
18
|
+
let(:options) { {} }
|
19
|
+
|
20
|
+
subject { described_class.new(controller, options) }
|
21
|
+
|
22
|
+
before do
|
23
|
+
stub(const).configuration { configuration }
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#call" do
|
27
|
+
let(:configuration) { { _default: { nodoc: nodoc } } }
|
28
|
+
|
29
|
+
context "when nodoc specified" do
|
30
|
+
let(:nodoc) { true }
|
31
|
+
|
32
|
+
before do
|
33
|
+
dont_allow(subject).format_title!
|
34
|
+
dont_allow(subject).format_description!
|
35
|
+
dont_allow(subject).format_actions!
|
36
|
+
end
|
37
|
+
|
38
|
+
it "returns a blank output" do
|
39
|
+
expect(subject.call).to eq ""
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "when nodoc not specified" do
|
44
|
+
it "formats title, description, actions, and presenters" do
|
45
|
+
mock(subject).format_title!
|
46
|
+
mock(subject).format_description!
|
47
|
+
mock(subject).format_actions!
|
48
|
+
|
49
|
+
subject.call
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "formatting" do
|
55
|
+
let(:lorem) { "lorem ipsum dolor sit amet" }
|
56
|
+
let(:default_config) { {} }
|
57
|
+
let(:configuration) { { _default: default_config } }
|
58
|
+
|
59
|
+
|
60
|
+
describe "#format_title!" do
|
61
|
+
it "outputs it as an h2" do
|
62
|
+
stub(controller).title { lorem }
|
63
|
+
mock(subject).md_h2(lorem) { lorem }
|
64
|
+
subject.send(:format_title!)
|
65
|
+
expect(subject.output).to eq lorem
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "#format_description!" do
|
70
|
+
context "when present" do
|
71
|
+
before do
|
72
|
+
stub(controller).description { lorem }
|
73
|
+
end
|
74
|
+
|
75
|
+
it "prints it as a p" do
|
76
|
+
mock(subject).md_p(lorem) { lorem }
|
77
|
+
subject.send(:format_description!)
|
78
|
+
expect(subject.output).to eq lorem
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "when absent" do
|
83
|
+
before do
|
84
|
+
stub(controller).description { "" }
|
85
|
+
end
|
86
|
+
|
87
|
+
it "prints nothing" do
|
88
|
+
dont_allow(subject).md_p
|
89
|
+
subject.send(:format_description!)
|
90
|
+
expect(subject.output).to eq ""
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe "#format_actions!" do
|
97
|
+
context "if include actions" do
|
98
|
+
let(:options) { { include_actions: true } }
|
99
|
+
|
100
|
+
it "creates a subheading" do
|
101
|
+
stub(controller).valid_sorted_endpoints.stub!.formatted_as(:markdown, anything) { "" }
|
102
|
+
subject.send(:format_actions!)
|
103
|
+
expect(subject.output).to include "### Endpoints"
|
104
|
+
end
|
105
|
+
|
106
|
+
it "appends the formatted output of the endpoints" do
|
107
|
+
stub(controller).valid_sorted_endpoints.stub!.formatted_as(:markdown, anything) { "collection" }
|
108
|
+
subject.send(:format_actions!)
|
109
|
+
expect(subject.output).to include "collection"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
context "if not include actions" do
|
114
|
+
it "shows nothing" do
|
115
|
+
subject.send(:format_actions!)
|
116
|
+
expect(subject.output).to eq ""
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|