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,83 @@
1
+ # encoding: utf-8
2
+
3
+ require 'test/helper'
4
+
5
+ class Nanoc3::Helpers::BreadcrumbsTest < MiniTest::Unit::TestCase
6
+
7
+ include Nanoc3::TestHelpers
8
+
9
+ include Nanoc3::Helpers::Breadcrumbs
10
+
11
+ def test_breadcrumbs_trail_at_root
12
+ # Mock item
13
+ @item = mock
14
+ @item.stubs(:identifier).returns('/')
15
+ @items = [ @item ]
16
+
17
+ # Build trail
18
+ trail = breadcrumbs_trail
19
+
20
+ # Check
21
+ assert_equal(
22
+ [ @item ],
23
+ trail
24
+ )
25
+ end
26
+
27
+ def test_breadcrumbs_trail_with_1_parent
28
+ # Mock item
29
+ parent = mock
30
+ parent.stubs(:identifier).returns('/')
31
+ @item = mock
32
+ @item.stubs(:identifier).returns('/foo/')
33
+ @items = [ parent, @item ]
34
+
35
+ # Build trail
36
+ trail = breadcrumbs_trail
37
+
38
+ # Check
39
+ assert_equal(
40
+ [ parent, @item ],
41
+ trail
42
+ )
43
+ end
44
+
45
+ def test_breadcrumbs_trail_with_many_parents
46
+ # Mock item
47
+ grandparent = mock
48
+ grandparent.stubs(:identifier).returns('/')
49
+ parent = mock
50
+ parent.stubs(:identifier).returns('/foo/')
51
+ @item = mock
52
+ @item.stubs(:identifier).returns('/foo/bar/')
53
+ @items = [ grandparent, parent, @item ]
54
+
55
+ # Build trail
56
+ trail = breadcrumbs_trail
57
+
58
+ # Check
59
+ assert_equal(
60
+ [ grandparent, parent, @item ],
61
+ trail
62
+ )
63
+ end
64
+
65
+ def test_breadcrumbs_trail_with_nils
66
+ # Mock item
67
+ grandparent = mock
68
+ grandparent.stubs(:identifier).returns('/')
69
+ @item = mock
70
+ @item.stubs(:identifier).returns('/foo/bar/')
71
+ @items = [ grandparent, @item ]
72
+
73
+ # Build trail
74
+ trail = breadcrumbs_trail
75
+
76
+ # Check
77
+ assert_equal(
78
+ [ grandparent, nil, @item ],
79
+ trail
80
+ )
81
+ end
82
+
83
+ end
@@ -0,0 +1,42 @@
1
+ # encoding: utf-8
2
+
3
+ require 'test/helper'
4
+
5
+ class Nanoc3::Helpers::CapturingTest < MiniTest::Unit::TestCase
6
+
7
+ include Nanoc3::TestHelpers
8
+
9
+ include Nanoc3::Helpers::Capturing
10
+
11
+ def test_content_for
12
+ require 'erb'
13
+
14
+ # Build content to be evaluated
15
+ content = "head <% content_for :sidebar do %>\n" +
16
+ " <%= 1+2 %>\n" +
17
+ "<% end %> foot"
18
+
19
+ # Evaluate content
20
+ @item = {}
21
+ result = ::ERB.new(content).result(binding)
22
+
23
+ # Check
24
+ assert(@item[:content_for_sidebar].strip == '3')
25
+ assert_match(/^head\s+foot$/, result)
26
+ end
27
+
28
+ def test_capture
29
+ require 'erb'
30
+
31
+ # Capture
32
+ _erbout = 'foo'
33
+ captured_content = capture do
34
+ _erbout << 'bar'
35
+ end
36
+
37
+ # Check
38
+ assert_equal 'foo', _erbout
39
+ assert_equal 'bar', captured_content
40
+ end
41
+
42
+ end
@@ -0,0 +1,108 @@
1
+ # encoding: utf-8
2
+
3
+ require 'test/helper'
4
+
5
+ class Nanoc3::Helpers::FilteringTest < MiniTest::Unit::TestCase
6
+
7
+ include Nanoc3::TestHelpers
8
+
9
+ include Nanoc3::Helpers::Filtering
10
+
11
+ def test_filter_simple
12
+ if_have 'rubypants' do
13
+ # Build content to be evaluated
14
+ content = "<p>Foo...</p>\n" +
15
+ "<% filter :rubypants do %>\n" +
16
+ " <p>Bar...</p>\n" +
17
+ "<% end %>\n"
18
+
19
+ # Mock item and rep
20
+ @item_rep = mock
21
+ @item_rep.expects(:assigns).returns({})
22
+
23
+ # Evaluate content
24
+ result = ::ERB.new(content).result(binding)
25
+
26
+ # Check
27
+ assert_match('<p>Foo...</p>', result)
28
+ assert_match('<p>Bar&#8230;</p>', result)
29
+ end
30
+ end
31
+
32
+ def test_filter_with_assigns
33
+ if_have 'rubypants' do
34
+ # Build content to be evaluated
35
+ content = "<p>Foo...</p>\n" +
36
+ "<% filter :erb do %>\n" +
37
+ " <p><%%= @item[:title] %></p>\n" +
38
+ "<% end %>\n"
39
+
40
+ # Mock item and rep
41
+ @item = mock
42
+ @item.expects(:[]).with(:title).returns('Bar...')
43
+ @item.expects(:identifier).returns('/blah/')
44
+ @item_rep = mock
45
+ @item_rep.expects(:name).returns('default')
46
+ @item_rep.expects(:assigns).returns({
47
+ :item => @item,
48
+ :item_rep => @item_rep
49
+ })
50
+
51
+ # Evaluate content
52
+ result = ::ERB.new(content).result(binding)
53
+
54
+ # Check
55
+ assert_match('<p>Foo...</p>', result)
56
+ assert_match('<p>Bar...</p>', result)
57
+ end
58
+ end
59
+
60
+ def test_filter_with_unknown_filter_name
61
+ # Build content to be evaluated
62
+ content = "<p>Foo...</p>\n" +
63
+ "<% filter :askjdflkawgjlkwaheflnvz do %>\n" +
64
+ " <p>Blah blah blah.</p>\n" +
65
+ "<% end %>\n"
66
+
67
+ # Evaluate content
68
+ error = assert_raises(Nanoc3::Errors::UnknownFilter) do
69
+ ::ERB.new(content).result(binding)
70
+ end
71
+ end
72
+
73
+ def test_filter_with_arguments
74
+ if_have 'coderay' do
75
+ # Build content to be evaluated
76
+ content = "<% filter :coderay, :language => 'ruby' do %>\n" +
77
+ " def some_function ; x = blah.foo ; x.bar 'xyzzy' ; end\n" +
78
+ "<% end %>\n"
79
+
80
+ # Mock item and rep
81
+ @item_rep = mock
82
+ @item_rep.expects(:assigns).returns({})
83
+
84
+ # Evaluate content
85
+ result = ::ERB.new(content).result(binding)
86
+ assert_match(%r{<span class="r">def</span> <span class="fu">some_function</span>}, result)
87
+ end
88
+ end
89
+
90
+ def test_with_haml
91
+ if_have 'haml' do
92
+ # Build content to be evaluated
93
+ content = "%p Foo.\n" +
94
+ "- filter(:erb) do\n" +
95
+ " <%= 'abc' + 'xyz' %>\n" +
96
+ "%p Bar.\n"
97
+
98
+ # Mock item and rep
99
+ @item_rep = mock
100
+ @item_rep.expects(:assigns).returns({})
101
+
102
+ # Evaluate content
103
+ result = ::Haml::Engine.new(content).render(binding)
104
+ assert_match(%r{^<p>Foo.</p>\s*abcxyz\s*<p>Bar.</p>$}, result)
105
+ end
106
+ end
107
+
108
+ end
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ require 'test/helper'
4
+
5
+ class Nanoc3::Helpers::HTMLEscapeTest < MiniTest::Unit::TestCase
6
+
7
+ include Nanoc3::TestHelpers
8
+
9
+ include Nanoc3::Helpers::HTMLEscape
10
+
11
+ def test_html_escape
12
+ assert_equal('&lt;', html_escape('<'))
13
+ assert_equal('&gt;', html_escape('>'))
14
+ assert_equal('&amp;', html_escape('&'))
15
+ assert_equal('&quot;', html_escape('"'))
16
+ end
17
+
18
+ end
@@ -0,0 +1,251 @@
1
+ # encoding: utf-8
2
+
3
+ require 'test/helper'
4
+
5
+ class Nanoc3::Helpers::LinkToTest < MiniTest::Unit::TestCase
6
+
7
+ include Nanoc3::TestHelpers
8
+
9
+ include Nanoc3::Helpers::LinkTo
10
+
11
+ def test_link_to_with_path
12
+ # Check
13
+ assert_equal(
14
+ '<a href="/foo/">Foo</a>',
15
+ link_to('Foo', '/foo/')
16
+ )
17
+ end
18
+
19
+ def test_link_to_with_rep
20
+ # Create rep
21
+ rep = mock
22
+ rep.stubs(:path).returns('/bar/')
23
+
24
+ # Check
25
+ assert_equal(
26
+ '<a href="/bar/">Bar</a>',
27
+ link_to('Bar', rep)
28
+ )
29
+ end
30
+
31
+ def test_link_to_with_item
32
+ # Create rep
33
+ item = mock
34
+ item.stubs(:path).returns('/bar/')
35
+
36
+ # Check
37
+ assert_equal(
38
+ '<a href="/bar/">Bar</a>',
39
+ link_to('Bar', item)
40
+ )
41
+ end
42
+
43
+ def test_link_to_with_attributes
44
+ # Check
45
+ assert_equal(
46
+ '<a title="Dis mai foo!" href="/foo/">Foo</a>',
47
+ link_to('Foo', '/foo/', :title => 'Dis mai foo!')
48
+ )
49
+ end
50
+
51
+ def test_link_to_escape
52
+ # Check
53
+ assert_equal(
54
+ '<a title="Foo &amp; Bar" href="/foo&amp;bar/">Foo &amp; Bar</a>',
55
+ link_to('Foo &amp; Bar', '/foo&bar/', :title => 'Foo & Bar')
56
+ )
57
+ end
58
+
59
+ def test_link_to_to_nil_item_or_item_rep
60
+ obj = Object.new
61
+ def obj.path ; nil ; end
62
+
63
+ assert_raises RuntimeError do
64
+ link_to("Some Text", obj)
65
+ end
66
+ end
67
+
68
+ def test_link_to_unless_current_current
69
+ # Create item
70
+ @item_rep = mock
71
+ @item_rep.stubs(:path).returns('/foo/')
72
+
73
+ # Check
74
+ assert_equal(
75
+ '<span class="active" title="You\'re here.">Bar</span>',
76
+ link_to_unless_current('Bar', @item_rep)
77
+ )
78
+ ensure
79
+ @item = nil
80
+ end
81
+
82
+ def test_link_to_unless_current_not_current
83
+ # Create item
84
+ @item_rep = mock
85
+ @item_rep.stubs(:path).returns('/foo/')
86
+
87
+ # Check
88
+ assert_equal(
89
+ '<a href="/abc/xyz/">Bar</a>',
90
+ link_to_unless_current('Bar', '/abc/xyz/')
91
+ )
92
+ end
93
+
94
+ def test_relative_path_to_with_self
95
+ # Mock item
96
+ @item_rep = mock
97
+ @item_rep.stubs(:path).returns('/foo/bar/baz/')
98
+
99
+ # Test
100
+ assert_equal(
101
+ './',
102
+ relative_path_to('/foo/bar/baz/')
103
+ )
104
+ end
105
+
106
+ def test_relative_path_to_with_root
107
+ # Mock item
108
+ @item_rep = mock
109
+ @item_rep.stubs(:path).returns('/foo/bar/baz/')
110
+
111
+ # Test
112
+ assert_equal(
113
+ '../../../',
114
+ relative_path_to('/')
115
+ )
116
+ end
117
+
118
+ def test_relative_path_to_file
119
+ # Mock item
120
+ @item_rep = mock
121
+ @item_rep.stubs(:path).returns('/foo/bar/baz/')
122
+
123
+ # Test
124
+ assert_equal(
125
+ '../../quux',
126
+ relative_path_to('/foo/quux')
127
+ )
128
+ end
129
+
130
+ def test_relative_path_to_dir
131
+ # Mock item
132
+ @item_rep = mock
133
+ @item_rep.stubs(:path).returns('/foo/bar/baz/')
134
+
135
+ # Test
136
+ assert_equal(
137
+ '../../quux/',
138
+ relative_path_to('/foo/quux/')
139
+ )
140
+ end
141
+
142
+ def test_relative_path_to_rep
143
+ # Mock self
144
+ @item_rep = mock
145
+ @item_rep.stubs(:path).returns('/foo/bar/baz/')
146
+
147
+ # Mock other
148
+ other_item_rep = mock
149
+ other_item_rep.stubs(:path).returns('/foo/quux/')
150
+
151
+ # Test
152
+ assert_equal(
153
+ '../../quux/',
154
+ relative_path_to(other_item_rep)
155
+ )
156
+ end
157
+
158
+
159
+ def test_relative_path_to_item
160
+ # Mock self
161
+ @item_rep = mock
162
+ @item_rep.stubs(:path).returns('/foo/bar/baz/')
163
+
164
+ # Mock other
165
+ other_item = mock
166
+ other_item.stubs(:path).returns('/foo/quux/')
167
+
168
+ # Test
169
+ assert_equal(
170
+ '../../quux/',
171
+ relative_path_to(other_item)
172
+ )
173
+ end
174
+
175
+ def test_relative_path_to_to_nil
176
+ # Mock self
177
+ @item_rep = mock
178
+ @item_rep.stubs(:path).returns(nil)
179
+
180
+ # Mock other
181
+ other_item_rep = mock
182
+ other_item_rep.stubs(:path).returns('/foo/quux/')
183
+
184
+ # Test
185
+ assert_raises RuntimeError do
186
+ relative_path_to(other_item_rep)
187
+ end
188
+ end
189
+
190
+ def test_relative_path_to_from_nil
191
+ # Mock self
192
+ @item_rep = mock
193
+ @item_rep.stubs(:path).returns('/foo/quux/')
194
+
195
+ # Mock other
196
+ other_item_rep = mock
197
+ other_item_rep.stubs(:path).returns(nil)
198
+
199
+ # Test
200
+ assert_raises RuntimeError do
201
+ relative_path_to(other_item_rep)
202
+ end
203
+ end
204
+
205
+ def test_examples_link_to
206
+ # Parse
207
+ YARD.parse('../lib/nanoc3/helpers/link_to.rb')
208
+
209
+ # Mock
210
+ @items = [ mock, mock, mock ]
211
+ @items[0].stubs(:identifier).returns('/about/')
212
+ @items[0].stubs(:path).returns('/about.html')
213
+ @items[1].stubs(:identifier).returns('/software/')
214
+ @items[1].stubs(:path).returns('/software.html')
215
+ @items[2].stubs(:identifier).returns('/software/nanoc/')
216
+ @items[2].stubs(:path).returns('/software/nanoc.html')
217
+ about_rep_vcard = mock
218
+ about_rep_vcard.stubs(:path).returns('/about.vcf')
219
+ @items[0].stubs(:rep).with(:vcard).returns(about_rep_vcard)
220
+
221
+ # Run
222
+ assert_examples_correct 'Nanoc3::Helpers::LinkTo#link_to'
223
+ end
224
+
225
+ def test_examples_link_to_unless_current
226
+ # Parse
227
+ YARD.parse('../lib/nanoc3/helpers/link_to.rb')
228
+
229
+ # Mock
230
+ @item_rep = mock
231
+ @item_rep.stubs(:path).returns('/about/')
232
+ @item = mock
233
+ @item.stubs(:path).returns(@item_rep.path)
234
+
235
+ # Run
236
+ assert_examples_correct 'Nanoc3::Helpers::LinkTo#link_to_unless_current'
237
+ end
238
+
239
+ def test_examples_relative_path_to
240
+ # Parse
241
+ YARD.parse('../lib/nanoc3/helpers/link_to.rb')
242
+
243
+ # Mock
244
+ @item_rep = mock
245
+ @item_rep.stubs(:path).returns('/foo/bar/')
246
+
247
+ # Run
248
+ assert_examples_correct 'Nanoc3::Helpers::LinkTo#relative_path_to'
249
+ end
250
+
251
+ end
@@ -0,0 +1,109 @@
1
+ # encoding: utf-8
2
+
3
+ require 'test/helper'
4
+
5
+ class Nanoc3::Helpers::RenderingTest < MiniTest::Unit::TestCase
6
+
7
+ include Nanoc3::TestHelpers
8
+
9
+ include Nanoc3::Helpers::Rendering
10
+
11
+ def test_render
12
+ # Mock layouts
13
+ layout = MiniTest::Mock.new
14
+ layout.expect(:identifier, '/foo/')
15
+ layout.expect(:raw_content, 'This is the <%= @layout.identifier %> layout.')
16
+
17
+ # Mock site, compiler and stack
18
+ stack = []
19
+ compiler = MiniTest::Mock.new
20
+ compiler.expect(:stack, stack)
21
+ compiler.expects(:filter_for_layout).with(layout).returns([ :erb, {} ])
22
+ @site = MiniTest::Mock.new
23
+ @site.expect(:compiler, compiler)
24
+ @site.expect(:layouts, [ layout ])
25
+
26
+ # Render
27
+ assert_equal('This is the /foo/ layout.', render('/foo/'))
28
+ end
29
+
30
+ def test_render_with_unknown_layout
31
+ # Mock site
32
+ @site = MiniTest::Mock.new.expect(:layouts, [])
33
+
34
+ # Render
35
+ assert_raises(Nanoc3::Errors::UnknownLayout) do
36
+ render('/fawgooafwagwfe/')
37
+ end
38
+ end
39
+
40
+ def test_render_without_filter
41
+ # Mock layouts
42
+ layout = MiniTest::Mock.new
43
+ layout.expect(:identifier, '/foo/')
44
+ layout.expect(:raw_content, 'This is the <%= "foo" %> layout.')
45
+
46
+ # Mock compiler
47
+ compiler = mock
48
+ compiler.stubs(:filter_for_layout).with(layout).returns(nil)
49
+
50
+ # Mock site
51
+ @site = MiniTest::Mock.new
52
+ @site.expect(:layouts, [ layout ])
53
+ @site.expect(:compiler, compiler)
54
+
55
+ # Render
56
+ assert_raises(Nanoc3::Errors::CannotDetermineFilter) do
57
+ render '/foo/'
58
+ end
59
+ end
60
+
61
+ def test_render_with_unknown_filter
62
+ # Mock layouts
63
+ layout = MiniTest::Mock.new
64
+ layout.expect(:identifier, '/foo/')
65
+ layout.expect(:raw_content, 'This is the <%= "foo" %> layout.')
66
+
67
+ # Mock compiler
68
+ compiler = mock
69
+ compiler.stubs(:filter_for_layout).with(layout).returns([ :kjsdalfjwagihlawfji, {} ])
70
+
71
+ # Mock site
72
+ @site = MiniTest::Mock.new
73
+ @site.expect(:layouts, [ layout ])
74
+ @site.expect(:compiler, compiler)
75
+
76
+ # Render
77
+ assert_raises(Nanoc3::Errors::UnknownFilter) do
78
+ render '/foo/'
79
+ end
80
+ end
81
+
82
+ def test_render_with_block
83
+ # Mock layouts
84
+ layout = MiniTest::Mock.new
85
+ layout.expect(:identifier, '/foo/')
86
+ layout.expect(:raw_content, '[partial-before]<%= yield %>[partial-after]')
87
+
88
+ # Mock compiler
89
+ stack = []
90
+ compiler = mock
91
+ compiler.stubs(:stack).returns(stack)
92
+ compiler.expects(:filter_for_layout).with(layout).returns([ :erb, {} ])
93
+
94
+ # Mock site
95
+ @site = MiniTest::Mock.new
96
+ @site.expect(:compiler, compiler)
97
+ @site.expect(:layouts, [ layout ])
98
+
99
+ # Mock erbout
100
+ _erbout = '[erbout-before]'
101
+
102
+ # Render
103
+ render '/foo/' do
104
+ _erbout << "This is some extra content"
105
+ end
106
+ assert_equal('[erbout-before][partial-before]This is some extra content[partial-after]', _erbout)
107
+ end
108
+
109
+ end
@@ -0,0 +1,89 @@
1
+ # encoding: utf-8
2
+
3
+ require 'test/helper'
4
+
5
+ class Nanoc3::Helpers::TaggingTest < MiniTest::Unit::TestCase
6
+
7
+ include Nanoc3::TestHelpers
8
+
9
+ include Nanoc3::Helpers::Tagging
10
+
11
+ def test_tags_for_without_tags
12
+ # Create item
13
+ item = Nanoc3::Item.new('content', {}, '/path/')
14
+
15
+ # Check
16
+ assert_equal(
17
+ '(none)',
18
+ tags_for(item)
19
+ )
20
+ end
21
+
22
+ def test_tags_for_with_custom_base_url
23
+ # Create item
24
+ item = Nanoc3::Item.new('content', { :tags => [ 'foo', 'bar' ]}, '/path/')
25
+
26
+ # Check
27
+ assert_equal(
28
+ "#{link_for_tag('foo', 'http://stoneship.org/tag/')}, " +
29
+ "#{link_for_tag('bar', 'http://stoneship.org/tag/')}",
30
+ tags_for(item, :base_url => 'http://stoneship.org/tag/')
31
+ )
32
+ end
33
+
34
+ def test_tags_for_with_custom_none_text
35
+ # Create item
36
+ item = Nanoc3::Item.new('content', { :tags => [ ]}, '/path/')
37
+
38
+ # Check
39
+ assert_equal(
40
+ 'no tags for you, fool',
41
+ tags_for(item, :none_text => 'no tags for you, fool')
42
+ )
43
+ end
44
+
45
+ def test_tags_for_with_custom_separator
46
+ # Create item
47
+ item = Nanoc3::Item.new('content', { :tags => [ 'foo', 'bar' ]}, '/path/')
48
+
49
+ # Check
50
+ assert_equal(
51
+ "#{link_for_tag('foo', 'http://technorati.com/tag/')} ++ " +
52
+ "#{link_for_tag('bar', 'http://technorati.com/tag/')}",
53
+ tags_for(item, :separator => ' ++ ')
54
+ )
55
+ end
56
+
57
+ def test_items_with_tag
58
+ # Create items
59
+ @items = [
60
+ Nanoc3::Item.new('item 1', { :tags => [ :foo ] }, '/item1/'),
61
+ Nanoc3::Item.new('item 2', { :tags => [ :bar ] }, '/item2/'),
62
+ Nanoc3::Item.new('item 3', { :tags => [ :foo, :bar ] }, '/item3/')
63
+ ]
64
+
65
+ # Find items
66
+ items_with_foo_tag = items_with_tag(:foo)
67
+
68
+ # Check
69
+ assert_equal(
70
+ [ @items[0], @items[2] ],
71
+ items_with_foo_tag
72
+ )
73
+ end
74
+
75
+ def test_link_for_tag
76
+ assert_equal(
77
+ %[<a href="http://stoneship.org/tags/foobar" rel="tag">foobar</a>],
78
+ link_for_tag('foobar', 'http://stoneship.org/tags/')
79
+ )
80
+ end
81
+
82
+ def test_link_for_tag_escape
83
+ assert_equal(
84
+ %[<a href="http://stoneship.org/tags&amp;stuff/foo&amp;bar" rel="tag">foo&amp;bar</a>],
85
+ link_for_tag('foo&bar', 'http://stoneship.org/tags&stuff/')
86
+ )
87
+ end
88
+
89
+ end