Skip to content

Commit f16c4b8

Browse files
committed
Merge pull request nanoc#772 from nanoc/helper-helper
Add API for testing helpers
2 parents 163a14b + 55a4f4c commit f16c4b8

File tree

2 files changed

+81
-161
lines changed

2 files changed

+81
-161
lines changed

spec/nanoc/helpers/blogging_spec.rb

Lines changed: 34 additions & 161 deletions
Original file line numberDiff line numberDiff line change
@@ -1,136 +1,50 @@
11
describe Nanoc::Helpers::Blogging do
2-
let(:mod) do
3-
Class.new(Nanoc::Int::Context) do
4-
include Nanoc::Helpers::Blogging
5-
end.new(assigns)
6-
end
7-
8-
let(:assigns) do
9-
{ items: [] }
10-
end
11-
12-
let(:view_context) { Nanoc::ViewContext.new(reps: reps, items: []) }
13-
14-
let(:reps) do
15-
Nanoc::Int::ItemRepRepo.new
16-
end
2+
let(:ctx) { HelperContext.new(described_class) }
3+
let(:helper) { ctx.helper }
174

185
describe '#articles' do
19-
subject { mod.articles }
20-
21-
let(:item_a) do
22-
Nanoc::Int::Item.new(
23-
'blah',
24-
{ kind: 'item' },
25-
'/0/',
26-
)
27-
end
28-
29-
let(:item_b) do
30-
Nanoc::Int::Item.new(
31-
'blah blah',
32-
{ kind: 'article' },
33-
'/1/',
34-
)
35-
end
36-
37-
let(:item_c) do
38-
Nanoc::Int::Item.new(
39-
'blah blah blah',
40-
{ kind: 'article' },
41-
'/2/',
42-
)
43-
end
44-
45-
let(:assigns) do
46-
items = Nanoc::Int::IdentifiableCollection.new({})
47-
items << item_a
48-
items << item_b
49-
items << item_c
6+
subject { helper.articles }
507

51-
{ items: Nanoc::ItemCollectionWithRepsView.new(items, view_context) }
8+
before do
9+
ctx.create_item('blah', { kind: 'item' }, '/0/')
10+
ctx.create_item('blah blah', { kind: 'article' }, '/1/')
11+
ctx.create_item('blah blah blah', { kind: 'article' }, '/2/')
5212
end
5313

5414
it 'returns the two articles' do
55-
expect(subject.size).to eql(2)
56-
expect(subject.any? { |a| a.unwrap.equal?(item_a) }).to eql(false)
57-
expect(subject.any? { |a| a.unwrap.equal?(item_b) }).to eql(true)
58-
expect(subject.any? { |a| a.unwrap.equal?(item_c) }).to eql(true)
15+
expect(subject.map(&:identifier)).to match_array(['/1/', '/2/'])
5916
end
6017
end
6118

6219
describe '#sorted_articles' do
63-
subject { mod.sorted_articles }
64-
65-
let(:item_a) do
66-
Nanoc::Int::Item.new(
67-
'blah',
68-
{ kind: 'item' },
69-
'/0/',
70-
)
71-
end
72-
73-
let(:item_b) do
74-
Nanoc::Int::Item.new(
75-
'blah blah',
76-
{ kind: 'article', created_at: (Date.today - 1).to_s },
77-
'/1/',
78-
)
79-
end
20+
subject { helper.sorted_articles }
8021

81-
let(:item_c) do
82-
Nanoc::Int::Item.new(
83-
'blah blah blah',
84-
{ kind: 'article', created_at: (Time.now - 500).to_s },
85-
'/2/',
86-
)
87-
end
22+
before do
23+
attrs = { kind: 'item' }
24+
ctx.create_item('blah', attrs, '/0/')
8825

89-
let(:assigns) do
90-
items = Nanoc::Int::IdentifiableCollection.new({})
91-
items << item_a
92-
items << item_b
93-
items << item_c
26+
attrs = { kind: 'article', created_at: (Date.today - 1).to_s }
27+
ctx.create_item('blah blah', attrs, '/1/')
9428

95-
{ items: Nanoc::ItemCollectionWithRepsView.new(items, view_context) }
29+
attrs = { kind: 'article', created_at: (Time.now - 500).to_s }
30+
ctx.create_item('blah blah blah', attrs, '/2/')
9631
end
9732

98-
it 'returns the two articles' do
99-
expect(subject.size).to eql(2)
100-
expect(subject[0].unwrap).to equal(item_c)
101-
expect(subject[1].unwrap).to equal(item_b)
33+
it 'returns the two articles in descending order' do
34+
expect(subject.map(&:identifier)).to eql(['/2/', '/1/'])
10235
end
10336
end
10437

10538
describe '#url_for' do
106-
subject { mod.url_for(item_view) }
107-
108-
let(:item) do
109-
Nanoc::Int::Item.new('Stuff', item_attributes, '/stuff/')
110-
end
39+
subject { helper.url_for(item) }
11140

112-
let(:item_view) do
113-
Nanoc::ItemWithRepsView.new(item, view_context)
114-
end
41+
let!(:item) { ctx.create_item('Stuff', item_attributes, '/stuff/') }
42+
let(:item_attributes) { {} }
11543

116-
let(:rep) do
117-
Nanoc::Int::ItemRep.new(item, :default).tap do |rep|
118-
rep.paths[:last] = '/rep/path/stuff.html'
119-
end
120-
end
121-
122-
let(:item_attributes) do
123-
{}
124-
end
125-
126-
let(:assigns) do
127-
{
128-
config: { base_url: base_url },
129-
}
130-
end
44+
let!(:rep) { ctx.create_rep(item, '/rep/path/stuff.html') }
13145

13246
before do
133-
reps << rep
47+
ctx.config[:base_url] = base_url
13448
end
13549

13650
context 'without base_url' do
@@ -175,35 +89,15 @@
17589
end
17690

17791
describe '#feed_url' do
178-
subject { mod.feed_url }
179-
180-
let(:item) do
181-
Nanoc::Int::Item.new('Feed', item_attributes, '/feed/')
182-
end
92+
subject { helper.feed_url }
18393

184-
let(:rep) do
185-
Nanoc::Int::ItemRep.new(item, :default).tap do |rep|
186-
rep.paths[:last] = '/feed.xml'
187-
end
188-
end
189-
190-
let(:item_view) do
191-
Nanoc::ItemWithRepsView.new(item, view_context)
192-
end
94+
let!(:item) { ctx.create_item('Feed', item_attributes, '/feed/', main: true) }
95+
let(:item_attributes) { {} }
19396

194-
let(:item_attributes) do
195-
{}
196-
end
197-
198-
let(:assigns) do
199-
{
200-
config: { base_url: base_url },
201-
item: item_view,
202-
}
203-
end
97+
let!(:rep) { ctx.create_rep(item, '/feed.xml') }
20498

20599
before do
206-
reps << rep
100+
ctx.config[:base_url] = base_url
207101
end
208102

209103
context 'without base_url' do
@@ -236,7 +130,7 @@
236130
end
237131

238132
describe '#attribute_to_time' do
239-
subject { mod.attribute_to_time(arg) }
133+
subject { helper.attribute_to_time(arg) }
240134

241135
let(:around_noon_local) { Time.at(1_446_903_076 - Time.now.utc_offset) }
242136
let(:around_noon_utc) { Time.at(1_446_903_076) }
@@ -264,39 +158,18 @@
264158
end
265159

266160
describe '#atom_tag_for' do
267-
subject { mod.atom_tag_for(item_view) }
268-
269-
let(:item) do
270-
Nanoc::Int::Item.new('Stuff', item_attributes, '/stuff/')
271-
end
161+
subject { helper.atom_tag_for(item) }
272162

273-
let(:rep) do
274-
Nanoc::Int::ItemRep.new(item, :default).tap do |rep|
275-
rep.paths[:last] = item_rep_path
276-
end
277-
end
163+
let!(:item) { ctx.create_item('Stuff', item_attributes, '/stuff/') }
164+
let(:item_attributes) { { created_at: '2015-05-19 12:34:56' } }
278165

166+
let!(:rep) { ctx.create_rep(item, item_rep_path) }
279167
let(:item_rep_path) { '/stuff.xml' }
280168

281-
let(:item_view) do
282-
Nanoc::ItemWithRepsView.new(item, view_context)
283-
end
284-
285-
let(:item_attributes) do
286-
{ created_at: '2015-05-19 12:34:56' }
287-
end
288-
289-
let(:assigns) do
290-
{
291-
config: { base_url: base_url },
292-
item: item_view,
293-
}
294-
end
295-
296169
let(:base_url) { 'http://url.base' }
297170

298171
before do
299-
reps << rep
172+
ctx.config[:base_url] = base_url
300173
end
301174

302175
context 'item with path' do

spec/spec_helper.rb

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,53 @@ def self.setup_cleaning_streams
1212

1313
Nanoc::CLI.setup
1414

15+
class HelperContext
16+
def initialize(mod)
17+
@config = Nanoc::Int::Configuration.new
18+
@reps = Nanoc::Int::ItemRepRepo.new
19+
@items = Nanoc::Int::IdentifiableCollection.new(@config)
20+
@mod = mod
21+
end
22+
23+
def create_item(content, attributes, identifier, main: false)
24+
item = Nanoc::Int::Item.new(content, attributes, identifier)
25+
@items << item
26+
@item = item if main
27+
Nanoc::ItemWithRepsView.new(item, view_context)
28+
end
29+
30+
def create_rep(item, path)
31+
rep = Nanoc::Int::ItemRep.new(item.unwrap, :default)
32+
rep.paths[:last] = path
33+
@reps << rep
34+
Nanoc::ItemRepView.new(rep, view_context)
35+
end
36+
37+
def helper
38+
mod = @mod
39+
klass = Class.new(Nanoc::Int::Context) { include mod }
40+
klass.new(assigns)
41+
end
42+
43+
def config
44+
assigns[:config]
45+
end
46+
47+
private
48+
49+
def view_context
50+
Nanoc::ViewContext.new(reps: @reps, items: @items)
51+
end
52+
53+
def assigns
54+
{
55+
config: Nanoc::MutableConfigView.new(@config, view_context),
56+
item: @item ? Nanoc::ItemWithRepsView.new(@item, view_context) : nil,
57+
items: Nanoc::ItemCollectionWithRepsView.new(@items, view_context)
58+
}
59+
end
60+
end
61+
1562
RSpec.configure do |c|
1663
c.around(:each) do |example|
1764
Nanoc::CLI::ErrorHandler.disable

0 commit comments

Comments
 (0)