Skip to content

Commit

Permalink
Add SeamHttpInvalidInputError.get_validation_error_messages (#67)
Browse files Browse the repository at this point in the history
* Add validation_errors prop and get_validation_error_messages method to SeamHttpInvalidInputError

* Test get_validation_error_messages
  • Loading branch information
andrii-balitskyi authored Jul 31, 2024
1 parent f8b006a commit 96cf786
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 1 deletion.
15 changes: 14 additions & 1 deletion lib/seam/request.rb
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,13 @@ def handle_error_response(response, _method, _uri)
data: error["data"]
}

raise SeamHttpInvalidInputError.new(error_details, status_code, request_id) if error_type == "invalid_input"
if error_type == "invalid_input"
error_details["validation_errors"] = error["validation_errors"]

raise SeamHttpInvalidInputError.new(
error_details, status_code, request_id
)
end

raise SeamHttpApiError.new(error_details, status_code, request_id)
end
Expand Down Expand Up @@ -97,9 +103,16 @@ def initialize(request_id)
end

class SeamHttpInvalidInputError < SeamHttpApiError
attr_reader :validation_errors

def initialize(error, status_code, request_id)
super(error, status_code, request_id)
@code = "invalid_input"
@validation_errors = error["validation_errors"] || {}
end

def get_validation_error_messages(param_name)
@validation_errors.dig(param_name, "_errors") || []
end
end
end
52 changes: 52 additions & 0 deletions spec/seam_client/http_error_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
require "spec_helper"

RSpec.describe Seam::SeamHttpInvalidInputError do
let(:api_key) { "seam_apikey1_token" }
let(:client) { Seam::Client.new(api_key: api_key) }

describe "handling invalid input errors" do
let(:error_response) do
{
error: {
type: "invalid_input",
message: "Invalid input",
validation_errors: {
device_ids: {
_errors: ["Expected array, received number"]
}
}
}
}
end

it "raises SeamHttpInvalidInputError with correct validation messages" do
stub_seam_request(:post, "/devices/list",
error_response,
status: 400).with do |req|
req.body.source == {device_ids: 123}.to_json
end

expect {
client.devices.list(device_ids: 123)
}.to raise_error(Seam::SeamHttpInvalidInputError) do |error|
expect(error.code).to eq("invalid_input")
expect(error.status_code).to eq(400)
expect(error.get_validation_error_messages("device_ids")).to eq(["Expected array, received number"])
end
end

it "returns an empty array for non-existent validation errors" do
stub_seam_request(:post, "/devices/list",
error_response,
status: 400).with do |req|
req.body.source == {device_ids: 123}.to_json
end

begin
client.devices.list(device_ids: 123)
rescue Seam::SeamHttpInvalidInputError => error
expect(error.get_validation_error_messages("non_existent_field")).to eq([])
end
end
end
end

0 comments on commit 96cf786

Please sign in to comment.