Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fix Errors#from_array refactor sorting the attributes keys

  • Loading branch information...
commit d8864c445ca3353fb12fdf8c262d4a3fe12b406b 1 parent da3236c
@salrepe salrepe authored
Showing with 18 additions and 11 deletions.
  1. +1 −2  lib/active_resource/validations.rb
  2. +17 −9 test/cases/base_errors_test.rb
View
3  lib/active_resource/validations.rb
@@ -15,12 +15,11 @@ def from_array(messages, save_cache = false)
clear unless save_cache
humanized_attributes = Hash[@base.attributes.keys.map { |attr_name| [attr_name.humanize, attr_name] }]
messages.each do |message|
- attr_message = humanized_attributes.keys.detect do |attr_name|
+ attr_message = humanized_attributes.keys.sort_by { |a| -a.length }.detect do |attr_name|
if message[0, attr_name.size + 1] == "#{attr_name} "
add humanized_attributes[attr_name], message[(attr_name.size + 1)..-1]
end
end
-
self[:base] << message if attr_message.nil?
end
end
View
26 test/cases/base_errors_test.rb
@@ -4,8 +4,8 @@
class BaseErrorsTest < ActiveSupport::TestCase
def setup
ActiveResource::HttpMock.respond_to do |mock|
- mock.post "/people.xml", {}, %q(<?xml version="1.0" encoding="UTF-8"?><errors><error>Age can't be blank</error><error>Name can't be blank</error><error>Name must start with a letter</error><error>Person quota full for today.</error></errors>), 422, {'Content-Type' => 'application/xml; charset=utf-8'}
- mock.post "/people.json", {}, %q({"errors":{"age":["can't be blank"],"name":["can't be blank", "must start with a letter"],"person":["quota full for today."]}}), 422, {'Content-Type' => 'application/json; charset=utf-8'}
+ mock.post "/people.xml", {}, %q(<?xml version="1.0" encoding="UTF-8"?><errors><error>Age can't be blank</error><error>Name can't be blank</error><error>Name must start with a letter</error><error>Person quota full for today.</error><error>Phone work can't be blank</error><error>Phone is not valid</error></errors>), 422, {'Content-Type' => 'application/xml; charset=utf-8'}
+ mock.post "/people.json", {}, %q({"errors":{"age":["can't be blank"],"name":["can't be blank", "must start with a letter"],"person":["quota full for today."],"phone_work":["can't be blank"],"phone":["is not valid"]}}), 422, {'Content-Type' => 'application/json; charset=utf-8'}
end
end
@@ -21,7 +21,7 @@ def test_should_parse_json_and_xml_errors
[ :json, :xml ].each do |format|
invalid_user_using_format(format) do
assert_kind_of ActiveResource::Errors, @person.errors
- assert_equal 4, @person.errors.size
+ assert_equal 6, @person.errors.size
end
end
end
@@ -43,6 +43,8 @@ def test_should_parse_errors_to_individual_attributes
assert @person.errors[:name].any?
assert_equal ["can't be blank"], @person.errors[:age]
assert_equal ["can't be blank", "must start with a letter"], @person.errors[:name]
+ assert_equal ["can't be blank"], @person.errors[:phone_work]
+ assert_equal ["is not valid"], @person.errors[:phone]
assert_equal ["Person quota full for today."], @person.errors[:base]
end
end
@@ -76,14 +78,16 @@ def test_should_format_full_errors
assert full.include?("Name can't be blank")
assert full.include?("Name must start with a letter")
assert full.include?("Person quota full for today.")
+ assert full.include?("Phone is not valid")
+ assert full.include?("Phone work can't be blank")
end
end
end
def test_should_mark_as_invalid_when_content_type_is_unavailable_in_response_header
ActiveResource::HttpMock.respond_to do |mock|
- mock.post "/people.xml", {}, %q(<?xml version="1.0" encoding="UTF-8"?><errors><error>Age can't be blank</error><error>Name can't be blank</error><error>Name must start with a letter</error><error>Person quota full for today.</error></errors>), 422, {}
- mock.post "/people.json", {}, %q({"errors":{"age":["can't be blank"],"name":["can't be blank", "must start with a letter"],"person":["quota full for today."]}}), 422, {}
+ mock.post "/people.xml", {}, %q(<?xml version="1.0" encoding="UTF-8"?><errors><error>Age can't be blank</error><error>Name can't be blank</error><error>Name must start with a letter</error><error>Person quota full for today.</error><error>Phone work can't be blank</error><error>Phone is not valid</error></errors>), 422, {}
+ mock.post "/people.json", {}, %q({"errors":{"age":["can't be blank"],"name":["can't be blank", "must start with a letter"],"person":["quota full for today."],"phone_work":["can't be blank"],"phone":["is not valid"]}}), 422, {}
end
[ :json, :xml ].each do |format|
@@ -95,7 +99,7 @@ def test_should_mark_as_invalid_when_content_type_is_unavailable_in_response_hea
def test_should_parse_json_string_errors_with_an_errors_key
ActiveResource::HttpMock.respond_to do |mock|
- mock.post "/people.json", {}, %q({"errors":["Age can't be blank", "Name can't be blank", "Name must start with a letter", "Person quota full for today."]}), 422, {'Content-Type' => 'application/json; charset=utf-8'}
+ mock.post "/people.json", {}, %q({"errors":["Age can't be blank", "Name can't be blank", "Name must start with a letter", "Person quota full for today.", "Phone work can't be blank", "Phone is not valid"]}), 422, {'Content-Type' => 'application/json; charset=utf-8'}
end
assert_deprecated(/as an array/) do
@@ -103,6 +107,8 @@ def test_should_parse_json_string_errors_with_an_errors_key
assert @person.errors[:name].any?
assert_equal ["can't be blank"], @person.errors[:age]
assert_equal ["can't be blank", "must start with a letter"], @person.errors[:name]
+ assert_equal ["is not valid"], @person.errors[:phone]
+ assert_equal ["can't be blank"], @person.errors[:phone_work]
assert_equal ["Person quota full for today."], @person.errors[:base]
end
end
@@ -110,7 +116,7 @@ def test_should_parse_json_string_errors_with_an_errors_key
def test_should_parse_3_1_style_json_errors
ActiveResource::HttpMock.respond_to do |mock|
- mock.post "/people.json", {}, %q({"age":["can't be blank"],"name":["can't be blank", "must start with a letter"],"person":["quota full for today."]}), 422, {'Content-Type' => 'application/json; charset=utf-8'}
+ mock.post "/people.json", {}, %q({"age":["can't be blank"],"name":["can't be blank", "must start with a letter"],"person":["quota full for today."],"phone_work":["can't be blank"],"phone":["is not valid"]}), 422, {'Content-Type' => 'application/json; charset=utf-8'}
end
assert_deprecated(/without a root/) do
@@ -118,6 +124,8 @@ def test_should_parse_3_1_style_json_errors
assert @person.errors[:name].any?
assert_equal ["can't be blank"], @person.errors[:age]
assert_equal ["can't be blank", "must start with a letter"], @person.errors[:name]
+ assert_equal ["is not valid"], @person.errors[:phone]
+ assert_equal ["can't be blank"], @person.errors[:phone_work]
assert_equal ["Person quota full for today."], @person.errors[:base]
end
end
@@ -127,11 +135,11 @@ def test_should_parse_3_1_style_json_errors
def invalid_user_using_format(mime_type_reference)
previous_format = Person.format
Person.format = mime_type_reference
- @person = Person.new(:name => '', :age => '')
+ @person = Person.new(:name => '', :age => '', :phone => '', :phone_work => '')
assert_equal false, @person.save
yield
ensure
Person.format = previous_format
end
-end
+end
Please sign in to comment.
Something went wrong with that request. Please try again.