phaxio 0.5.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/.travis.yml +2 -1
- data/Gemfile +10 -0
- data/README.md +260 -73
- data/Rakefile +6 -16
- data/lib/phaxio.rb +47 -3
- data/lib/phaxio/client.rb +117 -484
- data/lib/phaxio/config.rb +31 -0
- data/lib/phaxio/error.rb +13 -0
- data/lib/phaxio/helpers/mime_type_helper.rb +14 -0
- data/lib/phaxio/resource.rb +168 -0
- data/lib/phaxio/resources.rb +7 -0
- data/lib/phaxio/resources/account.rb +41 -0
- data/lib/phaxio/resources/callback.rb +65 -0
- data/lib/phaxio/resources/fax.rb +310 -0
- data/lib/phaxio/resources/fax_recipient.rb +41 -0
- data/lib/phaxio/resources/phax_code.rb +89 -0
- data/lib/phaxio/resources/phone_number.rb +112 -0
- data/lib/phaxio/resources/public.rb +8 -0
- data/lib/phaxio/resources/public/area_code.rb +64 -0
- data/lib/phaxio/resources/public/country.rb +54 -0
- data/lib/phaxio/version.rb +1 -1
- data/phaxio.gemspec +9 -12
- data/spec/client_spec.rb +132 -0
- data/spec/helpers/mime_type_helper_spec.rb +11 -0
- data/spec/phaxio_spec.rb +20 -0
- data/spec/resources/account_spec.rb +24 -0
- data/spec/resources/callback_spec.rb +34 -0
- data/spec/resources/fax_spec.rb +227 -0
- data/spec/resources/phax_code_spec.rb +83 -0
- data/spec/resources/phone_number_spec.rb +89 -0
- data/spec/resources/public/area_code_spec.rb +24 -0
- data/spec/resources/public/country_spec.rb +24 -0
- data/spec/spec_helper.rb +6 -0
- data/spec/support/credentials.rb +7 -0
- data/spec/support/expectations.rb +9 -0
- data/spec/support/files/test.pdf +0 -0
- data/spec/support/vcr.rb +9 -0
- data/spec/support/vcr_cassettes/resources/account/status.yml +44 -0
- data/spec/support/vcr_cassettes/resources/fax/cancel.yml +46 -0
- data/spec/support/vcr_cassettes/resources/fax/create.yml +230 -0
- data/spec/support/vcr_cassettes/resources/fax/delete.yml +44 -0
- data/spec/support/vcr_cassettes/resources/fax/delete_file.yml +44 -0
- data/spec/support/vcr_cassettes/resources/fax/file.yml +251 -0
- data/spec/support/vcr_cassettes/resources/fax/get.yml +44 -0
- data/spec/support/vcr_cassettes/resources/fax/list.yml +56 -0
- data/spec/support/vcr_cassettes/resources/fax/resend.yml +46 -0
- data/spec/support/vcr_cassettes/resources/fax/test_receive.yml +231 -0
- data/spec/support/vcr_cassettes/resources/phax_code/create.yml +100 -0
- data/spec/support/vcr_cassettes/resources/phax_code/get.yml +190 -0
- data/spec/support/vcr_cassettes/resources/phone_number/create.yml +47 -0
- data/spec/support/vcr_cassettes/resources/phone_number/get.yml +45 -0
- data/spec/support/vcr_cassettes/resources/phone_number/list.yml +52 -0
- data/spec/support/vcr_cassettes/resources/phone_number/release.yml +44 -0
- data/spec/support/vcr_cassettes/resources/public/area_codes/list.yml +77 -0
- data/spec/support/vcr_cassettes/resources/public/country/list.yml +54 -0
- metadata +70 -82
- data/.ruby-version +0 -1
- data/CHANGELOG +0 -6
- data/test/files/test.pdf +0 -0
- data/test/integration/phaxio_integration_test.rb +0 -45
- data/test/support/responses/account_status.json +0 -9
- data/test/support/responses/cancel_success.json +0 -4
- data/test/support/responses/fax_status_success.json +0 -21
- data/test/support/responses/list_faxes.json +0 -68
- data/test/support/responses/list_numbers.json +0 -22
- data/test/support/responses/provision_number.json +0 -12
- data/test/support/responses/release_number.json +0 -7
- data/test/support/responses/send_failure.json +0 -8
- data/test/support/responses/send_success.json +0 -8
- data/test/support/responses/test.pdf +0 -0
- data/test/support/responses/test_receive.json +0 -4
- data/test/test_helper.rb +0 -57
- data/test/test_phaxio.rb +0 -128
@@ -0,0 +1,41 @@
|
|
1
|
+
module Phaxio
|
2
|
+
module Resources
|
3
|
+
class FaxRecipient < Resource
|
4
|
+
# @return [String] The phone number of the recipient in E.164 format.
|
5
|
+
# @!attribute phone_number
|
6
|
+
|
7
|
+
# @return [String] The status of the recipient.
|
8
|
+
# @!attribute status
|
9
|
+
|
10
|
+
# @return [Integer] The number of retries for this recipient.
|
11
|
+
# @!attribute retry_count
|
12
|
+
|
13
|
+
# @return [Integer] The bitrate in bits/second that the fax was transmitted at.
|
14
|
+
# @!attribute bitrate
|
15
|
+
|
16
|
+
# @return [Integer]
|
17
|
+
# The horizontal resolution that the fax was transmitted at in pixels per meter.
|
18
|
+
# @!attribute resolution
|
19
|
+
|
20
|
+
# @return [String]
|
21
|
+
# One of the Phaxio Error types. Will give you a general idea of what went wrong for this
|
22
|
+
# recipient.
|
23
|
+
# @!attribute error_type
|
24
|
+
|
25
|
+
# @return [String] A more detailed description of what went wrong for this receipient.
|
26
|
+
# @!attribute error_message
|
27
|
+
|
28
|
+
# @return [Integer] A numeric error code that corresponds to the error message, if any.
|
29
|
+
# @!attribute error_id
|
30
|
+
|
31
|
+
has_normal_attributes %w[
|
32
|
+
phone_number status retry_count bitrate resolution error_type error_message error_id
|
33
|
+
]
|
34
|
+
|
35
|
+
# @return [Time] The time the job was completed for this recipient.
|
36
|
+
# @!attribute completed_at
|
37
|
+
|
38
|
+
has_time_attributes %w[completed_at]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module Phaxio
|
2
|
+
module Resources
|
3
|
+
# Provides functionality for viewing and managing PhaxCodes.
|
4
|
+
class PhaxCode < Resource
|
5
|
+
PHAX_CODES_PATH = 'phax_codes'.freeze
|
6
|
+
DEFAULT_PHAX_CODE_PATH = 'phax_code'.freeze
|
7
|
+
private_constant :PHAX_CODES_PATH, :DEFAULT_PHAX_CODE_PATH
|
8
|
+
|
9
|
+
# @return [String] The identifier for the PhaxCode.
|
10
|
+
# @!attribute identifier
|
11
|
+
|
12
|
+
# @return [String] The metadata associated with the PhaxCode.
|
13
|
+
# @!attribute metadata
|
14
|
+
|
15
|
+
has_normal_attributes %w[identifier metadata]
|
16
|
+
|
17
|
+
# @return [Time] The time that the PhaxCode was created.
|
18
|
+
# @!attribute created_at
|
19
|
+
|
20
|
+
has_time_attributes %w[created_at]
|
21
|
+
|
22
|
+
class << self
|
23
|
+
# Create a PhaxCode.
|
24
|
+
# @param params [Hash]
|
25
|
+
# A hash of parameters to send to Phaxio.
|
26
|
+
# - *metadata* [String] - Metadata to be associated with the PhaxCode.
|
27
|
+
# - *type* [String] - If set to "png", this method will return a PNG
|
28
|
+
# file instead of a PhaxCode object.
|
29
|
+
# @return [Phaxio::Resources::PhaxCode | File] The created PhaxCode
|
30
|
+
# @raise [Phaxio::Error::PhaxioError]
|
31
|
+
# @see https://www.phaxio.com/docs/api/v2/phaxcodes/create_phax_code
|
32
|
+
def create params = {}
|
33
|
+
endpoint = case (params[:type] || params['type']).to_s
|
34
|
+
when 'png' then phax_codes_endpoint_png
|
35
|
+
else phax_codes_endpoint
|
36
|
+
end
|
37
|
+
result = Client.request :post, endpoint, params
|
38
|
+
return result if result.is_a? File
|
39
|
+
response_record result
|
40
|
+
end
|
41
|
+
|
42
|
+
# Retrieve a PhaxCode.
|
43
|
+
# @param params [Hash]
|
44
|
+
# A hash of parameters to send to Phaxio.
|
45
|
+
# - *identifier* [String] - The identifier for the PhaxCode you want to get. If blank, the
|
46
|
+
# default PhaxCode will be returned.
|
47
|
+
# - *type* [String] - If set to "png", this method will return a PNG file instead of a
|
48
|
+
# PhaxCode object.
|
49
|
+
# @return [Phaxio::Resources::PhaxCode | File]
|
50
|
+
# @raise [Phaxio::Error::PhaxioError]
|
51
|
+
# @see https://www.phaxio.com/docs/api/v2/phaxcodes/retrieve_phax_code
|
52
|
+
def get params = {}
|
53
|
+
identifier = params[:identifier] || params['identifier']
|
54
|
+
endpoint = case (identifier)
|
55
|
+
when nil then default_phax_code_path
|
56
|
+
else phax_code_endpoint(identifier)
|
57
|
+
end
|
58
|
+
endpoint = case (params[:type] || params['type']).to_s
|
59
|
+
when 'png' then "#{endpoint}.png"
|
60
|
+
else endpoint
|
61
|
+
end
|
62
|
+
result = Client.request :get, endpoint, {}
|
63
|
+
return result if result.is_a? File
|
64
|
+
response_record result
|
65
|
+
end
|
66
|
+
alias :find :get
|
67
|
+
alias :retrieve :get
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def phax_codes_endpoint
|
72
|
+
PHAX_CODES_PATH
|
73
|
+
end
|
74
|
+
|
75
|
+
def phax_codes_endpoint_png
|
76
|
+
"#{phax_codes_endpoint}.png"
|
77
|
+
end
|
78
|
+
|
79
|
+
def phax_code_endpoint(identifier)
|
80
|
+
"#{phax_codes_endpoint}/#{identifier}"
|
81
|
+
end
|
82
|
+
|
83
|
+
def default_phax_code_path
|
84
|
+
DEFAULT_PHAX_CODE_PATH
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
module Phaxio
|
2
|
+
module Resources
|
3
|
+
# Provides functionality for viewing and managing phone numbers.
|
4
|
+
class PhoneNumber < Resource
|
5
|
+
PHONE_NUMBERS_PATH = 'phone_numbers'.freeze
|
6
|
+
private_constant :PHONE_NUMBERS_PATH
|
7
|
+
|
8
|
+
# @return [String] The phone number itself, in E.164 format.
|
9
|
+
# @!attribute phone_number
|
10
|
+
|
11
|
+
# @return [String] The city associated with the phone number.
|
12
|
+
# @!attribute city
|
13
|
+
|
14
|
+
# @return [String] The state associated with the phone number.
|
15
|
+
# @!attribute state
|
16
|
+
|
17
|
+
# @return [String] The country associated with the phone number.
|
18
|
+
# @!attribute country
|
19
|
+
|
20
|
+
# @return [Integer] The cost of the phone number in cents.
|
21
|
+
# @!attribute cost
|
22
|
+
|
23
|
+
# @return [String] The callback URL associated with the phone number.
|
24
|
+
# @!attribute callback_url
|
25
|
+
|
26
|
+
has_normal_attributes %w(phone_number city state country cost callback_url)
|
27
|
+
|
28
|
+
# @return [Time] The time at which the phone number was provisioned.
|
29
|
+
# @!attribute provisioned_at
|
30
|
+
|
31
|
+
# @return [Time] The last time the phone number was billed.
|
32
|
+
# @!attribute last_billed_at
|
33
|
+
|
34
|
+
has_time_attributes %w(provisioned_at last_billed_at)
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
class << self
|
39
|
+
# Provision a new phone number.
|
40
|
+
# @param params [Hash]
|
41
|
+
# A hash of parameters to send to Phaxio:
|
42
|
+
# - *country_code* [Integer] - The country code (E.164) of the number you'd like to provision.
|
43
|
+
# - *area_code* [Integer] - The area code of the number you'd like to provision.
|
44
|
+
# - *callback_url* [String] - A callback URL that we'll post to when a fax is received by this number. This will override the global receive callback URL, if you have one specified.
|
45
|
+
# @return [Phaxio::Resources::PhoneNumber] The newly provisioned number.
|
46
|
+
# @raise [Phaxio::Error::PhaxioError]
|
47
|
+
# @see https://www.phaxio.com/docs/api/v2/phone_numbers/provision
|
48
|
+
def create params = {}
|
49
|
+
response = Client.request :post, phone_numbers_endpoint, params
|
50
|
+
response_record response
|
51
|
+
end
|
52
|
+
alias :provision :create
|
53
|
+
|
54
|
+
# Get information about a specific phone number.
|
55
|
+
# @param phone_number [String]
|
56
|
+
# The phone number itself, in E.164 format, which you want to get information about.
|
57
|
+
# @param params [Hash]
|
58
|
+
# A hash of parameters to send to Phaxio. This action has no unique parameters.
|
59
|
+
# @return [Phaxio::Resources::PhoneNumber] The requested number.
|
60
|
+
# @raise [Phaxio::Error::PhaxioError]
|
61
|
+
# @see https://www.phaxio.com/docs/api/v2/phone_numbers/get_number
|
62
|
+
def get phone_number, params = {}
|
63
|
+
response = Client.request :get, phone_number_endpoint(phone_number), params
|
64
|
+
response_record response
|
65
|
+
end
|
66
|
+
alias :find :get
|
67
|
+
alias :retrieve :get
|
68
|
+
|
69
|
+
# @macro paging
|
70
|
+
# Get a list of phone numbers that you currently own on Phaxio.
|
71
|
+
# @param params [Hash]
|
72
|
+
# A hash of parameters to send to Phaxio.
|
73
|
+
# - *country_code* [Integer] - An E.164 country code that you'd like to filter by.
|
74
|
+
# - *area_code* [Integer] - An area code that you'd like to filter by. If an area code is
|
75
|
+
# specified, then *country_code* is required.
|
76
|
+
# @return [Phaxio::Resource::Collection<Phaxio::Resources::PhoneNumber>]
|
77
|
+
# A collection of phone numbers.
|
78
|
+
# @raise [Phaxio::Error::PhaxioError]
|
79
|
+
# @see https://www.phaxio.com/docs/api/v2/phone_numbers/list
|
80
|
+
def list params = {}
|
81
|
+
response = Client.request :get, phone_numbers_endpoint, params
|
82
|
+
response_collection response
|
83
|
+
end
|
84
|
+
|
85
|
+
# Release a phone number that you no longer need. Once a phone number is released you will
|
86
|
+
# no longer be charged for it.
|
87
|
+
# @param phone_number [String]
|
88
|
+
# The phone number itself, in E.164 format, which you want to release.
|
89
|
+
# @param params [Hash]
|
90
|
+
# A hash of parameters to send to Phaxio. This action has no unique parameters.
|
91
|
+
# @return true
|
92
|
+
# @raise [Phaxio::Error::PhaxioError]
|
93
|
+
# @see https://www.phaxio.com/docs/api/v2/phone_numbers/release
|
94
|
+
def delete phone_number, params = {}
|
95
|
+
Client.request :delete, phone_number_endpoint(phone_number), params
|
96
|
+
true
|
97
|
+
end
|
98
|
+
alias :release :delete
|
99
|
+
|
100
|
+
private
|
101
|
+
|
102
|
+
def phone_numbers_endpoint
|
103
|
+
PHONE_NUMBERS_PATH
|
104
|
+
end
|
105
|
+
|
106
|
+
def phone_number_endpoint phone_number
|
107
|
+
"#{phone_numbers_endpoint}/#{phone_number}"
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Phaxio
|
2
|
+
module Resources
|
3
|
+
module Public
|
4
|
+
# Information about area codes for provisioning numbers.
|
5
|
+
#
|
6
|
+
# @see Phaxio::Resources::PhoneNumber.list_available_area_codes
|
7
|
+
class AreaCode < Resource
|
8
|
+
AVAILABLE_AREA_CODES_PATH = 'public/area_codes'.freeze
|
9
|
+
private_constant :AVAILABLE_AREA_CODES_PATH
|
10
|
+
|
11
|
+
# @return [Integer] The country code associated with this area code.
|
12
|
+
# @!attribute country_code
|
13
|
+
|
14
|
+
# @return [Integer] The actual area code.
|
15
|
+
# @!attribute area_code
|
16
|
+
|
17
|
+
# @return [String] The city associated with this area code.
|
18
|
+
# @!attribute city
|
19
|
+
|
20
|
+
# @return [String] The state associated with this area code.
|
21
|
+
# @!attribute state
|
22
|
+
|
23
|
+
# @return [String] The country associated with this area code.
|
24
|
+
# @!attribute country
|
25
|
+
|
26
|
+
# @return [true | false] Indicates whether this area code is toll free.
|
27
|
+
# @!attribute toll_free
|
28
|
+
|
29
|
+
has_normal_attributes %w[country_code area_code city state country toll_free]
|
30
|
+
|
31
|
+
class << self
|
32
|
+
# @macro paging
|
33
|
+
# Displays a list of area codes available for purchasing Phaxio numbers. This operation
|
34
|
+
# requires no authentication and can be used without passing an API key.
|
35
|
+
# @param params [Hash]
|
36
|
+
# A hash of parameters to send to Phaxio.
|
37
|
+
# - *toll_free* [true|false] - If set to *true*, only toll free area codes will be
|
38
|
+
# returned. If specified and set to *false*, only non-toll free area codes will be
|
39
|
+
# returned.
|
40
|
+
# - *country_code* [Integer] - An E.164 country code you'd like to filter by.
|
41
|
+
# - *country* [String] - A two character country abbreviation (ISO 3166; e.g. "US" or
|
42
|
+
# "CA") you'd like to filter by.
|
43
|
+
# - *state* [String] - A two character state or province abbreviation (ISO 3166; e.g.
|
44
|
+
# "IL" or "YT") you'd like to filter by. When using this parameter, *country_code* or
|
45
|
+
# *country* must also be provided.
|
46
|
+
# @return [Phaxio::Resource::Collection<Phaxio::Resources::AreaCode>] A collection of
|
47
|
+
# AreaCode objects.
|
48
|
+
# @raise [Phaxio::Error::PhaxioError]
|
49
|
+
# @see https://www.phaxio.com/docs/api/v2/public/list_area_codes
|
50
|
+
def list params = {}
|
51
|
+
response = Client.request :get, available_area_codes_endpoint, params
|
52
|
+
AreaCode.response_collection response
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def available_area_codes_endpoint
|
58
|
+
AVAILABLE_AREA_CODES_PATH
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Phaxio
|
2
|
+
module Resources
|
3
|
+
module Public
|
4
|
+
class Country < Resource
|
5
|
+
SUPPORTED_COUNTRIES_PATH = 'public/countries'.freeze
|
6
|
+
private_constant :SUPPORTED_COUNTRIES_PATH
|
7
|
+
|
8
|
+
# @return [String] the name of the country.
|
9
|
+
# @!attribute name
|
10
|
+
|
11
|
+
# @return [String] the alpha2 representation of the country.
|
12
|
+
# @!attribute alpha2
|
13
|
+
|
14
|
+
# @return [Integer] the E.164 country code for the country.
|
15
|
+
# @!attribute country_code
|
16
|
+
|
17
|
+
# @return [Integer] the price per page for the country, in cents.
|
18
|
+
# @!attribute price_per_page
|
19
|
+
|
20
|
+
# @return [String] the level of send support provided for this country.
|
21
|
+
# @!attribute send_support
|
22
|
+
|
23
|
+
# @return [String] the level of receive support provided for this country.
|
24
|
+
# @!attribute receive_support
|
25
|
+
|
26
|
+
has_normal_attributes %w[
|
27
|
+
name alpha2 country_code price_per_page send_support receive_support
|
28
|
+
]
|
29
|
+
|
30
|
+
class << self
|
31
|
+
# @macro paging
|
32
|
+
# Get a list of supported countries for sending faxes.
|
33
|
+
# @param params [Hash]
|
34
|
+
# A hash of parameters to send to Phaxio. This action has no unique
|
35
|
+
# parameters.
|
36
|
+
# @return [Phaxio::Resource::Collection<Phaxio::Resources::Country>]
|
37
|
+
# A collection of supported countries.
|
38
|
+
# @raise Phaxio::Error::PhaxioError
|
39
|
+
# @see https://www.phaxio.com/docs/api/v2/public/list_countries
|
40
|
+
def list params = {}
|
41
|
+
response = Client.request :get, supported_countries_endpoint, params
|
42
|
+
Country.response_collection response
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def supported_countries_endpoint
|
48
|
+
SUPPORTED_COUNTRIES_PATH
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/lib/phaxio/version.rb
CHANGED
data/phaxio.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
require File.expand_path('../lib/phaxio/version', __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
|
-
gem.authors = ["
|
6
|
-
gem.email = ["
|
7
|
-
gem.description = %q{
|
8
|
-
gem.summary = %q{
|
9
|
-
gem.homepage = "
|
5
|
+
gem.authors = ["Julien Negrotto"]
|
6
|
+
gem.email = ["julien@phaxio.com"]
|
7
|
+
gem.description = %q{Official ruby gem for interacting with Phaxio's API.}
|
8
|
+
gem.summary = %q{Official ruby gem for interacting with Phaxio's API.}
|
9
|
+
gem.homepage = "https://github.com/phaxio/phaxio-ruby"
|
10
10
|
|
11
11
|
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
12
12
|
gem.files = `git ls-files`.split("\n")
|
@@ -15,11 +15,8 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = Phaxio::VERSION
|
17
17
|
|
18
|
-
gem.
|
19
|
-
|
20
|
-
gem.
|
21
|
-
gem.
|
22
|
-
gem.add_development_dependency 'rake', '~> 10'
|
23
|
-
gem.add_development_dependency 'minitest', '~> 5'
|
24
|
-
gem.add_development_dependency 'mocha', '~> 1.1'
|
18
|
+
gem.required_ruby_version = '>= 2.0'
|
19
|
+
gem.add_dependency 'faraday', '~> 0.10'
|
20
|
+
gem.add_dependency 'mime-types', '~> 3.0'
|
21
|
+
gem.add_dependency 'activesupport'
|
25
22
|
end
|
data/spec/client_spec.rb
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Phaxio::Client do
|
4
|
+
subject(:client) { Phaxio::Client }
|
5
|
+
let(:test_connection) { instance_double Faraday::Connection }
|
6
|
+
|
7
|
+
before do
|
8
|
+
allow(client).to receive(:conn) { test_connection }
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_response status_code, message: 'This is a test.'
|
12
|
+
success = (200..299).include? status_code
|
13
|
+
instance_double(
|
14
|
+
Faraday::Response,
|
15
|
+
status: status_code,
|
16
|
+
success?: success,
|
17
|
+
headers: {content_type: 'application/json'},
|
18
|
+
body: %Q({"success": #{success}, "message": "#{message}", "data": {"foo": "bar"}})
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'making a request' do
|
23
|
+
it 'sends the request to Phaxio' do
|
24
|
+
endpoint = 'public/countries/'
|
25
|
+
params = {page: 1, per_page: 10}
|
26
|
+
expect(test_connection).to receive(:get) do |request_endpoint, request_params|
|
27
|
+
expect(request_endpoint).to eq(endpoint)
|
28
|
+
expect(request_params[:page]).to eq(params[:page])
|
29
|
+
expect(request_params[:per_page]).to eq(params[:per_page])
|
30
|
+
test_response 200
|
31
|
+
end
|
32
|
+
client.request :get, endpoint, params
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'uses the configured API key and secret by default' do
|
36
|
+
expect(test_connection).to receive(:get) do |_endpoint, request_params|
|
37
|
+
expect(request_params[:api_key]).to eq(Phaxio.api_key)
|
38
|
+
expect(request_params[:api_secret]).to eq(Phaxio.api_secret)
|
39
|
+
test_response 200
|
40
|
+
end
|
41
|
+
client.request :get, 'test'
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'uses the api key specified in the params hash' do
|
45
|
+
custom_api_key = 'custom-api-key'
|
46
|
+
custom_api_secret = 'custom-api-secret'
|
47
|
+
expect(test_connection).to receive(:get) do |_endpoint, request_params|
|
48
|
+
expect(request_params[:api_key]).to eq(custom_api_key)
|
49
|
+
expect(request_params[:api_secret]).to eq(custom_api_secret)
|
50
|
+
test_response 200
|
51
|
+
end
|
52
|
+
client.request :get, 'test', api_key: custom_api_key, api_secret: custom_api_secret
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'parses the response JSON and returns the data if the response indicates success' do
|
56
|
+
expect(test_connection).to receive(:get) { test_response 200 }
|
57
|
+
result = client.request :get, 'test'
|
58
|
+
expect(result).to eq({'foo' => 'bar'})
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'raises an authentication error if the response status is 401' do
|
62
|
+
expect(test_connection).to receive(:get) { test_response 401 }
|
63
|
+
expect {
|
64
|
+
client.request :get, 'test'
|
65
|
+
}.to raise_error(Phaxio::Error::AuthenticationError, '401: This is a test.')
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'raises a not found error if the response status is 404' do
|
69
|
+
expect(test_connection).to receive(:get) { test_response 404 }
|
70
|
+
expect do
|
71
|
+
client.request :get, 'test'
|
72
|
+
end.to raise_error(Phaxio::Error::NotFoundError, '404: This is a test.')
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'raises an invalid request error if the response status is 422' do
|
76
|
+
expect(test_connection).to receive(:get) { test_response 422 }
|
77
|
+
expect {
|
78
|
+
client.request :get, 'test'
|
79
|
+
}.to raise_error(Phaxio::Error::InvalidRequestError, '422: This is a test.')
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'raises a rate limit error if the response status is 429' do
|
83
|
+
expect(test_connection).to receive(:get) { test_response 429 }
|
84
|
+
expect {
|
85
|
+
client.request :get, 'test'
|
86
|
+
}.to raise_error(Phaxio::Error::RateLimitExceededError, '429: This is a test.')
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'raises a general error for if the response status is 5XX' do
|
90
|
+
expect(test_connection).to receive(:get) { test_response 500 }
|
91
|
+
expect {
|
92
|
+
client.request :get, 'test'
|
93
|
+
}.to raise_error(Phaxio::Error::GeneralError, '500: This is a test.')
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'raises a general error if the response status is some other value' do
|
97
|
+
expect(test_connection).to receive(:get) { test_response 418 }
|
98
|
+
expect {
|
99
|
+
client.request :get, 'test'
|
100
|
+
}.to raise_error(Phaxio::Error::GeneralError, '418: This is a test.')
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'raises an API connection error if a networking issue occurs' do
|
104
|
+
expect(test_connection).to receive(:get) { raise Faraday::ConnectionFailed, 'This is a test.' }
|
105
|
+
expect {
|
106
|
+
client.request :get, 'test'
|
107
|
+
}.to raise_error(Phaxio::Error::ApiConnectionError, 'Error communicating with Phaxio: This is a test.')
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'allows unknown errors to bubble up' do
|
111
|
+
expect(test_connection).to receive(:get) { raise RuntimeError, 'This is a test.' }
|
112
|
+
expect {
|
113
|
+
client.request :get, 'test'
|
114
|
+
}.to raise_error(RuntimeError, 'This is a test.')
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'raises a general error if the status indicates success but the body indicates failure' do
|
118
|
+
expect(test_connection).to receive(:get) do
|
119
|
+
instance_double(
|
120
|
+
Faraday::Response,
|
121
|
+
status: 200,
|
122
|
+
success?: true,
|
123
|
+
headers: {content_type: 'application/json'},
|
124
|
+
body: '{"success": false, "message": "Something bad happened.", "data": {"foo": "bar"}}'
|
125
|
+
)
|
126
|
+
end
|
127
|
+
expect {
|
128
|
+
client.request :get, 'test'
|
129
|
+
}.to raise_error(Phaxio::Error::GeneralError, "Something bad happened.")
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|