bumbleworks 0.0.74 → 0.0.76

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 (50) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +1 -1
  3. data/.ruby-version +1 -1
  4. data/bumbleworks.gemspec +2 -2
  5. data/lib/bumbleworks.rb +1 -0
  6. data/lib/bumbleworks/expression.rb +12 -1
  7. data/lib/bumbleworks/process.rb +10 -0
  8. data/lib/bumbleworks/process/error_record.rb +14 -0
  9. data/lib/bumbleworks/schedule.rb +58 -0
  10. data/lib/bumbleworks/task.rb +2 -1
  11. data/lib/bumbleworks/task/finder.rb +4 -0
  12. data/lib/bumbleworks/version.rb +1 -1
  13. data/lib/bumbleworks/workitem.rb +4 -0
  14. data/spec/fixtures/schedules.rb +40 -0
  15. data/spec/integration/entity_spec.rb +7 -7
  16. data/spec/integration/example_configurations_spec.rb +5 -5
  17. data/spec/integration/history_storage_spec.rb +9 -9
  18. data/spec/integration/sample_application_spec.rb +15 -15
  19. data/spec/lib/bumbleworks/configuration_spec.rb +52 -52
  20. data/spec/lib/bumbleworks/entity_spec.rb +66 -68
  21. data/spec/lib/bumbleworks/error_handler_spec.rb +1 -1
  22. data/spec/lib/bumbleworks/error_logger_spec.rb +5 -5
  23. data/spec/lib/bumbleworks/expression_spec.rb +34 -12
  24. data/spec/lib/bumbleworks/hash_storage_spec.rb +2 -2
  25. data/spec/lib/bumbleworks/participant/base_spec.rb +1 -1
  26. data/spec/lib/bumbleworks/participant/entity_interactor_spec.rb +20 -20
  27. data/spec/lib/bumbleworks/participant/error_dispatcher_spec.rb +3 -3
  28. data/spec/lib/bumbleworks/participant/local_participant_spec.rb +1 -1
  29. data/spec/lib/bumbleworks/participant_registration_spec.rb +4 -4
  30. data/spec/lib/bumbleworks/process/error_record_spec.rb +13 -0
  31. data/spec/lib/bumbleworks/process_definition_spec.rb +30 -24
  32. data/spec/lib/bumbleworks/process_spec.rb +86 -54
  33. data/spec/lib/bumbleworks/ruote/exp/broadcast_event_expression_spec.rb +2 -2
  34. data/spec/lib/bumbleworks/ruote/exp/wait_for_event_expression_spec.rb +4 -4
  35. data/spec/lib/bumbleworks/ruote_spec.rb +73 -71
  36. data/spec/lib/bumbleworks/schedule_spec.rb +124 -0
  37. data/spec/lib/bumbleworks/simple_logger_spec.rb +8 -8
  38. data/spec/lib/bumbleworks/storage_adapter_spec.rb +16 -16
  39. data/spec/lib/bumbleworks/support_spec.rb +23 -19
  40. data/spec/lib/bumbleworks/task/finder_spec.rb +46 -46
  41. data/spec/lib/bumbleworks/task_spec.rb +188 -167
  42. data/spec/lib/bumbleworks/tracker_spec.rb +41 -42
  43. data/spec/lib/bumbleworks/tree_builder_spec.rb +9 -7
  44. data/spec/lib/bumbleworks/user_spec.rb +35 -35
  45. data/spec/lib/bumbleworks/workitem_entity_storage_spec.rb +5 -5
  46. data/spec/lib/bumbleworks/workitem_spec.rb +28 -17
  47. data/spec/lib/bumbleworks_spec.rb +57 -51
  48. data/spec/spec_helper.rb +0 -1
  49. data/spec/support/shared_examples.rb +3 -3
  50. metadata +35 -54
@@ -1,5 +1,12 @@
1
1
  describe Bumbleworks::Task do
2
- let(:workflow_item) {Ruote::Workitem.new('fields' => {'params' => {'task' => 'go_to_work'} })}
2
+ let(:workflow_item) {
3
+ Ruote::Workitem.new({
4
+ 'fields' => {
5
+ 'params' => {'task' => 'go_to_work'},
6
+ 'dispatched_at' => 'some time ago'
7
+ }
8
+ })
9
+ }
3
10
 
4
11
  before :each do
5
12
  Bumbleworks::Ruote.register_participants
@@ -14,17 +21,18 @@ describe Bumbleworks::Task do
14
21
  describe '#not_completable_error_message' do
15
22
  it 'defaults to generic message' do
16
23
  task = described_class.new(workflow_item)
17
- task.not_completable_error_message.should ==
24
+ expect(task.not_completable_error_message).to eq(
18
25
  "This task is not currently completable."
26
+ )
19
27
  end
20
28
  end
21
29
 
22
30
  describe '.autoload_all' do
23
31
  it 'autoloads all task modules in directory' do
24
32
  Bumbleworks.root = File.join(fixtures_path, 'apps', 'with_default_directories')
25
- Object.should_receive(:autoload).with(:MakeSomeHoneyTask,
33
+ expect(Object).to receive(:autoload).with(:MakeSomeHoneyTask,
26
34
  File.join(Bumbleworks.root, 'tasks', 'make_some_honey_task.rb'))
27
- Object.should_receive(:autoload).with(:TasteThatMolassesTask,
35
+ expect(Object).to receive(:autoload).with(:TasteThatMolassesTask,
28
36
  File.join(Bumbleworks.root, 'tasks', 'taste_that_molasses_task.rb'))
29
37
  described_class.autoload_all
30
38
  end
@@ -43,9 +51,16 @@ describe Bumbleworks::Task do
43
51
  end
44
52
  end
45
53
 
54
+ describe '#dispatched_at' do
55
+ it 'returns dispatched_at timestamp from workitem' do
56
+ task = described_class.new(workflow_item)
57
+ expect(task.dispatched_at).to eq 'some time ago'
58
+ end
59
+ end
60
+
46
61
  describe '#completable?' do
47
62
  it 'defaults to true on base task' do
48
- described_class.new(workflow_item).should be_completable
63
+ expect(described_class.new(workflow_item)).to be_completable
49
64
  end
50
65
  end
51
66
 
@@ -69,7 +84,7 @@ describe Bumbleworks::Task do
69
84
  end
70
85
 
71
86
  it 'extends new object with task module' do
72
- described_class.any_instance.should_receive(:extend_module)
87
+ expect_any_instance_of(described_class).to receive(:extend_module)
73
88
  described_class.new(workflow_item)
74
89
  end
75
90
  end
@@ -77,11 +92,11 @@ describe Bumbleworks::Task do
77
92
  describe '#reload' do
78
93
  it 'reloads the workitem from the storage participant' do
79
94
  task = described_class.new(workflow_item)
80
- task.stub(:sid).and_return(:the_sid)
81
- Bumbleworks.dashboard.storage_participant.should_receive(
95
+ allow(task).to receive(:sid).and_return(:the_sid)
96
+ expect(Bumbleworks.dashboard.storage_participant).to receive(
82
97
  :[]).with(:the_sid).and_return(:amazing_workitem)
83
98
  task.reload
84
- task.instance_variable_get(:@workitem).should == :amazing_workitem
99
+ expect(task.instance_variable_get(:@workitem)).to eq(:amazing_workitem)
85
100
  end
86
101
  end
87
102
 
@@ -91,9 +106,9 @@ describe Bumbleworks::Task do
91
106
  observer1, observer2 = double('observer1'), double('observer2')
92
107
  Bumbleworks.observers = [observer1, observer2]
93
108
  task = described_class.new(workflow_item)
94
- task.should_receive(:"#{phase}_snoogle").with(:chachunga, :faloop)
95
- observer1.should_receive(:"#{phase}_snoogle").with(:chachunga, :faloop)
96
- observer2.should_receive(:"#{phase}_snoogle").with(:chachunga, :faloop)
109
+ expect(task).to receive(:"#{phase}_snoogle").with(:chachunga, :faloop)
110
+ expect(observer1).to receive(:"#{phase}_snoogle").with(:chachunga, :faloop)
111
+ expect(observer2).to receive(:"#{phase}_snoogle").with(:chachunga, :faloop)
97
112
  task.send(:"call_#{phase}_hooks", :snoogle, :chachunga, :faloop)
98
113
  end
99
114
  end
@@ -109,7 +124,7 @@ describe Bumbleworks::Task do
109
124
  end
110
125
 
111
126
  it 'is called when task is dispatched' do
112
- described_class.any_instance.should_receive(:on_dispatch)
127
+ expect_any_instance_of(described_class).to receive(:on_dispatch)
113
128
  Bumbleworks.launch!('planting_a_noodle')
114
129
  Bumbleworks.dashboard.wait_for(:horse_feeder)
115
130
  end
@@ -119,15 +134,15 @@ describe Bumbleworks::Task do
119
134
  Bumbleworks.dashboard.wait_for(:horse_feeder)
120
135
  task = described_class.for_role('horse_feeder').first
121
136
  log_entry = Bumbleworks.logger.entries.last[:entry]
122
- log_entry[:action].should == :dispatch
123
- log_entry[:target_type].should == 'Task'
124
- log_entry[:target_id].should == task.id
137
+ expect(log_entry[:action]).to eq(:dispatch)
138
+ expect(log_entry[:target_type]).to eq('Task')
139
+ expect(log_entry[:target_id]).to eq(task.id)
125
140
  end
126
141
 
127
142
  it 'calls after hooks' do
128
143
  task = described_class.new(workflow_item)
129
- task.stub(:log)
130
- task.should_receive(:call_after_hooks).with(:dispatch)
144
+ allow(task).to receive(:log)
145
+ expect(task).to receive(:call_after_hooks).with(:dispatch)
131
146
  task.on_dispatch
132
147
  end
133
148
  end
@@ -135,22 +150,22 @@ describe Bumbleworks::Task do
135
150
  describe '#extend_module' do
136
151
  it 'extends with base module and task module' do
137
152
  task = described_class.new(workflow_item)
138
- task.should_receive(:task_module).and_return(:task_module_double)
139
- task.should_receive(:extend).with(Bumbleworks::Task::Base).ordered
140
- task.should_receive(:extend).with(:task_module_double).ordered
153
+ expect(task).to receive(:task_module).and_return(:task_module_double)
154
+ expect(task).to receive(:extend).with(Bumbleworks::Task::Base).ordered
155
+ expect(task).to receive(:extend).with(:task_module_double).ordered
141
156
  task.extend_module
142
157
  end
143
158
 
144
159
  it 'extends only with base module if no nickname' do
145
160
  task = described_class.new(workflow_item)
146
- task.stub(:nickname).and_return(nil)
147
- task.should_receive(:extend).with(Bumbleworks::Task::Base)
161
+ allow(task).to receive(:nickname).and_return(nil)
162
+ expect(task).to receive(:extend).with(Bumbleworks::Task::Base)
148
163
  task.extend_module
149
164
  end
150
165
 
151
166
  it 'extends only with base module if task module does not exist' do
152
167
  task = described_class.new(workflow_item)
153
- task.should_receive(:extend).with(Bumbleworks::Task::Base)
168
+ expect(task).to receive(:extend).with(Bumbleworks::Task::Base)
154
169
  task.extend_module
155
170
  end
156
171
  end
@@ -158,21 +173,21 @@ describe Bumbleworks::Task do
158
173
  describe '#task_module' do
159
174
  it 'returns nil if no nickname' do
160
175
  task = described_class.new(workflow_item)
161
- task.stub(:nickname).and_return(nil)
162
- task.task_module.should be_nil
176
+ allow(task).to receive(:nickname).and_return(nil)
177
+ expect(task.task_module).to be_nil
163
178
  end
164
179
 
165
180
  it 'returns constantized task nickname with "Task" appended' do
166
181
  task = described_class.new(workflow_item)
167
- Bumbleworks::Support.stub(:constantize).with("GoToWorkTask").and_return(:the_task_module)
168
- task.task_module.should == :the_task_module
182
+ allow(Bumbleworks::Support).to receive(:constantize).with("GoToWorkTask").and_return(:the_task_module)
183
+ expect(task.task_module).to eq(:the_task_module)
169
184
  end
170
185
  end
171
186
 
172
187
  describe '#id' do
173
188
  it 'returns the sid from the workitem' do
174
- workflow_item.stub(:sid).and_return(:an_exciting_id)
175
- described_class.new(workflow_item).id.should == :an_exciting_id
189
+ allow(workflow_item).to receive(:sid).and_return(:an_exciting_id)
190
+ expect(described_class.new(workflow_item).id).to eq(:an_exciting_id)
176
191
  end
177
192
  end
178
193
 
@@ -191,10 +206,12 @@ describe Bumbleworks::Task do
191
206
 
192
207
  # checking for equality by comparing sid, which is the flow expression id
193
208
  # that identifies not only the expression, but its instance
194
- described_class.find_by_id(plant_noodle_seed_task.id).sid.should ==
209
+ expect(described_class.find_by_id(plant_noodle_seed_task.id).sid).to eq(
195
210
  plant_noodle_seed_task.sid
196
- described_class.find_by_id(give_the_horse_a_bon_bon_task.id).sid.should ==
211
+ )
212
+ expect(described_class.find_by_id(give_the_horse_a_bon_bon_task.id).sid).to eq(
197
213
  give_the_horse_a_bon_bon_task.sid
214
+ )
198
215
  end
199
216
 
200
217
  it 'raises an error if id is nil' do
@@ -238,37 +255,37 @@ describe Bumbleworks::Task do
238
255
  describe '.order_by_param' do
239
256
  it 'orders returned tasks by given param ascending by default' do
240
257
  tasks = described_class.order_by_param(:priority)
241
- tasks.map(&:nickname).should == [
258
+ expect(tasks.map(&:nickname)).to eq([
242
259
  'appear_authoritative',
243
260
  'panic',
244
261
  'evince_concern',
245
262
  'roll_eyes',
246
263
  'sit_quietly'
247
- ]
264
+ ])
248
265
  end
249
266
 
250
267
  it 'can order in reverse' do
251
268
  tasks = described_class.order_by_param(:priority, :desc)
252
- tasks.map(&:nickname).should == [
269
+ expect(tasks.map(&:nickname)).to eq([
253
270
  'sit_quietly',
254
271
  'roll_eyes',
255
272
  'evince_concern',
256
273
  'panic',
257
274
  'appear_authoritative'
258
- ]
275
+ ])
259
276
  end
260
277
  end
261
278
 
262
279
  describe '.order_by_params' do
263
280
  it 'orders by multiple parameters' do
264
281
  tasks = described_class.order_by_params(:importance => :desc, :priority => :asc)
265
- tasks.map(&:nickname).should == [
282
+ expect(tasks.map(&:nickname)).to eq([
266
283
  'appear_authoritative',
267
284
  'evince_concern',
268
285
  'roll_eyes',
269
286
  'sit_quietly',
270
287
  'panic'
271
- ]
288
+ ])
272
289
  end
273
290
  end
274
291
  end
@@ -290,37 +307,37 @@ describe Bumbleworks::Task do
290
307
  describe '.order_by_field' do
291
308
  it 'orders returned tasks by given param ascending by default' do
292
309
  tasks = described_class.for_role('doctor').order_by_field(:strength)
293
- tasks.map { |t| [t.nickname, t.wfid] }.should == [
310
+ expect(tasks.map { |t| [t.nickname, t.wfid] }).to eq([
294
311
  ['evince_concern', @wf1.wfid],
295
312
  ['evince_concern', @wf2.wfid],
296
313
  ['evince_concern', @wf3.wfid],
297
314
  ['evince_concern', @wf4.wfid],
298
315
  ['evince_concern', @wf5.wfid]
299
- ]
316
+ ])
300
317
  end
301
318
 
302
319
  it 'can order in reverse' do
303
320
  tasks = described_class.for_role('doctor').order_by_field(:strength, :desc)
304
- tasks.map { |t| [t.nickname, t.wfid] }.should == [
321
+ expect(tasks.map { |t| [t.nickname, t.wfid] }).to eq([
305
322
  ['evince_concern', @wf5.wfid],
306
323
  ['evince_concern', @wf4.wfid],
307
324
  ['evince_concern', @wf3.wfid],
308
325
  ['evince_concern', @wf2.wfid],
309
326
  ['evince_concern', @wf1.wfid]
310
- ]
327
+ ])
311
328
  end
312
329
  end
313
330
 
314
331
  describe '.order_by_fields' do
315
332
  it 'orders by multiple parameters' do
316
333
  tasks = described_class.for_role('doctor').order_by_fields(:group => :asc, :strength => :desc)
317
- tasks.map { |t| [t.nickname, t.wfid] }.should == [
334
+ expect(tasks.map { |t| [t.nickname, t.wfid] }).to eq([
318
335
  ['evince_concern', @wf5.wfid],
319
336
  ['evince_concern', @wf4.wfid],
320
337
  ['evince_concern', @wf2.wfid],
321
338
  ['evince_concern', @wf3.wfid],
322
339
  ['evince_concern', @wf1.wfid]
323
- ]
340
+ ])
324
341
  end
325
342
  end
326
343
  end
@@ -342,34 +359,34 @@ describe Bumbleworks::Task do
342
359
  it 'returns tasks for all given roles' do
343
360
  Bumbleworks.dashboard.wait_for(:father)
344
361
  tasks = described_class.for_roles(['heckler', 'mother'])
345
- tasks.map(&:nickname).should == [
362
+ expect(tasks.map(&:nickname)).to eq([
346
363
  'comment_on_dancing_ability',
347
364
  'ignore_pleas_for_attention'
348
- ]
365
+ ])
349
366
  end
350
367
 
351
368
  it 'works with symbolized role names' do
352
369
  Bumbleworks.dashboard.wait_for(:father)
353
370
  tasks = described_class.for_roles([:heckler, :mother])
354
- tasks.map(&:nickname).should == [
371
+ expect(tasks.map(&:nickname)).to eq([
355
372
  'comment_on_dancing_ability',
356
373
  'ignore_pleas_for_attention'
357
- ]
374
+ ])
358
375
  end
359
376
 
360
377
  it 'returns empty array if no tasks found for given roles' do
361
378
  Bumbleworks.dashboard.wait_for(:father)
362
- described_class.for_roles(['elephant']).should be_empty
379
+ expect(described_class.for_roles(['elephant'])).to be_empty
363
380
  end
364
381
 
365
382
  it 'returns empty array if given empty array' do
366
383
  Bumbleworks.dashboard.wait_for(:father)
367
- described_class.for_roles([]).should be_empty
384
+ expect(described_class.for_roles([])).to be_empty
368
385
  end
369
386
 
370
387
  it 'returns empty array if given nil' do
371
388
  Bumbleworks.dashboard.wait_for(:father)
372
- described_class.for_roles(nil).should be_empty
389
+ expect(described_class.for_roles(nil)).to be_empty
373
390
  end
374
391
  end
375
392
 
@@ -398,33 +415,33 @@ describe Bumbleworks::Task do
398
415
  rooting_tasks = described_class.for_processes([@rooting_process_1])
399
416
  tasks_for_both = described_class.for_processes([@spunking_process, @rooting_process_1])
400
417
 
401
- spunking_tasks.map(&:nickname).should =~ ['spunk', 'complain']
402
- rooting_tasks.map(&:nickname).should =~ ['get_the_rooting_on', 'scoff']
403
- tasks_for_both.map(&:nickname).should =~ ['spunk', 'complain', 'get_the_rooting_on', 'scoff']
418
+ expect(spunking_tasks.map(&:nickname)).to match_array(['spunk', 'complain'])
419
+ expect(rooting_tasks.map(&:nickname)).to match_array(['get_the_rooting_on', 'scoff'])
420
+ expect(tasks_for_both.map(&:nickname)).to match_array(['spunk', 'complain', 'get_the_rooting_on', 'scoff'])
404
421
  end
405
422
 
406
423
  it 'works with process ids as well' do
407
424
  spunking_tasks = described_class.for_processes([@spunking_process.id])
408
- spunking_tasks.map(&:nickname).should =~ ['spunk', 'complain']
425
+ expect(spunking_tasks.map(&:nickname)).to match_array(['spunk', 'complain'])
409
426
  end
410
427
 
411
428
  it 'returns empty array when no tasks for given process id' do
412
- described_class.for_processes(['boop']).should be_empty
429
+ expect(described_class.for_processes(['boop'])).to be_empty
413
430
  end
414
431
 
415
432
  it 'returns empty array if given empty array' do
416
- described_class.for_processes([]).should be_empty
433
+ expect(described_class.for_processes([])).to be_empty
417
434
  end
418
435
 
419
436
  it 'returns empty array if given nil' do
420
- described_class.for_processes(nil).should be_empty
437
+ expect(described_class.for_processes(nil)).to be_empty
421
438
  end
422
439
  end
423
440
 
424
441
  describe '.for_process' do
425
442
  it 'acts as shortcut to .for_processes with one process' do
426
- described_class::Finder.any_instance.should_receive(:for_processes).with([:one_guy]).and_return(:aha)
427
- described_class.for_process(:one_guy).should == :aha
443
+ allow_any_instance_of(described_class::Finder).to receive(:for_processes).with([:one_guy]).and_return(:aha)
444
+ expect(described_class.for_process(:one_guy)).to eq(:aha)
428
445
  end
429
446
  end
430
447
 
@@ -441,10 +458,10 @@ describe Bumbleworks::Task do
441
458
  Bumbleworks.dashboard.wait_for(:hagrid)
442
459
 
443
460
  tasks = described_class.for_role('chalker')
444
- tasks.map(&:nickname).should == [
461
+ expect(tasks.map(&:nickname)).to eq([
445
462
  'make_chalk_drawings',
446
463
  'chalk_it_good_baby'
447
- ]
464
+ ])
448
465
  end
449
466
  end
450
467
 
@@ -462,12 +479,12 @@ describe Bumbleworks::Task do
462
479
  Bumbleworks.launch!('dog-lifecycle')
463
480
  Bumbleworks.dashboard.wait_for(:cat)
464
481
  @unclaimed = described_class.unclaimed
465
- @unclaimed.map(&:nickname).should =~ ['eat', 'bark', 'pet_dog', 'skip_and_jump']
482
+ expect(@unclaimed.map(&:nickname)).to match_array(['eat', 'bark', 'pet_dog', 'skip_and_jump'])
466
483
  described_class.all.each do |t|
467
484
  t.claim('radish') unless ['pet_dog', 'bark'].include?(t.nickname)
468
485
  end
469
486
  @unclaimed = described_class.unclaimed
470
- @unclaimed.map(&:nickname).should =~ ['pet_dog', 'bark']
487
+ expect(@unclaimed.map(&:nickname)).to match_array(['pet_dog', 'bark'])
471
488
  end
472
489
  end
473
490
 
@@ -484,12 +501,12 @@ describe Bumbleworks::Task do
484
501
  end
485
502
  Bumbleworks.launch!('dog-lifecycle')
486
503
  Bumbleworks.dashboard.wait_for(:cat)
487
- described_class.claimed.should be_empty
504
+ expect(described_class.claimed).to be_empty
488
505
  described_class.all.each_with_index do |t, i|
489
506
  t.claim("radish_#{i}") unless ['pet_dog', 'bark'].include?(t.nickname)
490
507
  end
491
508
  @claimed = described_class.claimed
492
- @claimed.map(&:nickname).should =~ ['eat', 'skip_and_jump']
509
+ expect(@claimed.map(&:nickname)).to match_array(['eat', 'skip_and_jump'])
493
510
  end
494
511
  end
495
512
 
@@ -511,16 +528,14 @@ describe Bumbleworks::Task do
511
528
  Bumbleworks.launch!('hand_waggling')
512
529
  Bumbleworks.dashboard.wait_for(:a_lady)
513
530
  tasks = described_class.completable
514
- tasks.should have(2).items
515
- tasks.map { |t| [t.role, t.nickname] }.should == [
531
+ expect(tasks.map { |t| [t.role, t.nickname] }).to eq([
516
532
  ['a_fella', 'waggle_hands'],
517
533
  ['a_lady', 'wiggle_hands']
518
- ]
534
+ ])
519
535
  tasks = described_class.completable(false)
520
- tasks.should have(1).item
521
- tasks.map { |t| [t.role, t.nickname] }.should == [
536
+ expect(tasks.map { |t| [t.role, t.nickname] }).to eq([
522
537
  ['a_monkey', 'wuggle_hands']
523
- ]
538
+ ])
524
539
  end
525
540
  end
526
541
 
@@ -542,21 +557,21 @@ describe Bumbleworks::Task do
542
557
  it 'executes for each found task' do
543
558
  list = []
544
559
  described_class.each { |t| list << t.nickname }
545
- list.should =~ ['grouch_it_up', 'sing_a_tune', 'steal_booze', 'eat_cabbage']
560
+ expect(list).to match_array(['grouch_it_up', 'sing_a_tune', 'steal_booze', 'eat_cabbage'])
546
561
  end
547
562
  end
548
563
 
549
564
  describe '.map' do
550
565
  it 'maps result of yielding block with each task' do
551
566
  list = described_class.map { |t| t.nickname }
552
- list.should =~ ['grouch_it_up', 'sing_a_tune', 'steal_booze', 'eat_cabbage']
567
+ expect(list).to match_array(['grouch_it_up', 'sing_a_tune', 'steal_booze', 'eat_cabbage'])
553
568
  end
554
569
  end
555
570
 
556
571
  context 'with queries' do
557
572
  it 'checks filters' do
558
573
  list = described_class.for_role('elmo').map { |t| t.nickname }
559
- list.should =~ ['sing_a_tune', 'steal_booze']
574
+ expect(list).to match_array(['sing_a_tune', 'steal_booze'])
560
575
  end
561
576
  end
562
577
  end
@@ -579,20 +594,19 @@ describe Bumbleworks::Task do
579
594
  it 'returns all tasks (with task param) in queue regardless of role' do
580
595
  Bumbleworks.dashboard.wait_for(:dog_legs)
581
596
  tasks = described_class.all
582
- tasks.should have(4).items
583
- tasks.map { |t| [t.role, t.nickname] }.should == [
597
+ expect(tasks.map { |t| [t.role, t.nickname] }).to eq([
584
598
  ['dog_teeth', 'eat'],
585
599
  ['dog_mouth', 'bark'],
586
600
  ['everyone', 'pet_dog'],
587
601
  ['dog_legs', 'skip_and_jump']
588
- ]
602
+ ])
589
603
  end
590
604
 
591
605
  it 'uses subclass for generation of tasks' do
592
606
  class MyOwnTask < Bumbleworks::Task; end
593
607
  Bumbleworks.dashboard.wait_for(:dog_legs)
594
608
  tasks = MyOwnTask.all
595
- tasks.should be_all { |t| t.class == MyOwnTask }
609
+ expect(tasks).to be_all { |t| t.class == MyOwnTask }
596
610
  Object.send(:remove_const, :MyOwnTask)
597
611
  end
598
612
  end
@@ -601,25 +615,25 @@ describe Bumbleworks::Task do
601
615
  subject{described_class.new(workflow_item)}
602
616
  it 'sets values on workitem fields' do
603
617
  subject['hive'] = 'bees at work'
604
- workflow_item.fields['hive'].should == 'bees at work'
618
+ expect(workflow_item.fields['hive']).to eq('bees at work')
605
619
  end
606
620
 
607
621
  it 'retuns value from workitem params' do
608
622
  workflow_item.fields['nest'] = 'queen resting'
609
- subject['nest'].should == 'queen resting'
623
+ expect(subject['nest']).to eq('queen resting')
610
624
  end
611
625
  end
612
626
 
613
627
  describe '#nickname' do
614
628
  it 'returns the "task" param' do
615
- described_class.new(workflow_item).nickname.should == 'go_to_work'
629
+ expect(described_class.new(workflow_item).nickname).to eq('go_to_work')
616
630
  end
617
631
 
618
632
  it 'is immutable; cannot be changed by modifying the param' do
619
633
  task = described_class.new(workflow_item)
620
- task.nickname.should == 'go_to_work'
634
+ expect(task.nickname).to eq('go_to_work')
621
635
  task.params['task'] = 'what_is_wrong_with_you?'
622
- task.nickname.should == 'go_to_work'
636
+ expect(task.nickname).to eq('go_to_work')
623
637
  end
624
638
  end
625
639
 
@@ -630,7 +644,7 @@ describe Bumbleworks::Task do
630
644
  end
631
645
  Bumbleworks.launch!('planting_a_noodle')
632
646
  Bumbleworks.dashboard.wait_for(:noodle_gardener)
633
- described_class.all.first.role.should == 'noodle_gardener'
647
+ expect(described_class.all.first.role).to eq('noodle_gardener')
634
648
  end
635
649
  end
636
650
 
@@ -648,13 +662,12 @@ describe Bumbleworks::Task do
648
662
  end
649
663
  Bumbleworks.launch!('dog-lifecycle')
650
664
  Bumbleworks.dashboard.wait_for(:cat)
651
- described_class.for_claimant('radish').should be_empty
665
+ expect(described_class.for_claimant('radish')).to be_empty
652
666
  described_class.all.each do |t|
653
667
  t.claim('radish') unless t.nickname == 'pet_dog'
654
668
  end
655
669
  @tasks = described_class.for_claimant('radish')
656
- @tasks.should have(3).items
657
- @tasks.map(&:nickname).should =~ ['eat', 'bark', 'skip_and_jump']
670
+ expect(@tasks.map(&:nickname)).to match_array(['eat', 'bark', 'skip_and_jump'])
658
671
  end
659
672
  end
660
673
 
@@ -680,20 +693,20 @@ describe Bumbleworks::Task do
680
693
  end
681
694
 
682
695
  it 'returns all tasks with given field' do
683
- described_class.with_fields(:grumbles => true).count.should == 3
684
- described_class.with_fields(:bumby => 'fancy').count.should == 1
685
- described_class.with_fields(:bumby => 'not_fancy').count.should == 2
686
- described_class.with_fields(:what => 'ever').should be_empty
696
+ expect(described_class.with_fields(:grumbles => true).count).to eq(3)
697
+ expect(described_class.with_fields(:bumby => 'fancy').count).to eq(1)
698
+ expect(described_class.with_fields(:bumby => 'not_fancy').count).to eq(2)
699
+ expect(described_class.with_fields(:what => 'ever')).to be_empty
687
700
  end
688
701
 
689
702
  it 'looks up multiple fields at once' do
690
- described_class.with_fields(:grumbles => true, :bumby => 'not_fancy').count.should == 2
691
- described_class.with_fields(:grumbles => false, :bumby => 'not_fancy').should be_empty
703
+ expect(described_class.with_fields(:grumbles => true, :bumby => 'not_fancy').count).to eq(2)
704
+ expect(described_class.with_fields(:grumbles => false, :bumby => 'not_fancy')).to be_empty
692
705
  end
693
706
 
694
707
  it 'can be chained' do
695
- described_class.with_fields(:grumbles => true).with_fields(:bumby => 'fancy').count.should == 1
696
- described_class.with_fields(:grumbles => false).with_fields(:bumby => 'not_fancy').should be_empty
708
+ expect(described_class.with_fields(:grumbles => true).with_fields(:bumby => 'fancy').count).to eq(1)
709
+ expect(described_class.with_fields(:grumbles => false).with_fields(:bumby => 'not_fancy')).to be_empty
697
710
  end
698
711
  end
699
712
 
@@ -709,7 +722,7 @@ describe Bumbleworks::Task do
709
722
  Bumbleworks.launch!('existential_pb_and_j', :entity => fake_sandwich)
710
723
  Bumbleworks.dashboard.wait_for(:sandwich)
711
724
  tasks = described_class.for_entity(fake_sandwich)
712
- tasks.should have(2).items
725
+ expect(tasks.size).to eq(2)
713
726
  end
714
727
  end
715
728
 
@@ -725,8 +738,7 @@ describe Bumbleworks::Task do
725
738
  Bumbleworks.launch!('animal_disagreements')
726
739
  Bumbleworks.dashboard.wait_for(:rabbit)
727
740
  tasks = described_class.by_nickname('punch_turtle')
728
- tasks.should have(2).items
729
- tasks.map(&:role).should =~ ['goose', 'rabbit']
741
+ expect(tasks.map(&:role)).to match_array(['goose', 'rabbit'])
730
742
  end
731
743
  end
732
744
 
@@ -743,11 +755,11 @@ describe Bumbleworks::Task do
743
755
 
744
756
  describe '#claim' do
745
757
  it 'sets token on "claimant" param' do
746
- @task.params['claimant'].should == 'boss'
758
+ expect(@task.params['claimant']).to eq('boss')
747
759
  end
748
760
 
749
761
  it 'sets claimed_at param' do
750
- @task.params['claimed_at'].should_not be_nil
762
+ expect(@task.params['claimed_at']).not_to be_nil
751
763
  end
752
764
 
753
765
  it 'raises an error if already claimed by someone else' do
@@ -760,67 +772,67 @@ describe Bumbleworks::Task do
760
772
 
761
773
  it 'calls before_claim and after_claim callbacks' do
762
774
  task = described_class.new(workflow_item)
763
- task.stub(:log)
764
- task.should_receive(:before_claim).with(:doctor_claim).ordered
765
- task.should_receive(:set_claimant).ordered
766
- task.should_receive(:after_claim).with(:doctor_claim).ordered
775
+ allow(task).to receive(:log)
776
+ expect(task).to receive(:before_claim).with(:doctor_claim).ordered
777
+ expect(task).to receive(:set_claimant).ordered
778
+ expect(task).to receive(:after_claim).with(:doctor_claim).ordered
767
779
  task.claim(:doctor_claim)
768
780
  end
769
781
 
770
782
  it 'logs event' do
771
783
  log_entry = Bumbleworks.logger.entries.last[:entry]
772
- log_entry[:action].should == :claim
773
- log_entry[:actor].should == 'boss'
784
+ expect(log_entry[:action]).to eq(:claim)
785
+ expect(log_entry[:actor]).to eq('boss')
774
786
  end
775
787
  end
776
788
 
777
789
  describe '#claimant' do
778
790
  it 'returns token of who has claim' do
779
- @task.claimant.should == 'boss'
791
+ expect(@task.claimant).to eq('boss')
780
792
  end
781
793
  end
782
794
 
783
795
  describe '#claimed_at' do
784
796
  it 'returns claimed_at param' do
785
- @task.claimed_at.should == @task.params['claimed_at']
797
+ expect(@task.claimed_at).to eq(@task.params['claimed_at'])
786
798
  end
787
799
  end
788
800
 
789
801
  describe '#claimed?' do
790
802
  it 'returns true if claimed' do
791
- @task.claimed?.should be_true
803
+ expect(@task.claimed?).to be_truthy
792
804
  end
793
805
 
794
806
  it 'false otherwise' do
795
807
  @task.params['claimant'] = nil
796
- @task.claimed?.should be_false
808
+ expect(@task.claimed?).to be_falsy
797
809
  end
798
810
  end
799
811
 
800
812
  describe '#release' do
801
813
  it "release claim on workitem" do
802
- @task.should be_claimed
814
+ expect(@task).to be_claimed
803
815
  @task.release
804
- @task.should_not be_claimed
816
+ expect(@task).not_to be_claimed
805
817
  end
806
818
 
807
819
  it 'clears claimed_at param' do
808
820
  @task.release
809
- @task.params['claimed_at'].should be_nil
821
+ expect(@task.params['claimed_at']).to be_nil
810
822
  end
811
823
 
812
824
  it 'calls with hooks' do
813
- @task.should_receive(:call_before_hooks).with(:release, 'boss').ordered
814
- @task.should_receive(:set_claimant).ordered
815
- @task.should_receive(:call_after_hooks).with(:release, 'boss').ordered
825
+ expect(@task).to receive(:call_before_hooks).with(:release, 'boss').ordered
826
+ expect(@task).to receive(:set_claimant).ordered
827
+ expect(@task).to receive(:call_after_hooks).with(:release, 'boss').ordered
816
828
  @task.release
817
829
  end
818
830
 
819
831
  it 'logs event' do
820
832
  @task.release
821
833
  log_entry = Bumbleworks.logger.entries.last[:entry]
822
- log_entry[:action].should == :release
823
- log_entry[:actor].should == 'boss'
834
+ expect(log_entry[:action]).to eq(:release)
835
+ expect(log_entry[:actor]).to eq('boss')
824
836
  end
825
837
  end
826
838
  end
@@ -842,27 +854,36 @@ describe Bumbleworks::Task do
842
854
  task.fields['meal'] = 'salted_rhubarb'
843
855
  task.update
844
856
  task = described_class.for_role('dog_mouth').first
845
- task.params['state'].should == 'is ready'
846
- task.fields['meal'].should == 'salted_rhubarb'
857
+ expect(task.params['state']).to eq('is ready')
858
+ expect(task.fields['meal']).to eq('salted_rhubarb')
847
859
  end
848
860
 
849
861
  it 'calls with hooks' do
850
862
  task = described_class.new(workflow_item)
851
- task.stub(:log)
852
- task.should_receive(:call_before_hooks).with(:update, :argue_mints).ordered
853
- task.should_receive(:update_workitem).ordered
854
- task.should_receive(:call_after_hooks).with(:update, :argue_mints).ordered
863
+ allow(task).to receive(:log)
864
+ expect(task).to receive(:call_before_hooks).with(:update, :argue_mints).ordered
865
+ expect(task).to receive(:update_workitem).ordered
866
+ expect(task).to receive(:call_after_hooks).with(:update, :argue_mints).ordered
855
867
  task.update(:argue_mints)
856
868
  end
857
869
 
870
+ it 'reloads after updating workitem' do
871
+ event = Bumbleworks.dashboard.wait_for :dog_mouth
872
+ task = described_class.for_role('dog_mouth').first
873
+ allow(task).to receive(:log)
874
+ expect(described_class.storage_participant).to receive(:update).with(task.workitem).ordered
875
+ expect(task).to receive(:reload).ordered
876
+ task.update(:noofles)
877
+ end
878
+
858
879
  it 'logs event' do
859
880
  event = Bumbleworks.dashboard.wait_for :dog_mouth
860
881
  task = described_class.for_role('dog_mouth').first
861
882
  task.params['claimant'] = :some_user
862
883
  task.update(:extra_data => :fancy)
863
- Bumbleworks.logger.entries.last.should == {
884
+ expect(Bumbleworks.logger.entries.last).to eq({
864
885
  :level => :info, :entry => {
865
- :actor => :some_user,
886
+ :actor => "some_user", # claimant is a string after #reload
866
887
  :action => :update,
867
888
  :target_type => 'Task',
868
889
  :target_id => task.id,
@@ -871,7 +892,7 @@ describe Bumbleworks::Task do
871
892
  :current_fields => task.fields
872
893
  }
873
894
  }
874
- }
895
+ })
875
896
  end
876
897
  end
877
898
 
@@ -882,37 +903,37 @@ describe Bumbleworks::Task do
882
903
  task.params['state'] = 'is ready'
883
904
  task.fields['meal'] = 'root beer and a kite'
884
905
  task.complete
885
- described_class.for_role('dog_mouth').should be_empty
906
+ expect(described_class.for_role('dog_mouth')).to be_empty
886
907
  event = Bumbleworks.dashboard.wait_for :dog_brain
887
908
  task = described_class.for_role('dog_brain').first
888
- task.params['state'].should be_nil
889
- task.fields['meal'].should == 'root beer and a kite'
909
+ expect(task.params['state']).to be_nil
910
+ expect(task.fields['meal']).to eq('root beer and a kite')
890
911
  end
891
912
 
892
913
  it 'throws exception if task is not completable' do
893
914
  event = Bumbleworks.dashboard.wait_for :dog_mouth
894
915
  task = described_class.for_role('dog_mouth').first
895
- task.stub(:completable?).and_return(false)
896
- task.stub(:not_completable_error_message).and_return('hogwash!')
897
- task.should_receive(:before_update).never
898
- task.should_receive(:before_complete).never
899
- task.should_receive(:proceed_workitem).never
900
- task.should_receive(:after_complete).never
901
- task.should_receive(:after_update).never
916
+ allow(task).to receive(:completable?).and_return(false)
917
+ allow(task).to receive(:not_completable_error_message).and_return('hogwash!')
918
+ expect(task).to receive(:before_update).never
919
+ expect(task).to receive(:before_complete).never
920
+ expect(task).to receive(:proceed_workitem).never
921
+ expect(task).to receive(:after_complete).never
922
+ expect(task).to receive(:after_update).never
902
923
  expect {
903
924
  task.complete
904
925
  }.to raise_error(Bumbleworks::Task::NotCompletable, "hogwash!")
905
- described_class.for_role('dog_mouth').should_not be_empty
926
+ expect(described_class.for_role('dog_mouth')).not_to be_empty
906
927
  end
907
928
 
908
929
  it 'calls update and complete callbacks' do
909
930
  task = described_class.new(workflow_item)
910
- task.stub(:log)
911
- task.should_receive(:call_before_hooks).with(:update, :argue_mints).ordered
912
- task.should_receive(:call_before_hooks).with(:complete, :argue_mints).ordered
913
- task.should_receive(:proceed_workitem).ordered
914
- task.should_receive(:call_after_hooks).with(:complete, :argue_mints).ordered
915
- task.should_receive(:call_after_hooks).with(:update, :argue_mints).ordered
931
+ allow(task).to receive(:log)
932
+ expect(task).to receive(:call_before_hooks).with(:update, :argue_mints).ordered
933
+ expect(task).to receive(:call_before_hooks).with(:complete, :argue_mints).ordered
934
+ expect(task).to receive(:proceed_workitem).ordered
935
+ expect(task).to receive(:call_after_hooks).with(:complete, :argue_mints).ordered
936
+ expect(task).to receive(:call_after_hooks).with(:update, :argue_mints).ordered
916
937
  task.complete(:argue_mints)
917
938
  end
918
939
 
@@ -921,7 +942,7 @@ describe Bumbleworks::Task do
921
942
  task = described_class.for_role('dog_mouth').first
922
943
  task.params['claimant'] = :some_user
923
944
  task.complete(:extra_data => :fancy)
924
- Bumbleworks.logger.entries.last.should == {
945
+ expect(Bumbleworks.logger.entries.last).to eq({
925
946
  :level => :info, :entry => {
926
947
  :actor => :some_user,
927
948
  :action => :complete,
@@ -932,7 +953,7 @@ describe Bumbleworks::Task do
932
953
  :current_fields => task.fields
933
954
  }
934
955
  }
935
- }
956
+ })
936
957
  end
937
958
  end
938
959
  end
@@ -966,37 +987,37 @@ describe Bumbleworks::Task do
966
987
  tasks = described_class.
967
988
  for_roles(['green', 'pink']).
968
989
  by_nickname('be_proud')
969
- tasks.map(&:nickname).should =~ ['be_proud', 'be_proud']
990
+ expect(tasks.map(&:nickname)).to match_array(['be_proud', 'be_proud'])
970
991
 
971
992
  tasks = described_class.
972
993
  for_roles(['green', 'pink', 'blue']).
973
994
  completable.
974
995
  by_nickname('be_proud')
975
- tasks.map(&:nickname).should =~ ['be_proud']
976
- tasks.first.role.should == 'pink'
996
+ expect(tasks.map(&:nickname)).to match_array(['be_proud'])
997
+ expect(tasks.first.role).to eq('pink')
977
998
 
978
999
  tasks = described_class.
979
1000
  for_claimant('crayon_box').
980
1001
  for_roles(['red', 'yellow', 'green'])
981
- tasks.map(&:nickname).should =~ ['be_really_mad', 'be_scared']
1002
+ expect(tasks.map(&:nickname)).to match_array(['be_really_mad', 'be_scared'])
982
1003
 
983
1004
  tasks = described_class.
984
1005
  for_claimant('crayon_box').
985
1006
  by_nickname('be_a_bit_sad').
986
1007
  for_role('blue')
987
- tasks.map(&:nickname).should == ['be_a_bit_sad']
1008
+ expect(tasks.map(&:nickname)).to eq(['be_a_bit_sad'])
988
1009
  end
989
1010
 
990
1011
  it 'allows for OR-ed chained finders' do
991
1012
  tasks = described_class.where_any.
992
1013
  for_role('blue').
993
1014
  by_nickname('be_proud')
994
- tasks.map(&:nickname).should =~ ['be_a_bit_sad', 'be_proud', 'be_proud']
1015
+ expect(tasks.map(&:nickname)).to match_array(['be_a_bit_sad', 'be_proud', 'be_proud'])
995
1016
 
996
1017
  tasks = described_class.where_any.
997
1018
  completable.
998
1019
  claimed
999
- tasks.map(&:nickname).should =~ ['be_really_mad', 'be_scared', 'be_a_bit_sad', 'be_envious', 'be_proud']
1020
+ expect(tasks.map(&:nickname)).to match_array(['be_really_mad', 'be_scared', 'be_a_bit_sad', 'be_envious', 'be_proud'])
1000
1021
  end
1001
1022
 
1002
1023
  it 'allows for combination of AND-ed and OR-ed finders' do
@@ -1004,14 +1025,14 @@ describe Bumbleworks::Task do
1004
1025
  for_claimant('crayon_box').
1005
1026
  for_roles(['red', 'yellow', 'green']).
1006
1027
  where_any(:nickname => 'spittle', :role => 'red')
1007
- tasks.map(&:nickname).should =~ ['be_really_mad']
1028
+ expect(tasks.map(&:nickname)).to match_array(['be_really_mad'])
1008
1029
  end
1009
1030
  end
1010
1031
 
1011
1032
  describe 'method missing' do
1012
1033
  it 'calls method on new Finder object' do
1013
- described_class::Finder.any_instance.stub(:shabam!).with(:yay).and_return(:its_a_me)
1014
- described_class.shabam!(:yay).should == :its_a_me
1034
+ allow_any_instance_of(described_class::Finder).to receive(:shabam!).with(:yay).and_return(:its_a_me)
1035
+ expect(described_class.shabam!(:yay)).to eq(:its_a_me)
1015
1036
  end
1016
1037
 
1017
1038
  it 'falls back to method missing if no finder method' do
@@ -1036,8 +1057,8 @@ describe Bumbleworks::Task do
1036
1057
  Bumbleworks.launch!('lazy_bum_and_cool_guy')
1037
1058
  task = described_class.for_role('bum').next_available
1038
1059
  end_time = Time.now
1039
- task.nickname.should == 'finally_get_a_round_tuit'
1040
- (end_time - start_time).should >= 2
1060
+ expect(task.nickname).to eq('finally_get_a_round_tuit')
1061
+ expect(end_time - start_time).to be >= 2
1041
1062
  end
1042
1063
 
1043
1064
  it 'times out if task does not appear in time' do
@@ -1060,50 +1081,50 @@ describe Bumbleworks::Task do
1060
1081
  describe '#humanize' do
1061
1082
  it "returns humanized version of task name when no entity" do
1062
1083
  task = described_class.new(workflow_item)
1063
- task.humanize.should == 'Go to work'
1084
+ expect(task.humanize).to eq('Go to work')
1064
1085
  end
1065
1086
 
1066
1087
  it "returns humanized version of task name with entity" do
1067
1088
  task = described_class.new(workflow_item)
1068
1089
  task[:entity_id] = '45'
1069
1090
  task[:entity_type] = 'RhubarbSandwich'
1070
- task.humanize.should == 'Go to work: Rhubarb sandwich 45'
1091
+ expect(task.humanize).to eq('Go to work: Rhubarb sandwich 45')
1071
1092
  end
1072
1093
 
1073
1094
  it "returns humanized version of task name without entity if requested" do
1074
1095
  task = described_class.new(workflow_item)
1075
1096
  task[:entity_id] = '45'
1076
1097
  task[:entity_type] = 'RhubarbSandwich'
1077
- task.humanize(:entity => false).should == 'Go to work'
1098
+ expect(task.humanize(:entity => false)).to eq('Go to work')
1078
1099
  end
1079
1100
  end
1080
1101
 
1081
1102
  describe '#to_s' do
1082
1103
  it "is aliased to #titleize" do
1083
1104
  task = described_class.new(workflow_item)
1084
- task.stub(:titleize).with(:the_args).and_return(:see_i_told_you_so)
1085
- task.to_s(:the_args).should == :see_i_told_you_so
1105
+ allow(task).to receive(:titleize).with(:the_args).and_return(:see_i_told_you_so)
1106
+ expect(task.to_s(:the_args)).to eq(:see_i_told_you_so)
1086
1107
  end
1087
1108
  end
1088
1109
 
1089
1110
  describe '#titleize' do
1090
1111
  it "returns titleized version of task name when no entity" do
1091
1112
  task = described_class.new(workflow_item)
1092
- task.titleize.should == 'Go To Work'
1113
+ expect(task.titleize).to eq('Go To Work')
1093
1114
  end
1094
1115
 
1095
1116
  it "returns titleized version of task name with entity" do
1096
1117
  task = described_class.new(workflow_item)
1097
1118
  task[:entity_id] = '45'
1098
1119
  task[:entity_type] = 'RhubarbSandwich'
1099
- task.titleize.should == 'Go To Work: Rhubarb Sandwich 45'
1120
+ expect(task.titleize).to eq('Go To Work: Rhubarb Sandwich 45')
1100
1121
  end
1101
1122
 
1102
1123
  it "returns titleized version of task name without entity if requested" do
1103
1124
  task = described_class.new(workflow_item)
1104
1125
  task[:entity_id] = '45'
1105
1126
  task[:entity_type] = 'RhubarbSandwich'
1106
- task.titleize(:entity => false).should == 'Go To Work'
1127
+ expect(task.titleize(:entity => false)).to eq('Go To Work')
1107
1128
  end
1108
1129
  end
1109
1130
  end