Skip to content

Commit d51cfaa

Browse files
conarrojonnyom
authored andcommitted
Add API version support (#459)
1 parent 7020bf0 commit d51cfaa

File tree

5 files changed

+53
-5
lines changed

5 files changed

+53
-5
lines changed

lib/intercom/client.rb

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ module Intercom
22
class MisconfiguredClientError < StandardError; end
33
class Client
44
include Options
5-
attr_reader :base_url, :rate_limit_details, :username_part, :password_part, :handle_rate_limit, :timeouts
5+
attr_reader :base_url, :rate_limit_details, :username_part, :password_part, :handle_rate_limit, :timeouts, :api_version
66

77
class << self
88
def set_base_url(base_url)
@@ -25,7 +25,7 @@ def set_timeouts(open_timeout: nil, read_timeout: nil)
2525
end
2626
end
2727

28-
def initialize(app_id: 'my_app_id', api_key: 'my_api_key', token: nil, base_url:'https://api.intercom.io', handle_rate_limit: false)
28+
def initialize(app_id: 'my_app_id', api_key: 'my_api_key', token: nil, base_url:'https://api.intercom.io', handle_rate_limit: false, api_version: nil)
2929
if token
3030
@username_part = token
3131
@password_part = ""
@@ -35,6 +35,9 @@ def initialize(app_id: 'my_app_id', api_key: 'my_api_key', token: nil, base_url:
3535
end
3636
validate_credentials!
3737

38+
@api_version = api_version
39+
validate_api_version!
40+
3841
@base_url = base_url
3942
@rate_limit_details = {}
4043
@handle_rate_limit = handle_rate_limit
@@ -123,9 +126,14 @@ def validate_credentials!
123126
fail error if @username_part.nil?
124127
end
125128

129+
def validate_api_version!
130+
error = MisconfiguredClientError.new("api_version must be either nil or a valid API version")
131+
fail error if (@api_version && Gem::Version.new(@api_version) < Gem::Version.new('1.0'))
132+
end
133+
126134
def execute_request(request)
127135
request.handle_rate_limit = handle_rate_limit
128-
request.execute(@base_url, username: @username_part, secret: @password_part, **timeouts)
136+
request.execute(@base_url, username: @username_part, secret: @password_part, api_version: @api_version, **timeouts)
129137
ensure
130138
@rate_limit_details = request.rate_limit_details
131139
end

lib/intercom/errors.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ class Intercom::AttributeNotSetError < IntercomError; end
8181
# Raised when unexpected nil returned from server
8282
class Intercom::HttpError < IntercomError; end
8383

84+
# Raised when an invalid api version is used
85+
class ApiVersionInvalid < IntercomError; end
86+
8487
#
8588
# Non-public errors (internal to the gem)
8689
#

lib/intercom/request.rb

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ def set_basic_auth(method, username, secret)
1919
method.basic_auth(CGI.unescape(username), CGI.unescape(secret))
2020
end
2121

22+
def set_api_version(method, api_version)
23+
method.add_field('Intercom-Version', api_version)
24+
end
25+
2226
def self.get(path, params)
2327
new(path, Net::HTTP::Get.new(append_query_string_to_url(path, params), default_headers))
2428
end
@@ -58,11 +62,12 @@ def client(uri, read_timeout:, open_timeout:)
5862
net
5963
end
6064

61-
def execute(target_base_url=nil, username:, secret: nil, read_timeout: 90, open_timeout: 30)
65+
def execute(target_base_url=nil, username:, secret: nil, read_timeout: 90, open_timeout: 30, api_version: nil)
6266
retries = 3
6367
base_uri = URI.parse(target_base_url)
6468
set_common_headers(net_http_method, base_uri)
6569
set_basic_auth(net_http_method, username, secret)
70+
set_api_version(net_http_method, api_version) if api_version
6671
begin
6772
client(base_uri, read_timeout: read_timeout, open_timeout: open_timeout).start do |http|
6873
begin
@@ -180,6 +185,8 @@ def raise_application_errors_on_failure(error_list_details, http_code)
180185
raise Intercom::MultipleMatchingUsersError.new(error_details['message'], error_context)
181186
when 'resource_conflict'
182187
raise Intercom::ResourceNotUniqueError.new(error_details['message'], error_context)
188+
when 'intercom_version_invalid'
189+
raise Intercom::ApiVersionInvalid.new(error_details['message'], error_context)
183190
when nil, ''
184191
raise Intercom::UnexpectedError.new(message_for_unexpected_error_without_type(error_details, parsed_http_code), error_context)
185192
else

spec/unit/intercom/client_spec.rb

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,29 @@ module Intercom
4242
proc { Client.new(app_id: nil, api_key: nil) }.must_raise MisconfiguredClientError
4343
end
4444

45+
describe 'API version' do
46+
it 'does not set the api version by default' do
47+
assert_nil(client.api_version)
48+
end
49+
50+
it 'allows api version to be provided' do
51+
Client.new(app_id: app_id, api_key: api_key, api_version: '1.0').api_version.must_equal('1.0')
52+
end
53+
54+
it 'allows api version to be nil' do
55+
# matches default behavior, and will honor version set in the Developer Hub
56+
assert_nil(Client.new(app_id: app_id, api_key: api_key, api_version: nil).api_version)
57+
end
58+
59+
it 'raises on invalid api version' do
60+
proc { Client.new(app_id: app_id, api_key: api_key, api_version: '0.2') }.must_raise MisconfiguredClientError
61+
end
62+
63+
it 'raises on empty api version' do
64+
proc { Client.new(app_id: app_id, api_key: api_key, api_version: '') }.must_raise MisconfiguredClientError
65+
end
66+
end
67+
4568
describe 'OAuth clients' do
4669
it 'supports "token"' do
4770
client = Client.new(token: 'foo')

spec/unit/intercom/request_spec.rb

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@
7272
req.expects(:sleep).never.with(any_parameters)
7373
req.execute(target_base_url=uri, username: "ted", secret: "")
7474
end
75-
7675
end
7776

7877

@@ -85,6 +84,14 @@
8584
req = Intercom::Request.put(uri, "")
8685
expect { req.execute(target_base_url=uri, username: "ted", secret: "") }.must_raise(Intercom::ResourceNotUniqueError)
8786
end
87+
88+
it 'should raise ApiVersionInvalid error on intercom_version_invalid code' do
89+
# Use webmock to mock the HTTP request
90+
stub_request(:put, uri).\
91+
to_return(status: [400, "Bad Request"], headers: { 'X-RateLimit-Reset' => (Time.now.utc + 10).to_i.to_s }, body: {type: "error.list", errors: [ code: "intercom_version_invalid" ]}.to_json)
92+
req = Intercom::Request.put(uri, "")
93+
expect { req.execute(uri, username: "ted", secret: "") }.must_raise(Intercom::ApiVersionInvalid)
94+
end
8895
end
8996

9097
it 'parse_body returns nil if decoded_body is nil' do

0 commit comments

Comments
 (0)