state_machine 1.1.2 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +7 -11
- data/.travis.yml +49 -7
- data/Appraisals +255 -87
- data/CHANGELOG.md +30 -0
- data/README.md +142 -21
- data/Rakefile +1 -11
- data/examples/Gemfile +5 -0
- data/examples/Gemfile.lock +14 -0
- data/examples/auto_shop.rb +2 -0
- data/examples/car.rb +2 -0
- data/examples/doc/AutoShop.html +2856 -0
- data/examples/doc/AutoShop_state.png +0 -0
- data/examples/doc/Car.html +919 -0
- data/examples/doc/Car_state.png +0 -0
- data/examples/doc/TrafficLight.html +2230 -0
- data/examples/doc/TrafficLight_state.png +0 -0
- data/examples/doc/Vehicle.html +7921 -0
- data/examples/doc/Vehicle_state.png +0 -0
- data/examples/doc/_index.html +136 -0
- data/examples/doc/class_list.html +47 -0
- data/examples/doc/css/common.css +1 -0
- data/examples/doc/css/full_list.css +55 -0
- data/examples/doc/css/style.css +322 -0
- data/examples/doc/file_list.html +46 -0
- data/examples/doc/frames.html +13 -0
- data/examples/doc/index.html +136 -0
- data/examples/doc/js/app.js +205 -0
- data/examples/doc/js/full_list.js +173 -0
- data/examples/doc/js/jquery.js +16 -0
- data/examples/doc/method_list.html +734 -0
- data/examples/doc/top-level-namespace.html +105 -0
- data/examples/rails-rest/migration.rb +1 -5
- data/examples/rails-rest/view__form.html.erb +34 -0
- data/examples/rails-rest/view_edit.html.erb +2 -21
- data/examples/rails-rest/view_index.html.erb +6 -4
- data/examples/rails-rest/view_new.html.erb +2 -11
- data/examples/rails-rest/view_show.html.erb +5 -3
- data/examples/traffic_light.rb +2 -0
- data/examples/vehicle.rb +2 -0
- data/gemfiles/active_model-3.0.0.gemfile.lock +9 -6
- data/gemfiles/active_model-3.0.5.gemfile.lock +10 -7
- data/gemfiles/active_model-3.1.1.gemfile.lock +12 -10
- data/gemfiles/{active_model-3.2.0.gemfile → active_model-3.2.1.gemfile} +1 -1
- data/gemfiles/{graphviz-0.9.0.gemfile → active_model-3.2.12.gemfile} +1 -1
- data/gemfiles/active_model-3.2.12.gemfile.lock +36 -0
- data/gemfiles/{active_record-3.2.0.gemfile → active_model-3.2.13.rc1.gemfile} +1 -2
- data/gemfiles/active_model-3.2.13.rc1.gemfile.lock +36 -0
- data/gemfiles/active_model-4.0.0.gemfile +9 -0
- data/gemfiles/active_model-4.0.0.gemfile.lock +78 -0
- data/gemfiles/active_record-2.0.0.gemfile +2 -1
- data/gemfiles/active_record-2.0.0.gemfile.lock +15 -6
- data/gemfiles/active_record-2.0.5.gemfile +2 -1
- data/gemfiles/active_record-2.0.5.gemfile.lock +15 -6
- data/gemfiles/active_record-2.1.0.gemfile +2 -1
- data/gemfiles/active_record-2.1.0.gemfile.lock +15 -6
- data/gemfiles/active_record-2.1.2.gemfile +2 -1
- data/gemfiles/active_record-2.1.2.gemfile.lock +15 -6
- data/gemfiles/active_record-2.2.3.gemfile +2 -1
- data/gemfiles/active_record-2.2.3.gemfile.lock +15 -6
- data/gemfiles/active_record-2.3.12.gemfile +2 -1
- data/gemfiles/active_record-2.3.12.gemfile.lock +15 -6
- data/gemfiles/active_record-2.3.5.gemfile +9 -0
- data/gemfiles/active_record-2.3.5.gemfile.lock +39 -0
- data/gemfiles/active_record-3.0.0.gemfile +2 -1
- data/gemfiles/active_record-3.0.0.gemfile.lock +18 -11
- data/gemfiles/active_record-3.0.5.gemfile +2 -1
- data/gemfiles/active_record-3.0.5.gemfile.lock +19 -12
- data/gemfiles/active_record-3.1.1.gemfile +2 -1
- data/gemfiles/active_record-3.1.1.gemfile.lock +22 -16
- data/gemfiles/active_record-3.2.12.gemfile +9 -0
- data/gemfiles/active_record-3.2.12.gemfile.lock +51 -0
- data/gemfiles/active_record-3.2.13.rc1.gemfile +9 -0
- data/gemfiles/active_record-3.2.13.rc1.gemfile.lock +51 -0
- data/gemfiles/active_record-4.0.0.gemfile +11 -0
- data/gemfiles/active_record-4.0.0.gemfile.lock +83 -0
- data/gemfiles/data_mapper-0.10.2.gemfile +1 -0
- data/gemfiles/data_mapper-0.10.2.gemfile.lock +13 -9
- data/gemfiles/data_mapper-0.9.11.gemfile +1 -0
- data/gemfiles/data_mapper-0.9.11.gemfile.lock +31 -7
- data/gemfiles/data_mapper-0.9.4.gemfile.lock +25 -14
- data/gemfiles/data_mapper-0.9.7.gemfile +1 -0
- data/gemfiles/data_mapper-0.9.7.gemfile.lock +27 -15
- data/gemfiles/data_mapper-1.0.0.gemfile.lock +20 -17
- data/gemfiles/data_mapper-1.0.1.gemfile.lock +20 -17
- data/gemfiles/data_mapper-1.0.2.gemfile.lock +20 -17
- data/gemfiles/data_mapper-1.1.0.gemfile.lock +19 -16
- data/gemfiles/data_mapper-1.2.0.gemfile.lock +19 -16
- data/gemfiles/default.gemfile.lock +8 -5
- data/gemfiles/graphviz-0.9.17.gemfile +7 -0
- data/gemfiles/graphviz-0.9.17.gemfile.lock +29 -0
- data/gemfiles/graphviz-0.9.21.gemfile.lock +7 -4
- data/gemfiles/graphviz-1.0.0.gemfile.lock +7 -4
- data/gemfiles/graphviz-1.0.3.gemfile +7 -0
- data/gemfiles/graphviz-1.0.3.gemfile.lock +29 -0
- data/gemfiles/graphviz-1.0.8.gemfile +7 -0
- data/gemfiles/graphviz-1.0.8.gemfile.lock +29 -0
- data/gemfiles/mongo_mapper-0.10.0.gemfile +1 -0
- data/gemfiles/mongo_mapper-0.10.0.gemfile.lock +14 -11
- data/gemfiles/mongo_mapper-0.11.1.gemfile +7 -0
- data/gemfiles/mongo_mapper-0.11.1.gemfile.lock +44 -0
- data/gemfiles/mongo_mapper-0.11.2.gemfile +9 -0
- data/gemfiles/mongo_mapper-0.11.2.gemfile.lock +48 -0
- data/gemfiles/mongo_mapper-0.12.0.gemfile +9 -0
- data/gemfiles/mongo_mapper-0.12.0.gemfile.lock +48 -0
- data/gemfiles/mongo_mapper-0.5.5.gemfile.lock +7 -4
- data/gemfiles/mongo_mapper-0.5.8.gemfile.lock +7 -4
- data/gemfiles/mongo_mapper-0.6.0.gemfile.lock +7 -4
- data/gemfiles/mongo_mapper-0.6.10.gemfile.lock +7 -4
- data/gemfiles/mongo_mapper-0.7.0.gemfile.lock +7 -4
- data/gemfiles/mongo_mapper-0.7.5.gemfile.lock +7 -4
- data/gemfiles/mongo_mapper-0.8.0.gemfile.lock +7 -4
- data/gemfiles/mongo_mapper-0.8.3.gemfile.lock +7 -4
- data/gemfiles/mongo_mapper-0.8.4.gemfile.lock +7 -4
- data/gemfiles/mongo_mapper-0.8.6.gemfile.lock +7 -4
- data/gemfiles/mongo_mapper-0.9.0.gemfile.lock +7 -4
- data/gemfiles/mongoid-2.0.0.gemfile +2 -0
- data/gemfiles/mongoid-2.0.0.gemfile.lock +22 -18
- data/gemfiles/mongoid-2.1.4.gemfile +2 -0
- data/gemfiles/mongoid-2.1.4.gemfile.lock +21 -17
- data/gemfiles/mongoid-2.2.4.gemfile +2 -0
- data/gemfiles/mongoid-2.2.4.gemfile.lock +21 -17
- data/gemfiles/mongoid-2.3.3.gemfile +2 -0
- data/gemfiles/mongoid-2.3.3.gemfile.lock +21 -17
- data/gemfiles/mongoid-2.4.0.gemfile +9 -0
- data/gemfiles/mongoid-2.4.0.gemfile.lock +47 -0
- data/gemfiles/mongoid-2.4.10.gemfile +9 -0
- data/gemfiles/mongoid-2.4.10.gemfile.lock +47 -0
- data/gemfiles/mongoid-2.5.2.gemfile +9 -0
- data/gemfiles/mongoid-2.5.2.gemfile.lock +47 -0
- data/gemfiles/mongoid-2.6.0.gemfile +9 -0
- data/gemfiles/mongoid-2.6.0.gemfile.lock +47 -0
- data/gemfiles/mongoid-3.0.0.gemfile +8 -0
- data/gemfiles/mongoid-3.0.0.gemfile.lock +45 -0
- data/gemfiles/mongoid-3.0.22.gemfile +8 -0
- data/gemfiles/mongoid-3.0.22.gemfile.lock +45 -0
- data/gemfiles/mongoid-3.1.0.gemfile +8 -0
- data/gemfiles/mongoid-3.1.0.gemfile.lock +45 -0
- data/gemfiles/sequel-2.11.0.gemfile +2 -1
- data/gemfiles/sequel-2.11.0.gemfile.lock +11 -6
- data/gemfiles/sequel-2.12.0.gemfile +2 -1
- data/gemfiles/sequel-2.12.0.gemfile.lock +11 -6
- data/gemfiles/sequel-2.8.0.gemfile +2 -1
- data/gemfiles/sequel-2.8.0.gemfile.lock +11 -6
- data/gemfiles/sequel-3.0.0.gemfile +2 -1
- data/gemfiles/sequel-3.0.0.gemfile.lock +11 -6
- data/gemfiles/sequel-3.10.0.gemfile +9 -0
- data/gemfiles/sequel-3.10.0.gemfile.lock +33 -0
- data/gemfiles/sequel-3.13.0.gemfile +2 -1
- data/gemfiles/sequel-3.13.0.gemfile.lock +11 -6
- data/gemfiles/sequel-3.14.0.gemfile +2 -1
- data/gemfiles/sequel-3.14.0.gemfile.lock +11 -6
- data/gemfiles/sequel-3.23.0.gemfile +2 -1
- data/gemfiles/sequel-3.23.0.gemfile.lock +11 -6
- data/gemfiles/sequel-3.24.0.gemfile +2 -1
- data/gemfiles/sequel-3.24.0.gemfile.lock +11 -6
- data/gemfiles/sequel-3.29.0.gemfile +2 -1
- data/gemfiles/sequel-3.29.0.gemfile.lock +11 -6
- data/gemfiles/sequel-3.34.0.gemfile +9 -0
- data/gemfiles/sequel-3.34.0.gemfile.lock +33 -0
- data/gemfiles/sequel-3.35.0.gemfile +9 -0
- data/gemfiles/sequel-3.35.0.gemfile.lock +33 -0
- data/gemfiles/sequel-3.4.0.gemfile +9 -0
- data/gemfiles/sequel-3.4.0.gemfile.lock +33 -0
- data/gemfiles/sequel-3.44.0.gemfile +9 -0
- data/gemfiles/sequel-3.44.0.gemfile.lock +33 -0
- data/lib/state_machine.rb +6 -0
- data/lib/state_machine/branch.rb +9 -8
- data/lib/state_machine/callback.rb +2 -2
- data/lib/state_machine/core.rb +10 -0
- data/lib/state_machine/core_ext.rb +1 -0
- data/lib/state_machine/eval_helpers.rb +5 -3
- data/lib/state_machine/event.rb +17 -6
- data/lib/state_machine/graph.rb +92 -0
- data/lib/state_machine/integrations.rb +13 -1
- data/lib/state_machine/integrations/active_model.rb +14 -20
- data/lib/state_machine/integrations/active_model/observer.rb +3 -3
- data/lib/state_machine/integrations/active_model/observer_update.rb +42 -0
- data/lib/state_machine/integrations/active_record.rb +52 -25
- data/lib/state_machine/integrations/active_record/locale.rb +1 -1
- data/lib/state_machine/integrations/active_record/versions.rb +1 -17
- data/lib/state_machine/integrations/base.rb +15 -6
- data/lib/state_machine/integrations/data_mapper.rb +98 -35
- data/lib/state_machine/integrations/data_mapper/versions.rb +46 -8
- data/lib/state_machine/integrations/mongo_mapper.rb +39 -12
- data/lib/state_machine/integrations/mongo_mapper/locale.rb +1 -1
- data/lib/state_machine/integrations/mongo_mapper/versions.rb +3 -20
- data/lib/state_machine/integrations/mongoid.rb +52 -14
- data/lib/state_machine/integrations/mongoid/locale.rb +1 -1
- data/lib/state_machine/integrations/mongoid/versions.rb +52 -26
- data/lib/state_machine/integrations/sequel.rb +82 -33
- data/lib/state_machine/integrations/sequel/versions.rb +19 -44
- data/lib/state_machine/machine.rb +99 -59
- data/lib/state_machine/machine_collection.rb +1 -2
- data/lib/state_machine/macro_methods.rb +29 -0
- data/lib/state_machine/node_collection.rb +1 -1
- data/lib/state_machine/state.rb +18 -10
- data/lib/state_machine/state_context.rb +2 -2
- data/lib/state_machine/transition.rb +8 -1
- data/lib/state_machine/transition_collection.rb +2 -1
- data/lib/state_machine/version.rb +1 -1
- data/lib/state_machine/yard.rb +8 -0
- data/lib/state_machine/yard/handlers.rb +12 -0
- data/lib/state_machine/yard/handlers/base.rb +32 -0
- data/lib/state_machine/yard/handlers/event.rb +25 -0
- data/lib/state_machine/yard/handlers/machine.rb +344 -0
- data/lib/state_machine/yard/handlers/state.rb +25 -0
- data/lib/state_machine/yard/handlers/transition.rb +47 -0
- data/lib/state_machine/yard/templates.rb +3 -0
- data/lib/state_machine/yard/templates/default/class/html/setup.rb +30 -0
- data/lib/state_machine/yard/templates/default/class/html/state_machines.erb +12 -0
- data/lib/tasks/state_machine.rb +2 -1
- data/lib/yard-state_machine.rb +2 -0
- data/state_machine.gemspec +4 -3
- data/test/files/switch.rb +4 -0
- data/test/test_helper.rb +5 -0
- data/test/unit/branch_test.rb +117 -36
- data/test/unit/callback_test.rb +5 -2
- data/test/unit/eval_helpers_test.rb +49 -1
- data/test/unit/event_collection_test.rb +3 -1
- data/test/unit/event_test.rb +182 -12
- data/test/unit/graph_test.rb +98 -0
- data/test/unit/integrations/active_model_test.rb +82 -12
- data/test/unit/integrations/active_record_test.rb +393 -37
- data/test/unit/integrations/base_test.rb +7 -2
- data/test/unit/integrations/data_mapper_test.rb +326 -72
- data/test/unit/integrations/mongo_mapper_test.rb +338 -44
- data/test/unit/integrations/mongoid_test.rb +606 -98
- data/test/unit/integrations/sequel_test.rb +429 -102
- data/test/unit/integrations_test.rb +28 -6
- data/test/unit/machine_collection_test.rb +6 -2
- data/test/unit/machine_test.rb +134 -82
- data/test/unit/node_collection_test.rb +2 -2
- data/test/unit/path_test.rb +1 -1
- data/test/unit/state_test.rb +65 -21
- data/test/unit/transition_collection_test.rb +43 -23
- data/test/unit/transition_test.rb +8 -2
- metadata +303 -221
- data/gemfiles/active_model-3.2.0.gemfile.lock +0 -32
- data/gemfiles/active_record-3.2.0.gemfile.lock +0 -43
- data/gemfiles/graphviz-0.9.0.gemfile.lock +0 -26
@@ -2,9 +2,10 @@ require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
|
|
2
2
|
|
3
3
|
require 'sequel'
|
4
4
|
require 'logger'
|
5
|
+
require 'stringio'
|
5
6
|
|
6
7
|
# Establish database connection
|
7
|
-
DB = Sequel.connect('sqlite:///', :loggers => [Logger.new("#{File.dirname(__FILE__)}/../../sequel.log")])
|
8
|
+
DB = Sequel.connect(RUBY_PLATFORM == 'java' ? 'jdbc:sqlite::memory:' : 'sqlite:///', :loggers => [Logger.new("#{File.dirname(__FILE__)}/../../sequel.log")])
|
8
9
|
|
9
10
|
module SequelTest
|
10
11
|
class BaseTestCase < Test::Unit::TestCase
|
@@ -14,10 +15,11 @@ module SequelTest
|
|
14
15
|
protected
|
15
16
|
# Creates a new Sequel model (and the associated table)
|
16
17
|
def new_model(create_table = :foo, &block)
|
17
|
-
|
18
|
-
|
18
|
+
name = create_table || :foo
|
19
|
+
table_name = "#{name}_#{rand(1000000)}"
|
20
|
+
table_identifier = Sequel::SQL::Identifier.new(table_name)
|
19
21
|
|
20
|
-
if !defined?(Sequel::VERSION) || Gem::Version.new(
|
22
|
+
if !defined?(Sequel::VERSION) || Gem::Version.new(Sequel::VERSION) <= Gem::Version.new('3.26.0')
|
21
23
|
class << table_identifier
|
22
24
|
alias_method :original_to_s, :to_s
|
23
25
|
def to_s(*args); args.empty? ? inspect : original_to_s(*args); end
|
@@ -28,12 +30,16 @@ module SequelTest
|
|
28
30
|
primary_key :id
|
29
31
|
column :state, :string
|
30
32
|
end if create_table
|
31
|
-
model = Class.new(Sequel::Model
|
33
|
+
model = Class.new(Sequel::Model) do
|
32
34
|
self.raise_on_save_failure = false
|
33
35
|
(class << self; self; end).class_eval do
|
34
|
-
define_method(:name) { "SequelTest::#{
|
36
|
+
define_method(:name) { "SequelTest::#{name.to_s.capitalize}" }
|
37
|
+
define_method(:table_identifier) { table_identifier }
|
35
38
|
end
|
39
|
+
|
40
|
+
set_dataset(DB[table_identifier])
|
36
41
|
end
|
42
|
+
model.set_dataset(DB[table_identifier])
|
37
43
|
model.class_eval(&block) if block_given?
|
38
44
|
model
|
39
45
|
end
|
@@ -57,7 +63,7 @@ module SequelTest
|
|
57
63
|
end
|
58
64
|
|
59
65
|
def test_should_have_defaults
|
60
|
-
assert_equal
|
66
|
+
assert_equal({:action => :save}, StateMachine::Integrations::Sequel.defaults)
|
61
67
|
end
|
62
68
|
|
63
69
|
def test_should_not_have_a_locale_path
|
@@ -122,7 +128,7 @@ module SequelTest
|
|
122
128
|
|
123
129
|
class MachineWithStaticInitialStateTest < BaseTestCase
|
124
130
|
def setup
|
125
|
-
@model = new_model do
|
131
|
+
@model = new_model(:vehicle) do
|
126
132
|
attr_accessor :value
|
127
133
|
end
|
128
134
|
@machine = StateMachine::Machine.new(@model, :initial => :parked)
|
@@ -133,17 +139,6 @@ module SequelTest
|
|
133
139
|
assert_equal 'parked', record.state
|
134
140
|
end
|
135
141
|
|
136
|
-
def test_should_set_initial_state_with_nil_attributes
|
137
|
-
@model.class_eval do
|
138
|
-
def set(hash)
|
139
|
-
super(hash || {})
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
record = @model.new(nil)
|
144
|
-
assert_equal 'parked', record.state
|
145
|
-
end
|
146
|
-
|
147
142
|
def test_should_still_set_attributes
|
148
143
|
record = @model.new(:value => 1)
|
149
144
|
assert_equal 1, record.value
|
@@ -160,7 +155,7 @@ module SequelTest
|
|
160
155
|
|
161
156
|
def test_should_set_attributes_prior_to_initialize_block
|
162
157
|
state = nil
|
163
|
-
|
158
|
+
@model.new do |record|
|
164
159
|
state = record.state
|
165
160
|
end
|
166
161
|
|
@@ -182,6 +177,7 @@ module SequelTest
|
|
182
177
|
@model.class_eval do
|
183
178
|
attr_accessor :state_during_setter
|
184
179
|
|
180
|
+
remove_method :value=
|
185
181
|
define_method(:value=) do |value|
|
186
182
|
self.state_during_setter = state
|
187
183
|
end
|
@@ -200,6 +196,20 @@ module SequelTest
|
|
200
196
|
assert_equal 'idling', record.state
|
201
197
|
end
|
202
198
|
|
199
|
+
def test_should_persist_initial_state
|
200
|
+
record = @model.new
|
201
|
+
record.save
|
202
|
+
record.reload
|
203
|
+
assert_equal 'parked', record.state
|
204
|
+
end
|
205
|
+
|
206
|
+
def test_should_persist_initial_state_on_dup
|
207
|
+
record = @model.create.dup
|
208
|
+
record.save
|
209
|
+
record.reload
|
210
|
+
assert_equal 'parked', record.state
|
211
|
+
end
|
212
|
+
|
203
213
|
def test_should_use_stored_values_when_loading_from_database
|
204
214
|
@machine.state :idling
|
205
215
|
|
@@ -213,6 +223,77 @@ module SequelTest
|
|
213
223
|
record = @model[@model.create(:state => nil).id]
|
214
224
|
assert_nil record.state
|
215
225
|
end
|
226
|
+
|
227
|
+
def test_should_use_stored_values_when_loading_for_many_association
|
228
|
+
@machine.state :idling
|
229
|
+
|
230
|
+
DB.alter_table(@model.table_identifier) do
|
231
|
+
add_column :owner_id, :integer
|
232
|
+
end
|
233
|
+
@model.class_eval { get_db_schema(true) }
|
234
|
+
SequelTest.const_set('Vehicle', @model)
|
235
|
+
|
236
|
+
owner_model = new_model(:owner) do
|
237
|
+
one_to_many :vehicles, :class_name => 'SequelTest::Vehicle'
|
238
|
+
end
|
239
|
+
SequelTest.const_set('Owner', owner_model)
|
240
|
+
|
241
|
+
owner = owner_model.create
|
242
|
+
record = @model.create(:state => 'idling', :owner_id => owner.id)
|
243
|
+
assert_equal 'idling', owner.vehicles[0].state
|
244
|
+
end
|
245
|
+
|
246
|
+
if defined?(Sequel::VERSION) && Gem::Version.new(Sequel::VERSION) >= Gem::Version.new('3.10.0')
|
247
|
+
def test_should_use_stored_values_when_loading_for_one_association
|
248
|
+
@machine.state :idling
|
249
|
+
|
250
|
+
DB.alter_table(@model.table_identifier) do
|
251
|
+
add_column :owner_id, :integer
|
252
|
+
end
|
253
|
+
@model.class_eval { get_db_schema(true) }
|
254
|
+
SequelTest.const_set('Vehicle', @model)
|
255
|
+
|
256
|
+
owner_model = new_model(:owner) do
|
257
|
+
one_to_one :vehicle, :class_name => 'SequelTest::Vehicle'
|
258
|
+
end
|
259
|
+
SequelTest.const_set('Owner', owner_model)
|
260
|
+
|
261
|
+
owner = owner_model.create
|
262
|
+
record = @model.create(:state => 'idling', :owner_id => owner.id)
|
263
|
+
owner.reload
|
264
|
+
assert_equal 'idling', owner.vehicle.state
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
def test_should_use_stored_values_when_loading_for_belongs_to_association
|
269
|
+
@machine.state :idling
|
270
|
+
|
271
|
+
SequelTest.const_set('Vehicle', @model)
|
272
|
+
|
273
|
+
driver_model = new_model(:driver) do
|
274
|
+
DB.alter_table(table_identifier) do
|
275
|
+
add_column :vehicle_id, :integer
|
276
|
+
end
|
277
|
+
get_db_schema(true)
|
278
|
+
|
279
|
+
many_to_one :vehicle, :class_name => 'SequelTest::Vehicle'
|
280
|
+
end
|
281
|
+
|
282
|
+
SequelTest.const_set('Driver', driver_model)
|
283
|
+
|
284
|
+
record = @model.create(:state => 'idling')
|
285
|
+
driver = driver_model.create(:vehicle_id => record.id)
|
286
|
+
assert_equal 'idling', driver.vehicle.state
|
287
|
+
end
|
288
|
+
|
289
|
+
def teardown
|
290
|
+
SequelTest.class_eval do
|
291
|
+
remove_const('Vehicle') if defined?(SequelTest::Vehicle)
|
292
|
+
remove_const('Owner') if defined?(SequelTest::Owner)
|
293
|
+
remove_const('Driver') if defined?(SequelTest::Driver)
|
294
|
+
end
|
295
|
+
super
|
296
|
+
end
|
216
297
|
end
|
217
298
|
|
218
299
|
class MachineWithDynamicInitialStateTest < BaseTestCase
|
@@ -250,7 +331,7 @@ module SequelTest
|
|
250
331
|
|
251
332
|
def test_should_set_attributes_prior_to_initialize_block
|
252
333
|
state = nil
|
253
|
-
|
334
|
+
@model.new do |record|
|
254
335
|
state = record.state
|
255
336
|
end
|
256
337
|
|
@@ -272,6 +353,7 @@ module SequelTest
|
|
272
353
|
@model.class_eval do
|
273
354
|
attr_accessor :state_during_setter
|
274
355
|
|
356
|
+
remove_method :value=
|
275
357
|
define_method(:value=) do |value|
|
276
358
|
self.state_during_setter = state || 'nil'
|
277
359
|
end
|
@@ -290,6 +372,20 @@ module SequelTest
|
|
290
372
|
assert_equal 'idling', record.state
|
291
373
|
end
|
292
374
|
|
375
|
+
def test_should_persist_initial_state
|
376
|
+
record = @model.new
|
377
|
+
record.save
|
378
|
+
record.reload
|
379
|
+
assert_equal 'parked', record.state
|
380
|
+
end
|
381
|
+
|
382
|
+
def test_should_persist_initial_state_on_dup
|
383
|
+
record = @model.create.dup
|
384
|
+
record.save
|
385
|
+
record.reload
|
386
|
+
assert_equal 'parked', record.state
|
387
|
+
end
|
388
|
+
|
293
389
|
def test_should_use_stored_values_when_loading_from_database
|
294
390
|
@machine.state :idling
|
295
391
|
|
@@ -317,13 +413,19 @@ module SequelTest
|
|
317
413
|
end
|
318
414
|
end
|
319
415
|
|
320
|
-
class
|
416
|
+
class MachineWithSameColumnDefaultTest < BaseTestCase
|
321
417
|
def setup
|
322
|
-
@
|
323
|
-
|
324
|
-
|
418
|
+
@original_stderr, $stderr = $stderr, StringIO.new
|
419
|
+
|
420
|
+
@model = new_model(false)
|
421
|
+
DB.create_table!(@model.table_identifier) do
|
422
|
+
primary_key :id
|
423
|
+
column :status, :string, :default => 'parked'
|
424
|
+
end
|
425
|
+
@model.class_eval do
|
426
|
+
set_dataset(DB[table_identifier])
|
427
|
+
get_db_schema(true)
|
325
428
|
end
|
326
|
-
@model.class_eval { get_db_schema(true) }
|
327
429
|
|
328
430
|
@machine = StateMachine::Machine.new(@model, :status, :initial => :parked)
|
329
431
|
@record = @model.new
|
@@ -332,6 +434,77 @@ module SequelTest
|
|
332
434
|
def test_should_use_machine_default
|
333
435
|
assert_equal 'parked', @record.status
|
334
436
|
end
|
437
|
+
|
438
|
+
def test_should_not_generate_a_warning
|
439
|
+
assert_no_match(/have defined a different default/, $stderr.string)
|
440
|
+
end
|
441
|
+
|
442
|
+
def teardown
|
443
|
+
$stderr = @original_stderr
|
444
|
+
end
|
445
|
+
end
|
446
|
+
|
447
|
+
class MachineWithDifferentColumnDefaultTest < BaseTestCase
|
448
|
+
def setup
|
449
|
+
@original_stderr, $stderr = $stderr, StringIO.new
|
450
|
+
|
451
|
+
@model = new_model(false)
|
452
|
+
DB.create_table!(@model.table_identifier) do
|
453
|
+
primary_key :id
|
454
|
+
column :status, :string, :default => 'idling'
|
455
|
+
end
|
456
|
+
@model.class_eval do
|
457
|
+
set_dataset(DB[table_identifier])
|
458
|
+
get_db_schema(true)
|
459
|
+
end
|
460
|
+
|
461
|
+
@machine = StateMachine::Machine.new(@model, :status, :initial => :parked)
|
462
|
+
@record = @model.new
|
463
|
+
end
|
464
|
+
|
465
|
+
def test_should_use_machine_default
|
466
|
+
assert_equal 'parked', @record.status
|
467
|
+
end
|
468
|
+
|
469
|
+
def test_should_generate_a_warning
|
470
|
+
assert_match(/Both SequelTest::Foo and its :status machine have defined a different default for "status". Use only one or the other for defining defaults to avoid unexpected behaviors\./, $stderr.string)
|
471
|
+
end
|
472
|
+
|
473
|
+
def teardown
|
474
|
+
$stderr = @original_stderr
|
475
|
+
end
|
476
|
+
end
|
477
|
+
|
478
|
+
class MachineWithDifferentIntegerColumnDefaultTest < BaseTestCase
|
479
|
+
def setup
|
480
|
+
@original_stderr, $stderr = $stderr, StringIO.new
|
481
|
+
|
482
|
+
@model = new_model(false)
|
483
|
+
DB.create_table!(@model.table_identifier) do
|
484
|
+
primary_key :id
|
485
|
+
column :status, :integer, :default => 0
|
486
|
+
end
|
487
|
+
@model.class_eval do
|
488
|
+
set_dataset(DB[table_identifier])
|
489
|
+
get_db_schema(true)
|
490
|
+
end
|
491
|
+
|
492
|
+
@machine = StateMachine::Machine.new(@model, :status, :initial => :parked)
|
493
|
+
@machine.state :parked, :value => 1
|
494
|
+
@record = @model.new
|
495
|
+
end
|
496
|
+
|
497
|
+
def test_should_use_machine_default
|
498
|
+
assert_equal 1, @record.status
|
499
|
+
end
|
500
|
+
|
501
|
+
def test_should_generate_a_warning
|
502
|
+
assert_match(/Both SequelTest::Foo and its :status machine have defined a different default for "status". Use only one or the other for defining defaults to avoid unexpected behaviors\./, $stderr.string)
|
503
|
+
end
|
504
|
+
|
505
|
+
def teardown
|
506
|
+
$stderr = @original_stderr
|
507
|
+
end
|
335
508
|
end
|
336
509
|
|
337
510
|
class MachineWithConflictingPredicateTest < BaseTestCase
|
@@ -377,8 +550,7 @@ module SequelTest
|
|
377
550
|
end
|
378
551
|
|
379
552
|
def test_should_raise_exception_for_predicate_without_parameters
|
380
|
-
|
381
|
-
assert_equal 'wrong number of arguments (1 for 2)', exception.message
|
553
|
+
assert_raise(ArgumentError) { @record.state? }
|
382
554
|
end
|
383
555
|
|
384
556
|
def test_should_return_false_for_predicate_if_does_not_match_current_value
|
@@ -492,8 +664,8 @@ module SequelTest
|
|
492
664
|
class MachineMultipleTest < BaseTestCase
|
493
665
|
def setup
|
494
666
|
@model = new_model
|
495
|
-
DB.alter_table
|
496
|
-
add_column :status, :string
|
667
|
+
DB.alter_table(@model.table_identifier) do
|
668
|
+
add_column :status, :string
|
497
669
|
end
|
498
670
|
@model.class_eval { get_db_schema(true) }
|
499
671
|
|
@@ -544,7 +716,7 @@ module SequelTest
|
|
544
716
|
end
|
545
717
|
end
|
546
718
|
|
547
|
-
DB.alter_table
|
719
|
+
DB.alter_table(@model.table_identifier) do
|
548
720
|
add_column :updated_at, :datetime
|
549
721
|
end
|
550
722
|
@model.class_eval { get_db_schema(true) }
|
@@ -607,8 +779,8 @@ module SequelTest
|
|
607
779
|
class MachineWithDirtyAttributesAndCustomAttributeTest < BaseTestCase
|
608
780
|
def setup
|
609
781
|
@model = new_model
|
610
|
-
DB.alter_table
|
611
|
-
add_column :status, :string
|
782
|
+
DB.alter_table(@model.table_identifier) do
|
783
|
+
add_column :status, :string
|
612
784
|
end
|
613
785
|
@model.class_eval { get_db_schema(true) }
|
614
786
|
|
@@ -630,8 +802,8 @@ module SequelTest
|
|
630
802
|
class MachineWithDirtyAttributeAndCustomAttributesDuringLoopbackTest < BaseTestCase
|
631
803
|
def setup
|
632
804
|
@model = new_model
|
633
|
-
DB.alter_table
|
634
|
-
add_column :status, :string
|
805
|
+
DB.alter_table(@model.table_identifier) do
|
806
|
+
add_column :status, :string
|
635
807
|
end
|
636
808
|
@model.class_eval { get_db_schema(true) }
|
637
809
|
|
@@ -790,12 +962,22 @@ module SequelTest
|
|
790
962
|
|
791
963
|
def test_should_run_around_callbacks
|
792
964
|
before_called = false
|
793
|
-
after_called =
|
794
|
-
|
965
|
+
after_called = false
|
966
|
+
ensure_called = 0
|
967
|
+
@machine.around_transition do |block|
|
968
|
+
before_called = true
|
969
|
+
begin
|
970
|
+
block.call
|
971
|
+
ensure
|
972
|
+
ensure_called += 1
|
973
|
+
end
|
974
|
+
after_called = true
|
975
|
+
end
|
795
976
|
|
796
977
|
@transition.perform
|
797
978
|
assert before_called
|
798
|
-
assert after_called
|
979
|
+
assert after_called
|
980
|
+
assert_equal ensure_called, 1
|
799
981
|
end
|
800
982
|
|
801
983
|
def test_should_run_around_callbacks_with_the_context_of_the_record
|
@@ -830,6 +1012,33 @@ module SequelTest
|
|
830
1012
|
|
831
1013
|
assert_equal [1, 2, 3], @record.callback_result
|
832
1014
|
end
|
1015
|
+
|
1016
|
+
def test_should_run_in_expected_order
|
1017
|
+
expected = [
|
1018
|
+
:before_transition, :before_validation, :after_validation,
|
1019
|
+
:before_save, :before_create, :after_create, :after_save,
|
1020
|
+
:after_transition
|
1021
|
+
]
|
1022
|
+
|
1023
|
+
callbacks = []
|
1024
|
+
@model.before_validation { callbacks << :before_validation }
|
1025
|
+
@model.after_validation { callbacks << :after_validation }
|
1026
|
+
@model.before_save { callbacks << :before_save }
|
1027
|
+
@model.before_create { callbacks << :before_create }
|
1028
|
+
@model.after_create { callbacks << :after_create }
|
1029
|
+
@model.after_save { callbacks << :after_save }
|
1030
|
+
if @model.respond_to?(:after_commit)
|
1031
|
+
@model.after_commit { callbacks << :after_commit }
|
1032
|
+
expected << :after_commit
|
1033
|
+
end
|
1034
|
+
|
1035
|
+
@machine.before_transition { callbacks << :before_transition }
|
1036
|
+
@machine.after_transition { callbacks << :after_transition }
|
1037
|
+
|
1038
|
+
@transition.perform
|
1039
|
+
|
1040
|
+
assert_equal expected, callbacks
|
1041
|
+
end
|
833
1042
|
end
|
834
1043
|
|
835
1044
|
class MachineWithFailedBeforeCallbacksTest < BaseTestCase
|
@@ -869,12 +1078,50 @@ module SequelTest
|
|
869
1078
|
end
|
870
1079
|
end
|
871
1080
|
|
1081
|
+
class MachineNestedActionTest < BaseTestCase
|
1082
|
+
def setup
|
1083
|
+
@callbacks = []
|
1084
|
+
|
1085
|
+
@model = new_model
|
1086
|
+
@machine = StateMachine::Machine.new(@model)
|
1087
|
+
@machine.event :ignite do
|
1088
|
+
transition :parked => :idling
|
1089
|
+
end
|
1090
|
+
|
1091
|
+
@record = @model.new(:state => 'parked')
|
1092
|
+
end
|
1093
|
+
|
1094
|
+
def test_should_allow_transition_prior_to_creation_if_skipping_action
|
1095
|
+
record = @record
|
1096
|
+
@model.before_create { record.ignite(false) }
|
1097
|
+
result = @record.save
|
1098
|
+
|
1099
|
+
assert result
|
1100
|
+
assert_equal "idling", @record.state
|
1101
|
+
@record.reload
|
1102
|
+
assert_equal "idling", @record.state
|
1103
|
+
end
|
1104
|
+
|
1105
|
+
if !defined?(Sequel::VERSION) || !%w(2.10.0 2.11.0).include?(Sequel::VERSION)
|
1106
|
+
def test_should_allow_transition_after_creation
|
1107
|
+
record = @record
|
1108
|
+
@model.after_create { record.ignite }
|
1109
|
+
result = @record.save
|
1110
|
+
|
1111
|
+
assert result
|
1112
|
+
assert_equal "idling", @record.state
|
1113
|
+
@record.reload
|
1114
|
+
assert_equal "idling", @record.state
|
1115
|
+
end
|
1116
|
+
end
|
1117
|
+
end
|
1118
|
+
|
872
1119
|
class MachineWithFailedActionTest < BaseTestCase
|
873
1120
|
def setup
|
874
1121
|
@model = new_model do
|
875
|
-
|
876
|
-
|
877
|
-
|
1122
|
+
def validate
|
1123
|
+
super
|
1124
|
+
errors[:state] << 'is invalid' unless %w(first_gear).include?(state)
|
878
1125
|
end
|
879
1126
|
end
|
880
1127
|
|
@@ -913,7 +1160,7 @@ module SequelTest
|
|
913
1160
|
end
|
914
1161
|
|
915
1162
|
class MachineWithFailedAfterCallbacksTest < BaseTestCase
|
916
|
-
|
1163
|
+
def setup
|
917
1164
|
callbacks = []
|
918
1165
|
|
919
1166
|
@model = new_model
|
@@ -1042,7 +1289,10 @@ module SequelTest
|
|
1042
1289
|
|
1043
1290
|
@machine = StateMachine::Machine.new(@model)
|
1044
1291
|
@machine.state :first_gear do
|
1045
|
-
|
1292
|
+
def validate
|
1293
|
+
super if defined?(super)
|
1294
|
+
errors[:seatbelt] << 'is not present' if seatbelt.nil?
|
1295
|
+
end
|
1046
1296
|
end
|
1047
1297
|
@machine.other_states :parked
|
1048
1298
|
end
|
@@ -1104,7 +1354,11 @@ module SequelTest
|
|
1104
1354
|
ran_callback = false
|
1105
1355
|
@machine.around_transition {|block| ran_callback = true; block.call }
|
1106
1356
|
|
1107
|
-
|
1357
|
+
begin
|
1358
|
+
@record.valid?
|
1359
|
+
rescue ArgumentError
|
1360
|
+
raise if StateMachine::Transition.pause_supported?
|
1361
|
+
end
|
1108
1362
|
assert ran_callback
|
1109
1363
|
end
|
1110
1364
|
|
@@ -1124,7 +1378,10 @@ module SequelTest
|
|
1124
1378
|
def test_should_not_run_after_callbacks_with_failures_disabled_if_validation_fails
|
1125
1379
|
@model.class_eval do
|
1126
1380
|
attr_accessor :seatbelt
|
1127
|
-
|
1381
|
+
def validate
|
1382
|
+
super
|
1383
|
+
errors[:seatbelt] << 'is not present' if seatbelt.nil?
|
1384
|
+
end
|
1128
1385
|
end
|
1129
1386
|
|
1130
1387
|
ran_callback = false
|
@@ -1137,7 +1394,10 @@ module SequelTest
|
|
1137
1394
|
def test_should_run_failure_callbacks_if_validation_fails
|
1138
1395
|
@model.class_eval do
|
1139
1396
|
attr_accessor :seatbelt
|
1140
|
-
|
1397
|
+
def validate
|
1398
|
+
super
|
1399
|
+
errors[:seatbelt] << 'is not present' if seatbelt.nil?
|
1400
|
+
end
|
1141
1401
|
end
|
1142
1402
|
|
1143
1403
|
ran_callback = false
|
@@ -1151,20 +1411,31 @@ module SequelTest
|
|
1151
1411
|
ran_callback = [false]
|
1152
1412
|
@machine.around_transition {|block| block.call; ran_callback[0] = true }
|
1153
1413
|
|
1154
|
-
|
1414
|
+
begin
|
1415
|
+
@record.valid?
|
1416
|
+
rescue ArgumentError
|
1417
|
+
raise if StateMachine::Transition.pause_supported?
|
1418
|
+
end
|
1155
1419
|
assert !ran_callback[0]
|
1156
1420
|
end
|
1157
1421
|
|
1158
1422
|
def test_should_not_run_around_callbacks_after_yield_with_failures_disabled_if_validation_fails
|
1159
1423
|
@model.class_eval do
|
1160
1424
|
attr_accessor :seatbelt
|
1161
|
-
|
1425
|
+
def validate
|
1426
|
+
super
|
1427
|
+
errors[:seatbelt] << 'is not present' if seatbelt.nil?
|
1428
|
+
end
|
1162
1429
|
end
|
1163
1430
|
|
1164
1431
|
ran_callback = [false]
|
1165
1432
|
@machine.around_transition {|block| block.call; ran_callback[0] = true }
|
1166
1433
|
|
1167
|
-
|
1434
|
+
begin
|
1435
|
+
@record.valid?
|
1436
|
+
rescue ArgumentError
|
1437
|
+
raise if StateMachine::Transition.pause_supported?
|
1438
|
+
end
|
1168
1439
|
assert !ran_callback[0]
|
1169
1440
|
end
|
1170
1441
|
|
@@ -1282,29 +1553,17 @@ module SequelTest
|
|
1282
1553
|
assert !ran_callback
|
1283
1554
|
end
|
1284
1555
|
|
1285
|
-
|
1286
|
-
|
1287
|
-
|
1288
|
-
|
1289
|
-
|
1290
|
-
|
1291
|
-
|
1292
|
-
|
1293
|
-
assert !ran_callback
|
1294
|
-
end
|
1295
|
-
else
|
1296
|
-
def test_should_run_failure_callbacks_if_fails
|
1297
|
-
@model.before_create {|record| false}
|
1298
|
-
|
1299
|
-
ran_callback = false
|
1300
|
-
@machine.after_failure { ran_callback = true }
|
1301
|
-
|
1302
|
-
@record.save
|
1303
|
-
assert ran_callback
|
1304
|
-
end
|
1556
|
+
def test_should_run_failure_callbacks_if_fails
|
1557
|
+
@model.before_create {|record| false}
|
1558
|
+
|
1559
|
+
ran_callback = false
|
1560
|
+
@machine.after_failure { ran_callback = true }
|
1561
|
+
|
1562
|
+
@record.save
|
1563
|
+
assert ran_callback
|
1305
1564
|
end
|
1306
1565
|
|
1307
|
-
def
|
1566
|
+
def test_should_run_before_transitions_within_transaction
|
1308
1567
|
@machine.before_transition { self.class.create; raise Sequel::Error::Rollback }
|
1309
1568
|
|
1310
1569
|
begin
|
@@ -1312,7 +1571,7 @@ module SequelTest
|
|
1312
1571
|
rescue Sequel::Error::Rollback
|
1313
1572
|
end
|
1314
1573
|
|
1315
|
-
assert_equal
|
1574
|
+
assert_equal 0, @model.count
|
1316
1575
|
end
|
1317
1576
|
|
1318
1577
|
def test_should_not_run_around_callbacks_with_failures_disabled_if_fails
|
@@ -1333,43 +1592,111 @@ module SequelTest
|
|
1333
1592
|
assert ran_callback[0]
|
1334
1593
|
end
|
1335
1594
|
|
1336
|
-
|
1337
|
-
|
1338
|
-
|
1595
|
+
def test_should_run_after_transitions_within_transaction
|
1596
|
+
@machine.after_transition { self.class.create; raise Sequel::Error::Rollback }
|
1597
|
+
|
1598
|
+
@record.save
|
1599
|
+
|
1600
|
+
assert_equal 0, @model.count
|
1601
|
+
end
|
1602
|
+
|
1603
|
+
def test_should_run_around_transition_within_transaction
|
1604
|
+
@machine.around_transition {|block| block.call; self.class.create; raise Sequel::Error::Rollback }
|
1605
|
+
|
1606
|
+
@record.save
|
1607
|
+
|
1608
|
+
assert_equal 0, @model.count
|
1609
|
+
end
|
1610
|
+
|
1611
|
+
def test_should_allow_additional_transitions_to_new_state_in_after_transitions
|
1612
|
+
@machine.event :park do
|
1613
|
+
transition :idling => :parked
|
1614
|
+
end
|
1615
|
+
|
1616
|
+
@machine.after_transition(:on => :ignite) { park }
|
1617
|
+
|
1618
|
+
@record.save
|
1619
|
+
assert_equal 'parked', @record.state
|
1620
|
+
|
1621
|
+
@record.reload
|
1622
|
+
assert_equal 'parked', @record.state
|
1623
|
+
end
|
1624
|
+
|
1625
|
+
def test_should_allow_additional_transitions_to_previous_state_in_after_transitions
|
1626
|
+
@machine.event :shift_up do
|
1627
|
+
transition :idling => :first_gear
|
1628
|
+
end
|
1629
|
+
|
1630
|
+
@machine.after_transition(:on => :ignite) { shift_up }
|
1631
|
+
|
1632
|
+
@record.save
|
1633
|
+
assert_equal 'first_gear', @record.state
|
1634
|
+
|
1635
|
+
@record.reload
|
1636
|
+
assert_equal 'first_gear', @record.state
|
1637
|
+
end
|
1638
|
+
|
1639
|
+
def test_should_return_nil_on_manual_rollback
|
1640
|
+
@machine.before_transition { raise Sequel::Error::Rollback }
|
1641
|
+
|
1642
|
+
assert_equal nil, @record.save
|
1643
|
+
end
|
1644
|
+
end
|
1645
|
+
|
1646
|
+
if defined?(Sequel::VERSION) && Gem::Version.new(Sequel::VERSION) >= Gem::Version.new('3.4.0')
|
1647
|
+
class MachineWithEventAttributesOnAutosaveTest < BaseTestCase
|
1648
|
+
def setup
|
1649
|
+
@vehicle_model = new_model(:vehicle)
|
1650
|
+
DB.alter_table(@vehicle_model.table_identifier) do
|
1651
|
+
add_column :owner_id, :integer
|
1652
|
+
end
|
1653
|
+
@vehicle_model.class_eval { get_db_schema(true) }
|
1654
|
+
SequelTest.const_set('Vehicle', @vehicle_model)
|
1339
1655
|
|
1340
|
-
@
|
1656
|
+
@owner_model = new_model(:owner) do
|
1657
|
+
plugin :nested_attributes
|
1658
|
+
end
|
1659
|
+
SequelTest.const_set('Owner', @owner_model)
|
1341
1660
|
|
1342
|
-
|
1661
|
+
machine = StateMachine::Machine.new(@vehicle_model)
|
1662
|
+
machine.event :ignite do
|
1663
|
+
transition :parked => :idling
|
1664
|
+
end
|
1665
|
+
|
1666
|
+
@owner = @owner_model.create
|
1667
|
+
@vehicle = @vehicle_model.create(:state => 'parked', :owner_id => @owner.id)
|
1343
1668
|
end
|
1344
1669
|
|
1345
|
-
def
|
1346
|
-
@
|
1670
|
+
def test_should_persist_many_association
|
1671
|
+
@owner_model.one_to_many :vehicles, :class_name => 'SequelTest::Vehicle'
|
1672
|
+
@owner_model.nested_attributes :vehicles
|
1347
1673
|
|
1348
|
-
@
|
1674
|
+
@owner.vehicles_attributes = [{:id => @vehicle.id, :state_event => 'ignite'}]
|
1675
|
+
@owner.save
|
1349
1676
|
|
1350
|
-
|
1677
|
+
@vehicle.reload
|
1678
|
+
assert_equal 'idling', @vehicle.state
|
1351
1679
|
end
|
1352
|
-
|
1353
|
-
|
1354
|
-
|
1355
|
-
|
1356
|
-
|
1357
|
-
|
1358
|
-
|
1680
|
+
|
1681
|
+
if Gem::Version.new(Sequel::VERSION) >= Gem::Version.new('3.10.0')
|
1682
|
+
def test_should_persist_one_association
|
1683
|
+
@owner_model.one_to_one :vehicle, :class_name => 'SequelTest::Vehicle'
|
1684
|
+
@owner_model.nested_attributes :vehicle
|
1685
|
+
|
1686
|
+
@owner.vehicle_attributes = {:id => @vehicle.id, :state_event => 'ignite'}
|
1687
|
+
@owner.save
|
1688
|
+
|
1689
|
+
@vehicle.reload
|
1690
|
+
assert_equal 'idling', @vehicle.state
|
1359
1691
|
end
|
1360
|
-
|
1361
|
-
assert_equal 2, @model.count
|
1362
1692
|
end
|
1363
1693
|
|
1364
|
-
def
|
1365
|
-
|
1366
|
-
|
1367
|
-
|
1368
|
-
@record.save
|
1369
|
-
rescue Sequel::Error::Rollback
|
1694
|
+
def teardown
|
1695
|
+
SequelTest.class_eval do
|
1696
|
+
remove_const('Vehicle')
|
1697
|
+
remove_const('Owner')
|
1370
1698
|
end
|
1371
|
-
|
1372
|
-
assert_equal 2, @model.count
|
1699
|
+
super
|
1373
1700
|
end
|
1374
1701
|
end
|
1375
1702
|
end
|
@@ -1422,7 +1749,7 @@ module SequelTest
|
|
1422
1749
|
|
1423
1750
|
def test_should_only_include_records_with_state_in_singular_with_scope
|
1424
1751
|
parked = @model.create :state => 'parked'
|
1425
|
-
|
1752
|
+
@model.create :state => 'idling'
|
1426
1753
|
|
1427
1754
|
assert_equal [parked], @model.with_state(:parked).all
|
1428
1755
|
end
|
@@ -1482,7 +1809,7 @@ module SequelTest
|
|
1482
1809
|
@machine.state :idling, :value => lambda {'idling'}
|
1483
1810
|
|
1484
1811
|
parked = @model.create :state => 'parked'
|
1485
|
-
|
1812
|
+
@model.create :state => 'idling'
|
1486
1813
|
|
1487
1814
|
assert_equal [parked], @model.with_state(:parked).all
|
1488
1815
|
end
|
@@ -1537,7 +1864,7 @@ module SequelTest
|
|
1537
1864
|
@vehicle = new_model(:vehicle) do
|
1538
1865
|
many_to_one :company, :class => SequelTest::Company
|
1539
1866
|
end
|
1540
|
-
DB.alter_table
|
1867
|
+
DB.alter_table(@vehicle.table_identifier) do
|
1541
1868
|
add_column :company_id, :integer
|
1542
1869
|
end
|
1543
1870
|
@vehicle.class_eval { get_db_schema(true) }
|
@@ -1552,11 +1879,11 @@ module SequelTest
|
|
1552
1879
|
end
|
1553
1880
|
|
1554
1881
|
def test_should_find_records_in_with_scope
|
1555
|
-
assert_equal [@mustang], @vehicle.with_states(:parked).join(
|
1882
|
+
assert_equal [@mustang], @vehicle.with_states(:parked).join(@company.table_identifier.value, :id => :company_id).filter(:"#{@company.table_identifier.value}__state" => 'active').select(@vehicle.table_identifier.value.to_sym.*).all
|
1556
1883
|
end
|
1557
1884
|
|
1558
1885
|
def test_should_find_records_in_without_scope
|
1559
|
-
assert_equal [@mustang], @vehicle.without_states(:idling).join(
|
1886
|
+
assert_equal [@mustang], @vehicle.without_states(:idling).join(@company.table_identifier.value, :id => :company_id).filter(:"#{@company.table_identifier.value}__state" => 'active').select(@vehicle.table_identifier.value.to_sym.*).all
|
1560
1887
|
end
|
1561
1888
|
|
1562
1889
|
def teardown
|