nanoc3 3.1.7 → 3.1.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. data/.gemtest +0 -0
  2. data/LICENSE +1 -1
  3. data/NEWS.md +9 -0
  4. data/doc/yardoc_templates/default/layout/html/footer.erb +10 -0
  5. data/lib/nanoc3/base/item.rb +1 -1
  6. data/lib/nanoc3/base/item_rep.rb +1 -0
  7. data/lib/nanoc3/base/layout.rb +1 -1
  8. data/lib/nanoc3/cli/base.rb +4 -2
  9. data/lib/nanoc3/cli/commands/view.rb +1 -0
  10. data/lib/nanoc3/data_sources/filesystem.rb +25 -6
  11. data/lib/nanoc3/data_sources/filesystem_unified.rb +5 -5
  12. data/lib/nanoc3/extra/validators/links.rb +1 -1
  13. data/lib/nanoc3/filters/rdiscount.rb +2 -1
  14. data/lib/nanoc3/filters/sass.rb +20 -8
  15. data/lib/nanoc3/filters/sass.rb.orig +75 -0
  16. data/lib/nanoc3.rb +1 -1
  17. data/nanoc3.gemspec +41 -0
  18. data/tasks/clean.rake +11 -0
  19. data/tasks/doc.rake +14 -0
  20. data/tasks/gem.rake +13 -0
  21. data/tasks/test.rake +38 -0
  22. data/test/base/core_ext/array_spec.rb +23 -0
  23. data/test/base/core_ext/hash_spec.rb +41 -0
  24. data/test/base/core_ext/string_spec.rb +27 -0
  25. data/test/base/test_code_snippet.rb +33 -0
  26. data/test/base/test_compiler.rb +410 -0
  27. data/test/base/test_compiler_dsl.rb +121 -0
  28. data/test/base/test_context.rb +33 -0
  29. data/test/base/test_data_source.rb +48 -0
  30. data/test/base/test_dependency_tracker.rb +510 -0
  31. data/test/base/test_directed_graph.rb +91 -0
  32. data/test/base/test_filter.rb +85 -0
  33. data/test/base/test_item.rb +141 -0
  34. data/test/base/test_item_rep.rb +953 -0
  35. data/test/base/test_layout.rb +44 -0
  36. data/test/base/test_notification_center.rb +36 -0
  37. data/test/base/test_plugin.rb +32 -0
  38. data/test/base/test_rule.rb +21 -0
  39. data/test/base/test_rule_context.rb +63 -0
  40. data/test/base/test_site.rb +366 -0
  41. data/test/cli/commands/test_compile.rb +12 -0
  42. data/test/cli/commands/test_create_item.rb +12 -0
  43. data/test/cli/commands/test_create_layout.rb +28 -0
  44. data/test/cli/commands/test_create_site.rb +24 -0
  45. data/test/cli/commands/test_help.rb +12 -0
  46. data/test/cli/commands/test_info.rb +12 -0
  47. data/test/cli/commands/test_update.rb +12 -0
  48. data/test/cli/test_logger.rb +12 -0
  49. data/test/data_sources/test_filesystem.rb +420 -0
  50. data/test/data_sources/test_filesystem_unified.rb +538 -0
  51. data/test/data_sources/test_filesystem_verbose.rb +359 -0
  52. data/test/extra/core_ext/test_enumerable.rb +32 -0
  53. data/test/extra/core_ext/test_time.rb +17 -0
  54. data/test/extra/deployers/test_rsync.rb +234 -0
  55. data/test/extra/test_auto_compiler.rb +482 -0
  56. data/test/extra/test_file_proxy.rb +21 -0
  57. data/test/extra/test_vcs.rb +24 -0
  58. data/test/extra/validators/test_links.rb +53 -0
  59. data/test/extra/validators/test_w3c.rb +49 -0
  60. data/test/filters/test_bluecloth.rb +20 -0
  61. data/test/filters/test_coderay.rb +46 -0
  62. data/test/filters/test_colorize_syntax.rb +56 -0
  63. data/test/filters/test_erb.rb +72 -0
  64. data/test/filters/test_erubis.rb +72 -0
  65. data/test/filters/test_haml.rb +98 -0
  66. data/test/filters/test_kramdown.rb +20 -0
  67. data/test/filters/test_less.rb +59 -0
  68. data/test/filters/test_markaby.rb +26 -0
  69. data/test/filters/test_maruku.rb +20 -0
  70. data/test/filters/test_rainpress.rb +31 -0
  71. data/test/filters/test_rdiscount.rb +33 -0
  72. data/test/filters/test_rdoc.rb +18 -0
  73. data/test/filters/test_redcloth.rb +20 -0
  74. data/test/filters/test_relativize_paths.rb +231 -0
  75. data/test/filters/test_rubypants.rb +20 -0
  76. data/test/filters/test_sass.rb +170 -0
  77. data/test/filters/test_sass.rb.orig +103 -0
  78. data/test/gem_loader.rb +11 -0
  79. data/test/helper.rb +99 -0
  80. data/test/helpers/test_blogging.rb +808 -0
  81. data/test/helpers/test_breadcrumbs.rb +83 -0
  82. data/test/helpers/test_capturing.rb +42 -0
  83. data/test/helpers/test_filtering.rb +108 -0
  84. data/test/helpers/test_html_escape.rb +18 -0
  85. data/test/helpers/test_link_to.rb +251 -0
  86. data/test/helpers/test_rendering.rb +109 -0
  87. data/test/helpers/test_tagging.rb +89 -0
  88. data/test/helpers/test_text.rb +26 -0
  89. data/test/helpers/test_xml_sitemap.rb +69 -0
  90. data/test/tasks/test_clean.rb +71 -0
  91. metadata +83 -8
@@ -0,0 +1,808 @@
1
+ # encoding: utf-8
2
+
3
+ require 'test/helper'
4
+
5
+ class Nanoc3::Helpers::BloggingTest < MiniTest::Unit::TestCase
6
+
7
+ include Nanoc3::TestHelpers
8
+
9
+ include Nanoc3::Helpers::Blogging
10
+ include Nanoc3::Helpers::Text
11
+
12
+ def test_articles
13
+ # Create items
14
+ @items = [
15
+ Nanoc3::Item.new(
16
+ 'blah',
17
+ { :kind => 'item' },
18
+ '/0/'
19
+ ),
20
+ Nanoc3::Item.new(
21
+ 'blah blah',
22
+ { :kind => 'article' },
23
+ '/1/'
24
+ ),
25
+ Nanoc3::Item.new(
26
+ 'blah blah blah',
27
+ { :kind => 'article' },
28
+ '/2/'
29
+ )
30
+ ]
31
+
32
+ # Check
33
+ assert_equal(2, articles.size)
34
+ assert articles.include?(@items[1])
35
+ assert articles.include?(@items[2])
36
+ ensure
37
+ # Cleanup
38
+ @items = nil
39
+ end
40
+
41
+ def test_sorted_articles
42
+ # Create items
43
+ @items = [
44
+ Nanoc3::Item.new(
45
+ 'blah',
46
+ { :kind => 'item' },
47
+ '/0/'
48
+ ),
49
+ Nanoc3::Item.new(
50
+ 'blah',
51
+ { :kind => 'article', :created_at => (Date.today - 1).to_s },
52
+ '/1/'
53
+ ),
54
+ Nanoc3::Item.new(
55
+ 'blah',
56
+ { :kind => 'article', :created_at => (Time.now - 500).to_s },
57
+ '/2/'
58
+ )
59
+ ]
60
+
61
+ # Check
62
+ assert_equal(2, sorted_articles.size)
63
+ assert_equal(@items[2], sorted_articles[0])
64
+ assert_equal(@items[1], sorted_articles[1])
65
+ ensure
66
+ # Cleanup
67
+ @items = nil
68
+ end
69
+
70
+ def test_atom_feed
71
+ if_have 'builder' do
72
+ # Create items
73
+ @items = [ mock, mock, mock ]
74
+
75
+ # Create item 0
76
+ @items[0].stubs(:[]).with(:kind).returns('item')
77
+
78
+ # Create item 1
79
+ @items[1].stubs(:[]).with(:updated_at).returns(Date.today - 1)
80
+ @items[1].stubs(:[]).with(:kind).returns('article')
81
+ @items[1].stubs(:[]).with(:created_at).returns((Date.today - 2).to_s)
82
+ @items[1].stubs(:[]).with(:title).returns('Item One')
83
+ @items[1].stubs(:[]).with(:custom_path_in_feed).returns(nil)
84
+ @items[1].stubs(:[]).with(:custom_url_in_feed).returns(nil)
85
+ @items[1].stubs(:[]).with(:excerpt).returns(nil)
86
+ @items[1].stubs(:path).returns("/item1/")
87
+ @items[1].expects(:compiled_content).with(:snapshot => :pre).returns('item 1 content')
88
+
89
+ # Create item 2
90
+ @items[2].stubs(:[]).with(:updated_at).returns(Time.now - 250)
91
+ @items[2].stubs(:[]).with(:kind).returns('article')
92
+ @items[2].stubs(:[]).with(:created_at).returns((Time.now - 750).to_s)
93
+ @items[2].stubs(:[]).with(:title).returns('Item Two')
94
+ @items[2].stubs(:[]).with(:custom_path_in_feed).returns('/item2custom/')
95
+ @items[2].stubs(:[]).with(:custom_url_in_feed).returns(nil)
96
+ @items[2].stubs(:[]).with(:excerpt).returns('item 2 excerpt')
97
+ @items[2].stubs(:path).returns("/item2/")
98
+ @items[2].expects(:compiled_content).with(:snapshot => :pre).returns('item 2 content')
99
+
100
+ # Mock site
101
+ @site = mock
102
+ @site.stubs(:config).returns({ :base_url => 'http://example.com' })
103
+
104
+ # Create feed item
105
+ @item = mock
106
+ @item.stubs(:[]).with(:title).returns('My Cool Blog')
107
+ @item.stubs(:[]).with(:author_name).returns('Denis Defreyne')
108
+ @item.stubs(:[]).with(:author_uri).returns('http://stoneship.org/')
109
+ @item.stubs(:[]).with(:feed_url).returns(nil)
110
+ @item.stubs(:path).returns("/journal/feed/")
111
+
112
+ # Check
113
+ atom_feed
114
+ end
115
+ end
116
+
117
+ def test_atom_feed_with_times
118
+ if_have 'builder' do
119
+ # Create items
120
+ @items = [ mock, mock, mock ]
121
+
122
+ # Create item 0
123
+ @items[0].stubs(:[]).with(:kind).returns('item')
124
+
125
+ # Create item 1
126
+ @items[1].stubs(:[]).with(:updated_at).returns(Time.now - 500)
127
+ @items[1].stubs(:[]).with(:kind).returns('article')
128
+ @items[1].stubs(:[]).with(:created_at).returns(Time.now - 1000)
129
+ @items[1].stubs(:[]).with(:title).returns('Item One')
130
+ @items[1].stubs(:[]).with(:custom_path_in_feed).returns(nil)
131
+ @items[1].stubs(:[]).with(:custom_url_in_feed).returns(nil)
132
+ @items[1].stubs(:[]).with(:excerpt).returns(nil)
133
+ @items[1].stubs(:path).returns("/item1/")
134
+ @items[1].expects(:compiled_content).returns('item 1 content')
135
+
136
+ # Create item 2
137
+ @items[2].stubs(:[]).with(:updated_at).returns(Time.now - 250)
138
+ @items[2].stubs(:[]).with(:kind).returns('article')
139
+ @items[2].stubs(:[]).with(:created_at).returns(Time.now - 1200)
140
+ @items[2].stubs(:[]).with(:title).returns('Item Two')
141
+ @items[2].stubs(:[]).with(:custom_path_in_feed).returns('/item2custom/')
142
+ @items[2].stubs(:[]).with(:custom_url_in_feed).returns(nil)
143
+ @items[2].stubs(:[]).with(:excerpt).returns('item 2 excerpt')
144
+ @items[2].stubs(:path).returns("/item2/")
145
+ @items[2].expects(:compiled_content).returns('item 2 content')
146
+
147
+ # Mock site
148
+ @site = mock
149
+ @site.stubs(:config).returns({ :base_url => 'http://example.com' })
150
+
151
+ # Create feed item
152
+ @item = mock
153
+ @item.stubs(:[]).with(:title).returns('My Cool Blog')
154
+ @item.stubs(:[]).with(:author_name).returns('Denis Defreyne')
155
+ @item.stubs(:[]).with(:author_uri).returns('http://stoneship.org/')
156
+ @item.stubs(:[]).with(:feed_url).returns(nil)
157
+ @item.stubs(:path).returns("/journal/feed/")
158
+
159
+ # Check
160
+ atom_feed
161
+ end
162
+ end
163
+
164
+ def test_atom_feed_without_articles
165
+ if_have 'builder' do
166
+ # Mock items
167
+ @items = [ mock, mock, mock ]
168
+ @items[0].stubs(:[]).with(:kind).returns('item')
169
+ @items[1].stubs(:[]).with(:kind).returns('item')
170
+ @items[2].stubs(:[]).with(:kind).returns('item')
171
+
172
+ # Mock site
173
+ @site = mock
174
+ @site.stubs(:config).returns({ :base_url => 'http://example.com' })
175
+
176
+ # Create feed item
177
+ @item = mock
178
+ @item.stubs(:[]).with(:title).returns('My Blog Or Something')
179
+ @item.stubs(:[]).with(:author_name).returns('J. Doe')
180
+ @item.stubs(:[]).with(:author_uri).returns('http://example.com/~jdoe')
181
+
182
+ # Check
183
+ error = assert_raises(RuntimeError) do
184
+ atom_feed
185
+ end
186
+ assert_equal(
187
+ 'Cannot build Atom feed: no articles',
188
+ error.message
189
+ )
190
+ end
191
+ end
192
+
193
+ def test_atom_feed_without_base_url
194
+ if_have 'builder' do
195
+ # Create items
196
+ @items = [ mock, mock ]
197
+ @items[0].stubs(:[]).with(:kind).returns('item')
198
+ @items[1].stubs(:[]).with(:kind).returns('article')
199
+
200
+ # Mock site
201
+ @site = mock
202
+ @site.stubs(:config).returns({:base_url => nil})
203
+
204
+ # Create feed item
205
+ @item = mock
206
+ @item.stubs(:[]).with(:title).returns('My Blog Or Something')
207
+ @item.stubs(:[]).with(:author_name).returns('J. Doe')
208
+ @item.stubs(:[]).with(:author_uri).returns('http://example.com/~jdoe')
209
+
210
+ # Check
211
+ error = assert_raises(RuntimeError) do
212
+ atom_feed
213
+ end
214
+ assert_equal(
215
+ 'Cannot build Atom feed: site configuration has no base_url',
216
+ error.message
217
+ )
218
+ end
219
+ end
220
+
221
+ def test_atom_feed_without_title
222
+ if_have 'builder' do
223
+ # Create items
224
+ @items = [ mock, mock ]
225
+ @items[0].stubs(:[]).with(:kind).returns('item')
226
+ @items[1].stubs(:[]).with(:kind).returns('article')
227
+
228
+ # Mock site
229
+ @site = mock
230
+ @site.stubs(:config).returns({ :base_url => 'http://example.com' })
231
+
232
+ # Create feed item
233
+ @item = mock
234
+ @item.stubs(:[]).with(:title).returns(nil)
235
+ @item.stubs(:[]).with(:author_name).returns('J. Doe')
236
+ @item.stubs(:[]).with(:author_uri).returns('http://example.com/~jdoe')
237
+
238
+ # Check
239
+ error = assert_raises(RuntimeError) do
240
+ atom_feed
241
+ end
242
+ assert_equal(
243
+ 'Cannot build Atom feed: no title in params, item or site config',
244
+ error.message
245
+ )
246
+ end
247
+ end
248
+
249
+ def test_atom_feed_without_author_name
250
+ if_have 'builder' do
251
+ # Create items
252
+ @items = [ mock, mock ]
253
+ @items[0].stubs(:[]).with(:kind).returns('item')
254
+ @items[1].stubs(:[]).with(:kind).returns('article')
255
+
256
+ # Mock site
257
+ @site = mock
258
+ @site.stubs(:config).returns({ :base_url => 'http://example.com' })
259
+
260
+ # Create feed item
261
+ @item = mock
262
+ @item.stubs(:[]).with(:title).returns('My Blog Or Something')
263
+ @item.stubs(:[]).with(:author_name).returns(nil)
264
+ @item.stubs(:[]).with(:author_uri).returns('http://example.com/~jdoe')
265
+
266
+ # Check
267
+ error = assert_raises(RuntimeError) do
268
+ atom_feed
269
+ end
270
+ assert_equal(
271
+ 'Cannot build Atom feed: no author_name in params, item or site config',
272
+ error.message
273
+ )
274
+ end
275
+ end
276
+
277
+ def test_atom_feed_without_author_uri
278
+ if_have 'builder' do
279
+ # Create items
280
+ @items = [ mock, mock ]
281
+ @items[0].stubs(:[]).with(:kind).returns('item')
282
+ @items[1].stubs(:[]).with(:kind).returns('article')
283
+
284
+ # Mock site
285
+ @site = mock
286
+ @site.stubs(:config).returns({ :base_url => 'http://example.com' })
287
+
288
+ # Create feed item
289
+ @item = mock
290
+ @item.stubs(:[]).with(:title).returns('My Blog Or Something')
291
+ @item.stubs(:[]).with(:author_name).returns('J. Doe')
292
+ @item.stubs(:[]).with(:author_uri).returns(nil)
293
+
294
+ # Check
295
+ error = assert_raises(RuntimeError) do
296
+ atom_feed
297
+ end
298
+ assert_equal(
299
+ 'Cannot build Atom feed: no author_uri in params, item or site config',
300
+ error.message
301
+ )
302
+ end
303
+ end
304
+
305
+ def test_atom_feed_without_articles_created_at
306
+ if_have 'builder' do
307
+ # Create items
308
+ @items = [ mock, mock, mock, mock, mock ]
309
+ @items[0].stubs(:[]).with(:kind).returns('item')
310
+ @items[1].stubs(:[]).with(:kind).returns('article')
311
+ @items[1].stubs(:[]).with(:created_at).returns(Time.now.to_s)
312
+ @items[2].stubs(:[]).with(:kind).returns('article')
313
+ @items[2].stubs(:[]).with(:created_at).returns(Time.now.to_s)
314
+ @items[3].stubs(:[]).with(:kind).returns('article')
315
+ @items[3].stubs(:[]).with(:created_at).returns(Time.now.to_s)
316
+ @items[4].stubs(:[]).with(:kind).returns('article')
317
+ @items[4].stubs(:[]).with(:created_at).returns(nil)
318
+
319
+ # Mock site
320
+ @site = mock
321
+ @site.stubs(:config).returns({ :base_url => 'http://example.com' })
322
+
323
+ # Create feed item
324
+ @item = mock
325
+ @item.stubs(:[]).with(:title).returns('My Blog Or Something')
326
+ @item.stubs(:[]).with(:author_name).returns('J. Doe')
327
+ @item.stubs(:[]).with(:author_uri).returns('http://example.com/~jdoe')
328
+
329
+ # Check
330
+ error = assert_raises(RuntimeError) do
331
+ atom_feed
332
+ end
333
+ assert_equal(
334
+ 'Cannot build Atom feed: one or more articles lack created_at',
335
+ error.message
336
+ )
337
+ end
338
+ end
339
+
340
+ def test_atom_feed_with_title_author_name_and_uri_as_params
341
+ if_have 'builder' do
342
+ # Create items
343
+ @items = [ mock, mock ]
344
+ @items[0].stubs(:[]).with(:kind).returns('item')
345
+ @items[1].stubs(:[]).with(:kind).returns('article')
346
+ @items[1].stubs(:[]).with(:updated_at).returns(Time.now - 500)
347
+ @items[1].stubs(:raw_content).returns('item 1 content')
348
+ @items[1].stubs(:[]).with(:created_at).returns((Time.now - 1000).to_s)
349
+ @items[1].stubs(:[]).with(:title).returns('Item One')
350
+ @items[1].stubs(:[]).with(:custom_path_in_feed).returns(nil)
351
+ @items[1].stubs(:[]).with(:custom_url_in_feed).returns(nil)
352
+ @items[1].stubs(:[]).with(:path).returns('/item1/')
353
+ @items[1].stubs(:[]).with(:excerpt).returns(nil)
354
+ @items[1].stubs(:path).returns('/asdf/fdsa/')
355
+ @items[1].stubs(:raw_path).returns('output/asdf/fdsa/index.html')
356
+ @items[1].expects(:compiled_content).with(:snapshot => :pre).returns('asdf')
357
+
358
+ # Mock site
359
+ @site = mock
360
+ @site.stubs(:config).returns({ :base_url => 'http://example.com' })
361
+
362
+ # Create feed item
363
+ @item = mock
364
+ @item.stubs(:[]).with(:title).returns(nil)
365
+ @item.stubs(:[]).with(:author_name).returns(nil)
366
+ @item.stubs(:[]).with(:author_uri).returns(nil)
367
+ @item.stubs(:[]).with(:[]).with(:feed_url).returns('http://example.com/feed')
368
+
369
+ # Check
370
+ atom_feed(
371
+ :author_name => 'Bob',
372
+ :author_uri => 'http://example.com/~bob/',
373
+ :title => 'My Blog Or Something'
374
+ )
375
+ end
376
+ end
377
+
378
+ def test_atom_feed_with_title_author_name_and_uri_from_config
379
+ if_have 'builder' do
380
+ # Create items
381
+ @items = [ mock, mock ]
382
+ @items[0].stubs(:[]).with(:kind).returns('item')
383
+ @items[1].stubs(:[]).with(:kind).returns('article')
384
+ @items[1].stubs(:[]).with(:updated_at).returns(Time.now - 500)
385
+ @items[1].stubs(:raw_content).returns('item 1 content')
386
+ @items[1].stubs(:[]).with(:created_at).returns((Time.now - 1000).to_s)
387
+ @items[1].stubs(:[]).with(:title).returns('Item One')
388
+ @items[1].stubs(:[]).with(:custom_path_in_feed).returns(nil)
389
+ @items[1].stubs(:[]).with(:custom_url_in_feed).returns(nil)
390
+ @items[1].stubs(:[]).with(:path).returns('/item1/')
391
+ @items[1].stubs(:[]).with(:excerpt).returns(nil)
392
+ @items[1].stubs(:path).returns('/asdf/fdsa/')
393
+ @items[1].stubs(:raw_path).returns('output/asdf/fdsa/index.html')
394
+ @items[1].expects(:compiled_content).with(:snapshot => :pre).returns('asdf')
395
+
396
+ # Mock site
397
+ @config = {
398
+ :author_name => 'Bob',
399
+ :author_uri => 'http://example.com/~bob/',
400
+ :title => 'My Blog Or Something',
401
+ :base_url => 'http://example.com'
402
+ }
403
+ @site = mock
404
+ @site.stubs(:config).returns(@config)
405
+
406
+ # Create feed item
407
+ @item = mock
408
+ @item.stubs(:[]).with(:title).returns(nil)
409
+ @item.stubs(:[]).with(:author_name).returns(nil)
410
+ @item.stubs(:[]).with(:author_uri).returns(nil)
411
+ @item.stubs(:[]).with(:[]).with(:feed_url).returns('http://example.com/feed')
412
+
413
+ # Check
414
+ atom_feed
415
+ end
416
+ end
417
+
418
+ def test_atom_feed_with_articles_param
419
+ if_have 'builder' do
420
+ # Mock items
421
+ @items = [ mock, mock, mock, mock, mock ]
422
+ @items[0].stubs(:[]).with(:kind).returns('article')
423
+ @items[1].stubs(:[]).with(:kind).returns('article')
424
+ @items[2].stubs(:[]).with(:kind).returns('article')
425
+ @items[3].stubs(:[]).with(:kind).returns('article')
426
+ @items[4].stubs(:[]).with(:kind).returns('article')
427
+
428
+ # Mock one article
429
+ @items[4].stubs(:[]).with(:updated_at).returns(Time.now - 500)
430
+ @items[4].stubs(:raw_content).returns('item 1 content')
431
+ @items[4].stubs(:[]).with(:created_at).returns((Time.now - 1000).to_s)
432
+ @items[4].stubs(:[]).with(:title).returns('Item One')
433
+ @items[4].stubs(:[]).with(:custom_path_in_feed).returns(nil)
434
+ @items[4].stubs(:[]).with(:custom_url_in_feed).returns(nil)
435
+ @items[4].stubs(:[]).with(:path).returns('/item1/')
436
+ @items[4].stubs(:[]).with(:excerpt).returns(nil)
437
+ @items[4].stubs(:path).returns('/asdf/fdsa/')
438
+ @items[4].stubs(:raw_path).returns('output/asdf/fdsa/index.html')
439
+ @items[4].expects(:compiled_content).with(:snapshot => :pre).returns('asdf')
440
+
441
+ # Mock site
442
+ @site = mock
443
+ @site.stubs(:config).returns({ :base_url => 'http://example.com' })
444
+
445
+ # Create feed item
446
+ @item = mock
447
+ @item.stubs(:[]).with(:title).returns('My Blog Or Something')
448
+ @item.stubs(:[]).with(:author_name).returns('J. Doe')
449
+ @item.stubs(:[]).with(:author_uri).returns('http://example.com/~jdoe')
450
+ @item.stubs(:[]).with(:[]).with(:feed_url).returns('http://example.com/feed')
451
+
452
+ # Check
453
+ atom_feed :articles => [ @items[4] ]
454
+ end
455
+ end
456
+
457
+ def test_atom_feed_with_limit_param
458
+ if_have 'builder' do
459
+ # Mock articles
460
+ @items = [ mock, mock, mock, mock, mock ]
461
+ @items.each_with_index do |article, i|
462
+ article.stubs(:[]).with(:updated_at).returns(Time.now - 500)
463
+ article.stubs(:[]).with(:kind).returns('article')
464
+ article.stubs(:[]).with(:created_at).returns((Time.now - 1000*i).to_s)
465
+ article.stubs(:[]).with(:title).returns("Article #{i}")
466
+ article.stubs(:[]).with(:custom_path_in_feed).returns(nil)
467
+ article.stubs(:[]).with(:custom_url_in_feed).returns(nil)
468
+ article.stubs(:[]).with(:path).returns("/articles/#{i}/")
469
+ article.stubs(:[]).with(:excerpt).returns(nil)
470
+ article.stubs(:path).returns("/articles/#{i}/")
471
+ article.stubs(:raw_path).returns("output/articles/#{i}/index.html")
472
+ article.stubs(:compiled_content).with(:snapshot => :pre).returns("item #{i} content")
473
+ end
474
+
475
+ # Mock site
476
+ @site = mock
477
+ @site.stubs(:config).returns({ :base_url => 'http://example.com' })
478
+
479
+ # Create feed item
480
+ @item = mock
481
+ @item.stubs(:[]).with(:title).returns('My Blog Or Something')
482
+ @item.stubs(:[]).with(:author_name).returns('J. Doe')
483
+ @item.stubs(:[]).with(:author_uri).returns('http://example.com/~jdoe')
484
+ @item.stubs(:[]).with(:feed_url).returns('http://example.com/feed')
485
+
486
+ # Check
487
+ result = atom_feed :limit => 3, :articles => @items
488
+ assert_match(
489
+ Regexp.new('Article 0.*Article 1.*Article 2', Regexp::MULTILINE),
490
+ result
491
+ )
492
+ end
493
+ end
494
+
495
+ def test_atom_feed_sorting
496
+ if_have 'builder' do
497
+ # Mock articles
498
+ @items = [ mock, mock, mock, mock ]
499
+ @items.each_with_index do |article, i|
500
+ article.stubs(:[]).with(:updated_at).returns(Time.now - 500)
501
+ article.stubs(:[]).with(:kind).returns('article')
502
+ article.stubs(:[]).with(:title).returns("Article #{i}")
503
+ article.stubs(:[]).with(:custom_path_in_feed).returns(nil)
504
+ article.stubs(:[]).with(:custom_url_in_feed).returns(nil)
505
+ article.stubs(:[]).with(:path).returns("/articles/#{i}/")
506
+ article.stubs(:[]).with(:excerpt).returns(nil)
507
+ article.stubs(:path).returns("/articles/#{i}/")
508
+ article.stubs(:raw_path).returns("output/articles/#{i}/index.html")
509
+ article.stubs(:compiled_content).with(:snapshot => :pre).returns("Article #{i} content")
510
+ end
511
+ @items[0].stubs(:[]).with(:created_at).returns('23-02-2009')
512
+ @items[1].stubs(:[]).with(:created_at).returns('22-03-2009')
513
+ @items[2].stubs(:[]).with(:created_at).returns('21-04-2009')
514
+ @items[3].stubs(:[]).with(:created_at).returns('20-05-2009')
515
+
516
+ # Mock site
517
+ @site = mock
518
+ @site.stubs(:config).returns({ :base_url => 'http://example.com' })
519
+
520
+ # Create feed item
521
+ @item = mock
522
+ @item.stubs(:[]).with(:title).returns('My Blog Or Something')
523
+ @item.stubs(:[]).with(:author_name).returns('J. Doe')
524
+ @item.stubs(:[]).with(:author_uri).returns('http://example.com/~jdoe')
525
+ @item.stubs(:[]).with(:feed_url).returns('http://example.com/feed')
526
+
527
+ # Check
528
+ result = atom_feed
529
+ assert_match(
530
+ Regexp.new('Article 3.*Article 2.*Article 1.*Article 0', Regexp::MULTILINE),
531
+ result
532
+ )
533
+ end
534
+ end
535
+
536
+ def test_atom_feed_with_content_proc_param
537
+ if_have 'builder' do
538
+ # Mock article
539
+ @items = [ mock ]
540
+ @items[0].stubs(:[]).with(:updated_at).returns(Time.now - 500)
541
+ @items[0].stubs(:[]).with(:kind).returns('article')
542
+ @items[0].stubs(:[]).with(:created_at).returns((Time.now - 1000).to_s)
543
+ @items[0].stubs(:[]).with(:title).returns('Item One')
544
+ @items[0].stubs(:[]).with(:custom_path_in_feed).returns(nil)
545
+ @items[0].stubs(:[]).with(:custom_url_in_feed).returns(nil)
546
+ @items[0].stubs(:[]).with(:excerpt).returns(nil)
547
+ @items[0].stubs(:path).returns('/item1/')
548
+ @items[0].stubs(:raw_path).returns('output/item1/index.html')
549
+
550
+ # Mock site
551
+ @site = mock
552
+ @site.stubs(:config).returns({ :base_url => 'http://example.com' })
553
+
554
+ # Create feed item
555
+ @item = mock
556
+ @item.stubs(:[]).with(:title).returns('My Blog Or Something')
557
+ @item.stubs(:[]).with(:author_name).returns('J. Doe')
558
+ @item.stubs(:[]).with(:author_uri).returns('http://example.com/~jdoe')
559
+ @item.stubs(:[]).with(:feed_url).returns('http://example.com/feed')
560
+
561
+ # Check
562
+ result = atom_feed :content_proc => lambda { |a| 'foobar!' }
563
+ assert_match 'foobar!</content>', result
564
+ end
565
+ end
566
+
567
+ def test_atom_feed_with_excerpt_proc_param
568
+ if_have 'builder' do
569
+ # Mock article
570
+ @items = [ mock ]
571
+ @items[0].stubs(:[]).with(:updated_at).returns(Time.now - 500)
572
+ @items[0].stubs(:[]).with(:kind).returns('article')
573
+ @items[0].stubs(:[]).with(:created_at).returns((Time.now - 1000).to_s)
574
+ @items[0].stubs(:[]).with(:title).returns('Item One')
575
+ @items[0].stubs(:[]).with(:custom_path_in_feed).returns(nil)
576
+ @items[0].stubs(:[]).with(:custom_url_in_feed).returns(nil)
577
+ @items[0].stubs(:raw_content).returns('some content')
578
+ @items[0].stubs(:path).returns('/item1/')
579
+ @items[0].stubs(:raw_path).returns('output/item1/index.html')
580
+ @items[0].expects(:compiled_content).with(:snapshot => :pre).returns('foo')
581
+
582
+ # Mock site
583
+ @site = mock
584
+ @site.stubs(:config).returns({ :base_url => 'http://example.com' })
585
+
586
+ # Create feed item
587
+ @item = mock
588
+ @item.stubs(:[]).with(:title).returns('My Blog Or Something')
589
+ @item.stubs(:[]).with(:author_name).returns('J. Doe')
590
+ @item.stubs(:[]).with(:author_uri).returns('http://example.com/~jdoe')
591
+ @item.stubs(:[]).with(:[]).with(:feed_url).returns('http://example.com/feed')
592
+
593
+ # Check
594
+ result = atom_feed :excerpt_proc => lambda { |a| 'foobar!' }
595
+ assert_match 'foobar!</summary>', result
596
+ end
597
+ end
598
+
599
+ def test_atom_feed_with_item_without_path
600
+ if_have 'builder' do
601
+ # Create items
602
+ @items = [ mock ]
603
+ @items[0].stubs(:[]).with(:updated_at).returns(Time.now - 500)
604
+ @items[0].stubs(:identifier).returns('/item/')
605
+ @items[0].stubs(:[]).with(:kind).returns('article')
606
+ @items[0].stubs(:[]).with(:created_at).returns((Time.now - 1000).to_s)
607
+ @items[0].stubs(:[]).with(:title).returns('Item One')
608
+ @items[0].stubs(:[]).with(:custom_path_in_feed).returns(nil)
609
+ @items[0].stubs(:[]).with(:custom_url_in_feed).returns(nil)
610
+ @items[0].stubs(:[]).with(:excerpt).returns(nil)
611
+ @items[0].stubs(:path).returns(nil)
612
+
613
+ # Mock site
614
+ @site = mock
615
+ @site.stubs(:config).returns({ :base_url => 'http://example.com' })
616
+
617
+ # Create feed item
618
+ @item = mock
619
+ @item.stubs(:identifier).returns('/feed/')
620
+ @item.stubs(:[]).with(:title).returns('My Cool Blog')
621
+ @item.stubs(:[]).with(:author_name).returns('Denis Defreyne')
622
+ @item.stubs(:[]).with(:author_uri).returns('http://stoneship.org/')
623
+ @item.stubs(:[]).with(:feed_url).returns(nil)
624
+ @item.stubs(:path).returns("/journal/feed/")
625
+
626
+ # Check
627
+ atom_feed
628
+ end
629
+ end
630
+
631
+ def test_url_for_without_custom_path_in_feed
632
+ # Create site
633
+ @site = Nanoc3::Site.new({ :base_url => 'http://example.com' })
634
+
635
+ # Create article
636
+ item = Nanoc3::Item.new('content', {}, '/foo/')
637
+ item.reps << Nanoc3::ItemRep.new(item, :default)
638
+ item.reps[0].path = '/foo/bar/'
639
+
640
+ # Check
641
+ assert_equal('http://example.com/foo/bar/', url_for(item))
642
+ ensure
643
+ # Cleanup
644
+ @item = nil
645
+ end
646
+
647
+ def test_url_for_with_custom_path_in_feed
648
+ # Create site
649
+ @site = Nanoc3::Site.new({ :base_url => 'http://example.com' })
650
+
651
+ # Create article
652
+ item = Nanoc3::Item.new(
653
+ 'content', { :custom_path_in_feed => '/meow/woof/' }, '/foo/')
654
+ item.reps << Nanoc3::ItemRep.new(item, :default)
655
+
656
+ # Check
657
+ assert_equal('http://example.com/meow/woof/', url_for(item))
658
+ ensure
659
+ # Cleanup
660
+ @item = nil
661
+ end
662
+
663
+ def test_url_for_with_custom_url_in_feed
664
+ # Create site
665
+ @site = Nanoc3::Site.new({ :base_url => 'http://example.com' })
666
+
667
+ # Create article
668
+ item = Nanoc3::Item.new(
669
+ 'content', { :custom_url_in_feed => 'http://example.org/x' }, '/foo/')
670
+ item.reps << Nanoc3::ItemRep.new(item, :default)
671
+
672
+ # Check
673
+ assert_equal('http://example.org/x', url_for(item))
674
+ ensure
675
+ # Cleanup
676
+ @item = nil
677
+ end
678
+
679
+ def test_url_for_without_base_url
680
+ # Create site
681
+ @site = Nanoc3::Site.new({})
682
+
683
+ # Check
684
+ assert_raises(RuntimeError) do
685
+ url_for(nil)
686
+ end
687
+ end
688
+
689
+ def test_url_for_without_path
690
+ # Create site
691
+ @site = Nanoc3::Site.new({ :base_url => 'http://example.com' })
692
+
693
+ # Create article
694
+ item = Nanoc3::Item.new('content', {}, '/foo/')
695
+ item.reps << Nanoc3::ItemRep.new(item, :default)
696
+ item.reps[0].path = nil
697
+
698
+ # Check
699
+ assert_equal(nil, url_for(item))
700
+ end
701
+
702
+ def test_feed_url_without_custom_feed_url
703
+ # Create site
704
+ @site = Nanoc3::Site.new({ :base_url => 'http://example.com' })
705
+
706
+ # Create article
707
+ @item = Nanoc3::Item.new('content', {}, '/foo/')
708
+ @item.reps << Nanoc3::ItemRep.new(@item, :default)
709
+ @item.reps[0].path = '/foo/bar/'
710
+
711
+ # Check
712
+ assert_equal('http://example.com/foo/bar/', feed_url)
713
+ ensure
714
+ # Cleanup
715
+ @item = nil
716
+ end
717
+
718
+ def test_feed_url_with_custom_feed_url
719
+ # Create site
720
+ @site = Nanoc3::Site.new({ :base_url => 'http://example.com' })
721
+
722
+ # Create feed item
723
+ @item = Nanoc3::Item.new('content', { :feed_url => 'http://example.com/feed/' }, '/foo/')
724
+ @item.reps << Nanoc3::ItemRep.new(@item, :default)
725
+ @item.reps[0].path = '/foo/bar/'
726
+
727
+ # Check
728
+ assert_equal('http://example.com/feed/', feed_url)
729
+ ensure
730
+ # Cleanup
731
+ @item = nil
732
+ end
733
+
734
+ def test_feed_url_without_base_url
735
+ # Create site
736
+ @site = Nanoc3::Site.new({})
737
+
738
+ # Check
739
+ assert_raises(RuntimeError) do
740
+ feed_url
741
+ end
742
+ end
743
+
744
+ def test_atom_tag_for_with_path
745
+ # Create site
746
+ @site = Nanoc3::Site.new({ :base_url => 'http://example.com' })
747
+
748
+ # Create article
749
+ item = Nanoc3::Item.new('content', { :created_at => '2008-05-19' }, '/foo/')
750
+ item.reps << Nanoc3::ItemRep.new(item, :default)
751
+ item.reps[0].path = '/foo/bar/'
752
+
753
+ # Check
754
+ assert_equal('tag:example.com,2008-05-19:/foo/bar/', atom_tag_for(item))
755
+ end
756
+
757
+ def test_atom_tag_for_without_path
758
+ # Create site
759
+ @site = Nanoc3::Site.new({ :base_url => 'http://example.com' })
760
+
761
+ # Create article
762
+ item = Nanoc3::Item.new('content', { :created_at => '2008-05-19' }, '/baz/qux/')
763
+ item.reps << Nanoc3::ItemRep.new(item, :default)
764
+
765
+ # Check
766
+ assert_equal('tag:example.com,2008-05-19:/baz/qux/', atom_tag_for(item))
767
+ end
768
+
769
+ def test_atom_tag_for_with_base_url_in_dir
770
+ # Create site
771
+ @site = Nanoc3::Site.new({ :base_url => 'http://example.com/somedir' })
772
+
773
+ # Create article
774
+ item = Nanoc3::Item.new('content', { :created_at => '2008-05-19' }, '/foo/')
775
+ item.reps << Nanoc3::ItemRep.new(item, :default)
776
+ item.reps[0].path = '/foo/bar/'
777
+
778
+ # Check
779
+ assert_equal('tag:example.com,2008-05-19:/somedir/foo/bar/', atom_tag_for(item))
780
+ end
781
+
782
+ def test_atom_tag_for_with_time
783
+ # Create site
784
+ @site = Nanoc3::Site.new({ :base_url => 'http://example.com' })
785
+
786
+ # Create article
787
+ item = Nanoc3::Item.new('content', { :created_at => Time.parse('2008-05-19') }, '/foo/')
788
+ item.reps << Nanoc3::ItemRep.new(item, :default)
789
+ item.reps[0].path = '/foo/bar/'
790
+
791
+ # Check
792
+ assert_equal('tag:example.com,2008-05-19:/foo/bar/', atom_tag_for(item))
793
+ end
794
+
795
+ def test_atom_tag_for_with_date
796
+ # Create site
797
+ @site = Nanoc3::Site.new({ :base_url => 'http://example.com' })
798
+
799
+ # Create article
800
+ item = Nanoc3::Item.new('content', { :created_at => Date.parse('2008-05-19') }, '/foo/')
801
+ item.reps << Nanoc3::ItemRep.new(item, :default)
802
+ item.reps[0].path = '/foo/bar/'
803
+
804
+ # Check
805
+ assert_equal('tag:example.com,2008-05-19:/foo/bar/', atom_tag_for(item))
806
+ end
807
+
808
+ end