dat_gretel 4.0.1

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 (76) 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 +359 -0
  8. data/Rakefile +10 -0
  9. data/dat_gretel.gemspec +22 -0
  10. data/gemfiles/Gemfile-rails.3.1.x +19 -0
  11. data/gemfiles/Gemfile-rails.3.2.x +19 -0
  12. data/gemfiles/Gemfile-rails.4.0.x +19 -0
  13. data/gemfiles/Gemfile-rails.4.1.x +19 -0
  14. data/gemfiles/Gemfile-rails.5.2.x +19 -0
  15. data/lib/dat_gretel.rb +82 -0
  16. data/lib/dat_gretel/crumb.rb +70 -0
  17. data/lib/dat_gretel/crumbs.rb +64 -0
  18. data/lib/dat_gretel/deprecated.rb +1 -0
  19. data/lib/dat_gretel/deprecated/default_style_key.rb +25 -0
  20. data/lib/dat_gretel/deprecated/layout.rb +15 -0
  21. data/lib/dat_gretel/deprecated/show_root_alone.rb +27 -0
  22. data/lib/dat_gretel/deprecated/yield_links.rb +44 -0
  23. data/lib/dat_gretel/link.rb +40 -0
  24. data/lib/dat_gretel/renderer.rb +259 -0
  25. data/lib/dat_gretel/resettable.rb +13 -0
  26. data/lib/dat_gretel/version.rb +3 -0
  27. data/lib/dat_gretel/view_helpers.rb +71 -0
  28. data/lib/generators/dat_gretel/USAGE +8 -0
  29. data/lib/generators/dat_gretel/install_generator.rb +12 -0
  30. data/lib/generators/dat_gretel/templates/breadcrumbs.rb +28 -0
  31. data/test/dat_gretel_test.rb +24 -0
  32. data/test/deprecated_test.rb +45 -0
  33. data/test/dummy/Rakefile +7 -0
  34. data/test/dummy/app/assets/javascripts/application.js +15 -0
  35. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  36. data/test/dummy/app/controllers/application_controller.rb +3 -0
  37. data/test/dummy/app/helpers/application_helper.rb +5 -0
  38. data/test/dummy/app/mailers/.gitkeep +0 -0
  39. data/test/dummy/app/models/.gitkeep +0 -0
  40. data/test/dummy/app/models/issue.rb +3 -0
  41. data/test/dummy/app/models/project.rb +3 -0
  42. data/test/dummy/app/views/breadcrumbs/site.rb +3 -0
  43. data/test/dummy/config.ru +4 -0
  44. data/test/dummy/config/application.rb +14 -0
  45. data/test/dummy/config/boot.rb +10 -0
  46. data/test/dummy/config/breadcrumbs.rb +3 -0
  47. data/test/dummy/config/breadcrumbs/test_crumbs.rb +85 -0
  48. data/test/dummy/config/database.yml +25 -0
  49. data/test/dummy/config/environment.rb +5 -0
  50. data/test/dummy/config/environments/development.rb +2 -0
  51. data/test/dummy/config/environments/production.rb +2 -0
  52. data/test/dummy/config/environments/test.rb +2 -0
  53. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  54. data/test/dummy/config/initializers/inflections.rb +15 -0
  55. data/test/dummy/config/initializers/mime_types.rb +5 -0
  56. data/test/dummy/config/initializers/secret_token.rb +7 -0
  57. data/test/dummy/config/initializers/session_store.rb +8 -0
  58. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  59. data/test/dummy/config/locales/en.yml +5 -0
  60. data/test/dummy/config/routes.rb +11 -0
  61. data/test/dummy/db/migrate/20130122163007_create_projects.rb +9 -0
  62. data/test/dummy/db/migrate/20130122163051_create_issues.rb +10 -0
  63. data/test/dummy/db/schema.rb +28 -0
  64. data/test/dummy/lib/assets/.gitkeep +0 -0
  65. data/test/dummy/log/.gitkeep +0 -0
  66. data/test/dummy/public/404.html +26 -0
  67. data/test/dummy/public/422.html +26 -0
  68. data/test/dummy/public/500.html +25 -0
  69. data/test/dummy/public/favicon.ico +0 -0
  70. data/test/dummy/script/rails +6 -0
  71. data/test/fixtures/issues.yml +4 -0
  72. data/test/fixtures/projects.yml +3 -0
  73. data/test/gretel_test.rb +24 -0
  74. data/test/helper_methods_test.rb +552 -0
  75. data/test/test_helper.rb +15 -0
  76. metadata +193 -0
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The change you wanted was rejected (422)</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/422.html -->
21
+ <div class="dialog">
22
+ <h1>The change you wanted was rejected.</h1>
23
+ <p>Maybe you tried to change something you didn't have access to.</p>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -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,552 @@
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 fragment class" do
139
+ breadcrumb :basic
140
+ assert_dom_equal %{<div class="breadcrumbs"><a class="custom_fragment_class" href="/">Home</a> &rsaquo; <span class="current">About</span></div>},
141
+ breadcrumbs(fragment_class: "custom_fragment_class").to_s
142
+ end
143
+
144
+ test "custom pretext class" do
145
+ breadcrumb :basic
146
+ 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>},
147
+ breadcrumbs(pretext: "You are here:", pretext_class: "custom_pretext_class").to_s
148
+ end
149
+
150
+ test "custom posttext class" do
151
+ breadcrumb :basic
152
+ 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>},
153
+ breadcrumbs(posttext: "after breadcrumbs", posttext_class: "custom_posttext_class").to_s
154
+ end
155
+
156
+ test "unsafe html" do
157
+ breadcrumb :with_unsafe_html
158
+ 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>},
159
+ breadcrumbs.to_s
160
+ end
161
+
162
+ test "safe html" do
163
+ breadcrumb :with_safe_html
164
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <span class="current">Test <strong>bold text</strong></span></div>},
165
+ breadcrumbs.to_s
166
+ end
167
+
168
+ test "parent breadcrumb" do
169
+ breadcrumb :multiple_links_with_parent
170
+
171
+ parent = parent_breadcrumb
172
+ assert_equal [:multiple_links_with_parent, "Contact", "/about/contact"],
173
+ [parent.key, parent.text, parent.url]
174
+ end
175
+
176
+ test "yields parent breadcrumb" do
177
+ breadcrumb :multiple_links_with_parent
178
+
179
+ out = parent_breadcrumb do |parent|
180
+ [parent.key, parent.text, parent.url]
181
+ end
182
+ assert_equal [:multiple_links_with_parent, "Contact", "/about/contact"],
183
+ out
184
+ end
185
+
186
+ test "parent breadcrumb returns nil if not present" do
187
+ breadcrumb :basic
188
+
189
+ assert_nil parent_breadcrumb(autoroot: false)
190
+ end
191
+
192
+ test "parent breadcrumb yields only if present" do
193
+ breadcrumb :basic
194
+
195
+ out = parent_breadcrumb(autoroot: false) do
196
+ "yielded"
197
+ end
198
+
199
+ assert_nil out
200
+ end
201
+
202
+ test "link keys" do
203
+ breadcrumb :basic
204
+ assert_equal [:root, :basic], breadcrumbs.keys
205
+ end
206
+
207
+ test "using breadcrumbs as array" do
208
+ breadcrumb :basic
209
+
210
+ breadcrumbs.tap do |links|
211
+ assert_kind_of Array, links
212
+ assert_equal 2, links.count
213
+ end
214
+ end
215
+
216
+ test "sets current on last link in array" do
217
+ breadcrumb :multiple_links_with_parent
218
+ assert_equal [false, false, false, true], breadcrumbs.map(&:current?)
219
+ end
220
+
221
+ test "passing options to links" do
222
+ breadcrumb :with_link_options
223
+
224
+ breadcrumbs(autoroot: false).tap do |links|
225
+ links[0].tap do |link|
226
+ assert link.title?
227
+ assert_equal "My Title", link.title
228
+
229
+ assert link.other?
230
+ assert_equal "Other Option", link.other
231
+
232
+ assert !link.nonexistent?
233
+ assert_nil link.nonexistent
234
+ end
235
+
236
+ links[1].tap do |link|
237
+ assert link.some_option?
238
+ assert_equal "Test", link.some_option
239
+ end
240
+ end
241
+
242
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/about">Test</a> &rsaquo; <span class="current">Other Link</span></div>},
243
+ breadcrumbs(autoroot: false).to_s
244
+ end
245
+
246
+ test "without link" do
247
+ breadcrumb :without_link
248
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; Also without link &rsaquo; <span class="current">Without link</span></div>},
249
+ breadcrumbs.to_s
250
+ end
251
+
252
+ test "view context" do
253
+ breadcrumb :using_view_helper
254
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <span class="current">TestTest</span></div>},
255
+ breadcrumbs.to_s
256
+ end
257
+
258
+ test "multiple arguments" do
259
+ breadcrumb :with_multiple_arguments, "One", "Two", "Three"
260
+ 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>},
261
+ breadcrumbs.to_s
262
+ end
263
+
264
+ test "from views folder" do
265
+ breadcrumb :from_views
266
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <span class="current">Breadcrumb From View</span></div>},
267
+ breadcrumbs.to_s
268
+ end
269
+
270
+ test "with_breadcrumb" do
271
+ breadcrumb :basic
272
+
273
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <span class="current">About</span></div>},
274
+ breadcrumbs.to_s
275
+
276
+ with_breadcrumb(:with_parent_object, issues(:one)) do
277
+ 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>},
278
+ breadcrumbs.to_s
279
+ end
280
+
281
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <span class="current">About</span></div>},
282
+ breadcrumbs.to_s
283
+ end
284
+
285
+ test "calling breadcrumbs helper twice" do
286
+ breadcrumb :with_parent
287
+ 2.times do
288
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <a href="/about">About</a> &rsaquo; <span class="current">Contact</span></div>},
289
+ breadcrumbs.to_s
290
+ end
291
+ end
292
+
293
+ test "breadcrumb not found" do
294
+ assert_raises ArgumentError do
295
+ breadcrumb :nonexistent
296
+ breadcrumbs
297
+ end
298
+ end
299
+
300
+ test "current link url is set to fullpath" do
301
+ self.request = OpenStruct.new(fullpath: "/testpath?a=1&b=2")
302
+
303
+ breadcrumb :basic
304
+ assert_equal "/testpath?a=1&b=2", breadcrumbs.last.url
305
+ end
306
+
307
+ test "current link url is not set to fullpath using link_current_to_request_path=false" do
308
+ self.request = OpenStruct.new(fullpath: "/testpath?a=1&b=2")
309
+
310
+ breadcrumb :basic
311
+ assert_equal "/about", breadcrumbs(:link_current_to_request_path => false).last.url
312
+ end
313
+
314
+ test "calling the breadcrumb method with wrong arguments" do
315
+ assert_nothing_raised do
316
+ breadcrumb :basic, test: 1
317
+ end
318
+
319
+ assert_raises ArgumentError do
320
+ breadcrumb
321
+ end
322
+
323
+ assert_raises ArgumentError do
324
+ breadcrumb(pretext: "bla")
325
+ end
326
+ end
327
+
328
+ test "inferred breadcrumb" do
329
+ breadcrumb Project.first
330
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <span class="current">Test Project</span></div>},
331
+ breadcrumbs.to_s
332
+ end
333
+
334
+ test "inferred parent" do
335
+ breadcrumb :with_inferred_parent
336
+
337
+ 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>},
338
+ breadcrumbs.to_s
339
+ end
340
+
341
+ # Styles
342
+
343
+ test "default style" do
344
+ breadcrumb :basic
345
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; <span class="current">About</span></div>},
346
+ breadcrumbs.to_s
347
+ end
348
+
349
+ test "ordered list style" do
350
+ breadcrumb :basic
351
+ assert_dom_equal %{<ol class="breadcrumbs"><li><a href="/">Home</a></li><li class="current">About</li></ol>},
352
+ breadcrumbs(style: :ol).to_s
353
+ end
354
+
355
+ test "unordered list style" do
356
+ breadcrumb :basic
357
+ assert_dom_equal %{<ul class="breadcrumbs"><li><a href="/">Home</a></li><li class="current">About</li></ul>},
358
+ breadcrumbs(style: :ul).to_s
359
+ end
360
+
361
+ test "bootstrap style" do
362
+ breadcrumb :basic
363
+ assert_dom_equal %{<ol class="breadcrumb"><li class="breadcrumb-item"><a href="/">Home</a></li><li class="breadcrumb-item active">About</li></ol>},
364
+ breadcrumbs(style: :bootstrap).to_s
365
+ end
366
+
367
+ test "foundation5 style" do
368
+ breadcrumb :basic
369
+ assert_dom_equal %{<ul class="breadcrumbs"><li><a href="/">Home</a></li><li class="current">About</li></ul>},
370
+ breadcrumbs(style: :foundation5).to_s
371
+ end
372
+
373
+ test "custom container and fragment tags" do
374
+ breadcrumb :basic
375
+ assert_dom_equal %{<c class="breadcrumbs"><f><a href="/">Home</a></f> &rsaquo; <f class="current">About</f></c>},
376
+ breadcrumbs(container_tag: :c, fragment_tag: :f).to_s
377
+ end
378
+
379
+ test "custom semantic container and fragment tags" do
380
+ breadcrumb :basic
381
+ 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>},
382
+ breadcrumbs(container_tag: :c, fragment_tag: :f, semantic: true).to_s
383
+ end
384
+
385
+ test "unknown style" do
386
+ breadcrumb :basic
387
+ assert_raises ArgumentError do
388
+ breadcrumbs(style: :nonexistent)
389
+ end
390
+ end
391
+
392
+ test "register style" do
393
+ Gretel.register_style :test_style, { container_tag: :one, fragment_tag: :two }
394
+
395
+ breadcrumb :basic
396
+
397
+ assert_dom_equal %{<one class="breadcrumbs"><two><a href="/">Home</a></two><two class="current">About</two></one>},
398
+ breadcrumbs(style: :test_style).to_s
399
+ end
400
+
401
+ # Configuration reload
402
+
403
+ test "reload configuration when file is changed" do
404
+ path = setup_loading_from_tmp_folder
405
+ Gretel.reload_environments << "test"
406
+
407
+ File.open(path.join("site.rb"), "w") do |f|
408
+ f.write <<-EOT
409
+ crumb :root do
410
+ link "Home (loaded)", root_path
411
+ end
412
+ crumb :about do
413
+ link "About (loaded)", about_path
414
+ end
415
+ EOT
416
+ end
417
+
418
+ breadcrumb :about
419
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home (loaded)</a> &rsaquo; <span class="current">About (loaded)</span></div>}, breadcrumbs.to_s
420
+
421
+ sleep 1 # File change interval is 1 second
422
+
423
+ File.open(path.join("site.rb"), "w") do |f|
424
+ f.write <<-EOT
425
+ crumb :root do
426
+ link "Home (reloaded)", "/test"
427
+ end
428
+ crumb :about do
429
+ link "About (reloaded)", "/reloaded"
430
+ end
431
+ EOT
432
+ end
433
+
434
+ breadcrumb :about
435
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/test">Home (reloaded)</a> &rsaquo; <span class="current">About (reloaded)</span></div>}, breadcrumbs.to_s
436
+ end
437
+
438
+ test "reload configuration when file is added" do
439
+ path = setup_loading_from_tmp_folder
440
+ Gretel.reload_environments << "test"
441
+
442
+ File.open(path.join("site.rb"), "w") do |f|
443
+ f.write <<-EOT
444
+ crumb :root do
445
+ link "Home (loaded)", root_path
446
+ end
447
+ EOT
448
+ end
449
+
450
+ assert_raises ArgumentError do
451
+ breadcrumb :about
452
+ breadcrumbs
453
+ end
454
+
455
+ File.open(path.join("pages.rb"), "w") do |f|
456
+ f.write <<-EOT
457
+ crumb :about do
458
+ link "About (loaded)", about_path
459
+ end
460
+ EOT
461
+ end
462
+
463
+ breadcrumb :about
464
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home (loaded)</a> &rsaquo; <span class="current">About (loaded)</span></div>}, breadcrumbs.to_s
465
+ end
466
+
467
+ test "reload configuration when file is deleted" do
468
+ path = setup_loading_from_tmp_folder
469
+ Gretel.reload_environments << "test"
470
+
471
+ File.open(path.join("site.rb"), "w") do |f|
472
+ f.write <<-EOT
473
+ crumb :root do
474
+ link "Home (loaded)", root_path
475
+ end
476
+ crumb :about do
477
+ link "About (loaded)", about_path
478
+ end
479
+ EOT
480
+ end
481
+
482
+ File.open(path.join("pages.rb"), "w") do |f|
483
+ f.write <<-EOT
484
+ crumb :contact do
485
+ link "Contact (loaded)", "/contact"
486
+ parent :about
487
+ end
488
+ EOT
489
+ end
490
+
491
+ breadcrumb :contact
492
+ 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
493
+
494
+ File.delete path.join("pages.rb")
495
+
496
+ assert_raises ArgumentError do
497
+ breadcrumb :contact
498
+ breadcrumbs
499
+ end
500
+
501
+ breadcrumb :about
502
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home (loaded)</a> &rsaquo; <span class="current">About (loaded)</span></div>}, breadcrumbs.to_s
503
+ end
504
+
505
+ test "reloads only in development environment" do
506
+ path = setup_loading_from_tmp_folder
507
+
508
+ assert_equal ["development"], Gretel.reload_environments
509
+
510
+ File.open(path.join("site.rb"), "w") do |f|
511
+ f.write <<-EOT
512
+ crumb :root do
513
+ link "Home (loaded)", root_path
514
+ end
515
+ crumb :about do
516
+ link "About (loaded)", about_path
517
+ end
518
+ EOT
519
+ end
520
+
521
+ breadcrumb :about
522
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home (loaded)</a> &rsaquo; <span class="current">About (loaded)</span></div>}, breadcrumbs.to_s
523
+
524
+ sleep 1
525
+
526
+ File.open(path.join("site.rb"), "w") do |f|
527
+ f.write <<-EOT
528
+ crumb :root do
529
+ link "Home (reloaded)", "/test"
530
+ end
531
+ crumb :about do
532
+ link "About (reloaded)", "/reloaded"
533
+ end
534
+ EOT
535
+ end
536
+
537
+ breadcrumb :about
538
+ assert_dom_equal %{<div class="breadcrumbs"><a href="/">Home (loaded)</a> &rsaquo; <span class="current">About (loaded)</span></div>}, breadcrumbs.to_s
539
+ end
540
+
541
+ private
542
+
543
+ def setup_loading_from_tmp_folder
544
+ path = Rails.root.join("tmp", "testcrumbs")
545
+ FileUtils.rm_rf path
546
+ FileUtils.mkdir_p path
547
+
548
+ Gretel.breadcrumb_paths = [path.join("*.rb")]
549
+
550
+ path
551
+ end
552
+ end