2015-01-23 16:51:59 -05:00
|
|
|
require "cases/helper"
|
|
|
|
require "active_support/hash_with_indifferent_access"
|
2015-01-23 06:57:34 -05:00
|
|
|
|
|
|
|
class AttributeAssignmentTest < ActiveModel::TestCase
|
|
|
|
class Model
|
|
|
|
include ActiveModel::AttributeAssignment
|
|
|
|
|
|
|
|
attr_accessor :name, :description
|
|
|
|
|
|
|
|
def initialize(attributes = {})
|
|
|
|
assign_attributes(attributes)
|
|
|
|
end
|
|
|
|
|
|
|
|
def broken_attribute=(value)
|
2015-01-23 16:51:59 -05:00
|
|
|
raise ErrorFromAttributeWriter
|
2015-01-23 06:57:34 -05:00
|
|
|
end
|
|
|
|
|
2015-01-23 16:51:59 -05:00
|
|
|
protected
|
|
|
|
|
|
|
|
attr_writer :metadata
|
|
|
|
end
|
|
|
|
|
|
|
|
class ErrorFromAttributeWriter < StandardError
|
2015-01-23 06:57:34 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
class ProtectedParams < ActiveSupport::HashWithIndifferentAccess
|
|
|
|
def permit!
|
|
|
|
@permitted = true
|
|
|
|
end
|
|
|
|
|
|
|
|
def permitted?
|
|
|
|
@permitted ||= false
|
|
|
|
end
|
|
|
|
|
|
|
|
def dup
|
|
|
|
super.tap do |duplicate|
|
|
|
|
duplicate.instance_variable_set :@permitted, permitted?
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
test "simple assignment" do
|
|
|
|
model = Model.new
|
|
|
|
|
2015-01-23 16:51:59 -05:00
|
|
|
model.assign_attributes(name: "hello", description: "world")
|
|
|
|
assert_equal "hello", model.name
|
|
|
|
assert_equal "world", model.description
|
2015-01-23 06:57:34 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
test "assign non-existing attribute" do
|
|
|
|
model = Model.new
|
2015-02-25 09:14:43 -05:00
|
|
|
error = assert_raises(ActiveModel::UnknownAttributeError) do
|
2015-01-23 06:57:34 -05:00
|
|
|
model.assign_attributes(hz: 1)
|
|
|
|
end
|
|
|
|
|
|
|
|
assert_equal model, error.record
|
|
|
|
assert_equal "hz", error.attribute
|
|
|
|
end
|
|
|
|
|
|
|
|
test "assign private attribute" do
|
2015-03-02 11:14:45 -05:00
|
|
|
rubinius_skip "https://github.com/rubinius/rubinius/issues/3328"
|
|
|
|
|
2015-01-23 06:57:34 -05:00
|
|
|
model = Model.new
|
2015-02-25 09:14:43 -05:00
|
|
|
assert_raises(ActiveModel::UnknownAttributeError) do
|
2015-01-23 06:57:34 -05:00
|
|
|
model.assign_attributes(metadata: { a: 1 })
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-01-23 16:51:59 -05:00
|
|
|
test "does not swallow errors raised in an attribute writer" do
|
|
|
|
assert_raises(ErrorFromAttributeWriter) do
|
2015-01-23 06:57:34 -05:00
|
|
|
Model.new(broken_attribute: 1)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-01-23 16:51:59 -05:00
|
|
|
test "an ArgumentError is raised if a non-hash-like obejct is passed" do
|
|
|
|
assert_raises(ArgumentError) do
|
2015-01-23 06:57:34 -05:00
|
|
|
Model.new(1)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-01-23 16:51:59 -05:00
|
|
|
test "forbidden attributes cannot be used for mass assignment" do
|
|
|
|
params = ProtectedParams.new(name: "Guille", description: "m")
|
|
|
|
|
2015-01-23 06:57:34 -05:00
|
|
|
assert_raises(ActiveModel::ForbiddenAttributesError) do
|
|
|
|
Model.new(params)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-01-23 16:51:59 -05:00
|
|
|
test "permitted attributes can be used for mass assignment" do
|
|
|
|
params = ProtectedParams.new(name: "Guille", description: "desc")
|
2015-01-23 06:57:34 -05:00
|
|
|
params.permit!
|
|
|
|
model = Model.new(params)
|
|
|
|
|
2015-01-23 16:51:59 -05:00
|
|
|
assert_equal "Guille", model.name
|
|
|
|
assert_equal "desc", model.description
|
2015-01-23 06:57:34 -05:00
|
|
|
end
|
|
|
|
|
2015-01-23 16:51:59 -05:00
|
|
|
test "regular hash should still be used for mass assignment" do
|
|
|
|
model = Model.new(name: "Guille", description: "m")
|
2015-01-23 06:57:34 -05:00
|
|
|
|
2015-01-23 16:51:59 -05:00
|
|
|
assert_equal "Guille", model.name
|
|
|
|
assert_equal "m", model.description
|
2015-01-23 06:57:34 -05:00
|
|
|
end
|
|
|
|
|
2015-01-23 16:51:59 -05:00
|
|
|
test "assigning no attributes should not raise, even if the hash is un-permitted" do
|
2015-01-23 06:57:34 -05:00
|
|
|
model = Model.new
|
|
|
|
assert_nil model.assign_attributes(ProtectedParams.new({}))
|
|
|
|
end
|
|
|
|
end
|