jeffp-enumerated_attribute 0.1.7 → 0.2.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. data/.gitignore +8 -1
  2. data/README.rdoc +146 -32
  3. data/Rakefile +29 -14
  4. data/lib/enumerated_attribute.rb +0 -1
  5. data/lib/enumerated_attribute/attribute.rb +28 -26
  6. data/lib/enumerated_attribute/attribute/attribute_descriptor.rb +50 -0
  7. data/lib/enumerated_attribute/integrations/active_record.rb +6 -3
  8. data/lib/enumerated_attribute/integrations/object.rb +2 -1
  9. data/lib/enumerated_attribute/method_definition_dsl.rb +21 -11
  10. data/lib/enumerated_attribute/rails_helpers.rb +73 -0
  11. data/spec/active_record/active_record_spec.rb +49 -2
  12. data/spec/active_record/association_test_classes.rb +40 -0
  13. data/spec/active_record/associations_spec.rb +130 -0
  14. data/spec/active_record/test_in_memory.rb +40 -0
  15. data/spec/poro_spec.rb +32 -4
  16. data/spec/rails/README +243 -0
  17. data/spec/rails/Rakefile +10 -0
  18. data/spec/rails/app/controllers/application_controller.rb +10 -0
  19. data/spec/rails/app/controllers/form_test_controller.rb +38 -0
  20. data/spec/rails/app/helpers/application_helper.rb +3 -0
  21. data/spec/rails/app/helpers/form_test_helper.rb +2 -0
  22. data/spec/rails/app/models/user.rb +9 -0
  23. data/spec/rails/app/views/form_test/form.html.erb +1 -0
  24. data/spec/rails/app/views/form_test/form_for.html.erb +10 -0
  25. data/spec/rails/app/views/form_test/form_tag.html.erb +9 -0
  26. data/spec/rails/app/views/form_test/index.html.erb +6 -0
  27. data/spec/rails/app/views/layouts/application.html.erb +11 -0
  28. data/spec/rails/config/boot.rb +110 -0
  29. data/spec/rails/config/database.yml +22 -0
  30. data/spec/rails/config/environment.rb +45 -0
  31. data/spec/rails/config/environments/development.rb +17 -0
  32. data/spec/rails/config/environments/production.rb +28 -0
  33. data/spec/rails/config/environments/test.rb +28 -0
  34. data/spec/rails/config/initializers/backtrace_silencers.rb +7 -0
  35. data/spec/rails/config/initializers/inflections.rb +10 -0
  36. data/spec/rails/config/initializers/mime_types.rb +5 -0
  37. data/spec/rails/config/initializers/new_rails_defaults.rb +19 -0
  38. data/spec/rails/config/initializers/session_store.rb +15 -0
  39. data/spec/rails/config/locales/en.yml +5 -0
  40. data/spec/rails/config/routes.rb +43 -0
  41. data/spec/rails/db/development.sqlite3 +0 -0
  42. data/spec/rails/db/migrate/20090804230221_create_sessions.rb +16 -0
  43. data/spec/rails/db/migrate/20090804230546_create_users.rb +21 -0
  44. data/spec/rails/db/schema.rb +35 -0
  45. data/spec/rails/db/test.sqlite3 +0 -0
  46. data/spec/rails/public/404.html +30 -0
  47. data/spec/rails/public/422.html +30 -0
  48. data/spec/rails/public/500.html +30 -0
  49. data/spec/rails/public/favicon.ico +0 -0
  50. data/spec/rails/public/images/rails.png +0 -0
  51. data/spec/rails/public/index.html +275 -0
  52. data/spec/rails/public/javascripts/application.js +2 -0
  53. data/spec/rails/public/javascripts/controls.js +963 -0
  54. data/spec/rails/public/javascripts/dragdrop.js +973 -0
  55. data/spec/rails/public/javascripts/effects.js +1128 -0
  56. data/spec/rails/public/javascripts/prototype.js +4320 -0
  57. data/spec/rails/public/robots.txt +5 -0
  58. data/spec/rails/public/stylesheets/scaffold.css +54 -0
  59. data/spec/rails/script/about +4 -0
  60. data/spec/rails/script/autospec +6 -0
  61. data/spec/rails/script/console +3 -0
  62. data/spec/rails/script/dbconsole +3 -0
  63. data/spec/rails/script/destroy +3 -0
  64. data/spec/rails/script/generate +3 -0
  65. data/spec/rails/script/performance/benchmarker +3 -0
  66. data/spec/rails/script/performance/profiler +3 -0
  67. data/spec/rails/script/plugin +3 -0
  68. data/spec/rails/script/runner +3 -0
  69. data/spec/rails/script/server +3 -0
  70. data/spec/rails/script/spec +10 -0
  71. data/spec/rails/script/spec_server +9 -0
  72. data/spec/rails/spec/controllers/form_test_controller_spec.rb +41 -0
  73. data/spec/rails/spec/integrations/enum_select_spec.rb +73 -0
  74. data/spec/rails/spec/matchers.rb +12 -0
  75. data/spec/rails/spec/rcov.opts +2 -0
  76. data/spec/rails/spec/spec.opts +4 -0
  77. data/spec/rails/spec/spec_helper.rb +38 -0
  78. data/spec/rails/spec/views/form_test/form.html.erb_spec.rb +12 -0
  79. data/spec/rails/spec/views/form_test/form_for.html.erb_spec.rb +12 -0
  80. data/spec/rails/spec/views/form_test/form_tag.html.erb_spec.rb +12 -0
  81. data/spec/rcov.opts +2 -0
  82. data/spec/spec.opts +4 -0
  83. data/spec/tractor.rb +4 -1
  84. metadata +103 -5
@@ -0,0 +1,50 @@
1
+
2
+ module EnumeratedAttribute
3
+ module Attribute
4
+ class AttributeDescriptor < Array
5
+ attr_reader :name
6
+
7
+ def initialize(name, enums=[], opts={})
8
+ super enums
9
+ @name = name
10
+ @options = opts
11
+ @labels_hash = Hash[*self.collect{|e| [e, e.to_s.gsub(/_/, ' ').squeeze(' ').capitalize]}.flatten]
12
+ end
13
+
14
+ def allows_nil?
15
+ @options.key?(:nil) ? @options[:nil] : true
16
+ end
17
+ def allows_value?(value)
18
+ self.include?(value.to_sym)
19
+ end
20
+
21
+ def enums
22
+ self
23
+ end
24
+ def label(value)
25
+ @labels_hash[value]
26
+ end
27
+ def labels
28
+ @labels_array ||= self.map{|e| @labels_hash[e]}
29
+ end
30
+ def hash
31
+ @labels_hash
32
+ end
33
+ def select_options
34
+ @select_options ||= self.map{|e| [@labels_hash[e], e.to_s]}
35
+ end
36
+
37
+ def set_label(enum_value, label_string)
38
+ reset_labels
39
+ @labels_hash[enum_value.to_sym] = label_string
40
+ end
41
+
42
+ private
43
+ def reset_labels
44
+ @labels_array = nil
45
+ @select_options = nil
46
+ end
47
+
48
+ end
49
+ end
50
+ end
@@ -9,6 +9,7 @@ module EnumeratedAttribute
9
9
  def write_enumerated_attribute(name, val)
10
10
  name = name.to_s
11
11
  return write_attribute(name, val) unless self.class.has_enumerated_attribute?(name)
12
+ val = nil if val == ''
12
13
  val_str = val.to_s if val
13
14
  val_sym = val.to_sym if val
14
15
  unless self.class.enumerated_attribute_allows_value?(name, val_sym)
@@ -17,6 +18,7 @@ module EnumeratedAttribute
17
18
  end
18
19
  return instance_variable_set('@'+name, val_sym) unless self.has_attribute?(name)
19
20
  write_attribute(name, val_str)
21
+ val_sym
20
22
  end
21
23
 
22
24
  def read_enumerated_attribute(name)
@@ -24,10 +26,11 @@ module EnumeratedAttribute
24
26
  #if not enumerated - let active record handle it
25
27
  return read_attribute(name) unless self.class.has_enumerated_attribute?(name)
26
28
  #if enumerated, is it an active record attribute, if not, the value is stored in an instance variable
29
+ name_sym = name.to_sym
27
30
  return instance_variable_get('@'+name) unless self.has_attribute?(name)
28
31
  #this is an enumerated active record attribute
29
32
  val = read_attribute(name)
30
- val = val.to_sym if (!!val && self.class.has_enumerated_attribute?(name))
33
+ val = val.to_sym if !!val
31
34
  val
32
35
  end
33
36
 
@@ -48,7 +51,7 @@ module EnumeratedAttribute
48
51
 
49
52
  def attributes
50
53
  super.map do |k,v|
51
- self.class.has_enumerated_attribute?(k) ? v.to_sym : v
54
+ self.class.has_enumerated_attribute?(k) ? @@enumerated_attributes[k].cast_enum_symbol(v) : v
52
55
  end
53
56
  end
54
57
 
@@ -66,7 +69,7 @@ module EnumeratedAttribute
66
69
  attributes = super
67
70
  attributes.each { |k,v| attributes[k] = v.to_s if has_enumerated_attribute?(k) }
68
71
  attributes
69
- end
72
+ end
70
73
 
71
74
  def instantiate(record)
72
75
  object = super(record)
@@ -8,6 +8,7 @@ module EnumeratedAttribute
8
8
 
9
9
  def write_enumerated_attribute(name, val)
10
10
  name = name.to_s
11
+ val = nil if val == ''
11
12
  val = val.to_sym if val
12
13
  unless self.class.enumerated_attribute_allows_value?(name, val)
13
14
  raise(InvalidEnumeration, "nil is not allowed on '#{name}' attribute, set :nil=>true option", caller) unless val
@@ -17,7 +18,7 @@ module EnumeratedAttribute
17
18
  end
18
19
 
19
20
  def read_enumerated_attribute(name)
20
- return instance_variable_get('@'+name.to_s)
21
+ instance_variable_get('@'+name.to_s)
21
22
  end
22
23
 
23
24
  module ClassMethods
@@ -15,10 +15,10 @@ module EnumeratedAttribute
15
15
  class MethodDefinitionDSL
16
16
  attr_reader :initial_value, :pluralized_name, :decrementor_name, :incrementor_name
17
17
 
18
- def initialize(class_obj, attr_name, values=[])
18
+ def initialize(class_obj, descriptor)
19
19
  @class_obj = class_obj
20
- @attr_name = attr_name
21
- @attr_values = values
20
+ @attr_name = descriptor.name
21
+ @attr_descriptor = descriptor #this is the enums array
22
22
  end
23
23
 
24
24
  #we'll by pass this - they can use it if it helps make code more readable - not enforced - should it be??
@@ -60,7 +60,7 @@ module EnumeratedAttribute
60
60
  end
61
61
 
62
62
  def init(value)
63
- if (!@attr_values.empty? && !@attr_values.include?(value.to_sym))
63
+ if (!@attr_descriptor.empty? && !@attr_descriptor.include?(value.to_sym))
64
64
  raise(InvalidDefinition, "'#{value}' in method 'init' is not an enumeration value for :#{@attr_name} attribute", caller)
65
65
  end
66
66
  @initial_value = value
@@ -69,10 +69,20 @@ module EnumeratedAttribute
69
69
  def decrementor(value); @decrementor_name = value; end
70
70
  def incrementor(value); @incrementor_name = value; end
71
71
  def enums_accessor(value); @pluralized_name = value; end
72
- alias :inc :incrementor
73
- alias :dec :decrementor
74
- alias :enums :enums_accessor
75
- alias :plural :enums_accessor
72
+ alias_method :inc, :incrementor
73
+ alias_method :dec, :decrementor
74
+ alias_method :enums, :enums_accessor
75
+ alias_method :plural, :enums_accessor
76
+
77
+ def label(hash)
78
+ raise(InvalidDefinition, "label or labels keyword should be followed by a hash of :enum_value=>'label'", caller) unless hash.is_a?(Hash)
79
+ hash.each do |k,v|
80
+ raise(InvalidDefinition, "#{k} is not an enumeration value for :#{@attr_name} attribute", caller) unless (k.is_a?(Symbol) && @attr_descriptor.include?(k))
81
+ raise(InvalidDefinition, "#{v} is not a string. Labels should be strings", caller) unless v.is_a?(String)
82
+ @attr_descriptor.set_label(k, v)
83
+ end
84
+ end
85
+ alias_method :labels, :label
76
86
 
77
87
  private
78
88
 
@@ -111,16 +121,16 @@ module EnumeratedAttribute
111
121
  end
112
122
 
113
123
  def create_custom_method_for_symbol_or_string(mdef)
114
- if (!@attr_values.empty? && !@attr_values.include?(mdef.argument.to_sym))
124
+ if (!@attr_descriptor.empty? && !@attr_descriptor.include?(mdef.argument.to_sym))
115
125
  raise(InvalidDefinition, "'#{mdef.argument}' in method '#{mdef.method_name}' is not an enumeration value for :#{@attr_name} attribute", caller)
116
126
  end
117
127
  @class_obj.class_eval("def #{mdef.method_name}; @#{@attr_name} #{mdef.negated ? '!=' : '=='} :#{mdef.argument}; end")
118
128
  end
119
129
 
120
130
  def create_custom_method_for_array_of_enums(mdef)
121
- if !@attr_values.empty?
131
+ if !@attr_descriptor.empty?
122
132
  mdef.argument.each do |m|
123
- if !@attr_values.include?(m.to_sym)
133
+ if !@attr_descriptor.include?(m.to_sym)
124
134
  raise(InvalidDefinition, "'#{m}' in method '#{mdef.method_name}' is not an enumeration value for :#{@attr_name} attribute", caller)
125
135
  end
126
136
  end
@@ -0,0 +1,73 @@
1
+
2
+ if defined?(ActiveRecord)
3
+ module ActiveRecord
4
+ module ConnectionAdapters
5
+ class TableDefinition
6
+ def column_with_enumerated_attribute(name, type, options = {})
7
+ type = 'string' if type.to_s == 'enum'
8
+ column_without_enumerated_attribute(name, type, options)
9
+ end
10
+ alias_method_chain :column, :enumerated_attribute
11
+
12
+ def enum(*args)
13
+ options = args.extract_options!
14
+ column_names = args
15
+ column_names.each { |name| column(name, 'string', options) }
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ if defined?(ActionView::Base)
23
+ module ActionView
24
+ module Helpers
25
+
26
+ #form_options_helper.rb
27
+ module FormOptionsHelper
28
+ #def select
29
+ def enum_select(object, method, options={}, html_options={})
30
+ InstanceTag.new(object, method, self, options.delete(:object)).to_enum_select_tag(options, html_options)
31
+ end
32
+ end
33
+
34
+ class InstanceTag
35
+ def to_enum_select_tag(options, html_options={})
36
+ choices = []
37
+ if self.object.respond_to?(:enums)
38
+ enums = self.object.enums(method_name.to_sym)
39
+ choices = enums ? enums.select_options : []
40
+ if (value = self.object.__send__(method_name.to_sym))
41
+ options[:selected] ||= value.to_s
42
+ else
43
+ options[:include_blank] ||= true
44
+ end
45
+ end
46
+ to_select_tag(choices, options, html_options)
47
+ end
48
+
49
+ #initialize record_name, method, self
50
+ def to_tag_with_enumerated_attribute(options={})
51
+ #look for an enum
52
+ if (column_type == :string &&
53
+ self.object.class.respond_to?(:has_enumerated_attribute?) &&
54
+ self.object.class.has_enumerated_attribute?(method_name.to_sym))
55
+ to_enum_select_tag(options)
56
+ else
57
+ to_tag_without_enumerated_attribute(options)
58
+ end
59
+ end
60
+ alias_method_chain :to_tag, :enumerated_attribute
61
+ end
62
+
63
+ class FormBuilder
64
+ def enum_select(method, options={}, html_options={})
65
+ @template.enum_select(@object_name, method, objectify_options(options), @default_options.merge(html_options))
66
+ end
67
+ end
68
+
69
+ end
70
+ end
71
+ end
72
+
73
+
@@ -1,9 +1,48 @@
1
1
  require 'test_in_memory'
2
- require 'enumerated_attribute'
3
2
  require 'active_record'
3
+ require 'enumerated_attribute'
4
4
  require 'race_car'
5
5
 
6
6
  describe "RaceCar" do
7
+
8
+ it "should have default labels for :gear attribute" do
9
+ labels_hash = {:reverse=>'Reverse', :neutral=>'Neutral', :first=>'First', :second=>'Second', :over_drive=>'Over drive'}
10
+ labels = ['Reverse', 'Neutral', 'First', 'Second', 'Over drive']
11
+ select_options = [['Reverse', 'reverse'], ['Neutral', 'neutral'], ['First', 'first'], ['Second', 'second'], ['Over drive', 'over_drive']]
12
+ r=RaceCar.new
13
+ r.gears.labels.should == labels
14
+ labels_hash.each do |k,v|
15
+ r.gears.label(k).should == v
16
+ end
17
+ r.gears.hash.should == labels_hash
18
+ r.gears.select_options.should == select_options
19
+ end
20
+
21
+ it "should retrieve :gear enums through enums method" do
22
+ r=RaceCar.new
23
+ r.enums(:gear).should == r.gears
24
+ end
25
+
26
+ it "should return a Symbol type from reader methods" do
27
+ r=RaceCar.new
28
+ r.gear.should be_an_instance_of(Symbol)
29
+ end
30
+
31
+ it "should increment and decrement :gear attribute correctly" do
32
+ r=RaceCar.new
33
+ r.gear = :neutral
34
+ r.gear_next.should == :first
35
+ r.gear_next.should == :second
36
+ r.gear_next.should == :over_drive
37
+ r.gear_next.should == :reverse
38
+ r.gear_next.should == :neutral
39
+ r.gear.should == :neutral
40
+ r.gear_previous.should == :reverse
41
+ r.gear_previous.should == :over_drive
42
+ r.gear_previous.should == :second
43
+ r.gear_previous
44
+ r.gear.should == :first
45
+ end
7
46
 
8
47
  it "should have dynamic predicate methods for :gear attribute" do
9
48
  r=RaceCar.new
@@ -55,13 +94,21 @@ describe "RaceCar" do
55
94
  r.choke.should == :medium
56
95
  end
57
96
 
58
- it "should initialize using parameter hash" do
97
+ it "should initialize using parameter hash with symbol keys" do
59
98
  r=RaceCar.new(:name=>'FastFurious', :gear=>:second, :lights=>'on', :choke=>:medium)
60
99
  r.gear.should == :second
61
100
  r.lights.should == 'on'
62
101
  r.choke.should == :medium
63
102
  end
64
103
 
104
+ it "should initialize using parameter hash with string keys" do
105
+ r=RaceCar.new({'name'=>'FastFurious', 'gear'=>'second', 'lights'=>'on', 'choke'=>'medium'})
106
+ r.gear.should == :second
107
+ r.lights.should == 'on'
108
+ r.choke.should == :medium
109
+ end
110
+
111
+
65
112
  it "should convert non-column enumerated attributes from string to symbols" do
66
113
  r=RaceCar.new
67
114
  r.choke = 'medium'
@@ -0,0 +1,40 @@
1
+
2
+ class Company < ActiveRecord::Base
3
+ has_one :license
4
+ has_many :employees
5
+ has_many :contract_workers
6
+ has_many :contractors, :through=>:contract_workers
7
+ enum_attr :status, %w(s_corp c_corp llc), :nil=>true
8
+ end
9
+ class Employee < ActiveRecord::Base
10
+ belongs_to :company
11
+ enum_attr :status, %w(full_time part_time suspended), :nil=>true
12
+ end
13
+ class License < ActiveRecord::Base
14
+ belongs_to :company
15
+ enum_attr :status, %w(^current expired)
16
+ end
17
+ class Contractor < ActiveRecord::Base
18
+ has_many :contract_workers
19
+ has_many :companies, :through=>:contract_workers
20
+ enum_attr :status, %w(^available unavailable)
21
+ end
22
+ class ContractWorker < ActiveRecord::Base
23
+ belongs_to :company
24
+ belongs_to :contractor
25
+ enum_attr :status, %w(unfresh ^unfresh) #i don't know what to put here
26
+ end
27
+
28
+ #polymorphic
29
+ class Comment < ActiveRecord::Base
30
+ belongs_to :document, :polymorphic=>true
31
+ enum_attr :status, %w(^unflagged flagged)
32
+ end
33
+ class Article < ActiveRecord::Base
34
+ has_one :comment, :as=>:document
35
+ enum_attr :status, %w(^unreviewed accepted)
36
+ end
37
+ class Image < ActiveRecord::Base
38
+ has_one :comment, :as=>:document
39
+ enum_attr :status, %w(^unreviewed accepted)
40
+ end
@@ -0,0 +1,130 @@
1
+ require 'test_in_memory'
2
+ require 'enumerated_attribute'
3
+ require 'active_record'
4
+ require 'association_test_classes'
5
+
6
+ module TestVariables
7
+ def company_name; 'Company A'; end
8
+ end
9
+
10
+ describe "Polymorphic associations" do
11
+ include TestVariables
12
+
13
+ it "should retrieve enum'ed attribute for articles and images of a comment" do
14
+ c1 = Comment.new(:comment=>'i like it')
15
+ c1.document = Article.create!(:name=>'Birds of a Feather', :status=>:accepted)
16
+ c1.save!
17
+ c1.status.should == :unflagged
18
+
19
+ c2 = Comment.new(:comment=>'i hate it', :status => :flagged)
20
+ c2.document = Image.create!(:name=>'Martian Landscape', :status=>:unreviewed)
21
+ c2.save!
22
+ c2.status.should == :flagged
23
+
24
+ Comment.find(c1.id).document.status.should == :accepted
25
+ Comment.find(c2.id).document.status.should == :unreviewed
26
+
27
+ end
28
+
29
+ it "should retrieve enum'ed attribute for comments on articles and images" do
30
+ a = Article.create!(:name=>'Swimming with Whales', :status=>:accepted)
31
+ a.create_comment(:comment=>'i like it', :status=>:unflagged)
32
+ a.save!
33
+
34
+ i = Image.create!(:name=>'Mountain Climbing', :status=>:unreviewed)
35
+ i.comment = Comment.create!(:comment=>'i do not like it', :status=>:flagged)
36
+ i.save!
37
+
38
+ Image.find(i.id).comment.status.should == :flagged
39
+ Article.find(a.id).comment.status.should == :unflagged
40
+
41
+ end
42
+
43
+ end
44
+
45
+ describe "Basic Associations" do
46
+ include TestVariables
47
+
48
+ it "should retrieve enum'ed status for its license" do
49
+ c = Company.new(:status=>:llc, :name=>company_name)
50
+ c.save!
51
+ c.create_license(:status=>:current)
52
+
53
+ r = Company.find(c.id)
54
+ lic = r.license
55
+ r.status.should == :llc
56
+ lic.status.should == :current
57
+ end
58
+
59
+ it "should retrieve enum'ed status for multiple employees" do
60
+ c=Company.new(:status=>:llc, :name=>company_name)
61
+ c.save!
62
+ c.employees.create!(:status=>:full_time, :name=>'edward')
63
+ c.employees.create!(:status=>:suspended, :name=>'tina')
64
+
65
+ r=Company.find(c.id)
66
+ r.employees.find_by_name('edward').status.should == :full_time
67
+ r.employees.find_by_name('tina').status.should == :suspended
68
+ Employee.delete_all
69
+ end
70
+
71
+ it "should retrieve enum'ed status for multiple contractors" do
72
+ c=Company.new(:status=>:llc, :name=>company_name)
73
+ c.save!
74
+ c1 = Contractor.new(:status=>:available, :name=>'john')
75
+ c2 = Contractor.new(:status=>:unavailable, :name=>'sally')
76
+ c.contractors << c1
77
+ c.contractors << c2
78
+
79
+ r=Company.find(c.id)
80
+ r.contractors.find_by_name('sally').status.should == :unavailable
81
+ r.contractors.find_by_name('john').status.should == :available
82
+ Contractor.delete_all
83
+ ContractWorker.delete_all
84
+ end
85
+ end
86
+
87
+ describe "License" do
88
+ include TestVariables
89
+ it "should retrieve the status for the company" do
90
+ Company.delete_all
91
+ License.delete_all
92
+ lic = License.create!(:status=>:expired)
93
+ lic.company = Company.create!(:name=>company_name, :status=>:llc)
94
+ lic.save!
95
+
96
+ License.find(lic.id).company.status.should == :llc
97
+ end
98
+ end
99
+
100
+ describe "Contractor" do
101
+ include TestVariables
102
+ it "should retrieve enum'ed status from multiple companies" do
103
+ Company.delete_all
104
+ Contractor.delete_all
105
+ ContractWorker.delete_all
106
+ c = Contractor.create!(:name=>'jack', :status=>:available)
107
+
108
+ c1 = Company.create!(:name=>company_name, :status=>:s_corp)
109
+ c2 = Company.create!(:name=>'other company', :status=>:llc)
110
+ c.companies << c1 << c2
111
+
112
+ j = Contractor.find(c.id)
113
+ j.companies.find_by_name('other company').status.should == :llc
114
+ j.companies.find_by_name(company_name).status.should == :s_corp
115
+ end
116
+ end
117
+
118
+ describe "Employee" do
119
+ include TestVariables
120
+ it "should retrieve enum'ed status from the company" do
121
+ Company.delete_all
122
+ Employee.delete_all
123
+ e = Employee.create!(:name=>'juanita', :status=>:part_time)
124
+ e.company = Company.create!(:name=>company_name, :status=>:c_corp)
125
+ e.save!
126
+
127
+ emp = Employee.find(e.id)
128
+ emp.company.status.should == :c_corp
129
+ end
130
+ end