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.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/VERSION +1 -1
  4. data/lib/spark_api/authentication/api_auth.rb +5 -3
  5. data/lib/spark_api/authentication/oauth2.rb +2 -1
  6. data/lib/spark_api/authentication/oauth2_impl/grant_type_base.rb +1 -1
  7. data/lib/spark_api/client.rb +2 -2
  8. data/lib/spark_api/models/media.rb +30 -0
  9. data/lib/spark_api/models/video.rb +108 -0
  10. data/lib/spark_api/models/virtual_tour.rb +16 -0
  11. data/lib/spark_api/models.rb +1 -0
  12. data/lib/spark_api/request.rb +17 -1
  13. data/lib/spark_api.rb +1 -0
  14. data/spec/spec_helper.rb +9 -4
  15. data/spec/unit/spark_api/authentication/api_auth_spec.rb +40 -22
  16. data/spec/unit/spark_api/authentication/base_auth_spec.rb +3 -3
  17. data/spec/unit/spark_api/authentication/oauth2_impl/faraday_middleware_spec.rb +1 -1
  18. data/spec/unit/spark_api/authentication/oauth2_impl/grant_type_base_spec.rb +1 -1
  19. data/spec/unit/spark_api/authentication/oauth2_impl/single_session_provider_spec.rb +2 -2
  20. data/spec/unit/spark_api/authentication/oauth2_spec.rb +58 -40
  21. data/spec/unit/spark_api/authentication_spec.rb +2 -2
  22. data/spec/unit/spark_api/configuration/yaml_spec.rb +44 -44
  23. data/spec/unit/spark_api/configuration_spec.rb +56 -57
  24. data/spec/unit/spark_api/faraday_middleware_spec.rb +12 -12
  25. data/spec/unit/spark_api/models/account_spec.rb +20 -20
  26. data/spec/unit/spark_api/models/activity_spec.rb +5 -5
  27. data/spec/unit/spark_api/models/base_spec.rb +32 -32
  28. data/spec/unit/spark_api/models/concerns/destroyable_spec.rb +2 -2
  29. data/spec/unit/spark_api/models/concerns/savable_spec.rb +19 -19
  30. data/spec/unit/spark_api/models/connect_prefs_spec.rb +1 -1
  31. data/spec/unit/spark_api/models/constraint_spec.rb +1 -1
  32. data/spec/unit/spark_api/models/contact_spec.rb +50 -50
  33. data/spec/unit/spark_api/models/dirty_spec.rb +12 -12
  34. data/spec/unit/spark_api/models/document_spec.rb +3 -3
  35. data/spec/unit/spark_api/models/fields_spec.rb +17 -17
  36. data/spec/unit/spark_api/models/finders_spec.rb +7 -7
  37. data/spec/unit/spark_api/models/floplan_spec.rb +4 -4
  38. data/spec/unit/spark_api/models/listing_cart_spec.rb +46 -46
  39. data/spec/unit/spark_api/models/listing_meta_translations_spec.rb +6 -6
  40. data/spec/unit/spark_api/models/listing_spec.rb +91 -91
  41. data/spec/unit/spark_api/models/message_spec.rb +10 -10
  42. data/spec/unit/spark_api/models/note_spec.rb +10 -10
  43. data/spec/unit/spark_api/models/notification_spec.rb +6 -6
  44. data/spec/unit/spark_api/models/open_house_spec.rb +4 -4
  45. data/spec/unit/spark_api/models/photo_spec.rb +8 -8
  46. data/spec/unit/spark_api/models/portal_spec.rb +4 -4
  47. data/spec/unit/spark_api/models/property_types_spec.rb +5 -5
  48. data/spec/unit/spark_api/models/rental_calendar_spec.rb +13 -11
  49. data/spec/unit/spark_api/models/rule_spec.rb +2 -2
  50. data/spec/unit/spark_api/models/saved_search_spec.rb +33 -33
  51. data/spec/unit/spark_api/models/search_template/quick_search_spec.rb +5 -5
  52. data/spec/unit/spark_api/models/shared_listing_spec.rb +12 -12
  53. data/spec/unit/spark_api/models/sort_spec.rb +3 -3
  54. data/spec/unit/spark_api/models/standard_fields_spec.rb +12 -12
  55. data/spec/unit/spark_api/models/subresource_spec.rb +18 -18
  56. data/spec/unit/spark_api/models/system_info_spec.rb +7 -7
  57. data/spec/unit/spark_api/models/tour_of_home_spec.rb +3 -3
  58. data/spec/unit/spark_api/models/video_spec.rb +9 -9
  59. data/spec/unit/spark_api/models/virtual_tour_spec.rb +7 -7
  60. data/spec/unit/spark_api/models/vow_account_spec.rb +8 -8
  61. data/spec/unit/spark_api/multi_client_spec.rb +14 -14
  62. data/spec/unit/spark_api/options_hash_spec.rb +4 -4
  63. data/spec/unit/spark_api/paginate_spec.rb +71 -71
  64. data/spec/unit/spark_api/primary_array_spec.rb +5 -5
  65. data/spec/unit/spark_api/request_spec.rb +79 -63
  66. data/spec/unit/spark_api_spec.rb +6 -6
  67. metadata +178 -248
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d372159752425b341adabf6fe1bf0361d28e4c1674f09f553b9e911f6294ac24
4
- data.tar.gz: cad48a5f4871cb19982be6ba6fd01163957aaf4b552156066e7ed5ebe5581538
3
+ metadata.gz: 9a99d333efb4d06b28966e72fde3baa3b0576ca30249baa555a1dbb613616d78
4
+ data.tar.gz: 9b83e6b6d097af7a0bd559121ab9bc702154d1a8afd39f2f9c59474946436c48
5
5
  SHA512:
6
- metadata.gz: ea1807cfe81a706d50eb70a59a9e831720d69c46318a414dbf1e2c0bc0e75d31f289d6686a21644224efde694993bccff0d0659d0ac8bd873754c6ccf1802963
7
- data.tar.gz: 8a6a226f3883d1f2bc9cb60bdaddf328e2e027f7d26452c0a60299ddd2ac99045cb19d8b1e55c00a35b15d418361d28f2aecadd750508ab68612f3c0e435fb73
6
+ metadata.gz: 51f1a951daccd3cabed8ffb0fd3abbf3c7f0b2be7bdd55453e8a806341f0a4c06c0f5073cf5f2c1b07d3dcdd4bd265274d2441b91e268414eba4b52b01e72c51
7
+ data.tar.gz: 12b0fabf1ab8dab5d8871b4176ec6c2ec4b094a7713ab29e34f1c37f14a67e4aad69bb212a2bf94ff8d9d53298062010d13067054841a96b96a43bf268ff42b6
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  Spark API
2
2
  =====================
3
- [![Build Status](https://travis-ci.org/sparkapi/spark_api.png?branch=master)](http://travis-ci.org/sparkapi/spark_api) [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/sparkapi/spark_api)
3
+ ![CI](https://github.com/sparkapi/spark_api/workflows/CI/badge.svg) ![Code Climate](https://codeclimate.com/badge.png)
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.4.34
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 = @client.connection.send(method, request_path)
81
+ response = connection.send(method, request_path)
80
82
  else
81
83
  SparkApi.logger.debug { "Data: #{body}" }
82
- response = @client.connection.send(method, request_path, body)
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::Error::ConnectionFailed => e
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
@@ -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 instanciated separately with the configuration information.
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
- # Instanciate the authenication class passed in.
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
@@ -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'
@@ -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::Error::ConnectionFailed => e
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
@@ -1,6 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'logger'
3
3
  require 'multi_json'
4
+ require 'addressable'
4
5
 
5
6
  require 'spark_api/version'
6
7
  require 'spark_api/errors'
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.color_enabled = true
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).should be_empty
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"}).should match("foobar")
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"}).should match("ooocarzoozar")
14
- subject.build_param_string({:Akey => "aValue", :aNotherkey => "AnotherValue"}).should
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.should == 401 }
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.stub(:expired?) { false }
45
- subject.authenticated?.should eq(true)
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.stub(:expired?) { true }
50
- subject.authenticated?.should eq(false)
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?.should eq(false)
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.stub(:delete).with("/session/1234") { logged_out = true }
63
+ allow(client).to receive(:delete).with("/session/1234") { logged_out = true }
65
64
  subject.logout
66
- subject.session.should eq(nil)
67
- logged_out.should eq(true)
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.stub(:delete) { raise "Should not be called" }
71
- subject.logout.should eq(nil)
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.should eq(200)
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.should eq(201)
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).should eq("c731cf2455fbc7a4ef937b2301108d7a")
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).should eq("7bbe3384a8b64368357f8551cab271e3")
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.should eq(2)
164
- SparkApi.client.session.expired?.should eq(false)
181
+ expect(count).to eq(2)
182
+ expect(SparkApi.client.session.expired?).to eq(false)
165
183
  end
166
184
  end
167
185