simple_enum 0.3.0

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.
@@ -0,0 +1,74 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{simple_enum}
8
+ s.version = "0.3.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Lukas Westermann"]
12
+ s.date = %q{2009-10-07}
13
+ s.email = %q{lukas.westermann@gmail.com}
14
+ s.extra_rdoc_files = [
15
+ "README.rdoc"
16
+ ]
17
+ s.files = [
18
+ ".gitignore",
19
+ "LICENCE",
20
+ "README.rdoc",
21
+ "Rakefile",
22
+ "VERSION.yml",
23
+ "init.rb",
24
+ "lib/simple_enum.rb",
25
+ "lib/simple_enum/array_support.rb",
26
+ "lib/simple_enum/enum_hash.rb",
27
+ "lib/simple_enum/object_support.rb",
28
+ "lib/simple_enum/validation.rb",
29
+ "lib/simple_enum/version.rb",
30
+ "locales/en.yml",
31
+ "simple_enum.gemspec",
32
+ "test/array_conversions_test.rb",
33
+ "test/class_methods_test.rb",
34
+ "test/enum_hash_test.rb",
35
+ "test/finders_test.rb",
36
+ "test/models.rb",
37
+ "test/object_backed_test.rb",
38
+ "test/object_support_test.rb",
39
+ "test/prefixes_test.rb",
40
+ "test/se_array_support_test.rb",
41
+ "test/simple_enum_test.rb",
42
+ "test/test_helper.rb",
43
+ "test/without_shortcuts_test.rb"
44
+ ]
45
+ s.homepage = %q{http://github.com/lwe/simple_enum}
46
+ s.rdoc_options = ["--charset=UTF-8"]
47
+ s.require_paths = ["lib"]
48
+ s.rubygems_version = %q{1.3.5}
49
+ s.summary = %q{Simple enum-like field support for ActiveRecord (including validations and i18n)}
50
+ s.test_files = [
51
+ "test/array_conversions_test.rb",
52
+ "test/class_methods_test.rb",
53
+ "test/enum_hash_test.rb",
54
+ "test/finders_test.rb",
55
+ "test/models.rb",
56
+ "test/object_backed_test.rb",
57
+ "test/object_support_test.rb",
58
+ "test/prefixes_test.rb",
59
+ "test/se_array_support_test.rb",
60
+ "test/simple_enum_test.rb",
61
+ "test/test_helper.rb",
62
+ "test/without_shortcuts_test.rb"
63
+ ]
64
+
65
+ if s.respond_to? :specification_version then
66
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
67
+ s.specification_version = 3
68
+
69
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
70
+ else
71
+ end
72
+ else
73
+ end
74
+ end
@@ -0,0 +1,22 @@
1
+ require 'test_helper'
2
+
3
+ class ArrayConversionsTest < ActiveSupport::TestCase
4
+ def setup
5
+ reload_db :genders => true
6
+ end
7
+
8
+ test "that conversion of Gender.find(:all).map {...} to enumeration values as symbols works the same as [:male,:female]" do
9
+ with_enum = Class.new(ActiveRecord::Base) do
10
+ set_table_name 'dummies'
11
+ as_enum :gender, Gender.find(:all).map { |g| [g.name.to_sym, g.id] }
12
+ end
13
+
14
+ assert_equal 0, with_enum.male
15
+ assert_equal 1, with_enum.female
16
+ assert_equal 1, with_enum.genders(:female)
17
+
18
+ jane = with_enum.new :gender => :female
19
+ assert_equal :female, jane.gender
20
+ assert_equal 1, jane.gender_cd
21
+ end
22
+ end
@@ -0,0 +1,94 @@
1
+ require 'test_helper'
2
+
3
+ class ClassMethodsTest < ActiveSupport::TestCase
4
+ def setup
5
+ reload_db
6
+ end
7
+
8
+ test "that Klass.genders[:sym] == Klass.genders(:sym)" do
9
+ assert_equal 0, Dummy.genders(:male)
10
+ assert_equal Dummy.genders(:male), Dummy.genders[:male]
11
+ assert_nil Dummy.genders(:inexistent)
12
+ assert_nil Dummy.genders[:inexistent]
13
+ end
14
+
15
+ test "generation of value shortcuts on class" do
16
+ g = Dummy.new
17
+
18
+ assert_equal 0, Dummy.male
19
+ assert_equal 1, Dummy.female
20
+ assert_equal 'alpha', Dummy.alpha
21
+ assert_respond_to Dummy, :male
22
+ assert_respond_to Dummy, :female
23
+ assert_respond_to Dummy, :beta
24
+ assert_respond_to Dummy, :foobar
25
+ end
26
+
27
+ test "that no Klass.shortcut are created if :slim => true" do
28
+ with_slim = Class.new(ActiveRecord::Base) do
29
+ set_table_name 'dummies'
30
+ as_enum :gender, [:male, :female], :slim => true
31
+ end
32
+
33
+ assert !with_slim.respond_to?(:male)
34
+ assert !with_slim.respond_to?(:female)
35
+ assert_respond_to with_slim, :genders
36
+ end
37
+
38
+ test "that no Klass.shortcut's are created if :slim => :class, though instance shortcuts are" do
39
+ with_slim_class = Class.new(ActiveRecord::Base) do
40
+ set_table_name 'dummies'
41
+ as_enum :gender, [:male, :female], :slim => :class
42
+ end
43
+
44
+ jane = with_slim_class.new
45
+
46
+ assert_respond_to jane, :male!
47
+ assert_respond_to jane, :female!
48
+ assert !with_slim_class.respond_to?(:male)
49
+ assert !with_slim_class.respond_to?(:female)
50
+ assert_respond_to with_slim_class, :genders
51
+ assert_same 0, with_slim_class.genders.male
52
+ assert_same 1, with_slim_class.genders[:female]
53
+ end
54
+
55
+ test "that Klass.shortcut respect :prefix => true and are prefixed by \#{enum_cd}" do
56
+ with_prefix = Class.new(ActiveRecord::Base) do
57
+ set_table_name 'dummies'
58
+ as_enum :gender, [:male, :female], :prefix => true
59
+ end
60
+
61
+ assert !with_prefix.respond_to?(:male)
62
+ assert !with_prefix.respond_to?(:female)
63
+ assert_respond_to with_prefix, :gender_male
64
+ assert_respond_to with_prefix, :gender_female
65
+ assert_equal 0, with_prefix.gender_male
66
+ assert_respond_to with_prefix, :genders
67
+ end
68
+
69
+ test "to ensure that Klass.shortcut also work with custom prefixes" do
70
+ with_custom_prefix = Class.new(ActiveRecord::Base) do
71
+ set_table_name 'dummies'
72
+ as_enum :gender, [:male, :female], :prefix => :g
73
+ end
74
+
75
+ assert !with_custom_prefix.respond_to?(:male)
76
+ assert !with_custom_prefix.respond_to?(:female)
77
+ assert !with_custom_prefix.respond_to?(:gender_female)
78
+ assert_respond_to with_custom_prefix, :g_male
79
+ assert_respond_to with_custom_prefix, :g_female
80
+ assert_equal 1, with_custom_prefix.g_female
81
+ assert_respond_to with_custom_prefix, :genders
82
+ end
83
+
84
+ test "new :upcase option for those guys picky with coding guidelines etc." do
85
+ with_upcase = Class.new(ActiveRecord::Base) do
86
+ set_table_name 'dummies'
87
+ as_enum :gender, [:male, :female], :upcase => true
88
+ end
89
+
90
+ assert_respond_to with_upcase, :GENDERS
91
+ assert_same 0, with_upcase.GENDERS.male
92
+ assert_same 1, with_upcase.GENDERS[:female]
93
+ end
94
+ end
@@ -0,0 +1,33 @@
1
+ require 'test_helper'
2
+ require 'simple_enum/enum_hash'
3
+
4
+ class EnumHashTest < ActiveSupport::TestCase
5
+
6
+ test "create new EnumHash instance from array of symbols" do
7
+ genders = SimpleEnum::EnumHash.new [:male, :female]
8
+
9
+ assert_same 0, genders[:male]
10
+ assert_same 1, genders[:female]
11
+ assert_same 0, genders.male
12
+ assert_same :female, genders.female(true)
13
+ end
14
+
15
+ test "create new EnumHash instance from Hash" do
16
+ status = SimpleEnum::EnumHash.new :inactive => 0, :active => 1, :archived => 99
17
+
18
+ assert_same 0, status.inactive
19
+ assert_same 1, status[:active]
20
+ end
21
+
22
+ test "create new EnumHash instance from ActiveRecord results" do
23
+ reload_db :genders => true
24
+ genders = SimpleEnum::EnumHash.new Gender.find(:all)
25
+
26
+ male = Gender.find(0)
27
+
28
+ assert_same 0, genders[male]
29
+ assert_same genders[male], genders[:male]
30
+ assert_same 1, genders.female
31
+ assert_equal male, genders.send(:male, true)
32
+ end
33
+ end
@@ -0,0 +1,41 @@
1
+ require 'test_helper'
2
+
3
+ class FindersTest < ActiveSupport::TestCase
4
+ def setup
5
+ reload_db
6
+ end
7
+
8
+ test "find all where :gender = :female" do
9
+ girls = Dummy.find :all, :conditions => { :gender_cd => Dummy.genders[:female] }, :order => 'name ASC'
10
+
11
+ assert_equal 2, girls.length
12
+
13
+ assert_equal 'Anna', girls.first.name
14
+ assert_equal :female, girls.first.gender
15
+ assert_equal true, girls.first.female?
16
+ end
17
+
18
+ test "find all where :word is 'gamma'" do
19
+ gammas = Dummy.find :all, :conditions => { :word_cd => Dummy.words(:gamma) }
20
+
21
+ assert_equal 1, gammas.length
22
+ assert_equal 'Chris', gammas.first.name
23
+ assert_equal true, gammas.first.male?
24
+ assert_equal 'gamma', gammas.first.word_cd
25
+ assert_equal :gamma, gammas.first.word
26
+ end
27
+
28
+ test "find with string conditions for all :didum = :foo" do
29
+ foos = Dummy.find :all, :conditions => ['other = ?', Dummy.didums(:foo)]
30
+
31
+ assert_equal 1, foos.length
32
+ assert_equal false, foos.first.foobar?
33
+ end
34
+
35
+ test "find using insecure inline string conditions" do
36
+ men = Dummy.find :all, :conditions => "gender_cd = #{Dummy.genders(:male)}"
37
+
38
+ assert_equal 1, men.length
39
+ assert_equal true, men.first.male?
40
+ end
41
+ end
data/test/models.rb ADDED
@@ -0,0 +1,8 @@
1
+ class Dummy < ActiveRecord::Base
2
+ as_enum :gender, [:male, :female]
3
+ as_enum :word, { :alpha => 'alpha', :beta => 'beta', :gamma => 'gamma'}
4
+ as_enum :didum, [ :foo, :bar, :foobar ], :column => 'other'
5
+ end
6
+
7
+ class Gender < ActiveRecord::Base
8
+ end
@@ -0,0 +1,67 @@
1
+ require 'test_helper'
2
+
3
+ class ObjectBackedTest < ActiveSupport::TestCase
4
+ def setup
5
+ reload_db :genders => true
6
+ end
7
+
8
+ test "how working with object backed columns work..." do
9
+ # simple object -> not db backed instance
10
+ simple_obj = Class.new do
11
+ attr_accessor :name
12
+ def initialize(name)
13
+ @name = name
14
+ end
15
+ end
16
+
17
+ # create new class by using simple_obj
18
+ with_object = Class.new(ActiveRecord::Base) do
19
+ set_table_name 'dummies'
20
+ as_enum :gender, { simple_obj.new('Male') => 0, simple_obj.new('Female') => 1 }
21
+ end
22
+
23
+ d = with_object.find_by_name('Anna')
24
+
25
+ assert_same simple_obj, d.gender.class
26
+ assert_equal 'Female', d.gender.name
27
+ assert_same true, d.female?
28
+ assert_same false, d.male?
29
+ assert_same 0, with_object.male
30
+ end
31
+
32
+ test "db backed objects, using method described in 'Advanced Rails Recipes - Recipe 61: Look Up Constant Data Efficiently'" do
33
+ # "cache" as defined in ARR#61
34
+ genders = Gender.find(:all)
35
+ # works without mapping... .map { |g| [g, g.id] }
36
+
37
+ # use cached array of values
38
+ with_db_obj = Class.new(ActiveRecord::Base) do
39
+ set_table_name 'dummies'
40
+ as_enum :gender, genders
41
+ end
42
+
43
+ d = with_db_obj.find_by_name('Bella');
44
+
45
+ assert_respond_to with_db_obj, :female
46
+ assert_respond_to with_db_obj, :male
47
+ assert_equal 0, with_db_obj.male
48
+ end
49
+
50
+ test "that accessing keys and values of each enumeration value works as expected" do
51
+ genders = Gender.find(:all, :order => :id)
52
+
53
+ male = genders.first
54
+ female = genders.last
55
+
56
+ with_db_obj = Class.new(ActiveRecord::Base) do
57
+ set_table_name 'dummies'
58
+ as_enum :gender, genders
59
+ end
60
+
61
+ assert_same male.id, with_db_obj.male
62
+ assert_same male, with_db_obj.male(true)
63
+
64
+ assert_same :male, Dummy.male(true)
65
+ assert_same 0, Dummy.male
66
+ end
67
+ end
@@ -0,0 +1,27 @@
1
+ class ObjectSupportTest < ActiveSupport::TestCase
2
+
3
+ test "ensure that symbols stay symbols" do
4
+ assert_same :sym, :sym.to_enum_sym
5
+ end
6
+
7
+ test "ensure that strings are just converted to symbols, whatever they look like" do
8
+ assert_same :sym, 'sym'.to_enum_sym
9
+ assert_same :OtherSym, 'OtherSym'.to_enum_sym
10
+ end
11
+
12
+ test "convert custom class to symbol, by providing attr_accessor :name" do
13
+ has_name = Class.new do
14
+ attr_accessor :name
15
+ end
16
+
17
+ named = has_name.new
18
+ named.name = 'sym'
19
+
20
+ assert_same :sym, named.to_enum_sym
21
+
22
+ another_named = has_name.new
23
+ another_named.name = 'Contains Spaces?'
24
+
25
+ assert_same :contains_spaces, another_named.to_enum_sym
26
+ end
27
+ end
@@ -0,0 +1,38 @@
1
+ require 'test_helper'
2
+
3
+ class PrefixesTest < ActiveSupport::TestCase
4
+ def setup
5
+ reload_db
6
+ end
7
+
8
+ test "set :prefix => true and ensure that 'gender' is prefixed to <symbol>? and <symbol>! methods" do
9
+ with_prefix = Class.new(ActiveRecord::Base) do
10
+ set_table_name 'dummies'
11
+ as_enum :gender, [:male, :female], :prefix => true
12
+ end
13
+
14
+ d = with_prefix.new :gender => :male
15
+ assert_respond_to d, :gender_male?
16
+ assert_respond_to d, :gender_male!
17
+ assert_respond_to d, :gender_female?
18
+ assert_respond_to d, :gender_female!
19
+
20
+ # just ensure that it DOES NOT RESPOND TO good old male!
21
+ assert !d.respond_to?(:male!)
22
+ end
23
+
24
+ test "set :prefix => 'didum' and ensure that 'didum' is prefix to <symbol>? and <symbol>! methods" do
25
+ with_string_prefix = Class.new(ActiveRecord::Base) do
26
+ set_table_name 'dummies'
27
+ as_enum :gender, [:male, :female], :prefix => 'didum'
28
+ end
29
+
30
+ d = with_string_prefix.new :gender => :female
31
+ assert_respond_to d, :didum_female?
32
+ assert_respond_to d, :didum_female!
33
+
34
+ # just check wheter the results are still correct :)
35
+ assert d.didum_female?
36
+ assert !d.didum_male?
37
+ end
38
+ end
@@ -0,0 +1,32 @@
1
+ class SeArraySupportTest < ActiveSupport::TestCase
2
+ test "that when simple array is merge to hash, array values are the keys and indicies are values" do
3
+ a = [:a, :b, :c, :d]
4
+ h = a.to_hash_magic
5
+
6
+ assert_same 0, h[:a]
7
+ assert_same 1, h[:b]
8
+ assert_same 2, h[:c]
9
+ assert_same 3, h[:d]
10
+ end
11
+
12
+ test "that an already correct looking array is converted to a hash" do
13
+ a = [[:a, 5], [:b, 10]]
14
+ h = a.to_hash_magic
15
+
16
+ assert_same 5, h[:a]
17
+ assert_same 10, h[:b]
18
+ end
19
+
20
+ test "that an array of ActiveRecords are converted to <obj> => obj.id" do
21
+ reload_db :genders => true # reload db
22
+ a = Gender.find(:all, :order => :id)
23
+
24
+ male = Gender.find(0)
25
+ female = Gender.find(1)
26
+
27
+ h = a.to_hash_magic
28
+
29
+ assert_same 0, h[male]
30
+ assert_same 1, h[female]
31
+ end
32
+ end
@@ -0,0 +1,97 @@
1
+ require 'test_helper'
2
+
3
+ class SimpleEnumTest < ActiveSupport::TestCase
4
+ def setup
5
+ reload_db
6
+ end
7
+
8
+ test "get the correct integer values when setting to symbol" do
9
+ d = Dummy.new
10
+ d.gender = :male
11
+ assert_equal(0, d.gender_cd)
12
+ end
13
+
14
+ test "get the correct symbol when setting the integer value" do
15
+ d = Dummy.new
16
+ d.gender_cd = 1
17
+ assert_equal(:female, d.gender)
18
+ end
19
+
20
+ test "verify that <symbol>? returns correct result" do
21
+ d = Dummy.new
22
+ d.gender = :male
23
+ assert_equal(true, d.male?)
24
+ assert_equal(false, d.female?)
25
+ end
26
+
27
+ test "get symbol when rows are fetched from db" do
28
+ # Anna
29
+ assert_equal(:female, Dummy.find(1).gender)
30
+ assert_equal(:alpha, Dummy.find(1).word)
31
+ assert_equal(:foo, Dummy.find(1).didum)
32
+
33
+ # Bella
34
+ assert_equal(true, Dummy.find(2).female?)
35
+ assert_equal(true, Dummy.find(2).beta?)
36
+ assert_equal(:bar, Dummy.find(2).didum)
37
+
38
+ # Chris
39
+ assert_equal(false, Dummy.find(3).female?)
40
+ assert_equal(:gamma, Dummy.find(3).word)
41
+ assert_equal(:foobar, Dummy.find(3).didum)
42
+ end
43
+
44
+ test "create and save new record then test symbols" do
45
+ d = Dummy.create({ :name => 'Dummy', :gender_cd => 0 }) # :gender => male
46
+ assert_equal(true, d.male?)
47
+
48
+ # change :gender_cd to 1
49
+ d.female!
50
+ d.save!
51
+ assert_equal(true, Dummy.find(d.id).female?)
52
+ end
53
+
54
+ test "add validation and test validations" do
55
+ Dummy.class_eval do; validates_as_enum :gender; end
56
+ #with_validation = Class.new(Dummy) do
57
+ # validates_as_enum :gender
58
+ #end
59
+
60
+ d = Dummy.new :gender_cd => 5 # invalid number :)
61
+ assert_equal(false, d.save)
62
+ d.gender_cd = 1
63
+ assert_equal(true, d.save)
64
+ assert_equal(:female, d.gender)
65
+ end
66
+
67
+ test "raises ArgumentError if invalid symbol is passed" do
68
+ assert_raise ArgumentError do
69
+ Dummy.new :gender => :foo
70
+ end
71
+ end
72
+
73
+ test "raises NO ArgumentError if :whiny => false is defined" do
74
+ not_whiny = Class.new(Dummy) do
75
+ as_enum :gender, [:male, :female], :whiny => false
76
+ end
77
+
78
+ d = not_whiny.new :gender => :foo
79
+ assert_nil(d.gender)
80
+ end
81
+
82
+ test "ensure that setting to 'nil' works if :whiny => true and :whiny => false" do
83
+ d = Dummy.new :gender => :male
84
+ assert_equal(:male, d.gender)
85
+ d.gender = nil
86
+ assert_nil(d.gender)
87
+
88
+ not_whiny_again = Class.new(Dummy) do
89
+ as_enum :gender, [:male, :female], :whiny => false
90
+ end
91
+
92
+ d = not_whiny_again.new :gender => :male
93
+ assert_equal(:male, d.gender)
94
+ d.gender = nil
95
+ assert_nil(d.gender)
96
+ end
97
+ end
@@ -0,0 +1,66 @@
1
+ # Setup environment for both tests and IRB interactive console
2
+ #
3
+
4
+ $KCODE = 'u' # to make parameterize work...
5
+
6
+ require 'rubygems'
7
+
8
+ gem 'sqlite3-ruby'
9
+
10
+ require 'active_support'
11
+ require 'active_record'
12
+
13
+ # setup fake rails env
14
+ ROOT = File.join(File.dirname(__FILE__), '..')
15
+ RAILS_ROOT = ROOT
16
+ RAILS_ENV = 'test'
17
+
18
+ # create database connection (in memory db!)
19
+ ActiveRecord::Base.establish_connection({ :adapter => 'sqlite3', :database => ':memory:'})
20
+
21
+ # load simple_enum
22
+ require File.join(ROOT, 'init')
23
+
24
+ # load dummy class
25
+ require File.join(ROOT, 'test', 'models')
26
+
27
+ # Reload database
28
+ def reload_db(options = {})
29
+ options = { :fill => true, :genders => false }.merge(options)
30
+ ActiveRecord::Base.connection.create_table :dummies, :force => true do |t|
31
+ t.column :name, :string
32
+ t.column :gender_cd, :integer
33
+ t.column :word_cd, :string, :limit => 5
34
+ t.column :other, :integer
35
+ end
36
+
37
+ # Create ref-data table and fill with records
38
+ ActiveRecord::Base.connection.create_table :genders, :force => true do |t|
39
+ t.column :name, :string
40
+ end
41
+
42
+ if options[:fill]
43
+ # fill db with some rows
44
+ Dummy.create({ :name => 'Anna', :gender_cd => 1, :word_cd => 'alpha', :other => 0})
45
+ Dummy.create({ :name => 'Bella', :gender_cd => 1, :word_cd => 'beta', :other => 1})
46
+ Dummy.create({ :name => 'Chris', :gender_cd => 0, :word_cd => 'gamma', :other => 2})
47
+ end
48
+
49
+ if options[:genders]
50
+ male = Gender.new({ :name => 'male' })
51
+ male.id = 0;
52
+ male.save!
53
+
54
+ female = Gender.new({ :name => 'female' })
55
+ female.id = 1;
56
+ female.save!
57
+ end
58
+ end
59
+
60
+ # do some magic to initialze DB for IRB session
61
+ if Object.const_defined?('IRB')
62
+ reload_db :fill => true, :genders => true
63
+ else # and load test classes when in test cases...
64
+ require 'test/unit'
65
+ require 'active_support/test_case'
66
+ end
@@ -0,0 +1,40 @@
1
+ require 'test_helper'
2
+
3
+ class SlimDummy < ActiveRecord::Base
4
+ set_table_name 'dummies'
5
+ as_enum :gender, [:male, :female], :slim => true
6
+ end
7
+
8
+ class WithoutShortcutsTest < ActiveSupport::TestCase
9
+ def setup
10
+ reload_db
11
+ end
12
+
13
+ test "that no shortcut methods are generated if :slim => true" do
14
+ jane = SlimDummy.new
15
+ jane.gender = :female
16
+
17
+ # ensure that other methods still work as expected
18
+ assert_equal 1, jane.gender_cd
19
+ assert_equal :female, jane.gender
20
+
21
+ # then check for availability of shortcut methods
22
+ assert !jane.respond_to?(:male!), "should not respond_to <male!>"
23
+ assert !jane.respond_to?(:female?), "should not respond_to <female?>"
24
+ end
25
+
26
+ test "that saving and loading from a DB still works, even if :slim => true" do
27
+ anna = SlimDummy.find_by_name 'Anna'
28
+
29
+ assert_equal 1, anna.gender_cd
30
+ assert_equal :female, anna.gender
31
+
32
+ # change anna, save + reload
33
+ anna.gender = :male
34
+ anna.save!
35
+ anna.reload
36
+
37
+ assert_equal 0, anna.gender_cd
38
+ assert_equal :male, anna.gender
39
+ end
40
+ end