gretel-lite 3.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +24 -0
  3. data/.travis.yml +16 -0
  4. data/CHANGELOG.md +56 -0
  5. data/Gemfile +23 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +376 -0
  8. data/Rakefile +10 -0
  9. data/gemfiles/Gemfile-rails.3.1.x +19 -0
  10. data/gemfiles/Gemfile-rails.3.2.x +19 -0
  11. data/gemfiles/Gemfile-rails.4.0.x +19 -0
  12. data/gemfiles/Gemfile-rails.4.1.x +19 -0
  13. data/gretel.gemspec +23 -0
  14. data/lib/generators/gretel/USAGE +8 -0
  15. data/lib/generators/gretel/install_generator.rb +12 -0
  16. data/lib/generators/gretel/templates/breadcrumbs.rb +28 -0
  17. data/lib/gretel.rb +82 -0
  18. data/lib/gretel/crumb.rb +68 -0
  19. data/lib/gretel/crumbs.rb +64 -0
  20. data/lib/gretel/deprecated.rb +1 -0
  21. data/lib/gretel/deprecated/default_style_key.rb +25 -0
  22. data/lib/gretel/deprecated/layout.rb +15 -0
  23. data/lib/gretel/deprecated/show_root_alone.rb +27 -0
  24. data/lib/gretel/deprecated/yield_links.rb +44 -0
  25. data/lib/gretel/link.rb +39 -0
  26. data/lib/gretel/renderer.rb +254 -0
  27. data/lib/gretel/resettable.rb +13 -0
  28. data/lib/gretel/version.rb +3 -0
  29. data/lib/gretel/view_helpers.rb +71 -0
  30. data/test/deprecated_test.rb +45 -0
  31. data/test/dummy/Rakefile +7 -0
  32. data/test/dummy/app/assets/javascripts/application.js +15 -0
  33. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  34. data/test/dummy/app/controllers/application_controller.rb +3 -0
  35. data/test/dummy/app/helpers/application_helper.rb +5 -0
  36. data/test/dummy/app/mailers/.gitkeep +0 -0
  37. data/test/dummy/app/models/.gitkeep +0 -0
  38. data/test/dummy/app/models/issue.rb +3 -0
  39. data/test/dummy/app/models/project.rb +3 -0
  40. data/test/dummy/app/views/breadcrumbs/site.rb +3 -0
  41. data/test/dummy/config.ru +4 -0
  42. data/test/dummy/config/application.rb +14 -0
  43. data/test/dummy/config/boot.rb +10 -0
  44. data/test/dummy/config/breadcrumbs.rb +3 -0
  45. data/test/dummy/config/breadcrumbs/test_crumbs.rb +85 -0
  46. data/test/dummy/config/database.yml +25 -0
  47. data/test/dummy/config/environment.rb +5 -0
  48. data/test/dummy/config/environments/development.rb +2 -0
  49. data/test/dummy/config/environments/production.rb +2 -0
  50. data/test/dummy/config/environments/test.rb +2 -0
  51. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  52. data/test/dummy/config/initializers/inflections.rb +15 -0
  53. data/test/dummy/config/initializers/mime_types.rb +5 -0
  54. data/test/dummy/config/initializers/secret_token.rb +7 -0
  55. data/test/dummy/config/initializers/session_store.rb +8 -0
  56. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  57. data/test/dummy/config/locales/en.yml +5 -0
  58. data/test/dummy/config/routes.rb +11 -0
  59. data/test/dummy/db/migrate/20130122163007_create_projects.rb +9 -0
  60. data/test/dummy/db/migrate/20130122163051_create_issues.rb +10 -0
  61. data/test/dummy/db/schema.rb +29 -0
  62. data/test/dummy/lib/assets/.gitkeep +0 -0
  63. data/test/dummy/log/.gitkeep +0 -0
  64. data/test/dummy/public/404.html +26 -0
  65. data/test/dummy/public/422.html +26 -0
  66. data/test/dummy/public/500.html +25 -0
  67. data/test/dummy/public/favicon.ico +0 -0
  68. data/test/dummy/script/rails +6 -0
  69. data/test/fixtures/issues.yml +4 -0
  70. data/test/fixtures/projects.yml +3 -0
  71. data/test/gretel_test.rb +24 -0
  72. data/test/helper_methods_test.rb +546 -0
  73. data/test/test_helper.rb +15 -0
  74. metadata +205 -0
@@ -0,0 +1,25 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/500.html -->
21
+ <div class="dialog">
22
+ <h1>We're sorry, but something went wrong.</h1>
23
+ </div>
24
+ </body>
25
+ </html>
File without changes
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
@@ -0,0 +1,4 @@
1
+ one:
2
+ id: 1
3
+ project_id: 1
4
+ title: Test Issue
@@ -0,0 +1,3 @@
1
+ one:
2
+ id: 1
3
+ name: Test Project
@@ -0,0 +1,24 @@
1
+ require 'test_helper'
2
+
3
+ class GretelTest < ActiveSupport::TestCase
4
+ setup do
5
+ Gretel.reset!
6
+ end
7
+
8
+ test "defaults" do
9
+ assert_equal [Rails.root.join("config", "breadcrumbs.rb"),
10
+ Rails.root.join("config", "breadcrumbs", "**", "*.rb"),
11
+ Rails.root.join("app", "views", "breadcrumbs", "**", "*.rb")],
12
+ Gretel.breadcrumb_paths[-3..-1]
13
+ assert_equal ["development"], Gretel.reload_environments
14
+ assert !Gretel.suppress_deprecation_warnings?
15
+ end
16
+
17
+ test "configuration block" do
18
+ Gretel.configure do |config|
19
+ config.reload_environments << "staging"
20
+ end
21
+
22
+ assert_equal ["development", "staging"], Gretel.reload_environments
23
+ end
24
+ end
@@ -0,0 +1,546 @@
1
+ require 'test_helper'
2
+
3
+ class HelperMethodsTest < ActionView::TestCase
4
+ include Gretel::ViewHelpers
5
+
6
+ self.fixture_path = File.expand_path("../../test/fixtures", __FILE__)
7
+ fixtures :all
8
+
9
+ helper :application
10
+
11
+ setup do
12
+ Gretel.reset!
13
+ end
14
+
15
+ def itemscope_value
16
+ ActionView::Helpers::TagHelper::BOOLEAN_ATTRIBUTES.include?("itemscope") ?
17
+ "itemscope" : ""
18
+ end
19
+
20
+ # Breadcrumb generation
21
+
22
+ test "basic breadcrumb" do
23
+ breadcrumb :basic
24
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <span class="current">About</span></div>},
25
+ breadcrumbs.to_s
26
+ end
27
+
28
+ test "breadcrumb with root" do
29
+ breadcrumb :with_root
30
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <span class="current">About</span></div>},
31
+ breadcrumbs.to_s
32
+ end
33
+
34
+ test "breadcrumb with parent" do
35
+ breadcrumb :with_parent
36
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <a href="/about">About</a> &rsaquo; <span class="current">Contact</span></div>},
37
+ breadcrumbs.to_s
38
+ end
39
+
40
+ test "breadcrumb with autopath" do
41
+ breadcrumb :with_autopath, projects(:one)
42
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <span class="current">Test Project</span></div>},
43
+ breadcrumbs.to_s
44
+ end
45
+
46
+ test "breadcrumb with parent object" do
47
+ breadcrumb :with_parent_object, issues(:one)
48
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <a href="/projects/1">Test Project</a> &rsaquo; <span class="current">Test Issue</span></div>},
49
+ breadcrumbs.to_s
50
+ end
51
+
52
+ test "multiple links" do
53
+ breadcrumb :multiple_links
54
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <a href="/about/contact">Contact</a> &rsaquo; <span class="current">Contact form</span></div>},
55
+ breadcrumbs.to_s
56
+ end
57
+
58
+ test "multiple links with parent" do
59
+ breadcrumb :multiple_links_with_parent
60
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <a href="/about">About</a> &rsaquo; <a href="/about/contact">Contact</a> &rsaquo; <span class="current">Contact form</span></div>},
61
+ breadcrumbs.to_s
62
+ end
63
+
64
+ test "semantic breadcrumb" do
65
+ breadcrumb :with_root
66
+ assert_dom_equal %Q{<div class="breadcrumbs"><span itemscope="#{itemscope_value}" itemtype="http://data-vocabulary.org/Breadcrumb"><a href="/" itemprop="url"><span itemprop="title">Home</span></a></span> &rsaquo; <span itemscope="#{itemscope_value}" itemtype="http://data-vocabulary.org/Breadcrumb"><span class="current" itemprop="title">About</span></span></div>},
67
+ breadcrumbs(semantic: true).to_s
68
+ end
69
+
70
+ test "doesn't show root alone" do
71
+ breadcrumb :root
72
+ assert_dom_equal "", breadcrumbs.to_s
73
+ end
74
+
75
+ test "displays single fragment" do
76
+ breadcrumb :root
77
+ assert_dom_equal %{<div class="breadcrumbs"><span class="current">Home</span></div>},
78
+ breadcrumbs(display_single_fragment: true).to_s
79
+ end
80
+
81
+ test "displays single non-root fragment" do
82
+ breadcrumb :basic
83
+ assert_dom_equal %{<div class="breadcrumbs"><span class="current">About</span></div>},
84
+ breadcrumbs(autoroot: false, display_single_fragment: true).to_s
85
+ end
86
+
87
+ test "no breadcrumb" do
88
+ assert_dom_equal "", breadcrumbs.to_s
89
+ end
90
+
91
+ test "links current breadcrumb" do
92
+ breadcrumb :with_root
93
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <a href="/about" class="current">About</a></div>},
94
+ breadcrumbs(link_current: true).to_s
95
+ end
96
+
97
+ test "pretext" do
98
+ breadcrumb :basic
99
+ assert_dom_equal %{<div class="breadcrumbs"><span class="pretext">You are here:</span> <a href="/">Home</a> &rsaquo; <span class="current">About</span></div>},
100
+ breadcrumbs(pretext: "You are here:").to_s
101
+ end
102
+
103
+ test "posttext" do
104
+ breadcrumb :basic
105
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <span class="current">About</span> <span class="posttext">text after breadcrumbs</span></div>},
106
+ breadcrumbs(posttext: "text after breadcrumbs").to_s
107
+ end
108
+
109
+ test "autoroot disabled" do
110
+ breadcrumb :basic
111
+ assert_dom_equal "", breadcrumbs(autoroot: false).to_s
112
+ end
113
+
114
+ test "separator" do
115
+ breadcrumb :with_root
116
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &raquo; <span class="current">About</span></div>},
117
+ breadcrumbs(separator: " &raquo; ").to_s
118
+ end
119
+
120
+ test "element id" do
121
+ breadcrumb :basic
122
+ assert_dom_equal %{<div class="breadcrumbs" id="custom_id"><a href="/">Home</a> &rsaquo; <span class="current">About</span></div>},
123
+ breadcrumbs(id: "custom_id").to_s
124
+ end
125
+
126
+ test "custom container class" do
127
+ breadcrumb :basic
128
+ assert_dom_equal %{<div class="custom_class"><a href="/">Home</a> &rsaquo; <span class="current">About</span></div>},
129
+ breadcrumbs(class: "custom_class").to_s
130
+ end
131
+
132
+ test "custom current class" do
133
+ breadcrumb :basic
134
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <span class="custom_current_class">About</span></div>},
135
+ breadcrumbs(current_class: "custom_current_class").to_s
136
+ end
137
+
138
+ test "custom pretext class" do
139
+ breadcrumb :basic
140
+ assert_dom_equal %{<div class="breadcrumbs"><span class="custom_pretext_class">You are here:</span> <a href="/">Home</a> &rsaquo; <span class="current">About</span></div>},
141
+ breadcrumbs(pretext: "You are here:", pretext_class: "custom_pretext_class").to_s
142
+ end
143
+
144
+ test "custom posttext class" do
145
+ breadcrumb :basic
146
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <span class="current">About</span> <span class="custom_posttext_class">after breadcrumbs</span></div>},
147
+ breadcrumbs(posttext: "after breadcrumbs", posttext_class: "custom_posttext_class").to_s
148
+ end
149
+
150
+ test "unsafe html" do
151
+ breadcrumb :with_unsafe_html
152
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <span class="current">Test &lt;strong&gt;bold text&lt;/strong&gt;</span></div>},
153
+ breadcrumbs.to_s
154
+ end
155
+
156
+ test "safe html" do
157
+ breadcrumb :with_safe_html
158
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <span class="current">Test <strong>bold text</strong></span></div>},
159
+ breadcrumbs.to_s
160
+ end
161
+
162
+ test "parent breadcrumb" do
163
+ breadcrumb :multiple_links_with_parent
164
+
165
+ parent = parent_breadcrumb
166
+ assert_equal [:multiple_links_with_parent, "Contact", "/about/contact"],
167
+ [parent.key, parent.text, parent.url]
168
+ end
169
+
170
+ test "yields parent breadcrumb" do
171
+ breadcrumb :multiple_links_with_parent
172
+
173
+ out = parent_breadcrumb do |parent|
174
+ [parent.key, parent.text, parent.url]
175
+ end
176
+ assert_equal [:multiple_links_with_parent, "Contact", "/about/contact"],
177
+ out
178
+ end
179
+
180
+ test "parent breadcrumb returns nil if not present" do
181
+ breadcrumb :basic
182
+
183
+ assert_nil parent_breadcrumb(autoroot: false)
184
+ end
185
+
186
+ test "parent breadcrumb yields only if present" do
187
+ breadcrumb :basic
188
+
189
+ out = parent_breadcrumb(autoroot: false) do
190
+ "yielded"
191
+ end
192
+
193
+ assert_nil out
194
+ end
195
+
196
+ test "link keys" do
197
+ breadcrumb :basic
198
+ assert_equal [:root, :basic], breadcrumbs.keys
199
+ end
200
+
201
+ test "using breadcrumbs as array" do
202
+ breadcrumb :basic
203
+
204
+ breadcrumbs.tap do |links|
205
+ assert_kind_of Array, links
206
+ assert_equal 2, links.count
207
+ end
208
+ end
209
+
210
+ test "sets current on last link in array" do
211
+ breadcrumb :multiple_links_with_parent
212
+ assert_equal [false, false, false, true], breadcrumbs.map(&:current?)
213
+ end
214
+
215
+ test "passing options to links" do
216
+ breadcrumb :with_link_options
217
+
218
+ breadcrumbs(autoroot: false).tap do |links|
219
+ links[0].tap do |link|
220
+ assert link.title?
221
+ assert_equal "My Title", link.title
222
+
223
+ assert link.other?
224
+ assert_equal "Other Option", link.other
225
+
226
+ assert !link.nonexistent?
227
+ assert_nil link.nonexistent
228
+ end
229
+
230
+ links[1].tap do |link|
231
+ assert link.some_option?
232
+ assert_equal "Test", link.some_option
233
+ end
234
+ end
235
+
236
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/about">Test</a> &rsaquo; <span class="current">Other Link</span></div>},
237
+ breadcrumbs(autoroot: false).to_s
238
+ end
239
+
240
+ test "without link" do
241
+ breadcrumb :without_link
242
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; Also without link &rsaquo; <span class="current">Without link</span></div>},
243
+ breadcrumbs.to_s
244
+ end
245
+
246
+ test "view context" do
247
+ breadcrumb :using_view_helper
248
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <span class="current">TestTest</span></div>},
249
+ breadcrumbs.to_s
250
+ end
251
+
252
+ test "multiple arguments" do
253
+ breadcrumb :with_multiple_arguments, "One", "Two", "Three"
254
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <a href="/about">First OneOne then TwoTwo then ThreeThree</a> &rsaquo; <span class="current">One and Two and Three</span></div>},
255
+ breadcrumbs.to_s
256
+ end
257
+
258
+ test "from views folder" do
259
+ breadcrumb :from_views
260
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <span class="current">Breadcrumb From View</span></div>},
261
+ breadcrumbs.to_s
262
+ end
263
+
264
+ test "with_breadcrumb" do
265
+ breadcrumb :basic
266
+
267
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <span class="current">About</span></div>},
268
+ breadcrumbs.to_s
269
+
270
+ with_breadcrumb(:with_parent_object, issues(:one)) do
271
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <a href="/projects/1">Test Project</a> &rsaquo; <span class="current">Test Issue</span></div>},
272
+ breadcrumbs.to_s
273
+ end
274
+
275
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <span class="current">About</span></div>},
276
+ breadcrumbs.to_s
277
+ end
278
+
279
+ test "calling breadcrumbs helper twice" do
280
+ breadcrumb :with_parent
281
+ 2.times do
282
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <a href="/about">About</a> &rsaquo; <span class="current">Contact</span></div>},
283
+ breadcrumbs.to_s
284
+ end
285
+ end
286
+
287
+ test "breadcrumb not found" do
288
+ assert_raises ArgumentError do
289
+ breadcrumb :nonexistent
290
+ breadcrumbs
291
+ end
292
+ end
293
+
294
+ test "current link url is set to fullpath" do
295
+ self.request = OpenStruct.new(fullpath: "/testpath?a=1&b=2")
296
+
297
+ breadcrumb :basic
298
+ assert_equal "/testpath?a=1&b=2", breadcrumbs.last.url
299
+ end
300
+
301
+ test "current link url is not set to fullpath using link_current_to_request_path=false" do
302
+ self.request = OpenStruct.new(fullpath: "/testpath?a=1&b=2")
303
+
304
+ breadcrumb :basic
305
+ assert_equal "/about", breadcrumbs(:link_current_to_request_path => false).last.url
306
+ end
307
+
308
+ test "calling the breadcrumb method with wrong arguments" do
309
+ assert_nothing_raised do
310
+ breadcrumb :basic, test: 1
311
+ end
312
+
313
+ assert_raises ArgumentError do
314
+ breadcrumb
315
+ end
316
+
317
+ assert_raises ArgumentError do
318
+ breadcrumb(pretext: "bla")
319
+ end
320
+ end
321
+
322
+ test "inferred breadcrumb" do
323
+ breadcrumb Project.first
324
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <span class="current">Test Project</span></div>},
325
+ breadcrumbs.to_s
326
+ end
327
+
328
+ test "inferred parent" do
329
+ breadcrumb :with_inferred_parent
330
+
331
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <a href="/projects/1">Test Project</a> &rsaquo; <span class="current">Test</span></div>},
332
+ breadcrumbs.to_s
333
+ end
334
+
335
+ # Styles
336
+
337
+ test "default style" do
338
+ breadcrumb :basic
339
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <span class="current">About</span></div>},
340
+ breadcrumbs.to_s
341
+ end
342
+
343
+ test "ordered list style" do
344
+ breadcrumb :basic
345
+ assert_dom_equal %{<ol class="breadcrumbs"><li><a href="/">Home</a></li><li class="current">About</li></ol>},
346
+ breadcrumbs(style: :ol).to_s
347
+ end
348
+
349
+ test "unordered list style" do
350
+ breadcrumb :basic
351
+ assert_dom_equal %{<ul class="breadcrumbs"><li><a href="/">Home</a></li><li class="current">About</li></ul>},
352
+ breadcrumbs(style: :ul).to_s
353
+ end
354
+
355
+ test "bootstrap style" do
356
+ breadcrumb :basic
357
+ assert_dom_equal %{<ol class="breadcrumb"><li><a href="/">Home</a></li><li class="active">About</li></ol>},
358
+ breadcrumbs(style: :bootstrap).to_s
359
+ end
360
+
361
+ test "foundation5 style" do
362
+ breadcrumb :basic
363
+ assert_dom_equal %{<ul class="breadcrumbs"><li><a href="/">Home</a></li><li class="current">About</li></ul>},
364
+ breadcrumbs(style: :foundation5).to_s
365
+ end
366
+
367
+ test "custom container and fragment tags" do
368
+ breadcrumb :basic
369
+ assert_dom_equal %{<c class="breadcrumbs"><f><a href="/">Home</a></f> &rsaquo; <f class="current">About</f></c>},
370
+ breadcrumbs(container_tag: :c, fragment_tag: :f).to_s
371
+ end
372
+
373
+ test "custom semantic container and fragment tags" do
374
+ breadcrumb :basic
375
+ assert_dom_equal %Q{<c class="breadcrumbs"><f itemscope="#{itemscope_value}" itemtype="http://data-vocabulary.org/Breadcrumb"><a itemprop="url" href="/"><span itemprop="title">Home</span></a></f> &rsaquo; <f class="current" itemscope="#{itemscope_value}" itemtype="http://data-vocabulary.org/Breadcrumb"><span itemprop="title">About</span><meta itemprop="url" content="http://test.host/about" /></f></c>},
376
+ breadcrumbs(container_tag: :c, fragment_tag: :f, semantic: true).to_s
377
+ end
378
+
379
+ test "unknown style" do
380
+ breadcrumb :basic
381
+ assert_raises ArgumentError do
382
+ breadcrumbs(style: :nonexistent)
383
+ end
384
+ end
385
+
386
+ test "register style" do
387
+ Gretel.register_style :test_style, { container_tag: :one, fragment_tag: :two }
388
+
389
+ breadcrumb :basic
390
+
391
+ assert_dom_equal %{<one class="breadcrumbs"><two><a href="/">Home</a></two><two class="current">About</two></one>},
392
+ breadcrumbs(style: :test_style).to_s
393
+ end
394
+
395
+ # Configuration reload
396
+
397
+ test "reload configuration when file is changed" do
398
+ path = setup_loading_from_tmp_folder
399
+ Gretel.reload_environments << "test"
400
+
401
+ File.open(path.join("site.rb"), "w") do |f|
402
+ f.write <<-EOT
403
+ crumb :root do
404
+ link "Home (loaded)", root_path
405
+ end
406
+ crumb :about do
407
+ link "About (loaded)", about_path
408
+ end
409
+ EOT
410
+ end
411
+
412
+ breadcrumb :about
413
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home (loaded)</a> &rsaquo; <span class="current">About (loaded)</span></div>}, breadcrumbs.to_s
414
+
415
+ sleep 1 # File change interval is 1 second
416
+
417
+ File.open(path.join("site.rb"), "w") do |f|
418
+ f.write <<-EOT
419
+ crumb :root do
420
+ link "Home (reloaded)", "/test"
421
+ end
422
+ crumb :about do
423
+ link "About (reloaded)", "/reloaded"
424
+ end
425
+ EOT
426
+ end
427
+
428
+ breadcrumb :about
429
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/test">Home (reloaded)</a> &rsaquo; <span class="current">About (reloaded)</span></div>}, breadcrumbs.to_s
430
+ end
431
+
432
+ test "reload configuration when file is added" do
433
+ path = setup_loading_from_tmp_folder
434
+ Gretel.reload_environments << "test"
435
+
436
+ File.open(path.join("site.rb"), "w") do |f|
437
+ f.write <<-EOT
438
+ crumb :root do
439
+ link "Home (loaded)", root_path
440
+ end
441
+ EOT
442
+ end
443
+
444
+ assert_raises ArgumentError do
445
+ breadcrumb :about
446
+ breadcrumbs
447
+ end
448
+
449
+ File.open(path.join("pages.rb"), "w") do |f|
450
+ f.write <<-EOT
451
+ crumb :about do
452
+ link "About (loaded)", about_path
453
+ end
454
+ EOT
455
+ end
456
+
457
+ breadcrumb :about
458
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home (loaded)</a> &rsaquo; <span class="current">About (loaded)</span></div>}, breadcrumbs.to_s
459
+ end
460
+
461
+ test "reload configuration when file is deleted" do
462
+ path = setup_loading_from_tmp_folder
463
+ Gretel.reload_environments << "test"
464
+
465
+ File.open(path.join("site.rb"), "w") do |f|
466
+ f.write <<-EOT
467
+ crumb :root do
468
+ link "Home (loaded)", root_path
469
+ end
470
+ crumb :about do
471
+ link "About (loaded)", about_path
472
+ end
473
+ EOT
474
+ end
475
+
476
+ File.open(path.join("pages.rb"), "w") do |f|
477
+ f.write <<-EOT
478
+ crumb :contact do
479
+ link "Contact (loaded)", "/contact"
480
+ parent :about
481
+ end
482
+ EOT
483
+ end
484
+
485
+ breadcrumb :contact
486
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home (loaded)</a> &rsaquo; <a href="/about">About (loaded)</a> &rsaquo; <span class="current">Contact (loaded)</span></div>}, breadcrumbs.to_s
487
+
488
+ File.delete path.join("pages.rb")
489
+
490
+ assert_raises ArgumentError do
491
+ breadcrumb :contact
492
+ breadcrumbs
493
+ end
494
+
495
+ breadcrumb :about
496
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home (loaded)</a> &rsaquo; <span class="current">About (loaded)</span></div>}, breadcrumbs.to_s
497
+ end
498
+
499
+ test "reloads only in development environment" do
500
+ path = setup_loading_from_tmp_folder
501
+
502
+ assert_equal ["development"], Gretel.reload_environments
503
+
504
+ File.open(path.join("site.rb"), "w") do |f|
505
+ f.write <<-EOT
506
+ crumb :root do
507
+ link "Home (loaded)", root_path
508
+ end
509
+ crumb :about do
510
+ link "About (loaded)", about_path
511
+ end
512
+ EOT
513
+ end
514
+
515
+ breadcrumb :about
516
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home (loaded)</a> &rsaquo; <span class="current">About (loaded)</span></div>}, breadcrumbs.to_s
517
+
518
+ sleep 1
519
+
520
+ File.open(path.join("site.rb"), "w") do |f|
521
+ f.write <<-EOT
522
+ crumb :root do
523
+ link "Home (reloaded)", "/test"
524
+ end
525
+ crumb :about do
526
+ link "About (reloaded)", "/reloaded"
527
+ end
528
+ EOT
529
+ end
530
+
531
+ breadcrumb :about
532
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home (loaded)</a> &rsaquo; <span class="current">About (loaded)</span></div>}, breadcrumbs.to_s
533
+ end
534
+
535
+ private
536
+
537
+ def setup_loading_from_tmp_folder
538
+ path = Rails.root.join("tmp", "testcrumbs")
539
+ FileUtils.rm_rf path
540
+ FileUtils.mkdir_p path
541
+
542
+ Gretel.breadcrumb_paths = [path.join("*.rb")]
543
+
544
+ path
545
+ end
546
+ end