jeffp-enumerated_attribute 0.1.7 → 0.2.0.2

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.
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