aasm 4.2.0 → 4.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -1
  3. data/Gemfile +2 -2
  4. data/PLANNED_CHANGES.md +24 -4
  5. data/README.md +75 -5
  6. data/lib/aasm/aasm.rb +50 -36
  7. data/lib/aasm/base.rb +36 -18
  8. data/lib/aasm/core/event.rb +6 -5
  9. data/lib/aasm/core/state.rb +3 -2
  10. data/lib/aasm/core/transition.rb +5 -4
  11. data/lib/aasm/errors.rb +7 -4
  12. data/lib/aasm/instance_base.rb +14 -13
  13. data/lib/aasm/localizer.rb +1 -1
  14. data/lib/aasm/persistence/active_record_persistence.rb +41 -66
  15. data/lib/aasm/persistence/base.rb +7 -7
  16. data/lib/aasm/persistence/mongo_mapper_persistence.rb +34 -51
  17. data/lib/aasm/persistence/mongoid_persistence.rb +15 -36
  18. data/lib/aasm/persistence/plain_persistence.rb +8 -7
  19. data/lib/aasm/persistence/sequel_persistence.rb +12 -10
  20. data/lib/aasm/state_machine.rb +11 -6
  21. data/lib/aasm/version.rb +1 -1
  22. data/spec/database.rb +27 -1
  23. data/spec/models/active_record/basic_active_record_two_state_machines_example.rb +25 -0
  24. data/spec/models/active_record/complex_active_record_example.rb +33 -0
  25. data/spec/models/active_record/derivate_new_dsl.rb +4 -0
  26. data/spec/models/active_record/false_state.rb +18 -0
  27. data/spec/models/active_record/gate.rb +20 -0
  28. data/spec/models/active_record/no_direct_assignment.rb +11 -0
  29. data/spec/models/active_record/no_scope.rb +11 -0
  30. data/spec/models/active_record/provided_and_persisted_state.rb +3 -3
  31. data/spec/models/active_record/simple_new_dsl.rb +9 -0
  32. data/spec/models/active_record/thief.rb +15 -0
  33. data/spec/models/active_record/with_enum.rb +20 -0
  34. data/spec/models/active_record/with_false_enum.rb +16 -0
  35. data/spec/models/active_record/with_true_enum.rb +20 -0
  36. data/spec/models/basic_two_state_machines_example.rb +25 -0
  37. data/spec/models/callbacks/basic_multiple.rb +75 -0
  38. data/spec/models/callbacks/guard_within_block_multiple.rb +66 -0
  39. data/spec/models/callbacks/multiple_transitions_transition_guard_multiple.rb +65 -0
  40. data/spec/models/callbacks/private_method_multiple.rb +44 -0
  41. data/spec/models/callbacks/with_args_multiple.rb +61 -0
  42. data/spec/models/callbacks/{with_state_args.rb → with_state_arg.rb} +0 -0
  43. data/spec/models/callbacks/with_state_arg_multiple.rb +26 -0
  44. data/spec/models/complex_example.rb +134 -0
  45. data/spec/models/conversation.rb +47 -1
  46. data/spec/models/foo.rb +57 -0
  47. data/spec/models/foo_callback_multiple.rb +45 -0
  48. data/spec/models/guardian_multiple.rb +48 -0
  49. data/spec/models/initial_state_proc.rb +16 -0
  50. data/spec/models/invalid_persistor.rb +15 -0
  51. data/spec/models/mongo_mapper/complex_mongo_mapper_example.rb +37 -0
  52. data/spec/models/mongo_mapper/no_scope_mongo_mapper.rb +11 -0
  53. data/spec/models/mongo_mapper/simple_mongo_mapper.rb +12 -0
  54. data/spec/models/mongo_mapper/simple_new_dsl_mongo_mapper.rb +13 -0
  55. data/spec/models/mongoid/complex_mongoid_example.rb +37 -0
  56. data/spec/models/mongoid/no_scope_mongoid.rb +11 -0
  57. data/spec/models/mongoid/simple_mongoid.rb +12 -0
  58. data/spec/models/mongoid/simple_new_dsl_mongoid.rb +13 -0
  59. data/spec/models/no_initial_state.rb +13 -0
  60. data/spec/models/parametrised_event.rb +1 -1
  61. data/spec/models/parametrised_event_multiple.rb +29 -0
  62. data/spec/models/provided_state.rb +3 -3
  63. data/spec/models/sequel/complex_sequel_example.rb +45 -0
  64. data/spec/models/sequel/sequel_multiple.rb +25 -0
  65. data/spec/models/sequel/sequel_simple.rb +25 -0
  66. data/spec/models/simple_multiple_example.rb +30 -0
  67. data/spec/models/sub_class.rb +4 -0
  68. data/spec/models/sub_class_with_more_states.rb +11 -0
  69. data/spec/models/super_class.rb +28 -0
  70. data/spec/models/transactor.rb +27 -0
  71. data/spec/models/valid_state_name.rb +12 -0
  72. data/spec/models/validator.rb +39 -0
  73. data/spec/unit/basic_two_state_machines_example_spec.rb +10 -0
  74. data/spec/unit/callback_multiple_spec.rb +295 -0
  75. data/spec/unit/callbacks_spec.rb +1 -1
  76. data/spec/unit/complex_multiple_example_spec.rb +99 -0
  77. data/spec/unit/edge_cases_spec.rb +16 -0
  78. data/spec/unit/event_multiple_spec.rb +73 -0
  79. data/spec/unit/event_spec.rb +11 -6
  80. data/spec/unit/guard_multiple_spec.rb +60 -0
  81. data/spec/unit/initial_state_multiple_spec.rb +15 -0
  82. data/spec/unit/inspection_multiple_spec.rb +201 -0
  83. data/spec/unit/persistence/active_record_persistence_multiple_spec.rb +560 -0
  84. data/spec/unit/persistence/active_record_persistence_spec.rb +17 -12
  85. data/spec/unit/persistence/mongo_mapper_persistence_multiple_spec.rb +146 -0
  86. data/spec/unit/persistence/{mongo_mapper_persistance_spec.rb → mongo_mapper_persistence_spec.rb} +7 -49
  87. data/spec/unit/persistence/mongoid_persistence_multiple_spec.rb +127 -0
  88. data/spec/unit/persistence/mongoid_persistence_spec.rb +79 -0
  89. data/spec/unit/persistence/sequel_persistence_multiple_spec.rb +153 -0
  90. data/spec/unit/persistence/sequel_persistence_spec.rb +7 -24
  91. data/spec/unit/reloading_spec.rb +1 -1
  92. data/spec/unit/simple_multiple_example_spec.rb +63 -0
  93. data/spec/unit/state_spec.rb +3 -1
  94. data/spec/unit/subclassing_multiple_spec.rb +39 -0
  95. data/spec/unit/transition_spec.rb +31 -22
  96. metadata +73 -9
  97. data/spec/unit/persistence/mongoid_persistance_spec.rb +0 -146
@@ -0,0 +1,153 @@
1
+ describe 'sequel' do
2
+ begin
3
+ require 'sequel'
4
+ require 'logger'
5
+ require 'spec_helper'
6
+
7
+ Dir[File.dirname(__FILE__) + "/../../models/sequel/*.rb"].sort.each do |f|
8
+ require File.expand_path(f)
9
+ end
10
+
11
+ before(:all) do
12
+ @model = SequelMultiple
13
+ end
14
+
15
+ describe "instance methods" do
16
+ let(:model) {@model.new}
17
+
18
+ it "should respond to aasm persistence methods" do
19
+ expect(model).to respond_to(:aasm_read_state)
20
+ expect(model).to respond_to(:aasm_write_state)
21
+ expect(model).to respond_to(:aasm_write_state_without_persistence)
22
+ end
23
+
24
+ it "should return the initial state when new and the aasm field is nil" do
25
+ expect(model.aasm(:left).current_state).to eq(:alpha)
26
+ end
27
+
28
+ it "should save the initial state" do
29
+ model.save
30
+ expect(model.status).to eq("alpha")
31
+ end
32
+
33
+ it "should return the aasm column when new and the aasm field is not nil" do
34
+ model.status = "beta"
35
+ expect(model.aasm(:left).current_state).to eq(:beta)
36
+ end
37
+
38
+ it "should return the aasm column when not new and the aasm_column is not nil" do
39
+ allow(model).to receive(:new?).and_return(false)
40
+ model.status = "gamma"
41
+ expect(model.aasm(:left).current_state).to eq(:gamma)
42
+ end
43
+
44
+ it "should allow a nil state" do
45
+ allow(model).to receive(:new?).and_return(false)
46
+ model.status = nil
47
+ expect(model.aasm(:left).current_state).to be_nil
48
+ end
49
+
50
+ it "should not change the state if state is not loaded" do
51
+ model.release
52
+ model.save
53
+ model.class.select(:id).first.save
54
+ model.reload
55
+ expect(model.aasm(:left).current_state).to eq(:beta)
56
+ end
57
+
58
+ it "should call aasm_ensure_initial_state on validation before create" do
59
+ expect(model).to receive(:aasm_ensure_initial_state).and_return(true)
60
+ model.valid?
61
+ end
62
+
63
+ it "should call aasm_ensure_initial_state before create, even if skipping validations" do
64
+ expect(model).to receive(:aasm_ensure_initial_state).and_return(true)
65
+ model.save(:validate => false)
66
+ end
67
+ end
68
+
69
+ describe 'subclasses' do
70
+ it "should have the same states as its parent class" do
71
+ expect(Class.new(@model).aasm(:left).states).to eq(@model.aasm(:left).states)
72
+ end
73
+
74
+ it "should have the same events as its parent class" do
75
+ expect(Class.new(@model).aasm(:left).events).to eq(@model.aasm(:left).events)
76
+ end
77
+
78
+ it "should have the same column as its parent even for the new dsl" do
79
+ expect(@model.aasm(:left).attribute_name).to eq(:status)
80
+ expect(Class.new(@model).aasm(:left).attribute_name).to eq(:status)
81
+ end
82
+ end
83
+
84
+ describe 'initial states' do
85
+ it 'should support conditions' do
86
+ @model.aasm(:left) do
87
+ initial_state lambda{ |m| m.default }
88
+ end
89
+
90
+ expect(@model.new(:default => :beta).aasm(:left).current_state).to eq(:beta)
91
+ expect(@model.new(:default => :gamma).aasm(:left).current_state).to eq(:gamma)
92
+ end
93
+ end
94
+
95
+ describe "complex example" do
96
+ it "works" do
97
+ record = ComplexSequelExample.new
98
+ expect(record.aasm(:left).current_state).to eql :one
99
+ expect(record.left).to be_nil
100
+ expect(record.aasm(:right).current_state).to eql :alpha
101
+ expect(record.right).to be_nil
102
+
103
+ record.save
104
+ expect_aasm_states record, :one, :alpha
105
+ record.reload
106
+ expect_aasm_states record, :one, :alpha
107
+
108
+ record.increment!
109
+ expect_aasm_states record, :two, :alpha
110
+ record.reload
111
+ expect_aasm_states record, :two, :alpha
112
+
113
+ record.level_up!
114
+ expect_aasm_states record, :two, :beta
115
+ record.reload
116
+ expect_aasm_states record, :two, :beta
117
+
118
+ record.increment!
119
+ expect { record.increment! }.to raise_error(AASM::InvalidTransition)
120
+ expect_aasm_states record, :three, :beta
121
+ record.reload
122
+ expect_aasm_states record, :three, :beta
123
+
124
+ record.level_up!
125
+ expect_aasm_states record, :three, :gamma
126
+ record.reload
127
+ expect_aasm_states record, :three, :gamma
128
+
129
+ record.level_down # without saving
130
+ expect_aasm_states record, :three, :beta
131
+ record.reload
132
+ expect_aasm_states record, :three, :gamma
133
+
134
+ record.level_down # without saving
135
+ expect_aasm_states record, :three, :beta
136
+ record.reset!
137
+ expect_aasm_states record, :one, :beta
138
+ end
139
+
140
+ def expect_aasm_states(record, left_state, right_state)
141
+ expect(record.aasm(:left).current_state).to eql left_state.to_sym
142
+ expect(record.left).to eql left_state.to_s
143
+ expect(record.aasm(:right).current_state).to eql right_state.to_sym
144
+ expect(record.right).to eql right_state.to_s
145
+ end
146
+ end
147
+
148
+ rescue LoadError
149
+ puts "------------------------------------------------------------------------"
150
+ puts "Not running Sequel multiple-specs because sequel gem is not installed!!!"
151
+ puts "------------------------------------------------------------------------"
152
+ end
153
+ end
@@ -1,34 +1,15 @@
1
-
2
1
  describe 'sequel' do
3
2
  begin
4
3
  require 'sequel'
5
4
  require 'logger'
6
5
  require 'spec_helper'
7
6
 
8
- before(:all) do
9
- db = Sequel.connect(SEQUEL_DB)
10
-
11
- # if you want to see the statements while running the spec enable the following line
12
- # db.loggers << Logger.new($stderr)
13
- db.create_table(:models) do
14
- primary_key :id
15
- String :status
16
- end
7
+ Dir[File.dirname(__FILE__) + "/../../models/sequel/*.rb"].sort.each do |f|
8
+ require File.expand_path(f)
9
+ end
17
10
 
18
- @model = Class.new(Sequel::Model(db)) do
19
- set_dataset(:models)
20
- attr_accessor :default
21
- include AASM
22
- aasm :column => :status
23
- aasm do
24
- state :alpha, :initial => true
25
- state :beta
26
- state :gamma
27
- event :release do
28
- transitions :from => [:alpha, :beta, :gamma], :to => :beta
29
- end
30
- end
31
- end
11
+ before(:all) do
12
+ @model = SequelSimple
32
13
  end
33
14
 
34
15
  describe "instance methods" do
@@ -112,6 +93,8 @@ describe 'sequel' do
112
93
  end
113
94
 
114
95
  rescue LoadError
96
+ puts "------------------------------------------------------------------------"
115
97
  puts "Not running Sequel specs because sequel gem is not installed!!!"
98
+ puts "------------------------------------------------------------------------"
116
99
  end
117
100
  end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'callbacks for the new DSL' do
3
+ describe 'when redefining states' do
4
4
  let(:definer) { DoubleDefiner.new }
5
5
 
6
6
  it "allows extending states" do
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'state machine' do
4
+ let(:simple) { SimpleMultipleExample.new }
5
+
6
+ it 'starts with an initial state' do
7
+ expect(simple.aasm(:move).current_state).to eq(:standing)
8
+ expect(simple).to respond_to(:standing?)
9
+ expect(simple).to be_standing
10
+
11
+ expect(simple.aasm(:work).current_state).to eq(:sleeping)
12
+ expect(simple).to respond_to(:sleeping?)
13
+ expect(simple).to be_sleeping
14
+ end
15
+
16
+ it 'allows transitions to other states' do
17
+ expect(simple).to respond_to(:walk)
18
+ expect(simple).to respond_to(:walk!)
19
+ simple.walk!
20
+ expect(simple).to respond_to(:walking?)
21
+ expect(simple).to be_walking
22
+
23
+ expect(simple).to respond_to(:run)
24
+ expect(simple).to respond_to(:run!)
25
+ simple.run
26
+ expect(simple).to respond_to(:running?)
27
+ expect(simple).to be_running
28
+
29
+ expect(simple).to respond_to(:start)
30
+ expect(simple).to respond_to(:start!)
31
+ simple.start
32
+ expect(simple).to respond_to(:processing?)
33
+ expect(simple).to be_processing
34
+ end
35
+
36
+ it 'denies transitions to other states' do
37
+ expect {simple.hold}.to raise_error(AASM::InvalidTransition)
38
+ expect {simple.hold!}.to raise_error(AASM::InvalidTransition)
39
+ simple.walk
40
+ expect {simple.walk}.to raise_error(AASM::InvalidTransition)
41
+ expect {simple.walk!}.to raise_error(AASM::InvalidTransition)
42
+ simple.run
43
+ expect {simple.walk}.to raise_error(AASM::InvalidTransition)
44
+ expect {simple.walk!}.to raise_error(AASM::InvalidTransition)
45
+
46
+ expect {simple.stop}.to raise_error(AASM::InvalidTransition)
47
+ expect {simple.stop!}.to raise_error(AASM::InvalidTransition)
48
+ simple.start
49
+ expect {simple.start}.to raise_error(AASM::InvalidTransition)
50
+ expect {simple.start!}.to raise_error(AASM::InvalidTransition)
51
+ simple.stop
52
+ end
53
+
54
+ it 'defines constants for each state name' do
55
+ expect(SimpleMultipleExample::STATE_STANDING).to eq(:standing)
56
+ expect(SimpleMultipleExample::STATE_WALKING).to eq(:walking)
57
+ expect(SimpleMultipleExample::STATE_RUNNING).to eq(:running)
58
+
59
+ expect(SimpleMultipleExample::STATE_SLEEPING).to eq(:sleeping)
60
+ expect(SimpleMultipleExample::STATE_PROCESSING).to eq(:processing)
61
+ expect(SimpleMultipleExample::STATE_RUNNING).to eq(:running)
62
+ end
63
+ end
@@ -1,13 +1,15 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe AASM::Core::State do
4
+ let(:state_machine) { AASM::StateMachine.new(:name) }
5
+
4
6
  before(:each) do
5
7
  @name = :astate
6
8
  @options = { :crazy_custom_key => 'key' }
7
9
  end
8
10
 
9
11
  def new_state(options={})
10
- AASM::Core::State.new(@name, Conversation, @options.merge(options))
12
+ AASM::Core::State.new(@name, Conversation, state_machine, @options.merge(options))
11
13
  end
12
14
 
13
15
  it 'should set the name' do
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'subclassing with multiple state machines' do
4
+
5
+ it 'should have the parent states' do
6
+ SuperClassMultiple.aasm(:left).states.each do |state|
7
+ expect(SubClassWithMoreStatesMultiple.aasm(:left).states).to include(state)
8
+ end
9
+ expect(SubClassMultiple.aasm(:left).states).to eq(SuperClassMultiple.aasm(:left).states)
10
+
11
+ SuperClassMultiple.aasm(:right).states.each do |state|
12
+ expect(SubClassWithMoreStatesMultiple.aasm(:right).states).to include(state)
13
+ end
14
+ expect(SubClassMultiple.aasm(:right).states).to eq(SuperClassMultiple.aasm(:right).states)
15
+ end
16
+
17
+ it 'should not add the child states to the parent machine' do
18
+ expect(SuperClassMultiple.aasm(:left).states).not_to include(:foo)
19
+ expect(SuperClassMultiple.aasm(:right).states).not_to include(:archived)
20
+ end
21
+
22
+ it "should have the same events as its parent" do
23
+ expect(SubClassMultiple.aasm(:left).events).to eq(SuperClassMultiple.aasm(:left).events)
24
+ expect(SubClassMultiple.aasm(:right).events).to eq(SuperClassMultiple.aasm(:right).events)
25
+ end
26
+
27
+ it 'should know how to respond to question methods' do
28
+ expect(SubClassMultiple.new.may_foo?).to be_truthy
29
+ expect(SubClassMultiple.new.may_close?).to be_truthy
30
+ end
31
+
32
+ it 'should not break if I call methods from super class' do
33
+ son = SubClassMultiple.new
34
+ son.update_state
35
+ expect(son.aasm(:left).current_state).to eq(:ended)
36
+ end
37
+
38
+ end
39
+
@@ -53,13 +53,13 @@ describe 'transitions' do
53
53
 
54
54
  end
55
55
 
56
- describe 'blocks' do
57
- end
58
-
59
56
  describe AASM::Core::Transition do
57
+ let(:state_machine) { AASM::StateMachine.new(:name) }
58
+ let(:event) { AASM::Core::Event.new(:event, state_machine) }
59
+
60
60
  it 'should set from, to, and opts attr readers' do
61
61
  opts = {:from => 'foo', :to => 'bar', :guard => 'g'}
62
- st = AASM::Core::Transition.new(opts)
62
+ st = AASM::Core::Transition.new(event, opts)
63
63
 
64
64
  expect(st.from).to eq(opts[:from])
65
65
  expect(st.to).to eq(opts[:to])
@@ -71,7 +71,7 @@ describe AASM::Core::Transition do
71
71
  st = AASM::Core::Transition.allocate
72
72
  expect(st).to receive(:warn).with('[DEPRECATION] :on_transition is deprecated, use :after instead')
73
73
 
74
- st.send :initialize, opts do
74
+ st.send :initialize, event, opts do
75
75
  guard :gg
76
76
  on_transition :after_callback
77
77
  end
@@ -81,7 +81,7 @@ describe AASM::Core::Transition do
81
81
 
82
82
  it 'should set after and guard from dsl' do
83
83
  opts = {:from => 'foo', :to => 'bar', :guard => 'g'}
84
- st = AASM::Core::Transition.new(opts) do
84
+ st = AASM::Core::Transition.new(event, opts) do
85
85
  guard :gg
86
86
  after :after_callback
87
87
  end
@@ -92,7 +92,7 @@ describe AASM::Core::Transition do
92
92
 
93
93
  it 'should pass equality check if from and to are the same' do
94
94
  opts = {:from => 'foo', :to => 'bar', :guard => 'g'}
95
- st = AASM::Core::Transition.new(opts)
95
+ st = AASM::Core::Transition.new(event, opts)
96
96
 
97
97
  obj = double('object')
98
98
  allow(obj).to receive(:from).and_return(opts[:from])
@@ -103,7 +103,7 @@ describe AASM::Core::Transition do
103
103
 
104
104
  it 'should fail equality check if from are not the same' do
105
105
  opts = {:from => 'foo', :to => 'bar', :guard => 'g'}
106
- st = AASM::Core::Transition.new(opts)
106
+ st = AASM::Core::Transition.new(event, opts)
107
107
 
108
108
  obj = double('object')
109
109
  allow(obj).to receive(:from).and_return('blah')
@@ -114,7 +114,7 @@ describe AASM::Core::Transition do
114
114
 
115
115
  it 'should fail equality check if to are not the same' do
116
116
  opts = {:from => 'foo', :to => 'bar', :guard => 'g'}
117
- st = AASM::Core::Transition.new(opts)
117
+ st = AASM::Core::Transition.new(event, opts)
118
118
 
119
119
  obj = double('object')
120
120
  allow(obj).to receive(:from).and_return(opts[:from])
@@ -125,16 +125,19 @@ describe AASM::Core::Transition do
125
125
  end
126
126
 
127
127
  describe AASM::Core::Transition, '- when performing guard checks' do
128
+ let(:state_machine) { AASM::StateMachine.new(:name) }
129
+ let(:event) { AASM::Core::Event.new(:event, state_machine) }
130
+
128
131
  it 'should return true of there is no guard' do
129
132
  opts = {:from => 'foo', :to => 'bar'}
130
- st = AASM::Core::Transition.new(opts)
133
+ st = AASM::Core::Transition.new(event, opts)
131
134
 
132
135
  expect(st.allowed?(nil)).to be_truthy
133
136
  end
134
137
 
135
138
  it 'should call the method on the object if guard is a symbol' do
136
139
  opts = {:from => 'foo', :to => 'bar', :guard => :test}
137
- st = AASM::Core::Transition.new(opts)
140
+ st = AASM::Core::Transition.new(event, opts)
138
141
 
139
142
  obj = double('object')
140
143
  expect(obj).to receive(:test)
@@ -144,7 +147,7 @@ describe AASM::Core::Transition, '- when performing guard checks' do
144
147
 
145
148
  it 'should call the method on the object if unless is a symbol' do
146
149
  opts = {:from => 'foo', :to => 'bar', :unless => :test}
147
- st = AASM::Core::Transition.new(opts)
150
+ st = AASM::Core::Transition.new(event, opts)
148
151
 
149
152
  obj = double('object')
150
153
  expect(obj).to receive(:test)
@@ -154,7 +157,7 @@ describe AASM::Core::Transition, '- when performing guard checks' do
154
157
 
155
158
  it 'should call the method on the object if guard is a string' do
156
159
  opts = {:from => 'foo', :to => 'bar', :guard => 'test'}
157
- st = AASM::Core::Transition.new(opts)
160
+ st = AASM::Core::Transition.new(event, opts)
158
161
 
159
162
  obj = double('object')
160
163
  expect(obj).to receive(:test)
@@ -164,7 +167,7 @@ describe AASM::Core::Transition, '- when performing guard checks' do
164
167
 
165
168
  it 'should call the method on the object if unless is a string' do
166
169
  opts = {:from => 'foo', :to => 'bar', :unless => 'test'}
167
- st = AASM::Core::Transition.new(opts)
170
+ st = AASM::Core::Transition.new(event, opts)
168
171
 
169
172
  obj = double('object')
170
173
  expect(obj).to receive(:test)
@@ -174,7 +177,7 @@ describe AASM::Core::Transition, '- when performing guard checks' do
174
177
 
175
178
  it 'should call the proc passing the object if the guard is a proc' do
176
179
  opts = {:from => 'foo', :to => 'bar', :guard => Proc.new { test }}
177
- st = AASM::Core::Transition.new(opts)
180
+ st = AASM::Core::Transition.new(event, opts)
178
181
 
179
182
  obj = double('object')
180
183
  expect(obj).to receive(:test)
@@ -184,9 +187,12 @@ describe AASM::Core::Transition, '- when performing guard checks' do
184
187
  end
185
188
 
186
189
  describe AASM::Core::Transition, '- when executing the transition with a Proc' do
190
+ let(:state_machine) { AASM::StateMachine.new(:name) }
191
+ let(:event) { AASM::Core::Event.new(:event, state_machine) }
192
+
187
193
  it 'should call a Proc on the object with args' do
188
194
  opts = {:from => 'foo', :to => 'bar', :after => Proc.new {|a| test(a) }}
189
- st = AASM::Core::Transition.new(opts)
195
+ st = AASM::Core::Transition.new(event, opts)
190
196
  args = {:arg1 => '1', :arg2 => '2'}
191
197
  obj = double('object', :aasm => 'aasm')
192
198
 
@@ -202,7 +208,7 @@ describe AASM::Core::Transition, '- when executing the transition with a Proc' d
202
208
  prc = Proc.new { prc_object = self }
203
209
 
204
210
  opts = {:from => 'foo', :to => 'bar', :after => prc }
205
- st = AASM::Core::Transition.new(opts)
211
+ st = AASM::Core::Transition.new(event, opts)
206
212
  args = {:arg1 => '1', :arg2 => '2'}
207
213
  obj = double('object', :aasm => 'aasm')
208
214
 
@@ -212,9 +218,12 @@ describe AASM::Core::Transition, '- when executing the transition with a Proc' d
212
218
  end
213
219
 
214
220
  describe AASM::Core::Transition, '- when executing the transition with an :after method call' do
221
+ let(:state_machine) { AASM::StateMachine.new(:name) }
222
+ let(:event) { AASM::Core::Event.new(:event, state_machine) }
223
+
215
224
  it 'should accept a String for the method name' do
216
225
  opts = {:from => 'foo', :to => 'bar', :after => 'test'}
217
- st = AASM::Core::Transition.new(opts)
226
+ st = AASM::Core::Transition.new(event, opts)
218
227
  args = {:arg1 => '1', :arg2 => '2'}
219
228
  obj = double('object', :aasm => 'aasm')
220
229
 
@@ -225,7 +234,7 @@ describe AASM::Core::Transition, '- when executing the transition with an :after
225
234
 
226
235
  it 'should accept a Symbol for the method name' do
227
236
  opts = {:from => 'foo', :to => 'bar', :after => :test}
228
- st = AASM::Core::Transition.new(opts)
237
+ st = AASM::Core::Transition.new(event, opts)
229
238
  args = {:arg1 => '1', :arg2 => '2'}
230
239
  obj = double('object', :aasm => 'aasm')
231
240
 
@@ -236,7 +245,7 @@ describe AASM::Core::Transition, '- when executing the transition with an :after
236
245
 
237
246
  it 'should pass args if the target method accepts them' do
238
247
  opts = {:from => 'foo', :to => 'bar', :after => :test}
239
- st = AASM::Core::Transition.new(opts)
248
+ st = AASM::Core::Transition.new(event, opts)
240
249
  args = {:arg1 => '1', :arg2 => '2'}
241
250
  obj = double('object', :aasm => 'aasm')
242
251
 
@@ -251,7 +260,7 @@ describe AASM::Core::Transition, '- when executing the transition with an :after
251
260
 
252
261
  it 'should NOT pass args if the target method does NOT accept them' do
253
262
  opts = {:from => 'foo', :to => 'bar', :after => :test}
254
- st = AASM::Core::Transition.new(opts)
263
+ st = AASM::Core::Transition.new(event, opts)
255
264
  args = {:arg1 => '1', :arg2 => '2'}
256
265
  obj = double('object', :aasm => 'aasm')
257
266
 
@@ -266,7 +275,7 @@ describe AASM::Core::Transition, '- when executing the transition with an :after
266
275
 
267
276
  it 'should allow accessing the from_state and the to_state' do
268
277
  opts = {:from => 'foo', :to => 'bar', :after => :test}
269
- transition = AASM::Core::Transition.new(opts)
278
+ transition = AASM::Core::Transition.new(event, opts)
270
279
  args = {:arg1 => '1', :arg2 => '2'}
271
280
  obj = double('object', :aasm => AASM::InstanceBase.new('object'))
272
281