jordanyeo-simple-navigation 3.11.0

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 (52) hide show
  1. data/CHANGELOG +265 -0
  2. data/Gemfile +17 -0
  3. data/README +22 -0
  4. data/Rakefile +47 -0
  5. data/VERSION +1 -0
  6. data/generators/navigation_config/USAGE +1 -0
  7. data/generators/navigation_config/navigation_config_generator.rb +8 -0
  8. data/generators/navigation_config/templates/config/navigation.rb +76 -0
  9. data/lib/generators/navigation_config/navigation_config_generator.rb +12 -0
  10. data/lib/simple-navigation.rb +1 -0
  11. data/lib/simple_navigation.rb +167 -0
  12. data/lib/simple_navigation/adapters.rb +10 -0
  13. data/lib/simple_navigation/adapters/base.rb +37 -0
  14. data/lib/simple_navigation/adapters/nanoc.rb +45 -0
  15. data/lib/simple_navigation/adapters/padrino.rb +20 -0
  16. data/lib/simple_navigation/adapters/rails.rb +93 -0
  17. data/lib/simple_navigation/adapters/sinatra.rb +69 -0
  18. data/lib/simple_navigation/core.rb +5 -0
  19. data/lib/simple_navigation/core/configuration.rb +72 -0
  20. data/lib/simple_navigation/core/item.rb +144 -0
  21. data/lib/simple_navigation/core/item_adapter.rb +63 -0
  22. data/lib/simple_navigation/core/item_container.rb +147 -0
  23. data/lib/simple_navigation/core/items_provider.rb +35 -0
  24. data/lib/simple_navigation/rails_controller_methods.rb +144 -0
  25. data/lib/simple_navigation/rendering.rb +12 -0
  26. data/lib/simple_navigation/rendering/helpers.rb +123 -0
  27. data/lib/simple_navigation/rendering/renderer/base.rb +107 -0
  28. data/lib/simple_navigation/rendering/renderer/breadcrumbs.rb +59 -0
  29. data/lib/simple_navigation/rendering/renderer/json.rb +29 -0
  30. data/lib/simple_navigation/rendering/renderer/links.rb +32 -0
  31. data/lib/simple_navigation/rendering/renderer/list.rb +29 -0
  32. data/lib/simple_navigation/rendering/renderer/text.rb +26 -0
  33. data/rails/init.rb +1 -0
  34. data/spec/lib/simple_navigation/adapters/padrino_spec.rb +31 -0
  35. data/spec/lib/simple_navigation/adapters/rails_spec.rb +287 -0
  36. data/spec/lib/simple_navigation/adapters/sinatra_spec.rb +80 -0
  37. data/spec/lib/simple_navigation/core/configuration_spec.rb +128 -0
  38. data/spec/lib/simple_navigation/core/item_adapter_spec.rb +212 -0
  39. data/spec/lib/simple_navigation/core/item_container_spec.rb +451 -0
  40. data/spec/lib/simple_navigation/core/item_spec.rb +566 -0
  41. data/spec/lib/simple_navigation/core/items_provider_spec.rb +60 -0
  42. data/spec/lib/simple_navigation/rails_controller_methods_spec.rb +249 -0
  43. data/spec/lib/simple_navigation/rendering/helpers_spec.rb +276 -0
  44. data/spec/lib/simple_navigation/rendering/renderer/base_spec.rb +199 -0
  45. data/spec/lib/simple_navigation/rendering/renderer/breadcrumbs_spec.rb +101 -0
  46. data/spec/lib/simple_navigation/rendering/renderer/json_spec.rb +48 -0
  47. data/spec/lib/simple_navigation/rendering/renderer/links_spec.rb +64 -0
  48. data/spec/lib/simple_navigation/rendering/renderer/list_spec.rb +211 -0
  49. data/spec/lib/simple_navigation/rendering/renderer/text_spec.rb +41 -0
  50. data/spec/lib/simple_navigation_spec.rb +307 -0
  51. data/spec/spec_helper.rb +108 -0
  52. metadata +199 -0
@@ -0,0 +1,566 @@
1
+ require 'spec_helper'
2
+
3
+ describe SimpleNavigation::Item do
4
+
5
+ before(:each) do
6
+ @item_container = stub(:item_container, :level => 1, :selected_class => nil).as_null_object
7
+ @item = SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', {})
8
+ @adapter = stub(:adapter)
9
+ SimpleNavigation.stub!(:adapter => @adapter)
10
+ end
11
+
12
+ describe 'initialize' do
13
+ context 'subnavigation' do
14
+ before(:each) do
15
+ @subnav_container = stub(:subnav_container).as_null_object
16
+ SimpleNavigation::ItemContainer.stub!(:new => @subnav_container)
17
+ end
18
+ context 'block given' do
19
+ it "should create a new ItemContainer with a level+1" do
20
+ SimpleNavigation::ItemContainer.should_receive(:new).with(2)
21
+ SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', {}) {}
22
+ end
23
+ it "should call the block" do
24
+ @subnav_container.should_receive(:test)
25
+ SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', {}) {|subnav| subnav.test}
26
+ end
27
+ end
28
+ context 'no block given' do
29
+ context 'items given' do
30
+ before(:each) do
31
+ @items = stub(:items)
32
+ end
33
+ it "should create a new ItemContainer with a level+1" do
34
+ SimpleNavigation::ItemContainer.should_receive(:new).with(2)
35
+ SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', {}, @items)
36
+ end
37
+ it "should set the items on the subnav_container" do
38
+ @subnav_container.should_receive(:items=).with(@items)
39
+ SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', {}, @items)
40
+ end
41
+ end
42
+ context 'no items given' do
43
+ it "should not create a new ItemContainer" do
44
+ SimpleNavigation::ItemContainer.should_not_receive(:new)
45
+ @item = SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', {})
46
+ end
47
+ end
48
+ end
49
+ end
50
+ context ':method option' do
51
+ context 'defined' do
52
+ before(:each) do
53
+ @options = {:method => :delete}
54
+ @item = SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', @options)
55
+ end
56
+ it 'should set the method as instance_var' do
57
+ @item.method.should == :delete
58
+ end
59
+ it 'should set the html-options without the method' do
60
+ @item.instance_variable_get(:@html_options).key?(:method).should be_false
61
+ end
62
+ end
63
+
64
+ context 'undefined' do
65
+ it 'should set the instance-var to nil' do
66
+ @item.method.should be_nil
67
+ end
68
+ end
69
+ end
70
+
71
+ context 'setting class and id on the container' do
72
+ before(:each) do
73
+ @options = {:container_class => 'container_class', :container_id => 'container_id'}
74
+ end
75
+ it {@item_container.should_receive(:dom_class=).with('container_class')}
76
+ it {@item_container.should_receive(:dom_id=).with('container_id')}
77
+ after(:each) do
78
+ SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', @options)
79
+ end
80
+ end
81
+
82
+ context ':highlights_on option' do
83
+ context 'defined' do
84
+ before(:each) do
85
+ @highlights_on = stub(:option)
86
+ @options = {:highlights_on => @highlights_on}
87
+ @item = SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', @options)
88
+ end
89
+ it 'should set the method as instance_var' do
90
+ @item.highlights_on.should == @highlights_on
91
+ end
92
+ it 'should set the html-options without the method' do
93
+ @item.instance_variable_get(:@html_options).key?(:highlights_on).should be_false
94
+ end
95
+ end
96
+
97
+ context 'undefined' do
98
+ it 'should set the instance-var to nil' do
99
+ @item.highlights_on.should be_nil
100
+ end
101
+ end
102
+ end
103
+
104
+ context 'url' do
105
+ context 'url is a string' do
106
+ before(:each) do
107
+ @item = SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', {})
108
+ end
109
+ it {@item.url.should == 'url'}
110
+ end
111
+ context 'url is a proc' do
112
+ before(:each) do
113
+ @item = SimpleNavigation::Item.new(@item_container, :my_key, 'name', Proc.new {"my_" + "url"}, {})
114
+ end
115
+ it {@item.url.should == 'my_url'}
116
+ end
117
+ context 'url is nil' do
118
+ before(:each) do
119
+ @item = SimpleNavigation::Item.new(@item_container, :my_key, 'name', nil, {})
120
+ end
121
+ it {@item.url.should == nil}
122
+ end
123
+ context 'url is unspecified' do
124
+ before(:each) do
125
+ @item = SimpleNavigation::Item.new(@item_container, :my_key, 'name')
126
+ end
127
+ it {@item.url.should == nil}
128
+ end
129
+ end
130
+
131
+ context 'optional url and optional options' do
132
+ context 'when constructed without any optional parameters' do
133
+ before(:each) do
134
+ @item = SimpleNavigation::Item.new(@item_container, :my_key, 'name')
135
+ end
136
+ it {@item.url.should == nil}
137
+ it {@item.instance_variable_get(:@html_options).should == {}}
138
+ end
139
+ context 'when constructed with only a url' do
140
+ before(:each) do
141
+ @item = SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url')
142
+ end
143
+ it {@item.url.should == 'url'}
144
+ it {@item.instance_variable_get(:@html_options).should == {}}
145
+ end
146
+ context 'when constructed with only options' do
147
+ before(:each) do
148
+ @item = SimpleNavigation::Item.new(@item_container, :my_key, 'name', {:option => true})
149
+ end
150
+ it {@item.url.should == nil}
151
+ it {@item.instance_variable_get(:@html_options).should == {:option => true}}
152
+ end
153
+ context 'when constructed with a url and options' do
154
+ before(:each) do
155
+ @item = SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', {:option => true})
156
+ end
157
+ it {@item.url.should == 'url'}
158
+ it {@item.instance_variable_get(:@html_options).should == {:option => true}}
159
+ end
160
+ end
161
+ end
162
+
163
+ describe 'name' do
164
+ before(:each) do
165
+ SimpleNavigation.config.stub!(:name_generator => Proc.new {|name| "<span>#{name}</span>"})
166
+ end
167
+ context 'default (generator is applied)' do
168
+ it {@item.name.should == "<span>name</span>"}
169
+ end
170
+ context 'generator is skipped' do
171
+ it {@item.name(:apply_generator => false).should == 'name'}
172
+ end
173
+ end
174
+
175
+ describe 'selected?' do
176
+ context 'explicitly selected' do
177
+ before(:each) do
178
+ @item.stub!(:selected_by_config? => true)
179
+ end
180
+ it {@item.should be_selected}
181
+ it "should not evaluate the subnav or urls" do
182
+ @item.should_not_receive(:selected_by_subnav?)
183
+ @item.should_not_receive(:selected_by_condition?)
184
+ @item.selected?
185
+ end
186
+ end
187
+ context 'not explicitly selected' do
188
+ before(:each) do
189
+ @item.stub!(:selected_by_config? => false)
190
+ end
191
+ context 'subnav is selected' do
192
+ before(:each) do
193
+ @item.stub!(:selected_by_subnav? => true)
194
+ end
195
+ it {@item.should be_selected}
196
+ end
197
+ context 'subnav is not selected' do
198
+ before(:each) do
199
+ @item.stub!(:selected_by_subnav? => false)
200
+ end
201
+ context 'selected by condition' do
202
+ before(:each) do
203
+ @item.stub!(:selected_by_condition? => true)
204
+ end
205
+ it {@item.should be_selected}
206
+ end
207
+ context 'not selected by condition' do
208
+ before(:each) do
209
+ @item.stub!(:selected_by_condition? => false)
210
+ end
211
+ it {@item.should_not be_selected}
212
+ end
213
+ end
214
+ end
215
+ end
216
+
217
+ describe 'selected_class' do
218
+ context 'selected_class is defined in context' do
219
+ before(:each) do
220
+ @item_container = stub(:item_container, :level => 1, :selected_class => 'context_defined').as_null_object
221
+ @item = SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', {})
222
+ @item.stub!(:selected? => true)
223
+ end
224
+ it {@item.instance_eval {selected_class.should == 'context_defined'}}
225
+ end
226
+ context 'item is selected' do
227
+ before(:each) do
228
+ @item.stub!(:selected? => true)
229
+ end
230
+ it {@item.instance_eval {selected_class.should == 'selected'}}
231
+ end
232
+
233
+ context 'item is not selected' do
234
+ before(:each) do
235
+ @item.stub!(:selected? => false)
236
+ end
237
+ it {@item.instance_eval {selected_class.should == nil}}
238
+ end
239
+ end
240
+
241
+ describe 'html_options' do
242
+ describe 'class' do
243
+ context 'with classes defined in options' do
244
+ before(:each) do
245
+ @options = {:class => 'my_class'}
246
+ @item = SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', @options)
247
+ end
248
+ context 'with item selected' do
249
+ before(:each) do
250
+ @item.stub!(:selected? => true, :selected_by_condition? => true)
251
+ end
252
+ it {@item.html_options[:class].should == 'my_class selected simple-navigation-active-leaf'}
253
+ end
254
+
255
+ context 'with item not selected' do
256
+ before(:each) do
257
+ @item.stub!(:selected? => false, :selected_by_condition? => false)
258
+ end
259
+ it {@item.html_options[:class].should == 'my_class'}
260
+ end
261
+ end
262
+
263
+ context 'without classes in options' do
264
+ before(:each) do
265
+ @options = {}
266
+ @item = SimpleNavigation::Item.new(@item_container, :my_key, 'name', 'url', @options)
267
+ end
268
+ context 'with item selected' do
269
+ before(:each) do
270
+ @item.stub!(:selected? => true, :selected_by_condition? => true)
271
+ end
272
+ it {@item.html_options[:class].should == 'selected simple-navigation-active-leaf'}
273
+ end
274
+
275
+ context 'with item not selected' do
276
+ before(:each) do
277
+ @item.stub!(:selected? => false, :selected_by_condition? => false)
278
+ end
279
+ it {@item.html_options[:class].should be_blank}
280
+ end
281
+ end
282
+
283
+ end
284
+
285
+ describe 'id' do
286
+ context 'with autogenerate_item_ids == true' do
287
+ before(:each) do
288
+ @item.stub!(:autogenerate_item_ids? => true)
289
+ @item.stub!(:selected? => false, :selected_by_condition? => false)
290
+ end
291
+ context 'with id defined in options' do
292
+ before(:each) do
293
+ @item.html_options = {:id => 'my_id'}
294
+ end
295
+ it {@item.html_options[:id].should == 'my_id'}
296
+ end
297
+
298
+ context 'with no id defined in options (using default id)' do
299
+ before(:each) do
300
+ @item.html_options = {}
301
+ end
302
+ it {@item.html_options[:id].should == 'my_key'}
303
+ end
304
+ end
305
+
306
+ context 'with autogenerate_item_ids == false' do
307
+ before(:each) do
308
+ @item.stub!(:autogenerate_item_ids? => false)
309
+ @item.stub!(:selected? => false, :selected_by_condition? => false)
310
+ end
311
+ context 'with id defined in options' do
312
+ before(:each) do
313
+ @item.html_options = {:id => 'my_id'}
314
+ end
315
+ it {@item.html_options[:id].should == 'my_id'}
316
+ end
317
+
318
+ context 'with no id definied in options (using default id)' do
319
+ before(:each) do
320
+ @item.html_options = {}
321
+ end
322
+ it {@item.html_options[:id].should be_nil}
323
+ end
324
+
325
+ end
326
+
327
+ end
328
+
329
+ end
330
+
331
+ describe 'selected_by_subnav?' do
332
+ context 'item has subnav' do
333
+ before(:each) do
334
+ @sub_navigation = stub(:sub_navigation)
335
+ @item.stub!(:sub_navigation => @sub_navigation)
336
+ end
337
+ it "should return true if subnav is selected" do
338
+ @sub_navigation.stub!(:selected? => true, :selected_by_condition? => true)
339
+ @item.should be_selected_by_subnav
340
+ end
341
+ it "should return false if subnav is not selected" do
342
+ @sub_navigation.stub!(:selected? => false, :selected_by_condition? => true)
343
+ @item.should_not be_selected_by_subnav
344
+ end
345
+ end
346
+ context 'item does not have subnav' do
347
+ before(:each) do
348
+ @item.stub!(:sub_navigation => @sub_navigation)
349
+ end
350
+ it {@item.should_not be_selected_by_subnav}
351
+ end
352
+ end
353
+
354
+ describe 'selected_by_condition?' do
355
+ context ':highlights_on option is set' do
356
+ before(:each) do
357
+ @item.stub!(:highlights_on => /^\/current/)
358
+ SimpleNavigation.stub!(:request_uri => '/current_url')
359
+ end
360
+ it "should not check for autohighlighting" do
361
+ @item.should_not_receive(:auto_highlight?)
362
+ @item.send(:selected_by_condition?)
363
+ end
364
+ context ':highlights_on is a regexp' do
365
+ context 'regexp matches current_url' do
366
+ it {@item.send(:selected_by_condition?).should be_true}
367
+ end
368
+ context 'regexp does not match current_url' do
369
+ before(:each) do
370
+ @item.stub!(:highlights_on => /^\/no_match/)
371
+ end
372
+ it {@item.send(:selected_by_condition?).should be_false}
373
+ end
374
+ end
375
+ context ':highlights_on is a lambda' do
376
+ context 'truthy lambda results in selection' do
377
+ before(:each) do
378
+ @item.stub!(:highlights_on => lambda{true})
379
+ end
380
+ it {@item.send(:selected_by_condition?).should be_true}
381
+ end
382
+ context 'falsey lambda results in no selection' do
383
+ before(:each) do
384
+ @item.stub!(:highlights_on => lambda{false})
385
+ end
386
+ it {@item.send(:selected_by_condition?).should be_false}
387
+ end
388
+ end
389
+ context ':highlights_on is :subpath' do
390
+ before(:each) do
391
+ @item.stub!(:url => '/resources')
392
+ @item.stub!(:highlights_on => :subpath)
393
+ end
394
+ context 'we are in a route beginning with this item path' do
395
+ before(:each) do
396
+ SimpleNavigation.stub!(:request_uri => '/resources/id')
397
+ end
398
+ it {@item.send(:selected_by_condition?).should be_true}
399
+ end
400
+ context 'we are in a route that has a similar name' do
401
+ before(:each) do
402
+ SimpleNavigation.stub!(:request_uri => '/resources_group/id')
403
+ end
404
+ it {@item.send(:selected_by_condition?).should be_false}
405
+ end
406
+ context 'we are in a route not beginning with this item path' do
407
+ before(:each) do
408
+ SimpleNavigation.stub!(:request_uri => '/another_resource/id')
409
+ end
410
+ it {@item.send(:selected_by_condition?).should be_false}
411
+ end
412
+ end
413
+ context ':highlights_on is not a regexp or a proc' do
414
+ before(:each) do
415
+ @item.stub!(:highlights_on => "not a regexp")
416
+ end
417
+ it "should raise an error" do
418
+ lambda {@item.send(:selected_by_condition?).should raise_error(ArgumentError)}
419
+ end
420
+ end
421
+ end
422
+ context ':highlights_on option is not set' do
423
+ before(:each) do
424
+ @item.stub!(:highlights_on => nil)
425
+ end
426
+ it "should check for autohighlighting" do
427
+ @item.should_receive(:auto_highlight?)
428
+ @item.send(:selected_by_condition?)
429
+ end
430
+ end
431
+ context 'auto_highlight is turned on' do
432
+ before(:each) do
433
+ @item.stub!(:auto_highlight? => true)
434
+ end
435
+ context 'root path matches' do
436
+ before(:each) do
437
+ @item.stub!(:root_path_match? => true)
438
+ end
439
+ it {@item.send(:selected_by_condition?).should be_true}
440
+ end
441
+ context 'root path does not match' do
442
+ before(:each) do
443
+ @item.stub!(:root_path_match? => false)
444
+ end
445
+ context 'current request url matches url' do
446
+ before(:each) do
447
+ @adapter.stub!(:current_page? => true)
448
+ end
449
+ it "should test with the item's url" do
450
+ @adapter.should_receive(:current_page?).with('url')
451
+ @item.send(:selected_by_condition?)
452
+ end
453
+ it "should remove anchors before testing the item's url" do
454
+ @item.stub!(:url => 'url#anchor')
455
+ @adapter.should_receive(:current_page?).with('url')
456
+ @item.send(:selected_by_condition?)
457
+ end
458
+ it "should not be queried when url is nil" do
459
+ @item.stub!(:url => nil)
460
+ @adapter.should_not_receive(:current_page?)
461
+ @item.send(:selected_by_condition?)
462
+ end
463
+ it {@item.send(:selected_by_condition?).should be_true}
464
+ end
465
+ context 'no match' do
466
+ before(:each) do
467
+ @adapter.stub!(:current_page? => false)
468
+ end
469
+ it {@item.send(:selected_by_condition?).should be_false}
470
+ end
471
+ end
472
+ end
473
+ context 'auto_highlight is turned off' do
474
+ before(:each) do
475
+ @item.stub!(:auto_highlight? => false)
476
+ end
477
+ it {@item.send(:selected_by_condition?).should be_false}
478
+ end
479
+ end
480
+
481
+ describe 'root_path_match?' do
482
+ it "should match if both url == /" do
483
+ @adapter.stub!(:request_path => '/')
484
+ @item.stub!(:url => '/')
485
+ @item.send(:root_path_match?).should be_true
486
+ end
487
+ it "should not match if item url is not /" do
488
+ @adapter.stub(:request_path => '/')
489
+ @item.stub!(:url => '/bla')
490
+ @item.send(:root_path_match?).should be_false
491
+ end
492
+ it "should not match if request url is not /" do
493
+ @adapter.stub(:request_path => '/bla')
494
+ @item.stub!(:url => '/')
495
+ @item.send(:root_path_match?).should be_false
496
+ end
497
+ it "should not match if urls do not match" do
498
+ @adapter.stub(:request_path => 'bla')
499
+ @item.stub!(:url => '/bli')
500
+ @item.send(:root_path_match?).should be_false
501
+ end
502
+ it "should not match if url is nil" do
503
+ @adapter.stub(:request_path => 'bla')
504
+ @item.stub!(:url => nil)
505
+ @item.send(:root_path_match?).should be_false
506
+ end
507
+ end
508
+
509
+ describe 'auto_highlight?' do
510
+ before(:each) do
511
+ @global = stub(:config)
512
+ SimpleNavigation.stub!(:config => @global)
513
+ end
514
+ context 'global auto_highlight on' do
515
+ before(:each) do
516
+ @global.stub!(:auto_highlight => true)
517
+ end
518
+ context 'container auto_highlight on' do
519
+ before(:each) do
520
+ @item_container.stub!(:auto_highlight => true)
521
+ end
522
+ it {@item.send(:auto_highlight?).should be_true}
523
+ end
524
+ context 'container auto_highlight off' do
525
+ before(:each) do
526
+ @item_container.stub!(:auto_highlight => false)
527
+ end
528
+ it {@item.send(:auto_highlight?).should be_false}
529
+ end
530
+ end
531
+ context 'global auto_highlight off' do
532
+ before(:each) do
533
+ @global.stub!(:auto_highlight => false)
534
+ end
535
+ context 'container auto_highlight on' do
536
+ before(:each) do
537
+ @item_container.stub!(:auto_highlight => true)
538
+ end
539
+ it {@item.send(:auto_highlight?).should be_false}
540
+ end
541
+ context 'container auto_highlight off' do
542
+ before(:each) do
543
+ @item_container.stub!(:auto_highlight => false)
544
+ end
545
+ it {@item.send(:auto_highlight?).should be_false}
546
+ end
547
+ end
548
+ end
549
+
550
+ describe 'autogenerated_item_id' do
551
+ context 'calls' do
552
+ before(:each) do
553
+ @id_generator = stub(:id_generator)
554
+ SimpleNavigation.config.stub!(:id_generator => @id_generator)
555
+ end
556
+ it "should call the configured generator with the key as param" do
557
+ @id_generator.should_receive(:call).with(:my_key)
558
+ @item.send(:autogenerated_item_id)
559
+ end
560
+ end
561
+ context 'default generator' do
562
+ it {@item.send(:autogenerated_item_id).should == 'my_key'}
563
+ end
564
+ end
565
+
566
+ end