bumbleworks 0.0.74 → 0.0.76

Sign up to get free protection for your applications and to get access to all the features.
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