active_attr 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of active_attr might be problematic. Click here for more details.

Files changed (45) hide show
  1. data/.travis.yml +11 -1
  2. data/CHANGELOG.md +9 -0
  3. data/Gemfile +4 -6
  4. data/README.md +29 -11
  5. data/active_attr.gemspec +3 -3
  6. data/gemfiles/rails_3_2.gemfile +11 -0
  7. data/gemfiles/rails_head.gemfile +3 -0
  8. data/lib/active_attr.rb +0 -1
  9. data/lib/active_attr/mass_assignment.rb +30 -2
  10. data/lib/active_attr/matchers/have_attribute_matcher.rb +17 -4
  11. data/lib/active_attr/model.rb +2 -2
  12. data/lib/active_attr/typecasting/big_decimal_typecaster.rb +2 -0
  13. data/lib/active_attr/typecasting/date_typecaster.rb +1 -1
  14. data/lib/active_attr/version.rb +1 -1
  15. data/spec/functional/active_attr/attribute_defaults_spec.rb +12 -12
  16. data/spec/functional/active_attr/attributes_spec.rb +12 -12
  17. data/spec/functional/active_attr/chainable_initialization_spec.rb +3 -3
  18. data/spec/functional/active_attr/mass_assignment_spec.rb +125 -0
  19. data/spec/functional/active_attr/matchers/have_attribute_matcher_spec.rb +147 -66
  20. data/spec/functional/active_attr/model_spec.rb +27 -19
  21. data/spec/functional/active_attr/serialization_spec.rb +5 -5
  22. data/spec/functional/active_attr/typecasted_attributes_spec.rb +45 -45
  23. data/spec/support/mass_assignment_shared_examples.rb +12 -12
  24. data/spec/unit/active_attr/attribute_defaults_spec.rb +6 -6
  25. data/spec/unit/active_attr/attribute_definition_spec.rb +6 -6
  26. data/spec/unit/active_attr/attributes_spec.rb +38 -38
  27. data/spec/unit/active_attr/logger_spec.rb +16 -16
  28. data/spec/unit/active_attr/mass_assignment_spec.rb +1 -1
  29. data/spec/unit/active_attr/matchers_spec.rb +3 -4
  30. data/spec/unit/active_attr/query_attributes_spec.rb +75 -75
  31. data/spec/unit/active_attr/typecasted_attributes_spec.rb +10 -10
  32. data/spec/unit/active_attr/typecasting/big_decimal_typecaster_spec.rb +9 -7
  33. data/spec/unit/active_attr/typecasting/boolean_typecaster_spec.rb +27 -25
  34. data/spec/unit/active_attr/typecasting/date_time_typecaster_spec.rb +12 -10
  35. data/spec/unit/active_attr/typecasting/date_typecaster_spec.rb +14 -12
  36. data/spec/unit/active_attr/typecasting/float_typecaster_spec.rb +6 -4
  37. data/spec/unit/active_attr/typecasting/integer_typecaster_spec.rb +8 -6
  38. data/spec/unit/active_attr/typecasting/object_typecaster_spec.rb +3 -1
  39. data/spec/unit/active_attr/typecasting/string_typecaster_spec.rb +5 -3
  40. data/spec/unit/active_attr/typecasting_spec.rb +3 -5
  41. data/spec/unit/active_attr/version_spec.rb +5 -5
  42. metadata +20 -17
  43. data/lib/active_attr/mass_assignment_security.rb +0 -54
  44. data/spec/functional/active_attr/mass_assignment_security_spec.rb +0 -45
  45. data/spec/unit/active_attr/mass_assignment_security_spec.rb +0 -67
data/.travis.yml CHANGED
@@ -3,17 +3,27 @@ rvm:
3
3
  - ree
4
4
  - 1.9.2
5
5
  - 1.9.3
6
+ - 2.0.0
6
7
  bundler_args: --without development
7
8
  gemfile:
8
9
  - Gemfile
9
10
  - gemfiles/rails_3_0.gemfile
10
11
  - gemfiles/rails_3_1.gemfile
12
+ - gemfiles/rails_3_2.gemfile
11
13
  - gemfiles/rails_head.gemfile
12
14
  matrix:
13
15
  allow_failures:
14
16
  - gemfile: gemfiles/rails_head.gemfile
15
17
  exclude:
18
+ - rvm: 1.9.2
19
+ gemfile: gemfiles/rails_head.gemfile
16
20
  - rvm: ree
17
21
  gemfile: gemfiles/rails_head.gemfile
18
22
  - rvm: 1.9.2
19
- gemfile: gemfiles/rails_head.gemfile
23
+ gemfile: Gemfile
24
+ - rvm: ree
25
+ gemfile: Gemfile
26
+ - rvm: 2.0.0
27
+ gemfile: gemfiles/rails_3_1.gemfile
28
+ - rvm: 2.0.0
29
+ gemfile: gemfiles/rails_3_0.gemfile
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ # ActiveAttr 0.8.0 (May 2, 2013) #
2
+
3
+ * ActiveAttr now supports Rails 4.0.0
4
+ * ActiveAttr now supports Ruby 2.0.0
5
+ * HaveAttributeMatcher failure messages now use an expected/got format
6
+ * Removed MassAssignmentSecurity, sanitizer support has been merged into
7
+ MassAssignment. Include the ActiveModel::MassAssignmentSecurity module or
8
+ ActiveModel::ForbiddenAttributesProtection depending on your Rails version
9
+
1
10
  # ActiveAttr 0.7.0 (December 15, 2012) #
2
11
 
3
12
  * Added Serialization
data/Gemfile CHANGED
@@ -2,12 +2,10 @@ source "https://rubygems.org"
2
2
 
3
3
  gemspec :development_group => :test
4
4
 
5
- if RUBY_VERSION < "1.9.2"
6
- gem "factory_girl", "< 3.0", :group => :test
7
- gem "strong_parameters", :git => "git://github.com/rails/strong_parameters.git", :group => :test
8
- else
9
- gem "strong_parameters"
10
- end
5
+ gem "activemodel", ">= 4.0.0.rc1"
6
+ gem "activesupport", ">= 4.0.0.rc1"
7
+ gem "actionpack", ">= 4.0.0.rc1", :group => :test
8
+ gem "protected_attributes", :group => :test
11
9
 
12
10
  group :development do
13
11
  gem "debugger", :platforms => :mri_19
data/README.md CHANGED
@@ -18,12 +18,13 @@ ActiveAttr is distributed as a rubygem [on rubygems.org][rubygems].
18
18
  * [Contributors][contributors]
19
19
 
20
20
  [api]: http://rubydoc.info/gems/active_attr
21
- [codeclimate badge]: https://codeclimate.com/badge.png
21
+ [codeclimate badge]: https://codeclimate.com/github/cgriego/active_attr.png
22
22
  [codeclimate]: https://codeclimate.com/github/cgriego/active_attr
23
23
  [contributors]: https://github.com/cgriego/active_attr/contributors
24
24
  [railscast poster]: http://railscasts.com/static/episodes/stills/326-activeattr.png
25
25
  [railscast]: http://railscasts.com/episodes/326-activeattr
26
26
  [rubygems]: http://rubygems.org/gems/active_attr
27
+ [protected_attributes]: https://github.com/rails/protected_attributes
27
28
  [strong_parameters]: https://github.com/rails/strong_parameters
28
29
  [speakerdeck slide]: https://speakerd.s3.amazonaws.com/presentations/4f31f1dec583b4001f008ec3/thumb_slide_0.jpg
29
30
  [speakerdeck]: https://speakerdeck.com/u/cgriego/p/models-models-every-where
@@ -165,14 +166,30 @@ are silently ignored.
165
166
  person.first_name #=> "Chris"
166
167
  person.last_name #=> "Griego"
167
168
 
168
- #### MassAssignmentSecurity ####
169
+ MassAssignment supports mass assignment security/sanitization if a sanitizer
170
+ is included in the model. If using Rails 4.0, include ActiveModel's forbidden
171
+ attributes protection module to get support for strong parameters.
169
172
 
170
- Including the MassAssignmentSecurity module into your class extends the
171
- MassAssignment methods to honor any declared mass assignment permission
172
- blacklists or whitelists including support for mass assignment roles.
173
+ class Person
174
+ include ActiveAttr::MassAssignment
175
+ include ActiveModel::ForbiddenAttributesProtection
176
+ attr_accessor :first_name, :last_name
177
+ end
178
+
179
+ person = Person.new(ActionController::Parameters.new({
180
+ :first_name => "Chris",
181
+ :last_name => "Griego",
182
+ }).permit(:first_name))
183
+ person.first_name #=> "Chris"
184
+ person.last_name #=> nil
185
+
186
+ If using Rails 3.x or the [Protected Attributes gem][protected_attributes],
187
+ include ActiveModel's mass assignment security module to get support for
188
+ protected attributes, including support for mass assignment roles.
173
189
 
174
190
  class Person
175
- include ActiveAttr::MassAssignmentSecurity
191
+ include ActiveAttr::MassAssignment
192
+ include ActiveModel::MassAssignmentSecurity
176
193
  attr_accessor :first_name, :last_name
177
194
  attr_protected :last_name
178
195
  end
@@ -181,12 +198,13 @@ blacklists or whitelists including support for mass assignment roles.
181
198
  person.first_name #=> "Chris"
182
199
  person.last_name #=> nil
183
200
 
184
- If you prefer the [Strong Paramters][strong_parameters] approach,
185
- include the ActiveModel::ForbiddenAttributesProtection module after
186
- including the MassAssignmentSecurity model.
201
+ If using the [Strong Paramters gem][strong_parameters] with Rails 3.2,
202
+ include the forbidden attributes protection module after including
203
+ the mass assignment security module.
187
204
 
188
205
  class Person
189
- include ActiveAttr::MassAssignmentSecurity
206
+ include ActiveAttr::MassAssignment
207
+ include ActiveModel::MassAssignmentSecurity
190
208
  include ActiveModel::ForbiddenAttributesProtection
191
209
  end
192
210
 
@@ -196,7 +214,7 @@ The Serialization module is a shortcut for incorporating ActiveModel's
196
214
  serialization functionality into your model with one include.
197
215
 
198
216
  class Person
199
- include ActiveAttr::Model
217
+ include ActiveAttr::Serialization
200
218
  end
201
219
 
202
220
  ### Model ###
data/active_attr.gemspec CHANGED
@@ -19,8 +19,8 @@ Gem::Specification.new do |gem|
19
19
  gem.add_runtime_dependency "activesupport", ">= 3.0.2", "< 4.1"
20
20
 
21
21
  gem.add_development_dependency "bundler", "~> 1.0"
22
- gem.add_development_dependency "factory_girl", ">= 2.2", "< 4.0"
23
- gem.add_development_dependency "rake", "~> 0.9.0"
24
- gem.add_development_dependency "rspec", "~> 2.6"
22
+ gem.add_development_dependency "factory_girl", ">= 2.2", "< 5.0"
23
+ gem.add_development_dependency "rake", ">= 0.9.0", "< 10.1"
24
+ gem.add_development_dependency "rspec", "~> 2.11"
25
25
  gem.add_development_dependency "tzinfo", "~> 0.3.29"
26
26
  end
@@ -0,0 +1,11 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec :development_group => :test, :path => ".."
4
+
5
+ if RUBY_VERSION < "1.9.2"
6
+ gem "factory_girl", "< 3.0", :group => :test
7
+ end
8
+
9
+ gem "activemodel", "~> 3.2.0"
10
+ gem "activesupport", "~> 3.2.0"
11
+ gem "strong_parameters", ">= 0.2.0", :group => :test
@@ -5,4 +5,7 @@ gemspec :development_group => :test, :path => ".."
5
5
  git "git://github.com/rails/rails.git" do
6
6
  gem "activemodel"
7
7
  gem "activesupport"
8
+ gem "actionpack", :group => :test
8
9
  end
10
+
11
+ gem "protected_attributes", :git => "git://github.com/rails/protected_attributes.git", :group => :test
data/lib/active_attr.rb CHANGED
@@ -18,7 +18,6 @@ module ActiveAttr
18
18
  autoload :Error
19
19
  autoload :Logger
20
20
  autoload :MassAssignment
21
- autoload :MassAssignmentSecurity
22
21
  autoload :Model
23
22
  autoload :QueryAttributes
24
23
  autoload :Serialization
@@ -26,13 +26,20 @@ module ActiveAttr
26
26
  #
27
27
  # @param [Hash{#to_s => Object}, #each] attributes Attributes used to
28
28
  # populate the model
29
+ # @param [Hash, #[]] options Options that affect mass assignment
30
+ #
31
+ # @option options [Symbol] :as (:default) Mass assignment role
32
+ # @option options [true, false] :without_protection (false) Bypass mass
33
+ # assignment security if true
29
34
  #
30
35
  # @since 0.1.0
31
36
  def assign_attributes(new_attributes, options={})
32
- new_attributes.each do |name, value|
37
+ sanitized_new_attributes = sanitize_for_mass_assignment_if_sanitizer new_attributes, options
38
+
39
+ sanitized_new_attributes.each do |name, value|
33
40
  writer = "#{name}="
34
41
  send writer, value if respond_to? writer
35
- end if new_attributes
42
+ end if sanitized_new_attributes
36
43
  end
37
44
 
38
45
  # Mass update a model's attributes
@@ -63,5 +70,26 @@ module ActiveAttr
63
70
  assign_attributes attributes, options
64
71
  super
65
72
  end
73
+
74
+ private
75
+
76
+ # @since 0.8.0
77
+ def sanitize_for_mass_assignment_if_sanitizer(new_attributes, options={})
78
+ if new_attributes && !options[:without_protection] && respond_to?(:sanitize_for_mass_assignment, true)
79
+ sanitize_for_mass_assignment_with_or_without_role new_attributes, options
80
+ else
81
+ new_attributes
82
+ end
83
+ end
84
+
85
+ # Rails 3.0 and 4.0 do not take a role argument for the sanitizer
86
+ # @since 0.7.0
87
+ def sanitize_for_mass_assignment_with_or_without_role(new_attributes, options)
88
+ if method(:sanitize_for_mass_assignment).arity.abs > 1
89
+ sanitize_for_mass_assignment new_attributes, options[:as] || :default
90
+ else
91
+ sanitize_for_mass_assignment new_attributes
92
+ end
93
+ end
66
94
  end
67
95
  end
@@ -1,3 +1,5 @@
1
+ require "active_attr/attribute_definition"
2
+
1
3
  module ActiveAttr
2
4
  module Matchers
3
5
  # Specify that a model should have an attribute matching the criteria. See
@@ -30,9 +32,10 @@ module ActiveAttr
30
32
  def initialize(attribute_name)
31
33
  raise TypeError, "can't convert #{attribute_name.class} into Symbol" unless attribute_name.respond_to? :to_sym
32
34
  @attribute_name = attribute_name.to_sym
35
+ @attribute_options = {}
33
36
  @description = "attribute named #{attribute_name}"
34
37
  @expected_ancestors = ["ActiveAttr::Attributes"]
35
- @attribute_expectations = [lambda { attribute_definition }]
38
+ @attribute_expectations = [lambda { actual_attribute_definition }]
36
39
  end
37
40
 
38
41
  # Specify that the attribute should have the given type
@@ -48,6 +51,7 @@ module ActiveAttr
48
51
  #
49
52
  # @since 0.5.0
50
53
  def of_type(type)
54
+ @attribute_options[:type] = type
51
55
  @description << " of type #{type}"
52
56
  @expected_ancestors << "ActiveAttr::TypecastedAttributes"
53
57
  @attribute_expectations << lambda { @model_class._attribute_type(attribute_name) == type }
@@ -69,9 +73,10 @@ module ActiveAttr
69
73
  #
70
74
  # @since 0.5.0
71
75
  def with_default_value_of(default_value)
76
+ @attribute_options[:default] = default_value
72
77
  @description << " with a default value of #{default_value.inspect}"
73
78
  @expected_ancestors << "ActiveAttr::AttributeDefaults"
74
- @attribute_expectations << lambda { attribute_definition[:default] == default_value }
79
+ @attribute_expectations << lambda { actual_attribute_definition[:default] == default_value }
75
80
  self
76
81
  end
77
82
 
@@ -92,6 +97,9 @@ module ActiveAttr
92
97
  def failure_message
93
98
  if missing_ancestors.any?
94
99
  "expected #{@model_class.name} to include #{missing_ancestors.first}"
100
+ elsif actual_attribute_definition
101
+ "expected: #{expected_attribute_definition.inspect}\n" +
102
+ " got: #{actual_attribute_definition.inspect}"
95
103
  else
96
104
  "expected #{@model_class.name} to have #{@description}"
97
105
  end
@@ -100,15 +108,20 @@ module ActiveAttr
100
108
  # @return [String] Negative failure message
101
109
  # @private
102
110
  def negative_failure_message
103
- "expected #{@model_class.name} to not have #{@description}"
111
+ "expected not: #{expected_attribute_definition.inspect}\n" +
112
+ " got: #{actual_attribute_definition.inspect}"
104
113
  end
105
114
 
106
115
  private
107
116
 
108
- def attribute_definition
117
+ def actual_attribute_definition
109
118
  @model_class.attributes[attribute_name]
110
119
  end
111
120
 
121
+ def expected_attribute_definition
122
+ AttributeDefinition.new @attribute_name, @attribute_options
123
+ end
124
+
112
125
  def missing_ancestors
113
126
  model_ancestor_names = @model_class.ancestors.map(&:name)
114
127
 
@@ -2,7 +2,7 @@ require "active_attr/attribute_defaults"
2
2
  require "active_attr/basic_model"
3
3
  require "active_attr/block_initialization"
4
4
  require "active_attr/logger"
5
- require "active_attr/mass_assignment_security"
5
+ require "active_attr/mass_assignment"
6
6
  require "active_attr/query_attributes"
7
7
  require "active_attr/serialization"
8
8
  require "active_attr/typecasted_attributes"
@@ -25,7 +25,7 @@ module ActiveAttr
25
25
  include BasicModel
26
26
  include BlockInitialization
27
27
  include Logger
28
- include MassAssignmentSecurity
28
+ include MassAssignment
29
29
  include AttributeDefaults
30
30
  include QueryAttributes
31
31
  include TypecastedAttributes
@@ -27,6 +27,8 @@ module ActiveAttr
27
27
  def call(value)
28
28
  if value.is_a? BigDecimal
29
29
  value
30
+ elsif value.is_a? Rational
31
+ value.to_f.to_d
30
32
  elsif value.respond_to? :to_d
31
33
  value.to_d
32
34
  else
@@ -24,7 +24,7 @@ module ActiveAttr
24
24
  # @since 0.5.0
25
25
  def call(value)
26
26
  value.to_date if value.respond_to? :to_date
27
- rescue NoMethodError
27
+ rescue NoMethodError, ArgumentError
28
28
  end
29
29
  end
30
30
  end
@@ -1,5 +1,5 @@
1
1
  module ActiveAttr
2
2
  # Complete version string
3
3
  # @since 0.1.0
4
- VERSION = "0.7.0"
4
+ VERSION = "0.8.0"
5
5
  end
@@ -6,7 +6,7 @@ require "active_model"
6
6
 
7
7
  module ActiveAttr
8
8
  describe AttributeDefaults do
9
- subject { model_class.new }
9
+ subject(:model) { model_class.new }
10
10
 
11
11
  let :model_class do
12
12
  Class.new.tap do |model_class|
@@ -20,20 +20,20 @@ module ActiveAttr
20
20
  before { model_class.attribute :first_name, :default => "John" }
21
21
 
22
22
  it "the attribute getter returns the string by default" do
23
- subject.first_name.should == "John"
23
+ model.first_name.should == "John"
24
24
  end
25
25
 
26
26
  it "#attributes includes the default attributes" do
27
- subject.attributes["first_name"].should == "John"
27
+ model.attributes["first_name"].should == "John"
28
28
  end
29
29
 
30
30
  it "#read_attribute returns the string by default" do
31
- subject.read_attribute("first_name").should == "John"
31
+ model.read_attribute("first_name").should == "John"
32
32
  end
33
33
 
34
34
  it "assigning nil sets nil as the attribute value" do
35
- subject.first_name = nil
36
- subject.first_name.should be_nil
35
+ model.first_name = nil
36
+ model.first_name.should be_nil
37
37
  end
38
38
 
39
39
  it "mutating the default value does not mutate the attribute definition" do
@@ -46,7 +46,7 @@ module ActiveAttr
46
46
  before { model_class.attribute :admin, :default => false }
47
47
 
48
48
  it "the attribute getter returns false by default" do
49
- subject.admin.should == false
49
+ model.admin.should == false
50
50
  end
51
51
  end
52
52
 
@@ -54,7 +54,7 @@ module ActiveAttr
54
54
  before { model_class.attribute :remember_me, :default => true }
55
55
 
56
56
  it "the attribute getter returns true by default" do
57
- subject.remember_me.should == true
57
+ model.remember_me.should == true
58
58
  end
59
59
  end
60
60
 
@@ -62,7 +62,7 @@ module ActiveAttr
62
62
  before { model_class.attribute :roles, :default => [] }
63
63
 
64
64
  it "the attribute getter returns an empty array by default" do
65
- subject.roles.should == []
65
+ model.roles.should == []
66
66
  end
67
67
  end
68
68
 
@@ -70,11 +70,11 @@ module ActiveAttr
70
70
  before { model_class.attribute :created_at, :default => lambda { Time.now } }
71
71
 
72
72
  it "the attribute getter returns a Time instance" do
73
- subject.created_at.should be_a_kind_of Time
73
+ model.created_at.should be_a_kind_of Time
74
74
  end
75
75
 
76
76
  it "the attribute default is only evaulated once per instance" do
77
- subject.created_at.should == subject.created_at
77
+ model.created_at.should == model.created_at
78
78
  end
79
79
 
80
80
  it "the attribute default is different per instance" do
@@ -86,7 +86,7 @@ module ActiveAttr
86
86
  before { model_class.attribute :id, :default => lambda { object_id } }
87
87
 
88
88
  it "the attribute getter returns the default based on the instance" do
89
- subject.id.should == subject.object_id
89
+ model.id.should == model.object_id
90
90
  end
91
91
  end
92
92
 
@@ -23,10 +23,10 @@ module ActiveAttr
23
23
  end
24
24
  end
25
25
 
26
- subject { model_class.new }
26
+ subject(:model) { model_class.new }
27
27
 
28
28
  it "correctly defines methods for the attributes instead of relying on method_missing" do
29
- subject.id.should be_nil
29
+ model.id.should be_nil
30
30
  end
31
31
  end
32
32
 
@@ -95,7 +95,7 @@ module ActiveAttr
95
95
  context "serializing a model" do
96
96
  let(:first_name) { "Chris" }
97
97
 
98
- let :instance do
98
+ let :model do
99
99
  model_class.new.tap do |model|
100
100
  model.first_name = first_name
101
101
  end
@@ -129,34 +129,34 @@ module ActiveAttr
129
129
  end
130
130
 
131
131
  it "includes unassigned, defined attributes" do
132
- subject.keys.should include("last_name")
133
- subject["last_name"].should be_nil
132
+ serialized_model.keys.should include("last_name")
133
+ serialized_model["last_name"].should be_nil
134
134
  end
135
135
  end
136
136
 
137
137
  describe "#as_json" do
138
- subject { instance.as_json["person"] }
138
+ subject(:serialized_model) { model.as_json["person"] }
139
139
  include_examples "serialization method"
140
140
  end
141
141
 
142
142
  describe "#serializable_hash" do
143
- subject { instance.serializable_hash }
143
+ subject(:serialized_model) { model.serializable_hash }
144
144
  include_examples "serialization method"
145
145
  end
146
146
 
147
147
  describe "#to_json" do
148
- subject { ActiveSupport::JSON.decode(instance.to_json)["person"] }
148
+ subject(:serialized_model) { ActiveSupport::JSON.decode(model.to_json)["person"] }
149
149
  include_examples "serialization method"
150
150
  end
151
151
 
152
152
  describe "#to_xml" do
153
- subject { Hash.from_xml(instance.to_xml)["person"] }
153
+ subject(:serialized_model) { Hash.from_trusted_xml(model.to_xml)["person"] }
154
154
  include_examples "serialization method"
155
155
  end
156
156
  end
157
157
 
158
158
  context "building with FactoryGirl" do
159
- subject { FactoryGirl.build(:person) }
159
+ subject(:model) { FactoryGirl.build(:person) }
160
160
 
161
161
  before do
162
162
  Object.const_set("Person", model_class)
@@ -187,8 +187,8 @@ module ActiveAttr
187
187
  end
188
188
 
189
189
  it "sets the attributes" do
190
- subject.first_name.should eq "Chris"
191
- subject.last_name.should == "Griego"
190
+ model.first_name.should eq "Chris"
191
+ model.last_name.should == "Griego"
192
192
  end
193
193
  end
194
194