diff --git a/lib/seam/request.rb b/lib/seam/request.rb index cd06b2d..160fbc9 100644 --- a/lib/seam/request.rb +++ b/lib/seam/request.rb @@ -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 @@ -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 diff --git a/spec/seam_client/http_error_spec.rb b/spec/seam_client/http_error_spec.rb new file mode 100644 index 0000000..5d07be3 --- /dev/null +++ b/spec/seam_client/http_error_spec.rb @@ -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