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,22 +1,21 @@
1
- require File.expand_path(File.join(fixtures_path, 'entities', 'rainbow_loom'))
2
1
  require File.expand_path(File.join(fixtures_path, 'trackers'))
3
2
 
4
3
  describe Bumbleworks::Tracker do
5
4
  before(:each) do
6
- Bumbleworks.dashboard.stub(:get_trackers => fake_trackers)
5
+ allow(Bumbleworks.dashboard).to receive_messages(:get_trackers => fake_trackers)
7
6
  end
8
7
 
9
8
  describe '.all' do
10
9
  it 'returns instances for each tracker in system' do
11
10
  trackers = described_class.all
12
- trackers.all? { |t| t.class == Bumbleworks::Tracker }.should be_true
13
- trackers.map(&:id).should =~ [
11
+ expect(trackers.all? { |t| t.class == Bumbleworks::Tracker }).to be_truthy
12
+ expect(trackers.map(&:id)).to match_array([
14
13
  'on_error',
15
14
  'global_tracker',
16
15
  'local_tracker',
17
16
  'local_error_intercept',
18
17
  'participant_tracker'
19
- ]
18
+ ])
20
19
  end
21
20
  end
22
21
 
@@ -29,127 +28,127 @@ describe Bumbleworks::Tracker do
29
28
  describe '.new' do
30
29
  it 'sets tracker id and fetches original_hash from dashboard' do
31
30
  tr = described_class.new('global_tracker')
32
- tr.id.should == 'global_tracker'
33
- tr.original_hash.should == fake_trackers['global_tracker']
31
+ expect(tr.id).to eq('global_tracker')
32
+ expect(tr.original_hash).to eq(fake_trackers['global_tracker'])
34
33
  end
35
34
 
36
35
  it 'sets tracker id and original_hash if directly provided' do
37
36
  tr = described_class.new('global_tracker', 'snarfles')
38
- tr.id.should == 'global_tracker'
39
- tr.original_hash.should == 'snarfles'
37
+ expect(tr.id).to eq('global_tracker')
38
+ expect(tr.original_hash).to eq('snarfles')
40
39
  end
41
40
  end
42
41
 
43
42
  describe '#wfid' do
44
43
  it 'returns wfid from original hash' do
45
- described_class.new('local_tracker').wfid.should == 'my_wfid'
44
+ expect(described_class.new('local_tracker').wfid).to eq('my_wfid')
46
45
  end
47
46
 
48
47
  it 'returns wfid from flow expression for global trackers' do
49
- described_class.new('global_tracker').wfid.should == 'my_wfid'
48
+ expect(described_class.new('global_tracker').wfid).to eq('my_wfid')
50
49
  end
51
50
 
52
51
  it 'returns nil if no wfid' do
53
- described_class.new('on_error').wfid.should be_nil
52
+ expect(described_class.new('on_error').wfid).to be_nil
54
53
  end
55
54
  end
56
55
 
57
56
  describe '#process' do
58
57
  it 'returns process for wfid stored in msg' do
59
58
  tr = described_class.new('global_tracker')
60
- tr.process.should == Bumbleworks::Process.new('my_wfid')
59
+ expect(tr.process).to eq(Bumbleworks::Process.new('my_wfid'))
61
60
  end
62
61
 
63
62
  it 'returns nil if no wfid' do
64
63
  tr = described_class.new('on_error')
65
- tr.process.should be_nil
64
+ expect(tr.process).to be_nil
66
65
  end
67
66
  end
68
67
 
69
68
  describe '#global?' do
70
69
  it 'returns true if not listening to events on a specific wfid' do
71
- described_class.new('on_error').global?.should be_true
72
- described_class.new('global_tracker').global?.should be_true
70
+ expect(described_class.new('on_error').global?).to be_truthy
71
+ expect(described_class.new('global_tracker').global?).to be_truthy
73
72
  end
74
73
 
75
74
  it 'returns false if listening to events on a specific wfid' do
76
- described_class.new('local_tracker').global?.should be_false
75
+ expect(described_class.new('local_tracker').global?).to be_falsy
77
76
  end
78
77
  end
79
78
 
80
79
  describe '#conditions' do
81
80
  it 'returns conditions that this tracker is watching' do
82
- described_class.new('global_tracker').conditions.should == { "tag" => [ "the_event" ] }
83
- described_class.new('local_tracker').conditions.should == { "tag" => [ "local_event" ] }
84
- described_class.new('local_error_intercept').conditions.should == { "message" => [ "/bad/" ] }
85
- described_class.new('participant_tracker').conditions.should == { "participant_name" => [ "goose","bunnies" ] }
81
+ expect(described_class.new('global_tracker').conditions).to eq({ "tag" => [ "the_event" ] })
82
+ expect(described_class.new('local_tracker').conditions).to eq({ "tag" => [ "local_event" ] })
83
+ expect(described_class.new('local_error_intercept').conditions).to eq({ "message" => [ "/bad/" ] })
84
+ expect(described_class.new('participant_tracker').conditions).to eq({ "participant_name" => [ "goose","bunnies" ] })
86
85
  end
87
86
 
88
87
  it 'returns empty hash when no conditions' do
89
- described_class.new('on_error').conditions.should == {}
88
+ expect(described_class.new('on_error').conditions).to eq({})
90
89
  end
91
90
  end
92
91
 
93
92
  describe '#tags' do
94
93
  it 'returns array of tags' do
95
- described_class.new('global_tracker').tags.should == [ "the_event" ]
96
- described_class.new('local_tracker').tags.should == [ "local_event" ]
94
+ expect(described_class.new('global_tracker').tags).to eq([ "the_event" ])
95
+ expect(described_class.new('local_tracker').tags).to eq([ "local_event" ])
97
96
  end
98
97
 
99
98
  it 'returns empty array if no tags' do
100
- described_class.new('local_error_intercept').tags.should == []
101
- described_class.new('participant_tracker').tags.should == []
99
+ expect(described_class.new('local_error_intercept').tags).to eq([])
100
+ expect(described_class.new('participant_tracker').tags).to eq([])
102
101
  end
103
102
  end
104
103
 
105
104
  describe '#action' do
106
105
  it 'returns action being awaited' do
107
- described_class.new('global_tracker').action.should == 'left_tag'
108
- described_class.new('local_error_intercept').action.should == 'error_intercepted'
109
- described_class.new('participant_tracker').action.should == 'dispatch'
106
+ expect(described_class.new('global_tracker').action).to eq('left_tag')
107
+ expect(described_class.new('local_error_intercept').action).to eq('error_intercepted')
108
+ expect(described_class.new('participant_tracker').action).to eq('dispatch')
110
109
  end
111
110
  end
112
111
 
113
- describe '#waiting_expression' do
112
+ describe '#waiting_expression' do
114
113
  it 'returns nil when no expression is waiting' do
115
- described_class.new('on_error').waiting_expression.should be_nil
114
+ expect(described_class.new('on_error').waiting_expression).to be_nil
116
115
  end
117
116
 
118
- it 'returns expression awaiting reply' do
117
+ it 'returns expression awaiting reply' do
119
118
  process = Bumbleworks::Process.new('my_wfid')
120
119
  expression1 = double(:expid => '0_0_0', :tree => :a_global_expression)
121
120
  expression2 = double(:expid => '0_0_1', :tree => :a_local_expression)
122
- process.stub(:expressions => [expression1, expression2])
121
+ allow(process).to receive_messages(:expressions => [expression1, expression2])
123
122
 
124
123
  tracker1 = described_class.new('global_tracker')
125
- tracker1.stub(:process => process)
126
- tracker1.waiting_expression.should == :a_global_expression
124
+ allow(tracker1).to receive_messages(:process => process)
125
+ expect(tracker1.waiting_expression).to eq(:a_global_expression)
127
126
 
128
127
  tracker2 = described_class.new('local_tracker')
129
- tracker2.stub(:process => process)
130
- tracker2.waiting_expression.should == :a_local_expression
128
+ allow(tracker2).to receive_messages(:process => process)
129
+ expect(tracker2.waiting_expression).to eq(:a_local_expression)
131
130
  end
132
131
  end
133
132
 
134
133
  describe '#where_clause' do
135
134
  it 'returns where clause from waiting expression' do
136
135
  tracker = described_class.new('global_tracker')
137
- tracker.stub(:waiting_expression => [
136
+ allow(tracker).to receive_messages(:waiting_expression => [
138
137
  'wait_for_event', { "where" => "some_stuff_matches" }, []
139
138
  ])
140
- tracker.where_clause.should == 'some_stuff_matches'
139
+ expect(tracker.where_clause).to eq('some_stuff_matches')
141
140
  end
142
141
 
143
142
  it 'returns nil when waiting_expression does not include where clause' do
144
143
  tracker = described_class.new('global_tracker')
145
- tracker.stub(:waiting_expression => [
144
+ allow(tracker).to receive_messages(:waiting_expression => [
146
145
  'wait_for_event', {}, []
147
146
  ])
148
- tracker.where_clause.should be_nil
147
+ expect(tracker.where_clause).to be_nil
149
148
  end
150
149
 
151
150
  it 'returns nil when no waiting_expression' do
152
- described_class.new('on_error').where_clause.should be_nil
151
+ expect(described_class.new('on_error').where_clause).to be_nil
153
152
  end
154
153
  end
155
154
  end
@@ -24,19 +24,20 @@ describe Bumbleworks::TreeBuilder do
24
24
  end
25
25
  )
26
26
  builder = described_class.new(:name => 'luigi', :definition => pdef)
27
- builder.build!.should == [
27
+ expect(builder.build!).to eq([
28
28
  "define", {"name" => "luigi"},
29
29
  [
30
30
  ["order_pants_around", {}, []]
31
31
  ]
32
- ]
32
+ ])
33
33
  end
34
34
 
35
35
  it 'uses tree if given' do
36
36
  tree = ["define", {"guppies" => nil}, [["swim", {}, []]]]
37
37
  builder = described_class.new(:tree => tree)
38
- builder.build!.should ==
38
+ expect(builder.build!).to eq(
39
39
  ["define", {"name" => "guppies"}, [["swim", {}, []]]]
40
+ )
40
41
  end
41
42
 
42
43
  it 'normalizes and sets name from tree' do
@@ -46,12 +47,12 @@ describe Bumbleworks::TreeBuilder do
46
47
  end
47
48
  )
48
49
  builder = described_class.new(:definition => pdef)
49
- builder.build!.should == [
50
+ expect(builder.build!).to eq([
50
51
  "define", {"name" => "country_time_county_dime"},
51
52
  [
52
53
  ["do_the_fig_newton", {}, []]
53
54
  ]
54
- ]
55
+ ])
55
56
  end
56
57
 
57
58
  it 'raises error if name conflicts with name in definition' do
@@ -82,14 +83,15 @@ describe Bumbleworks::TreeBuilder do
82
83
  construct :solution => 'to world conflict'
83
84
  end
84
85
  builder.build!
85
- builder.tree.should ==
86
+ expect(builder.tree).to eq(
86
87
  ["define", { "name" => "just_another_poodle_day" },
87
88
  [
88
89
  ["chew", {"on" => "dad"}, []],
89
90
  ["construct", {"solution" => "to world conflict"}, []]
90
91
  ]
91
92
  ]
92
- builder.name.should == 'just_another_poodle_day'
93
+ )
94
+ expect(builder.name).to eq('just_another_poodle_day')
93
95
  end
94
96
  end
95
97
  end
@@ -4,23 +4,23 @@ describe Bumbleworks::User do
4
4
 
5
5
  describe '#claim_token' do
6
6
  it 'returns username by default' do
7
- subject.stub(:username => 'nerfobot')
8
- subject.claim_token.should == 'nerfobot'
7
+ allow(subject).to receive_messages(:username => 'nerfobot')
8
+ expect(subject.claim_token).to eq('nerfobot')
9
9
  end
10
10
 
11
11
  it 'returns email if no username' do
12
- subject.stub(:email => 'fromp@nougatcountry.com')
13
- subject.claim_token.should == 'fromp@nougatcountry.com'
12
+ allow(subject).to receive_messages(:email => 'fromp@nougatcountry.com')
13
+ expect(subject.claim_token).to eq('fromp@nougatcountry.com')
14
14
  end
15
15
 
16
16
  it 'prefers username to email when both respond' do
17
- subject.stub(:username => 'dumb', :email => 'moar dumb')
18
- subject.claim_token.should == 'dumb'
17
+ allow(subject).to receive_messages(:username => 'dumb', :email => 'moar dumb')
18
+ expect(subject.claim_token).to eq('dumb')
19
19
  end
20
20
 
21
21
  it 'returns nil if method defined' do
22
- subject.stub(:username)
23
- subject.claim_token.should be_nil
22
+ allow(subject).to receive(:username)
23
+ expect(subject.claim_token).to be_nil
24
24
  end
25
25
 
26
26
  it 'raises exception if neither username nor email defined' do
@@ -32,19 +32,19 @@ describe Bumbleworks::User do
32
32
 
33
33
  describe '#claim' do
34
34
  before(:each) do
35
- subject.stub(:role_identifiers => ['snoogat'])
36
- subject.stub(:claim_token => "the umpire of snorts")
35
+ allow(subject).to receive_messages(:role_identifiers => ['snoogat'])
36
+ allow(subject).to receive_messages(:claim_token => "the umpire of snorts")
37
37
  end
38
38
 
39
39
  it 'claims a task if authorized' do
40
40
  task = double('task', :role => 'snoogat')
41
- task.should_receive(:claim).with("the umpire of snorts")
41
+ expect(task).to receive(:claim).with("the umpire of snorts")
42
42
  subject.claim(task)
43
43
  end
44
44
 
45
45
  it 'raises exception if unauthorized' do
46
46
  task = double('task', :role => 'fashbone')
47
- task.should_receive(:claim).never
47
+ expect(task).to receive(:claim).never
48
48
  expect {
49
49
  subject.claim(task)
50
50
  }.to raise_error(Bumbleworks::User::UnauthorizedClaimAttempt)
@@ -52,7 +52,7 @@ describe Bumbleworks::User do
52
52
 
53
53
  it 'raises exception if already claimed by another' do
54
54
  task = double('task', :role => 'snoogat')
55
- task.should_receive(:claim).and_raise(Bumbleworks::Task::AlreadyClaimed)
55
+ expect(task).to receive(:claim).and_raise(Bumbleworks::Task::AlreadyClaimed)
56
56
  expect {
57
57
  subject.claim(task)
58
58
  }.to raise_error(Bumbleworks::Task::AlreadyClaimed)
@@ -61,15 +61,15 @@ describe Bumbleworks::User do
61
61
  describe '!' do
62
62
  it 'resets even if claimed by another' do
63
63
  task = double('task', :role => 'snoogat', :claimed? => true, :claimant => 'fumbo the monfey')
64
- task.should_receive(:release).ordered
65
- task.should_receive(:claim).with("the umpire of snorts").ordered
64
+ expect(task).to receive(:release).ordered
65
+ expect(task).to receive(:claim).with("the umpire of snorts").ordered
66
66
  subject.claim!(task)
67
67
  end
68
68
 
69
69
  it 'raises exception (and does not release) if unauthorized' do
70
70
  task = double('task', :role => 'fashbone')
71
- task.should_receive(:release).never
72
- task.should_receive(:claim).never
71
+ expect(task).to receive(:release).never
72
+ expect(task).to receive(:claim).never
73
73
  expect {
74
74
  subject.claim!(task)
75
75
  }.to raise_error(Bumbleworks::User::UnauthorizedClaimAttempt)
@@ -79,24 +79,24 @@ describe Bumbleworks::User do
79
79
 
80
80
  describe '#release' do
81
81
  before(:each) do
82
- subject.stub(:claim_token => "the umpire of snorts")
82
+ allow(subject).to receive_messages(:claim_token => "the umpire of snorts")
83
83
  end
84
84
 
85
85
  it 'releases a claimed task if claimant' do
86
86
  task = double('task', :claimed? => true, :claimant => "the umpire of snorts")
87
- task.should_receive(:release)
87
+ expect(task).to receive(:release)
88
88
  subject.release(task)
89
89
  end
90
90
 
91
91
  it 'does nothing if task not claimed' do
92
92
  task = double('task', :claimed? => false)
93
- task.should_receive(:release).never
93
+ expect(task).to receive(:release).never
94
94
  subject.release(task)
95
95
  end
96
96
 
97
97
  it 'raises exception if not claimant' do
98
98
  task = double('task', :claimed? => true, :claimant => 'a castanet expert')
99
- task.should_receive(:release).never
99
+ expect(task).to receive(:release).never
100
100
  expect {
101
101
  subject.release(task)
102
102
  }.to raise_error(Bumbleworks::User::UnauthorizedReleaseAttempt)
@@ -105,7 +105,7 @@ describe Bumbleworks::User do
105
105
  describe '!' do
106
106
  it 'releases even if not claimant' do
107
107
  task = double('task', :claimed? => true, :claimant => 'a castanet expert')
108
- task.should_receive(:release)
108
+ expect(task).to receive(:release)
109
109
  subject.release!(task)
110
110
  end
111
111
  end
@@ -121,41 +121,41 @@ describe Bumbleworks::User do
121
121
 
122
122
  describe '#has_role?' do
123
123
  before(:each) do
124
- subject.stub(:role_identifiers => ['role1', 'role2'])
124
+ allow(subject).to receive_messages(:role_identifiers => ['role1', 'role2'])
125
125
  end
126
126
 
127
127
  it 'returns true if role_identifiers includes given role' do
128
- subject.has_role?('role1').should be_true
128
+ expect(subject.has_role?('role1')).to be_truthy
129
129
  end
130
130
 
131
131
  it 'returns false if role_identifiers does not include given role' do
132
- subject.has_role?('role3').should be_false
132
+ expect(subject.has_role?('role3')).to be_falsy
133
133
  end
134
134
  end
135
135
 
136
136
  describe '#authorized_tasks' do
137
137
  it 'returns task query for all tasks for user roles' do
138
- subject.stub(:role_identifiers => ['goose', 'midget'])
139
- Bumbleworks::Task.stub(:for_roles).with(['goose', 'midget']).and_return(:all_the_tasks)
140
- subject.authorized_tasks.should == :all_the_tasks
138
+ allow(subject).to receive_messages(:role_identifiers => ['goose', 'midget'])
139
+ allow(Bumbleworks::Task).to receive(:for_roles).with(['goose', 'midget']).and_return(:all_the_tasks)
140
+ expect(subject.authorized_tasks).to eq(:all_the_tasks)
141
141
  end
142
142
  end
143
143
 
144
144
  describe '#claimed_tasks' do
145
145
  it 'returns task query for all user claimed tasks' do
146
- subject.stub(:claim_token => :yay_its_me)
147
- Bumbleworks::Task.stub(:for_claimant).with(:yay_its_me).and_return(:my_tasks)
148
- subject.claimed_tasks.should == :my_tasks
146
+ allow(subject).to receive_messages(:claim_token => :yay_its_me)
147
+ allow(Bumbleworks::Task).to receive(:for_claimant).with(:yay_its_me).and_return(:my_tasks)
148
+ expect(subject.claimed_tasks).to eq(:my_tasks)
149
149
  end
150
150
  end
151
151
 
152
152
  describe '#available_tasks' do
153
153
  it 'returns authorized tasks filtered by available' do
154
- subject.stub(:role_identifiers => ['goose', 'midget'])
154
+ allow(subject).to receive_messages(:role_identifiers => ['goose', 'midget'])
155
155
  task_finder = double('task_finder')
156
- task_finder.stub(:available => :only_the_available_tasks)
157
- Bumbleworks::Task.stub(:for_roles).with(['goose', 'midget']).and_return(task_finder)
158
- subject.available_tasks.should == :only_the_available_tasks
156
+ allow(task_finder).to receive_messages(:available => :only_the_available_tasks)
157
+ allow(Bumbleworks::Task).to receive(:for_roles).with(['goose', 'midget']).and_return(task_finder)
158
+ expect(subject.available_tasks).to eq(:only_the_available_tasks)
159
159
  end
160
160
  end
161
161
  end
@@ -13,15 +13,15 @@ describe Bumbleworks::WorkitemEntityStorage do
13
13
 
14
14
  describe '#entity_storage_workitem' do
15
15
  it 'returns new Bumbleworks::Workitem instance with workitem' do
16
- Bumbleworks::Workitem.stub(:new).with(:a_workitem).and_return(:the_workitem)
16
+ allow(Bumbleworks::Workitem).to receive(:new).with(:a_workitem).and_return(:the_workitem)
17
17
  feh = fake_entity_holder.new(:a_workitem)
18
- feh.entity_storage_workitem.should == :the_workitem
18
+ expect(feh.entity_storage_workitem).to eq(:the_workitem)
19
19
  end
20
20
 
21
21
  it 'is memoized' do
22
22
  feh = fake_entity_holder.new(:a_workitem)
23
23
  esw = feh.entity_storage_workitem
24
- feh.entity_storage_workitem.should be esw
24
+ expect(feh.entity_storage_workitem).to be esw
25
25
  end
26
26
  end
27
27
 
@@ -29,8 +29,8 @@ describe Bumbleworks::WorkitemEntityStorage do
29
29
  describe "##{method}" do
30
30
  it 'delegates to entity storage workitem' do
31
31
  feh = fake_entity_holder.new(:a_workitem)
32
- feh.entity_storage_workitem.stub(method).with(1, 2, 3).and_return(:yay_for_bikes)
33
- feh.send(method, 1, 2, 3).should == :yay_for_bikes
32
+ allow(feh.entity_storage_workitem).to receive(method).with(1, 2, 3).and_return(:yay_for_bikes)
33
+ expect(feh.send(method, 1, 2, 3)).to eq(:yay_for_bikes)
34
34
  end
35
35
  end
36
36
  end