spark_api 1.4.34 → 1.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/VERSION +1 -1
- data/lib/spark_api/authentication/api_auth.rb +5 -3
- data/lib/spark_api/authentication/oauth2.rb +2 -1
- data/lib/spark_api/authentication/oauth2_impl/grant_type_base.rb +1 -1
- data/lib/spark_api/client.rb +2 -2
- data/lib/spark_api/models/media.rb +30 -0
- data/lib/spark_api/models/video.rb +108 -0
- data/lib/spark_api/models/virtual_tour.rb +16 -0
- data/lib/spark_api/models.rb +1 -0
- data/lib/spark_api/request.rb +17 -1
- data/lib/spark_api.rb +1 -0
- data/spec/spec_helper.rb +9 -4
- data/spec/unit/spark_api/authentication/api_auth_spec.rb +40 -22
- data/spec/unit/spark_api/authentication/base_auth_spec.rb +3 -3
- data/spec/unit/spark_api/authentication/oauth2_impl/faraday_middleware_spec.rb +1 -1
- data/spec/unit/spark_api/authentication/oauth2_impl/grant_type_base_spec.rb +1 -1
- data/spec/unit/spark_api/authentication/oauth2_impl/single_session_provider_spec.rb +2 -2
- data/spec/unit/spark_api/authentication/oauth2_spec.rb +58 -40
- data/spec/unit/spark_api/authentication_spec.rb +2 -2
- data/spec/unit/spark_api/configuration/yaml_spec.rb +44 -44
- data/spec/unit/spark_api/configuration_spec.rb +56 -57
- data/spec/unit/spark_api/faraday_middleware_spec.rb +12 -12
- data/spec/unit/spark_api/models/account_spec.rb +20 -20
- data/spec/unit/spark_api/models/activity_spec.rb +5 -5
- data/spec/unit/spark_api/models/base_spec.rb +32 -32
- data/spec/unit/spark_api/models/concerns/destroyable_spec.rb +2 -2
- data/spec/unit/spark_api/models/concerns/savable_spec.rb +19 -19
- data/spec/unit/spark_api/models/connect_prefs_spec.rb +1 -1
- data/spec/unit/spark_api/models/constraint_spec.rb +1 -1
- data/spec/unit/spark_api/models/contact_spec.rb +50 -50
- data/spec/unit/spark_api/models/dirty_spec.rb +12 -12
- data/spec/unit/spark_api/models/document_spec.rb +3 -3
- data/spec/unit/spark_api/models/fields_spec.rb +17 -17
- data/spec/unit/spark_api/models/finders_spec.rb +7 -7
- data/spec/unit/spark_api/models/floplan_spec.rb +4 -4
- data/spec/unit/spark_api/models/listing_cart_spec.rb +46 -46
- data/spec/unit/spark_api/models/listing_meta_translations_spec.rb +6 -6
- data/spec/unit/spark_api/models/listing_spec.rb +91 -91
- data/spec/unit/spark_api/models/message_spec.rb +10 -10
- data/spec/unit/spark_api/models/note_spec.rb +10 -10
- data/spec/unit/spark_api/models/notification_spec.rb +6 -6
- data/spec/unit/spark_api/models/open_house_spec.rb +4 -4
- data/spec/unit/spark_api/models/photo_spec.rb +8 -8
- data/spec/unit/spark_api/models/portal_spec.rb +4 -4
- data/spec/unit/spark_api/models/property_types_spec.rb +5 -5
- data/spec/unit/spark_api/models/rental_calendar_spec.rb +13 -11
- data/spec/unit/spark_api/models/rule_spec.rb +2 -2
- data/spec/unit/spark_api/models/saved_search_spec.rb +33 -33
- data/spec/unit/spark_api/models/search_template/quick_search_spec.rb +5 -5
- data/spec/unit/spark_api/models/shared_listing_spec.rb +12 -12
- data/spec/unit/spark_api/models/sort_spec.rb +3 -3
- data/spec/unit/spark_api/models/standard_fields_spec.rb +12 -12
- data/spec/unit/spark_api/models/subresource_spec.rb +18 -18
- data/spec/unit/spark_api/models/system_info_spec.rb +7 -7
- data/spec/unit/spark_api/models/tour_of_home_spec.rb +3 -3
- data/spec/unit/spark_api/models/video_spec.rb +9 -9
- data/spec/unit/spark_api/models/virtual_tour_spec.rb +7 -7
- data/spec/unit/spark_api/models/vow_account_spec.rb +8 -8
- data/spec/unit/spark_api/multi_client_spec.rb +14 -14
- data/spec/unit/spark_api/options_hash_spec.rb +4 -4
- data/spec/unit/spark_api/paginate_spec.rb +71 -71
- data/spec/unit/spark_api/primary_array_spec.rb +5 -5
- data/spec/unit/spark_api/request_spec.rb +79 -63
- data/spec/unit/spark_api_spec.rb +6 -6
- metadata +178 -248
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a99d333efb4d06b28966e72fde3baa3b0576ca30249baa555a1dbb613616d78
|
4
|
+
data.tar.gz: 9b83e6b6d097af7a0bd559121ab9bc702154d1a8afd39f2f9c59474946436c48
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 51f1a951daccd3cabed8ffb0fd3abbf3c7f0b2be7bdd55453e8a806341f0a4c06c0f5073cf5f2c1b07d3dcdd4bd265274d2441b91e268414eba4b52b01e72c51
|
7
|
+
data.tar.gz: 12b0fabf1ab8dab5d8871b4176ec6c2ec4b094a7713ab29e34f1c37f14a67e4aad69bb212a2bf94ff8d9d53298062010d13067054841a96b96a43bf268ff42b6
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Spark API
|
2
2
|
=====================
|
3
|
-
|
3
|
+
 
|
4
4
|
|
5
5
|
A Ruby wrapper for the Spark REST API. Loosely based on ActiveResource to provide models to interact with remote services.
|
6
6
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.5.3
|
@@ -62,7 +62,9 @@ module SparkApi
|
|
62
62
|
|
63
63
|
# Perform an HTTP request (no data)
|
64
64
|
def request(method, path, body, options)
|
65
|
-
escaped_path = URI.escape(path)
|
65
|
+
escaped_path = Addressable::URI.escape(path)
|
66
|
+
connection = @client.connection
|
67
|
+
connection.headers.merge!(options.delete(:override_headers) || {})
|
66
68
|
request_opts = {
|
67
69
|
:AuthToken => @session.auth_token
|
68
70
|
}
|
@@ -76,10 +78,10 @@ module SparkApi
|
|
76
78
|
request_path = "#{escaped_path}?#{build_url_parameters({"ApiSig"=>sig}.merge(request_opts))}"
|
77
79
|
SparkApi.logger.debug { "Request: #{request_path}" }
|
78
80
|
if body.nil?
|
79
|
-
response =
|
81
|
+
response = connection.send(method, request_path)
|
80
82
|
else
|
81
83
|
SparkApi.logger.debug { "Data: #{body}" }
|
82
|
-
response =
|
84
|
+
response = connection.send(method, request_path, body)
|
83
85
|
end
|
84
86
|
response
|
85
87
|
end
|
@@ -40,8 +40,9 @@ module SparkApi
|
|
40
40
|
|
41
41
|
# Perform an HTTP request (no data)
|
42
42
|
def request(method, path, body, options={})
|
43
|
-
escaped_path = URI.escape(path)
|
43
|
+
escaped_path = Addressable::URI.escape(path)
|
44
44
|
connection = @client.connection(true) # SSL Only!
|
45
|
+
connection.headers.merge!(options.delete(:override_headers) || {})
|
45
46
|
connection.headers.merge!(self.auth_header)
|
46
47
|
|
47
48
|
unless (@client.api_user.nil? || options[:ApiUser])
|
@@ -45,7 +45,7 @@ module SparkApi
|
|
45
45
|
response.expires_in = provider.session_timeout if response.expires_in.nil?
|
46
46
|
SparkApi.logger.debug { "[oauth2] New session created #{response}" }
|
47
47
|
response
|
48
|
-
rescue Faraday::
|
48
|
+
rescue Faraday::ConnectionFailed => e
|
49
49
|
if @client.ssl_verify && e.message =~ /certificate verify failed/
|
50
50
|
SparkApi.logger.error { SparkApi::Errors.ssl_verification_error }
|
51
51
|
end
|
data/lib/spark_api/client.rb
CHANGED
@@ -2,7 +2,7 @@ module SparkApi
|
|
2
2
|
# =API Client
|
3
3
|
# Main class to setup and run requests on the API. A default client is accessible globally as
|
4
4
|
# SparkApi::client if the global configuration has been set as well. Otherwise, this class may
|
5
|
-
# be
|
5
|
+
# be instantiated separately with the configuration information.
|
6
6
|
class Client
|
7
7
|
include Connection
|
8
8
|
include Authentication
|
@@ -21,7 +21,7 @@ module SparkApi
|
|
21
21
|
Configuration::VALID_OPTION_KEYS.each do |key|
|
22
22
|
send("#{key}=", options[key])
|
23
23
|
end
|
24
|
-
#
|
24
|
+
# Instantiate the authentication class passed in.
|
25
25
|
@authenticator = authentication_mode.send("new", self)
|
26
26
|
end
|
27
27
|
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module SparkApi
|
2
|
+
module Models
|
3
|
+
module Media
|
4
|
+
# This module is effectively an interface and helper to combine common media
|
5
|
+
# actions and information. Media types (videos, virtual tours, etc)
|
6
|
+
# should include this module and implement the methods contained
|
7
|
+
|
8
|
+
def url
|
9
|
+
raise "Not Implemented"
|
10
|
+
end
|
11
|
+
|
12
|
+
def description
|
13
|
+
raise "Not Implemented"
|
14
|
+
end
|
15
|
+
|
16
|
+
def private?
|
17
|
+
attributes['Privacy'] == 'Private'
|
18
|
+
end
|
19
|
+
|
20
|
+
def public?
|
21
|
+
attributes['Privacy'] == 'Public'
|
22
|
+
end
|
23
|
+
|
24
|
+
def automatic?
|
25
|
+
attributes['Privacy'] == 'Automatic'
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -1,7 +1,12 @@
|
|
1
|
+
require 'net/http'
|
1
2
|
module SparkApi
|
2
3
|
module Models
|
3
4
|
class Video < Base
|
4
5
|
extend Subresource
|
6
|
+
include Media
|
7
|
+
include Concerns::Savable,
|
8
|
+
Concerns::Destroyable
|
9
|
+
|
5
10
|
self.element_name = 'videos'
|
6
11
|
|
7
12
|
def branded?
|
@@ -11,6 +16,109 @@ module SparkApi
|
|
11
16
|
def unbranded?
|
12
17
|
attributes['Type'] == 'unbranded'
|
13
18
|
end
|
19
|
+
|
20
|
+
def url
|
21
|
+
attributes['ObjectHtml']
|
22
|
+
end
|
23
|
+
|
24
|
+
def description
|
25
|
+
attributes['Name']
|
26
|
+
end
|
27
|
+
|
28
|
+
# Some youtube URLS are youtu.be instead of youtube
|
29
|
+
SUPPORTED_VIDEO_TYPES = %w[vimeo youtu].freeze
|
30
|
+
|
31
|
+
def is_supported_type?
|
32
|
+
# Unfortunately there are so many formats of vimeo videos that we canot support all vimeo videos
|
33
|
+
# Therefore, we need to do a little more checking here and validate that we can get video codes out of the urls
|
34
|
+
(self.ObjectHtml.include?('youtu') && youtube_video_code.present?) || (self.ObjectHtml.include?('vimeo') && vimeo_video_code.present?)
|
35
|
+
end
|
36
|
+
|
37
|
+
def is_valid_iframe?
|
38
|
+
self.ObjectHtml.include?('<iframe') && self.ObjectHtml.include?('</iframe>')
|
39
|
+
end
|
40
|
+
|
41
|
+
# gets the thumbnail to be shown on supported (Vimeo and Youtube) videos
|
42
|
+
# YouTube provides a predictable url for each video's images
|
43
|
+
# for Vimeo, a get request is necessary
|
44
|
+
def display_image
|
45
|
+
url = self.video_link
|
46
|
+
if url
|
47
|
+
if(url.include?('youtube'))
|
48
|
+
youtube_thumbnail_url
|
49
|
+
else
|
50
|
+
vimeo_thumbnail_url
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def video_link
|
56
|
+
return nil unless is_supported_type?
|
57
|
+
|
58
|
+
if self.ObjectHtml.include?('youtu')
|
59
|
+
youtube_link
|
60
|
+
elsif self.ObjectHtml.include?('vimeo')
|
61
|
+
vimeo_link
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def vimeo_video_code
|
68
|
+
html = self.ObjectHtml
|
69
|
+
if html.match(/(src=)('|")((https:)?\/\/player\.vimeo\.com\/video\/)/)
|
70
|
+
new_url = html.split(/(src=')|(src=")/)
|
71
|
+
if new_url[2]
|
72
|
+
html = new_url[2].split(/("|')/)[0]
|
73
|
+
end
|
74
|
+
end
|
75
|
+
if html.match(/(?:.+?)?(player\.vimeo\.com|vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/([^\/]*)\/videos\/|album\/(\d+)\/video\/|)(\d+)(?:$|\/|\?))/)
|
76
|
+
code = html.split('/').last.split('?').first
|
77
|
+
# Vimeo Ids are always numerical
|
78
|
+
code.to_i.to_s === code ? code : nil
|
79
|
+
else
|
80
|
+
nil
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# This if correctly embedded by the user is an embed
|
85
|
+
# If not, it could be pretty much anything
|
86
|
+
def youtube_video_code
|
87
|
+
html = self.ObjectHtml
|
88
|
+
if html.match(/(?:.+?)?(?:\/v\/|watch\/|\?v=|\&v=|youtu\.be\/|\/v=|^youtu\.be\/|embed\/|watch\%3Fv\%3D)([a-zA-Z0-9_-]{11})/) || html.match(/(iframe)(.*)(src=)('|")(https:\/\/www\.youtube\.com\/embed)/)
|
89
|
+
html.split(/([a-zA-Z0-9_-]{11})/)[1]
|
90
|
+
else
|
91
|
+
nil
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def youtube_link
|
96
|
+
normalize_youtube_url
|
97
|
+
code = youtube_video_code
|
98
|
+
code ? "https://www.youtube.com/watch?v=#{code}" : nil
|
99
|
+
end
|
100
|
+
|
101
|
+
def vimeo_link
|
102
|
+
code = vimeo_video_code
|
103
|
+
code ? "https://vimeo.com/#{code}" : nil
|
104
|
+
end
|
105
|
+
|
106
|
+
def youtube_thumbnail_url
|
107
|
+
code = youtube_video_code
|
108
|
+
code ? "https://i1.ytimg.com/vi/#{code}/hqdefault.jpg" : nil
|
109
|
+
end
|
110
|
+
|
111
|
+
def vimeo_thumbnail_url
|
112
|
+
# due to the rate limiting issue that surfaced shortly before launch,
|
113
|
+
# we will temporarily not return vimeo thumbnails until
|
114
|
+
# there is bandwidth to implement the solution in FLEX-9959
|
115
|
+
return nil
|
116
|
+
end
|
117
|
+
|
118
|
+
def normalize_youtube_url
|
119
|
+
self.ObjectHtml.sub!('-nocookie', '')
|
120
|
+
end
|
121
|
+
|
14
122
|
end
|
15
123
|
end
|
16
124
|
end
|
@@ -2,6 +2,10 @@ module SparkApi
|
|
2
2
|
module Models
|
3
3
|
class VirtualTour < Base
|
4
4
|
extend Subresource
|
5
|
+
include Media
|
6
|
+
include Concerns::Savable,
|
7
|
+
Concerns::Destroyable
|
8
|
+
|
5
9
|
self.element_name="virtualtours"
|
6
10
|
|
7
11
|
|
@@ -13,6 +17,18 @@ module SparkApi
|
|
13
17
|
attributes["Type"] == "unbranded"
|
14
18
|
end
|
15
19
|
|
20
|
+
def url
|
21
|
+
attributes['Uri']
|
22
|
+
end
|
23
|
+
|
24
|
+
def description
|
25
|
+
attributes['Name']
|
26
|
+
end
|
27
|
+
|
28
|
+
def display_image
|
29
|
+
# Currently we have no universally good mechanism to get images for virtual tours
|
30
|
+
return nil
|
31
|
+
end
|
16
32
|
end
|
17
33
|
end
|
18
34
|
end
|
data/lib/spark_api/models.rb
CHANGED
@@ -25,6 +25,7 @@ require 'spark_api/models/listing'
|
|
25
25
|
require 'spark_api/models/listing_cart'
|
26
26
|
require 'spark_api/models/listing_meta_translations'
|
27
27
|
require 'spark_api/models/market_statistics'
|
28
|
+
require 'spark_api/models/media'
|
28
29
|
require 'spark_api/models/message'
|
29
30
|
require 'spark_api/models/news_feed_meta'
|
30
31
|
require 'spark_api/models/newsfeed'
|
data/lib/spark_api/request.rb
CHANGED
@@ -61,6 +61,22 @@ module SparkApi
|
|
61
61
|
unless authenticated?
|
62
62
|
authenticate
|
63
63
|
end
|
64
|
+
|
65
|
+
# Allow use of the X-HTTP-Method-Override header to disguise excessively
|
66
|
+
# large GET/DELETE/HEAD requests as POST requests.
|
67
|
+
if options[:http_method_override]
|
68
|
+
options = options.clone
|
69
|
+
options.delete(:http_method_override)
|
70
|
+
body = URI.encode_www_form(options)
|
71
|
+
options = {
|
72
|
+
override_headers: {
|
73
|
+
"X-HTTP-Method-Override" => method.to_s.upcase,
|
74
|
+
"Content-Type" => "application/x-www-form-urlencoded"
|
75
|
+
}
|
76
|
+
}
|
77
|
+
method = :post
|
78
|
+
end
|
79
|
+
|
64
80
|
attempts = 0
|
65
81
|
begin
|
66
82
|
request_opts = {}
|
@@ -99,7 +115,7 @@ module SparkApi
|
|
99
115
|
else
|
100
116
|
return response.body
|
101
117
|
end
|
102
|
-
rescue Faraday::
|
118
|
+
rescue Faraday::ConnectionFailed => e
|
103
119
|
if self.ssl_verify && e.message =~ /certificate verify failed/
|
104
120
|
SparkApi.logger.error { SparkApi::Errors.ssl_verification_error }
|
105
121
|
end
|
data/lib/spark_api.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -11,7 +11,6 @@ end
|
|
11
11
|
|
12
12
|
require "rubygems"
|
13
13
|
require "rspec"
|
14
|
-
require 'rspec/autorun'
|
15
14
|
require 'webmock/rspec'
|
16
15
|
require "json"
|
17
16
|
require 'multi_json'
|
@@ -22,6 +21,13 @@ require path + '/spark_api'
|
|
22
21
|
|
23
22
|
require 'spark_api'
|
24
23
|
|
24
|
+
if ENV['COVERAGE'] == "on"
|
25
|
+
require 'simplecov'
|
26
|
+
require 'simplecov-rcov'
|
27
|
+
SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
|
28
|
+
SimpleCov.start { add_filter %w(/vendor /spec /test) }
|
29
|
+
end
|
30
|
+
|
25
31
|
FileUtils.mkdir 'log' unless File.exists? 'log'
|
26
32
|
|
27
33
|
module SparkApi
|
@@ -48,17 +54,16 @@ end
|
|
48
54
|
Dir[File.expand_path(File.join(File.dirname(__FILE__),'support','**','*.rb'))].each {|f| require f}
|
49
55
|
|
50
56
|
RSpec.configure do |config|
|
51
|
-
|
57
|
+
|
52
58
|
config.include WebMock::API
|
53
59
|
config.include StubApiRequests
|
54
60
|
|
55
|
-
config.treat_symbols_as_metadata_keys_with_true_values = true
|
56
61
|
config.alias_example_to :on_get_it, :method => 'GET'
|
57
62
|
config.alias_example_to :on_put_it, :method => 'PUT'
|
58
63
|
config.alias_example_to :on_post_it, :method => 'POST'
|
59
64
|
config.alias_example_to :on_delete_it, :method => 'DELETE'
|
60
65
|
config.before(:all) { reset_config }
|
61
|
-
config.
|
66
|
+
config.color = true
|
62
67
|
end
|
63
68
|
|
64
69
|
def jruby?
|
@@ -4,15 +4,14 @@ describe SparkApi::Authentication::ApiAuth do
|
|
4
4
|
subject {SparkApi::Authentication::ApiAuth.new(nil) }
|
5
5
|
describe "build_param_hash" do
|
6
6
|
it "should return a blank string when passed nil" do
|
7
|
-
subject.build_param_string(nil).
|
7
|
+
expect(subject.build_param_string(nil)).to be_empty
|
8
8
|
end
|
9
9
|
it "should return a correct param string for one item" do
|
10
|
-
subject.build_param_string({:foo => "bar"}).
|
10
|
+
expect(subject.build_param_string({:foo => "bar"})).to match("foobar")
|
11
11
|
end
|
12
12
|
it "should alphabatize the param names by key first, then by value" do
|
13
|
-
subject.build_param_string({:zoo => "zar", :ooo => "car"}).
|
14
|
-
subject.build_param_string({:Akey => "aValue", :aNotherkey => "AnotherValue"}).
|
15
|
-
match "AkeyaValueaNotherkeyAnotherValue"
|
13
|
+
expect(subject.build_param_string({:zoo => "zar", :ooo => "car"})).to match("ooocarzoozar")
|
14
|
+
expect(subject.build_param_string({:Akey => "aValue", :aNotherkey => "AnotherValue"})).to match("AkeyaValueaNotherkeyAnotherValue")
|
16
15
|
end
|
17
16
|
end
|
18
17
|
|
@@ -33,7 +32,7 @@ describe SparkApi::Authentication::ApiAuth do
|
|
33
32
|
stub_request(:post, "https://api.sparkapi.com/#{SparkApi.version}/session").
|
34
33
|
with(:query => {:ApiKey => "my_key", :ApiSig => "c731cf2455fbc7a4ef937b2301108d7a"}).
|
35
34
|
to_return(:body => fixture("authentication_failure.json"), :status=>401)
|
36
|
-
expect {subject.authenticate()}.to raise_error(SparkApi::ClientError){ |e| e.status.
|
35
|
+
expect {subject.authenticate()}.to raise_error(SparkApi::ClientError){ |e| expect(e.status).to eq(401) }
|
37
36
|
end
|
38
37
|
end
|
39
38
|
|
@@ -41,16 +40,16 @@ describe SparkApi::Authentication::ApiAuth do
|
|
41
40
|
let(:session) { Object.new }
|
42
41
|
it "should return true when session is active" do
|
43
42
|
subject.session = session
|
44
|
-
session.
|
45
|
-
subject.authenticated
|
43
|
+
allow(session).to receive(:expired?) { false }
|
44
|
+
expect(subject.authenticated?).to eq(true)
|
46
45
|
end
|
47
46
|
it "should return false when session is expired" do
|
48
47
|
subject.session = session
|
49
|
-
session.
|
50
|
-
subject.authenticated
|
48
|
+
allow(session).to receive(:expired?) { true }
|
49
|
+
expect(subject.authenticated?).to eq(false)
|
51
50
|
end
|
52
51
|
it "should return false when session is uninitialized" do
|
53
|
-
subject.authenticated
|
52
|
+
expect(subject.authenticated?).to eq(false)
|
54
53
|
end
|
55
54
|
end
|
56
55
|
|
@@ -61,14 +60,14 @@ describe SparkApi::Authentication::ApiAuth do
|
|
61
60
|
it "should logout when there is an active session" do
|
62
61
|
logged_out = false
|
63
62
|
subject.session = session
|
64
|
-
client.
|
63
|
+
allow(client).to receive(:delete).with("/session/1234") { logged_out = true }
|
65
64
|
subject.logout
|
66
|
-
subject.session.
|
67
|
-
logged_out.
|
65
|
+
expect(subject.session).to eq(nil)
|
66
|
+
expect(logged_out).to eq(true)
|
68
67
|
end
|
69
68
|
it "should skip logging out when there is no active session information" do
|
70
|
-
client.
|
71
|
-
subject.logout.
|
69
|
+
allow(client).to receive(:delete) { raise "Should not be called" }
|
70
|
+
expect(subject.logout).to eq(nil)
|
72
71
|
end
|
73
72
|
end
|
74
73
|
|
@@ -98,7 +97,7 @@ describe SparkApi::Authentication::ApiAuth do
|
|
98
97
|
:AuthToken => "1234"}.merge(args)).
|
99
98
|
to_return(:body => fixture("listings/no_subresources.json"))
|
100
99
|
subject.session = session
|
101
|
-
subject.request(:get, "/#{SparkApi.version}/listings", nil, args).status.
|
100
|
+
expect(subject.request(:get, "/#{SparkApi.version}/listings", nil, args).status).to eq(200)
|
102
101
|
end
|
103
102
|
it "should handle a post request" do
|
104
103
|
stub_auth_request
|
@@ -118,14 +117,33 @@ describe SparkApi::Authentication::ApiAuth do
|
|
118
117
|
}]}
|
119
118
|
}',
|
120
119
|
:status=>201)
|
121
|
-
subject.request(:post, "/#{SparkApi.version}/contacts", contact, args).status.
|
120
|
+
expect(subject.request(:post, "/#{SparkApi.version}/contacts", contact, args).status).to eq(201)
|
121
|
+
end
|
122
|
+
it "should incorporate any override_headers it is given while excluding them from the resulting request" do
|
123
|
+
stub_auth_request
|
124
|
+
args = {
|
125
|
+
override_headers: {
|
126
|
+
"Some-Header" => "Some-Value"
|
127
|
+
},
|
128
|
+
ApiUser: "foobar",
|
129
|
+
some_other_param: "some_other_value"
|
130
|
+
}
|
131
|
+
body = "somerequestbodytext"
|
132
|
+
stub_request(:post, "https://api.sparkapi.com/v1/someservice?ApiSig=856f5c036137c0cef5d4d223cd0f42be&ApiUser=foobar&AuthToken=1234&some_other_param=some_other_value").
|
133
|
+
with(body: "somerequestbodytext", headers: args[:override_headers]).
|
134
|
+
to_return(body: '{"D": {
|
135
|
+
"Success": true,
|
136
|
+
"Results": []
|
137
|
+
}',
|
138
|
+
status: 200)
|
139
|
+
expect(subject.request(:post, "/#{SparkApi.version}/someservice", body, args).status).to eq(200)
|
122
140
|
end
|
123
141
|
end
|
124
142
|
|
125
143
|
describe "sign" do
|
126
144
|
it "should sign the auth parameters correctly" do
|
127
145
|
sign_token = "my_secretApiKeymy_key"
|
128
|
-
subject.sign(sign_token).
|
146
|
+
expect(subject.sign(sign_token)).to eq("c731cf2455fbc7a4ef937b2301108d7a")
|
129
147
|
end
|
130
148
|
end
|
131
149
|
|
@@ -134,7 +152,7 @@ describe SparkApi::Authentication::ApiAuth do
|
|
134
152
|
subject {SparkApi::Authentication::ApiAuth.new(client) }
|
135
153
|
it "should fully sign the token" do
|
136
154
|
parms = {:AuthToken => "1234", :ApiUser => "CoolAsIce"}
|
137
|
-
subject.sign_token("/test", parms).
|
155
|
+
expect(subject.sign_token("/test", parms)).to eq("7bbe3384a8b64368357f8551cab271e3")
|
138
156
|
end
|
139
157
|
end
|
140
158
|
|
@@ -160,8 +178,8 @@ describe SparkApi::Authentication::ApiAuth do
|
|
160
178
|
to_return(:body => fixture('listings/with_documents.json'))
|
161
179
|
l = Listing.find('1234', :_expand => "Documents")
|
162
180
|
|
163
|
-
count.
|
164
|
-
SparkApi.client.session.expired
|
181
|
+
expect(count).to eq(2)
|
182
|
+
expect(SparkApi.client.session.expired?).to eq(false)
|
165
183
|
end
|
166
184
|
end
|
167
185
|
|