Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 15 additions & 10 deletions lib/json_api_client/resource.rb
Original file line number Diff line number Diff line change
Expand Up @@ -410,13 +410,7 @@ def save
end

if last_result_set.has_errors?
last_result_set.errors.each do |error|
if error.source_parameter
errors.add(self.class.key_formatter.unformat(error.source_parameter), error.title || error.detail)
else
errors.add(:base, error.title || error.detail)
end
end
fill_errors
false
else
self.errors.clear if self.errors
Expand All @@ -436,11 +430,12 @@ def save
# @return [Boolean] Whether or not the destroy succeeded
def destroy
self.last_result_set = self.class.requestor.destroy(self)
if !last_result_set.has_errors?
if last_result_set.has_errors?
fill_errors
false
else
self.attributes.clear
true
else
false
end
end

Expand Down Expand Up @@ -504,5 +499,15 @@ def attributes_for_serialization
def relationships_for_serialization
relationships.as_json_api
end

def fill_errors
last_result_set.errors.each do |error|
if error.source_parameter
errors.add(self.class.key_formatter.unformat(error.source_parameter), error.title || error.detail)
else
errors.add(:base, error.title || error.detail)
end
end
end
end
end
19 changes: 12 additions & 7 deletions test/unit/destroying_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -43,18 +43,23 @@ def test_destroy_failure
assert(user.persisted?)

stub_request(:delete, "http://example.com/users/1")
.to_return(headers: {content_type: "application/json"}, body: {
.to_return(headers: { content_type: "application/json" }, body: {
data: [],
errors: [{
status: 400,
errors: [
{title: "Some failure message"}
]
}]
errors: [
{
status: 400,
title: "Some failure message",
source: {
pointer: "/data/attributes/email_address"
}
}
]
}.to_json)

assert_equal(false, user.destroy, "failed deletion should return falsy value")
assert_equal(true, user.persisted?, "user should still be persisted because destroy failed")
assert(user.errors.present?)
assert_equal("Some failure message", user.errors.messages[:email_address].first, "user should contain the errors describing the failure")
end

def test_callbacks
Expand Down