· 8 years ago · Mar 13, 2018, 10:34 PM
1require 'rubygems'
2require 'activerecord'
3
4$:.unshift('lib')
5require 'state_machine'
6
7ActiveRecord::Base.establish_connection({
8 :adapter => 'mysql',
9 :database => 'test',
10 :username => 'root'
11})
12
13ActiveRecord::Base.connection.execute "DROP TABLE IF EXISTS foos"
14ActiveRecord::Base.connection.execute <<EOSQL
15 CREATE TABLE foos (
16 id INT NOT NULL AUTO_INCREMENT,
17 state VARCHAR(255),
18 string VARCHAR(255),
19 PRIMARY KEY (id)
20 );
21EOSQL
22
23class Foo < ActiveRecord::Base
24 attr_reader :changes_before_update, :changes_before_save
25
26 state_machine :initial => 'park' do
27 event :ignite do
28 transition :park => :idling
29 end
30
31 event :park do
32 transition :idling => :park
33 end
34 end
35
36 def before_save
37 @changes_before_save = changes
38 end
39
40 def before_update
41 @changes_before_update = changes
42 end
43end
44
45require 'test/unit'
46
47class AttributeTest < Test::Unit::TestCase
48 def setup
49 Foo.delete_all
50 end
51
52 def test_initial
53 foo = Foo.new( :string => 'arb' )
54 foo.save
55
56 expected = { 'state' => [ nil, 'park' ], 'string' => [ nil, 'arb' ] }
57 assert_equal expected, foo.changes_before_save
58 end
59
60 def test_changes
61 foo = Foo.new
62 foo.save
63
64 foo.update_attribute :string, 'arb'
65 expected = { "string" => [ nil, "arb" ] }
66 assert_equal expected, foo.changes_before_update
67
68 foo.ignite!
69
70 expected = { "state" => [ 'park', 'idling' ] }
71 assert_equal expected, foo.changes_before_update
72 end
73end