Skip to content

Commit

Permalink
Merge pull request #75 from liveh2o/gt/add_errors_to_not_saved
Browse files Browse the repository at this point in the history
Include response errors in RemoteRecordNotSaved exception
  • Loading branch information
film42 authored Apr 16, 2019
2 parents 4477f6d + 5a03eda commit 9144e07
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 3 deletions.
10 changes: 10 additions & 0 deletions lib/active_remote/errors.rb
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,16 @@ def initialize(class_or_message = "")
# Raised by ActiveRemove::Base.save! and ActiveRemote::Base.create! methods
# when remote record cannot be saved because it is invalid.
class RemoteRecordNotSaved < ActiveRemoteError
attr_reader :record

def initialize(message_or_record = nil)
message = message_or_record
if message_or_record.is_a?(::ActiveRemote::Base)
@record = message_or_record
message = @record.errors.full_messages.join(", ")
end
super(message)
end
end

class UnknownAttributeError < ActiveRemoteError
Expand Down
2 changes: 1 addition & 1 deletion lib/active_remote/persistence.rb
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ def save(*args)
# Also runs any before/after save callbacks that are defined.
#
def save!(*args)
save(*args) || raise(RemoteRecordNotSaved)
save(*args) || fail(RemoteRecordNotSaved, self)
end

# Returns true if the record doesn't have errors; otherwise, returns false.
Expand Down
31 changes: 31 additions & 0 deletions spec/lib/active_remote/errors_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
require "spec_helper"

describe ::ActiveRemote::RemoteRecordNotSaved do
let(:record) { ::Tag.new }

before do
record.errors[:base] << "Some error one!"
record.errors[:base] << "Some error two!"
end

context "when an active remote record is used" do
it "uses embedded errors in message" do
expect { fail(::ActiveRemote::RemoteRecordNotSaved, record) }
.to raise_error(ActiveRemote::RemoteRecordNotSaved, "Some error one!, Some error two!")
end
end

context "when a string is used" do
it "uses the string in the error message" do
expect { fail(::ActiveRemote::RemoteRecordNotSaved, "something bad happened") }
.to raise_error(ActiveRemote::RemoteRecordNotSaved, "something bad happened")
end
end

context "when no message is used" do
it "raises the error" do
expect { raise(::ActiveRemote::RemoteRecordNotSaved) }
.to raise_error(ActiveRemote::RemoteRecordNotSaved)
end
end
end
11 changes: 9 additions & 2 deletions spec/lib/active_remote/persistence_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -314,9 +314,16 @@
end

context "when the record is not saved" do
let(:errors) {
[Generic::Error.new(:field => "name", :message => "Error one!"),
Generic::Error.new(:field => "name", :message => "Error two!")]
}
let(:response) { Generic::Remote::Tag.new(:errors => errors) }
before { allow(rpc).to receive(:execute).and_return(response) }

it "raises an exception" do
allow(subject).to receive(:save).and_return(false)
expect { subject.save! }.to raise_error(ActiveRemote::RemoteRecordNotSaved)
expect { subject.save! }
.to raise_error(ActiveRemote::RemoteRecordNotSaved, "Name Error one!, Name Error two!")
end
end
end
Expand Down

0 comments on commit 9144e07

Please sign in to comment.