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.
- checksums.yaml +7 -0
- data/.rspec +1 -1
- data/.ruby-version +1 -1
- data/bumbleworks.gemspec +2 -2
- data/lib/bumbleworks.rb +1 -0
- data/lib/bumbleworks/expression.rb +12 -1
- data/lib/bumbleworks/process.rb +10 -0
- data/lib/bumbleworks/process/error_record.rb +14 -0
- data/lib/bumbleworks/schedule.rb +58 -0
- data/lib/bumbleworks/task.rb +2 -1
- data/lib/bumbleworks/task/finder.rb +4 -0
- data/lib/bumbleworks/version.rb +1 -1
- data/lib/bumbleworks/workitem.rb +4 -0
- data/spec/fixtures/schedules.rb +40 -0
- data/spec/integration/entity_spec.rb +7 -7
- data/spec/integration/example_configurations_spec.rb +5 -5
- data/spec/integration/history_storage_spec.rb +9 -9
- data/spec/integration/sample_application_spec.rb +15 -15
- data/spec/lib/bumbleworks/configuration_spec.rb +52 -52
- data/spec/lib/bumbleworks/entity_spec.rb +66 -68
- data/spec/lib/bumbleworks/error_handler_spec.rb +1 -1
- data/spec/lib/bumbleworks/error_logger_spec.rb +5 -5
- data/spec/lib/bumbleworks/expression_spec.rb +34 -12
- data/spec/lib/bumbleworks/hash_storage_spec.rb +2 -2
- data/spec/lib/bumbleworks/participant/base_spec.rb +1 -1
- data/spec/lib/bumbleworks/participant/entity_interactor_spec.rb +20 -20
- data/spec/lib/bumbleworks/participant/error_dispatcher_spec.rb +3 -3
- data/spec/lib/bumbleworks/participant/local_participant_spec.rb +1 -1
- data/spec/lib/bumbleworks/participant_registration_spec.rb +4 -4
- data/spec/lib/bumbleworks/process/error_record_spec.rb +13 -0
- data/spec/lib/bumbleworks/process_definition_spec.rb +30 -24
- data/spec/lib/bumbleworks/process_spec.rb +86 -54
- data/spec/lib/bumbleworks/ruote/exp/broadcast_event_expression_spec.rb +2 -2
- data/spec/lib/bumbleworks/ruote/exp/wait_for_event_expression_spec.rb +4 -4
- data/spec/lib/bumbleworks/ruote_spec.rb +73 -71
- data/spec/lib/bumbleworks/schedule_spec.rb +124 -0
- data/spec/lib/bumbleworks/simple_logger_spec.rb +8 -8
- data/spec/lib/bumbleworks/storage_adapter_spec.rb +16 -16
- data/spec/lib/bumbleworks/support_spec.rb +23 -19
- data/spec/lib/bumbleworks/task/finder_spec.rb +46 -46
- data/spec/lib/bumbleworks/task_spec.rb +188 -167
- data/spec/lib/bumbleworks/tracker_spec.rb +41 -42
- data/spec/lib/bumbleworks/tree_builder_spec.rb +9 -7
- data/spec/lib/bumbleworks/user_spec.rb +35 -35
- data/spec/lib/bumbleworks/workitem_entity_storage_spec.rb +5 -5
- data/spec/lib/bumbleworks/workitem_spec.rb +28 -17
- data/spec/lib/bumbleworks_spec.rb +57 -51
- data/spec/spec_helper.rb +0 -1
- data/spec/support/shared_examples.rb +3 -3
- metadata +35 -54
@@ -8,7 +8,7 @@ describe Bumbleworks::ErrorLogger do
|
|
8
8
|
end
|
9
9
|
|
10
10
|
it 'calls registered logger and logs error information' do
|
11
|
-
Bumbleworks.logger.
|
11
|
+
expect(Bumbleworks.logger).to receive(:error).with({
|
12
12
|
:actor => 'armadillo',
|
13
13
|
:action => 'process error',
|
14
14
|
:target_type => nil,
|
@@ -20,8 +20,8 @@ describe Bumbleworks::ErrorLogger do
|
|
20
20
|
end
|
21
21
|
|
22
22
|
it 'sets target to entity if found' do
|
23
|
-
workitem.
|
24
|
-
Bumbleworks.logger.
|
23
|
+
allow(workitem).to receive_messages(:fields => {:entity_id => 1234, :entity_type => 'Lizards'})
|
24
|
+
expect(Bumbleworks.logger).to receive(:error).with(hash_including({
|
25
25
|
:target_type => 'Lizards',
|
26
26
|
:target_id => 1234,
|
27
27
|
}))
|
@@ -30,7 +30,7 @@ describe Bumbleworks::ErrorLogger do
|
|
30
30
|
end
|
31
31
|
|
32
32
|
it 'does nothing if logger is not registered' do
|
33
|
-
Bumbleworks.
|
34
|
-
subject.on_error.
|
33
|
+
allow(Bumbleworks).to receive(:logger)
|
34
|
+
expect(subject.on_error).to eq(nil)
|
35
35
|
end
|
36
36
|
end
|
@@ -3,15 +3,37 @@ describe Bumbleworks::Expression do
|
|
3
3
|
let(:fexp) { double('FlowExpression', :fei => fei, :tree => :a_tree) }
|
4
4
|
subject { described_class.new(fexp) }
|
5
5
|
|
6
|
+
describe '.from_fei' do
|
7
|
+
it 'returns instance generated from FlowExpressionId' do
|
8
|
+
allow(::Ruote::Exp::FlowExpression).to receive(:fetch).
|
9
|
+
with(Bumbleworks.dashboard.context, fei).and_return(fexp)
|
10
|
+
expect(described_class.from_fei(fei)).to eq(described_class.new(fexp))
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '#==' do
|
15
|
+
it 'returns true if other object has same flow expression id' do
|
16
|
+
exp1 = described_class.new(fexp)
|
17
|
+
exp2 = described_class.new(double('FlowExpression', :fei => fei))
|
18
|
+
expect(exp1).to eq(exp2)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'returns false if other object has different flow expression id' do
|
22
|
+
exp1 = described_class.new(fexp)
|
23
|
+
exp2 = described_class.new(double('FlowExpression', :fei => double(:expid => '4')))
|
24
|
+
expect(exp1).not_to eq(exp2)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
6
28
|
describe '#expid' do
|
7
29
|
it 'returns expid from fei' do
|
8
|
-
subject.expid.
|
30
|
+
expect(subject.expid).to eq('1_2_3')
|
9
31
|
end
|
10
32
|
end
|
11
33
|
|
12
34
|
describe '#process' do
|
13
35
|
it 'returns process for expression wfid' do
|
14
|
-
subject.process.
|
36
|
+
expect(subject.process).to eq(Bumbleworks::Process.new('snooks'))
|
15
37
|
end
|
16
38
|
end
|
17
39
|
|
@@ -24,44 +46,44 @@ describe Bumbleworks::Expression do
|
|
24
46
|
describe '#error' do
|
25
47
|
it 'returns error from process that matches fei' do
|
26
48
|
process = double
|
27
|
-
process.
|
49
|
+
allow(process).to receive_messages(:errors => [
|
28
50
|
double(:fei => :not_me, :message => 'alarming!'),
|
29
51
|
double(:fei => fei, :message => 'boo!'),
|
30
52
|
double(:fei => :also_not_me, :message => 'yippee!')
|
31
53
|
])
|
32
|
-
subject.
|
33
|
-
subject.error.message.
|
54
|
+
allow(subject).to receive_messages(:process => process)
|
55
|
+
expect(subject.error.message).to eq('boo!')
|
34
56
|
end
|
35
57
|
|
36
58
|
it 'returns nil if no error during this expression' do
|
37
59
|
process = double
|
38
|
-
process.
|
60
|
+
allow(process).to receive_messages(:errors => [
|
39
61
|
double(:fei => :not_me, :message => 'alarming!'),
|
40
62
|
double(:fei => :also_not_me, :message => 'yippee!')
|
41
63
|
])
|
42
|
-
subject.
|
43
|
-
subject.error.
|
64
|
+
allow(subject).to receive_messages(:process => process)
|
65
|
+
expect(subject.error).to be_nil
|
44
66
|
end
|
45
67
|
end
|
46
68
|
|
47
69
|
describe '#cancel!' do
|
48
70
|
it 'cancels the expression' do
|
49
|
-
Bumbleworks.dashboard.
|
71
|
+
expect(Bumbleworks.dashboard).to receive(:cancel_expression).with(fei)
|
50
72
|
subject.cancel!
|
51
73
|
end
|
52
74
|
end
|
53
75
|
|
54
76
|
describe '#kill!' do
|
55
77
|
it 'kills the expression' do
|
56
|
-
Bumbleworks.dashboard.
|
78
|
+
expect(Bumbleworks.dashboard).to receive(:kill_expression).with(fei)
|
57
79
|
subject.kill!
|
58
80
|
end
|
59
81
|
end
|
60
82
|
|
61
83
|
describe '#workitem' do
|
62
84
|
it 'returns the workitem as applied to this expression' do
|
63
|
-
fexp.
|
64
|
-
subject.workitem.
|
85
|
+
allow(fexp).to receive(:applied_workitem).and_return(:something_raw)
|
86
|
+
expect(subject.workitem).to eq(Bumbleworks::Workitem.new(:something_raw))
|
65
87
|
end
|
66
88
|
end
|
67
89
|
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
describe Bumbleworks::HashStorage do
|
2
2
|
describe '.allow_history_storage?' do
|
3
3
|
it 'returns false' do
|
4
|
-
described_class.allow_history_storage
|
4
|
+
expect(described_class.allow_history_storage?).to be_falsy
|
5
5
|
end
|
6
6
|
|
7
7
|
it 'is a Bumbleworks::StorageAdapter' do
|
8
|
-
described_class.superclass.
|
8
|
+
expect(described_class.superclass).to eq(Bumbleworks::StorageAdapter)
|
9
9
|
end
|
10
10
|
end
|
11
11
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
describe Bumbleworks::Participant do
|
2
2
|
it 'includes Bumbleworks::LocalParticipant' do
|
3
|
-
described_class.included_modules.
|
3
|
+
expect(described_class.included_modules).to include(Bumbleworks::LocalParticipant)
|
4
4
|
end
|
5
5
|
|
6
6
|
it 'defines #on_cancel' do
|
@@ -1,89 +1,89 @@
|
|
1
1
|
describe Bumbleworks::EntityInteractor do
|
2
2
|
let(:entity) { double('entity', :cheek_depth => 'crazy deep') }
|
3
3
|
let(:workitem) { Ruote::Workitem.new('fields' => { 'params' => { 'method' => 'cheek_depth' }}) }
|
4
|
-
subject { part = described_class.new; part.
|
4
|
+
subject { part = described_class.new; allow(part).to receive_messages(:entity => entity, :reply => nil); part }
|
5
5
|
|
6
6
|
describe '#on_workitem' do
|
7
7
|
it 'calls method then replies' do
|
8
|
-
subject.
|
9
|
-
subject.
|
8
|
+
expect(subject).to receive(:call_method).ordered
|
9
|
+
expect(subject).to receive(:reply).ordered
|
10
10
|
subject._on_workitem(workitem)
|
11
11
|
end
|
12
12
|
|
13
13
|
it 'saves the requested attribute to a workitem field' do
|
14
14
|
workitem.fields['params']['and_save_as'] = 'entity_cheek_depth'
|
15
15
|
subject._on_workitem(workitem)
|
16
|
-
workitem.fields['entity_cheek_depth'].
|
16
|
+
expect(workitem.fields['entity_cheek_depth']).to eq('crazy deep')
|
17
17
|
end
|
18
18
|
|
19
19
|
it 'overwrites an existing workitem field value' do
|
20
20
|
workitem.fields['entity_cheek_depth'] = '14'
|
21
21
|
workitem.fields['params']['and_save_as'] = 'entity_cheek_depth'
|
22
22
|
subject._on_workitem(workitem)
|
23
|
-
workitem.fields['entity_cheek_depth'].
|
23
|
+
expect(workitem.fields['entity_cheek_depth']).to eq('crazy deep')
|
24
24
|
end
|
25
25
|
|
26
26
|
it 'calls the method even if no save_as to store the result' do
|
27
|
-
subject.entity.
|
27
|
+
expect(subject.entity).to receive(:cheek_depth)
|
28
28
|
subject._on_workitem(workitem)
|
29
|
-
workitem.fields['entity_cheek_depth'].
|
29
|
+
expect(workitem.fields['entity_cheek_depth']).to be_nil
|
30
30
|
end
|
31
31
|
|
32
32
|
it 'passes arguments to method' do
|
33
33
|
workitem.fields['params']['arguments'] = [1, 3, ['apple', 'fish']]
|
34
34
|
workitem.fields['params']['and_save_as'] = 'entity_cheek_depth'
|
35
|
-
subject.entity.
|
35
|
+
expect(subject.entity).to receive(:cheek_depth).with(1, 3, ['apple', 'fish']).and_return('what')
|
36
36
|
subject._on_workitem(workitem)
|
37
|
-
workitem.fields['entity_cheek_depth'].
|
37
|
+
expect(workitem.fields['entity_cheek_depth']).to eq('what')
|
38
38
|
end
|
39
39
|
|
40
40
|
it 'can accept "with" for arguments' do
|
41
41
|
workitem.fields['params']['with'] = { :regular => 'joes' }
|
42
|
-
subject.entity.
|
42
|
+
expect(subject.entity).to receive(:cheek_depth).with({ :regular => 'joes' })
|
43
43
|
subject._on_workitem(workitem)
|
44
44
|
end
|
45
45
|
|
46
46
|
it 'can use "for" param for method' do
|
47
47
|
workitem.fields['params'] = { 'for' => 'grass_seed', 'and_save_as' => 'how_tasty' }
|
48
|
-
entity.
|
48
|
+
expect(entity).to receive(:grass_seed).and_return('tasty-o')
|
49
49
|
subject._on_workitem(workitem)
|
50
|
-
workitem.fields['how_tasty'].
|
50
|
+
expect(workitem.fields['how_tasty']).to eq('tasty-o')
|
51
51
|
end
|
52
52
|
|
53
53
|
it 'can use "to" param for method' do
|
54
54
|
workitem.fields['params'] = { 'to' => 'chew_things' }
|
55
|
-
entity.
|
55
|
+
expect(entity).to receive(:chew_things).and_return(nil)
|
56
56
|
subject._on_workitem(workitem)
|
57
|
-
workitem.fields['who_cares'].
|
57
|
+
expect(workitem.fields['who_cares']).to be_nil
|
58
58
|
end
|
59
59
|
|
60
60
|
it 'defaults to "method" when multiple options exist' do
|
61
61
|
workitem.fields['params'] = { 'method' => 'really_do_this', 'to' => 'not_this', 'for' => 'definitely_not_this' }
|
62
|
-
entity.
|
62
|
+
expect(entity).to receive(:really_do_this)
|
63
63
|
subject._on_workitem(workitem)
|
64
64
|
end
|
65
65
|
|
66
66
|
it 'defaults to "to" when both "to" and "for"' do
|
67
67
|
workitem.fields['params'] = { 'to' => 'please_call_me', 'for' => 'call_me_maybe' }
|
68
|
-
entity.
|
68
|
+
expect(entity).to receive(:please_call_me)
|
69
69
|
subject._on_workitem(workitem)
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
73
|
describe '#call_method' do
|
74
74
|
it 'calls the requested method on the entity' do
|
75
|
-
subject.call_method('cheek_depth').
|
75
|
+
expect(subject.call_method('cheek_depth')).to eq('crazy deep')
|
76
76
|
end
|
77
77
|
|
78
78
|
it 'saves the result if given a target' do
|
79
79
|
subject.workitem = workitem
|
80
80
|
subject.call_method('cheek_depth', :save_as => 'entity_cheek_depth')
|
81
|
-
workitem.fields['entity_cheek_depth'].
|
81
|
+
expect(workitem.fields['entity_cheek_depth']).to eq('crazy deep')
|
82
82
|
end
|
83
83
|
|
84
84
|
it 'raises an exception if no method on entity' do
|
85
|
-
subject.
|
86
|
-
expect {
|
85
|
+
allow(subject).to receive(:entity).and_return('just an unassuming little string!')
|
86
|
+
expect {
|
87
87
|
subject.call_method('eat_television')
|
88
88
|
}.to raise_error(NoMethodError)
|
89
89
|
end
|
@@ -6,9 +6,9 @@ describe Bumbleworks::ErrorDispatcher do
|
|
6
6
|
|
7
7
|
it 'calls all error handlers passing in workitem' do
|
8
8
|
Bumbleworks.error_handlers = error_handlers
|
9
|
-
error_handlers[0].
|
10
|
-
error_handlers[1].
|
11
|
-
subject.
|
9
|
+
expect(error_handlers[0]).to receive(:new).ordered.with(workitem).and_return(instances[0])
|
10
|
+
expect(error_handlers[1]).to receive(:new).ordered.with(workitem).and_return(instances[1])
|
11
|
+
allow(subject).to receive_messages(:reply => nil, :workitem => workitem)
|
12
12
|
subject.on_workitem
|
13
13
|
end
|
14
14
|
end
|
@@ -10,7 +10,7 @@ describe Bumbleworks::LocalParticipant do
|
|
10
10
|
}
|
11
11
|
|
12
12
|
it 'includes Ruote::LocalParticipant' do
|
13
|
-
described_class.included_modules.
|
13
|
+
expect(described_class.included_modules).to include(Ruote::LocalParticipant)
|
14
14
|
end
|
15
15
|
|
16
16
|
it_behaves_like "an entity holder" do
|
@@ -5,9 +5,9 @@ describe Bumbleworks::ParticipantRegistration do
|
|
5
5
|
|
6
6
|
describe '.autoload_all' do
|
7
7
|
it 'autoloads all participants in directory' do
|
8
|
-
Object.
|
8
|
+
expect(Object).to receive(:autoload).with(:HoneyParticipant,
|
9
9
|
File.join(Bumbleworks.root, 'participants', 'honey_participant.rb'))
|
10
|
-
Object.
|
10
|
+
expect(Object).to receive(:autoload).with(:MolassesParticipant,
|
11
11
|
File.join(Bumbleworks.root, 'participants', 'molasses_participant.rb'))
|
12
12
|
described_class.autoload_all
|
13
13
|
end
|
@@ -27,13 +27,13 @@ describe Bumbleworks::ParticipantRegistration do
|
|
27
27
|
|
28
28
|
describe '.register!' do
|
29
29
|
it 'loads registration file' do
|
30
|
-
Kernel.
|
30
|
+
expect(Kernel).to receive(:load).with(File.join(Bumbleworks.root, 'participants.rb'))
|
31
31
|
described_class.register!
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'registers default participants if using default path and file does not exist' do
|
35
35
|
Bumbleworks.root = File.join(fixtures_path, 'apps', 'minimal')
|
36
|
-
Bumbleworks.
|
36
|
+
expect(Bumbleworks).to receive(:register_default_participants)
|
37
37
|
described_class.register!
|
38
38
|
end
|
39
39
|
|
@@ -15,6 +15,19 @@ describe Bumbleworks::Process::ErrorRecord do
|
|
15
15
|
@error = @process.errors.first
|
16
16
|
end
|
17
17
|
|
18
|
+
describe '#replay' do
|
19
|
+
it 'replays the process at the error' do
|
20
|
+
expect(Bumbleworks.dashboard).to receive(:replay_at_error).with(@error.process_error)
|
21
|
+
@error.replay
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#workitem' do
|
26
|
+
it 'returns the workitem where the error occurred' do
|
27
|
+
expect(@error.workitem).to eq(@error.process_error.workitem)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
18
31
|
describe '#error_class_name' do
|
19
32
|
it 'returns the class name of the recorded error (as a string)' do
|
20
33
|
expect(@error.error_class_name).to eq 'NaughtyParticipant::StupidError'
|
@@ -7,25 +7,25 @@ describe Bumbleworks::ProcessDefinition do
|
|
7
7
|
|
8
8
|
it "can be constructed with name and definition" do
|
9
9
|
pdef = described_class.new(:name => 'zach', :definition => 'orbo')
|
10
|
-
pdef.name.
|
11
|
-
pdef.definition.
|
10
|
+
expect(pdef.name).to eq('zach')
|
11
|
+
expect(pdef.definition).to eq('orbo')
|
12
12
|
end
|
13
13
|
|
14
14
|
it "can be constructed with name and tree" do
|
15
15
|
pdef = described_class.new(:name => 'zach', :tree => ["define", {"your" => "face"}])
|
16
|
-
pdef.name.
|
17
|
-
pdef.tree.
|
16
|
+
expect(pdef.name).to eq('zach')
|
17
|
+
expect(pdef.tree).to eq(["define", {"your" => "face"}])
|
18
18
|
end
|
19
19
|
|
20
20
|
describe '#build_tree!' do
|
21
21
|
it "converts Bumbleworks definition to Ruote tree" do
|
22
22
|
pdef = described_class.new(:name => 'monkeys', :definition => valid_definition)
|
23
|
-
pdef.build_tree
|
23
|
+
expect(pdef.build_tree!).to eq([
|
24
24
|
"define", {"name" => "monkeys"},
|
25
25
|
[
|
26
26
|
["chocolate_covered_skis", {"are" => "awesome"}, []]
|
27
27
|
]
|
28
|
-
]
|
28
|
+
])
|
29
29
|
end
|
30
30
|
|
31
31
|
it "raises error if name in definition does not match" do
|
@@ -39,12 +39,12 @@ describe Bumbleworks::ProcessDefinition do
|
|
39
39
|
it "adds name to tree when not specified in definition" do
|
40
40
|
unnamed_def = valid_definition.gsub(/ 'monkeys'/, '')
|
41
41
|
pdef = described_class.new(:name => 'spit_salad', :definition => unnamed_def)
|
42
|
-
pdef.build_tree
|
42
|
+
expect(pdef.build_tree!).to eq([
|
43
43
|
"define", {"name" => "spit_salad"},
|
44
44
|
[
|
45
45
|
["chocolate_covered_skis", {"are" => "awesome"}, []]
|
46
46
|
]
|
47
|
-
]
|
47
|
+
])
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
@@ -72,7 +72,7 @@ describe Bumbleworks::ProcessDefinition do
|
|
72
72
|
describe "#save!" do
|
73
73
|
it "validates" do
|
74
74
|
pdef = described_class.new
|
75
|
-
pdef.
|
75
|
+
expect(pdef).to receive(:validate!)
|
76
76
|
pdef.save!
|
77
77
|
end
|
78
78
|
|
@@ -85,16 +85,18 @@ describe Bumbleworks::ProcessDefinition do
|
|
85
85
|
it "registers the process definition with the dashboard" do
|
86
86
|
pdef = described_class.new(:name => 'monkeys', :definition => valid_definition)
|
87
87
|
pdef.save!
|
88
|
-
Bumbleworks.dashboard.variables['monkeys'].
|
88
|
+
expect(Bumbleworks.dashboard.variables['monkeys']).to eq(
|
89
89
|
pdef.build_tree!
|
90
|
+
)
|
90
91
|
end
|
91
92
|
|
92
93
|
it "overwrites existing variable with new definition" do
|
93
94
|
Bumbleworks.dashboard.variables['monkeys'] = 'A miraculous ingredient'
|
94
95
|
pdef = described_class.new(:name => 'monkeys', :definition => valid_definition)
|
95
96
|
pdef.save!
|
96
|
-
Bumbleworks.dashboard.variables['monkeys'].
|
97
|
+
expect(Bumbleworks.dashboard.variables['monkeys']).to eq(
|
97
98
|
pdef.build_tree!
|
99
|
+
)
|
98
100
|
end
|
99
101
|
end
|
100
102
|
|
@@ -102,24 +104,24 @@ describe Bumbleworks::ProcessDefinition do
|
|
102
104
|
it "returns an instance with a previously registered definition" do
|
103
105
|
Bumbleworks.dashboard.variables['foo'] = 'go to the bar'
|
104
106
|
pdef = described_class.find_by_name('foo')
|
105
|
-
pdef.tree.
|
107
|
+
expect(pdef.tree).to eq('go to the bar')
|
106
108
|
end
|
107
109
|
|
108
110
|
it "raises an error if registered definition can't be found by given name" do
|
109
|
-
|
111
|
+
expect { described_class.find_by_name('nerf') }.to raise_error(described_class::NotFound)
|
110
112
|
end
|
111
113
|
end
|
112
114
|
|
113
115
|
describe "#load_definition_from_file" do
|
114
116
|
it "raises an error if given file can't be found" do
|
115
117
|
pdef = described_class.new(:name => 'whatever')
|
116
|
-
|
118
|
+
expect { pdef.load_definition_from_file('nerf') }.to raise_error(described_class::FileNotFound)
|
117
119
|
end
|
118
120
|
|
119
121
|
it "sets #definition to the parsed result of the file, if found" do
|
120
122
|
pdef = described_class.new(:name => 'test_process')
|
121
123
|
pdef.load_definition_from_file definition_path('test_process')
|
122
|
-
pdef.definition.
|
124
|
+
expect(pdef.definition).to eq(File.read(definition_path('test_process')))
|
123
125
|
end
|
124
126
|
end
|
125
127
|
|
@@ -133,7 +135,7 @@ describe Bumbleworks::ProcessDefinition do
|
|
133
135
|
end
|
134
136
|
|
135
137
|
it 'raises error if duplicate filenames are encountered' do
|
136
|
-
Bumbleworks::Support.
|
138
|
+
allow(Bumbleworks::Support).to receive(:all_files).and_return({
|
137
139
|
'Rhubarb Derailleur' => 'popular_side_dish',
|
138
140
|
'Cantonese Phrasebook' => 'popular_side_dish',
|
139
141
|
'Beans' => 'unpopular_side_dish'
|
@@ -147,32 +149,35 @@ describe Bumbleworks::ProcessDefinition do
|
|
147
149
|
Bumbleworks.dashboard.variables['keep_me'] = 'top_secret_cat_pics'
|
148
150
|
# stubbing here so we can explicitly set an order which will
|
149
151
|
# ensure we're testing rollback
|
150
|
-
Bumbleworks::Support.
|
152
|
+
allow(Bumbleworks::Support).to receive(:all_files).and_return({
|
151
153
|
definition_path('test_process') => 'test_process',
|
152
154
|
definition_path('a_list_of_jams') => 'a_list_of_jams'
|
153
155
|
})
|
154
156
|
expect {
|
155
157
|
described_class.create_all_from_directory!(definitions_path)
|
156
158
|
}.to raise_error
|
157
|
-
Bumbleworks.dashboard.variables['test_process'].
|
158
|
-
Bumbleworks.dashboard.variables['keep_me'].
|
159
|
+
expect(Bumbleworks.dashboard.variables['test_process']).to be_nil
|
160
|
+
expect(Bumbleworks.dashboard.variables['keep_me']).to eq('top_secret_cat_pics')
|
159
161
|
end
|
160
162
|
|
161
163
|
it 'skips invalid files and loads all valid definitions when option specified' do
|
162
164
|
described_class.create_all_from_directory!(definitions_path, :skip_invalid => true)
|
163
|
-
Bumbleworks.dashboard.variables['test_process'].
|
165
|
+
expect(Bumbleworks.dashboard.variables['test_process']).to eq(
|
164
166
|
["define", { "name" => "test_process" }, [["nothing", {}, []]]]
|
165
|
-
|
167
|
+
)
|
168
|
+
expect(Bumbleworks.dashboard.variables['test_nested_process']).to eq(
|
166
169
|
["define", { "name" => "test_nested_process" }, [["nothing_nested", {}, []]]]
|
167
|
-
|
170
|
+
)
|
171
|
+
expect(Bumbleworks.dashboard.variables['a_list_of_jams']).to be_nil
|
168
172
|
end
|
169
173
|
end
|
170
174
|
|
171
175
|
describe '.create!' do
|
172
176
|
it 'builds and saves a new instance' do
|
173
177
|
pdef = described_class.create!(:name => 'monkeys', :definition => valid_definition)
|
174
|
-
Bumbleworks.dashboard.variables['monkeys'].
|
178
|
+
expect(Bumbleworks.dashboard.variables['monkeys']).to eq(
|
175
179
|
pdef.build_tree!
|
180
|
+
)
|
176
181
|
end
|
177
182
|
end
|
178
183
|
|
@@ -181,8 +186,9 @@ describe Bumbleworks::ProcessDefinition do
|
|
181
186
|
definition = described_class.define 'nammikins' do
|
182
187
|
treefles
|
183
188
|
end
|
184
|
-
Bumbleworks.dashboard.variables['nammikins'].
|
189
|
+
expect(Bumbleworks.dashboard.variables['nammikins']).to eq(
|
185
190
|
["define", {"name" => "nammikins"}, [["treefles", {}, []]]]
|
191
|
+
)
|
186
192
|
end
|
187
193
|
end
|
188
194
|
end
|