spark_api 1.0.2 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +86 -3
- data/VERSION +1 -1
- data/lib/spark_api.rb +1 -0
- data/lib/spark_api/authentication/oauth2.rb +43 -2
- data/lib/spark_api/configuration/oauth2_configurable.rb +3 -1
- data/lib/spark_api/models.rb +1 -0
- data/lib/spark_api/models/listing.rb +17 -1
- data/lib/spark_api/models/rental_calendar.rb +26 -0
- data/lib/spark_api/options_hash.rb +18 -0
- data/script/combined_flow_example.rb +55 -0
- data/script/oauth2_example.rb +2 -2
- data/spec/fixtures/listings/rental_calendar.json +19 -0
- data/spec/fixtures/listings/with_rental_calendar.json +52 -0
- data/spec/unit/spark_api/authentication/oauth2_spec.rb +79 -1
- data/spec/unit/spark_api/models/listing_spec.rb +7 -0
- data/spec/unit/spark_api/models/rental_calendar_spec.rb +30 -0
- data/spec/unit/spark_api/options_hash_spec.rb +14 -0
- metadata +15 -96
- data/bin/spark_api~ +0 -8
- data/lib/spark_api/authentication/api_auth.rb~ +0 -104
- data/lib/spark_api/authentication/base_auth.rb~ +0 -47
- data/lib/spark_api/authentication/oauth2.rb~ +0 -199
- data/lib/spark_api/authentication/oauth2_impl/grant_type_base.rb~ +0 -87
- data/lib/spark_api/authentication/oauth2_impl/grant_type_code.rb~ +0 -49
- data/lib/spark_api/authentication/oauth2_impl/grant_type_password.rb~ +0 -45
- data/lib/spark_api/authentication/oauth2_impl/grant_type_refresh.rb~ +0 -36
- data/lib/spark_api/authentication/oauth2_impl/middleware.rb~ +0 -39
- data/lib/spark_api/authentication/oauth2_impl/password_provider.rb~ +0 -25
- data/lib/spark_api/cli.rb~ +0 -158
- data/lib/spark_api/cli/api_auth.rb~ +0 -8
- data/lib/spark_api/cli/oauth2.rb~ +0 -14
- data/lib/spark_api/cli/setup.rb~ +0 -47
- data/lib/spark_api/configuration.rb~ +0 -54
- data/lib/spark_api/configuration/yaml.rb~ +0 -101
- data/lib/spark_api/faraday.rb~ +0 -64
- data/lib/spark_api/models.rb~ +0 -33
- data/lib/spark_api/models/account.rb~ +0 -115
- data/lib/spark_api/models/base.rb~ +0 -118
- data/lib/spark_api/models/connect_prefs.rb~ +0 -10
- data/lib/spark_api/models/constraint.rb~ +0 -16
- data/lib/spark_api/models/contact.rb~ +0 -49
- data/lib/spark_api/models/custom_fields.rb~ +0 -12
- data/lib/spark_api/models/document.rb~ +0 -11
- data/lib/spark_api/models/finders.rb~ +0 -45
- data/lib/spark_api/models/idx_link.rb~ +0 -47
- data/lib/spark_api/models/listing.rb~ +0 -197
- data/lib/spark_api/models/listing_cart.rb~ +0 -72
- data/lib/spark_api/models/market_statistics.rb~ +0 -33
- data/lib/spark_api/models/message.rb~ +0 -21
- data/lib/spark_api/models/note.rb~ +0 -41
- data/lib/spark_api/models/notification.rb~ +0 -42
- data/lib/spark_api/models/open_house.rb~ +0 -24
- data/lib/spark_api/models/photo.rb~ +0 -70
- data/lib/spark_api/models/property_types.rb~ +0 -7
- data/lib/spark_api/models/saved_search.rb~ +0 -16
- data/lib/spark_api/models/shared_listing.rb~ +0 -35
- data/lib/spark_api/models/standard_fields.rb~ +0 -50
- data/lib/spark_api/models/subresource.rb~ +0 -19
- data/lib/spark_api/models/system_info.rb~ +0 -14
- data/lib/spark_api/models/tour_of_home.rb~ +0 -24
- data/lib/spark_api/models/video.rb~ +0 -16
- data/lib/spark_api/models/virtual_tour.rb~ +0 -18
- data/lib/spark_api/multi_client.rb~ +0 -59
- data/lib/spark_api/paginate.rb~ +0 -109
- data/lib/spark_api/primary_array.rb~ +0 -29
- data/lib/spark_api/request.rb~ +0 -96
- data/lib/spark_api/response.rb~ +0 -70
- data/lib/spark_api/version.rb~ +0 -4
- data/script/console~ +0 -6
- data/script/example.rb~ +0 -27
- data/spec/unit/flexmls_api_spec.rb~ +0 -23
- data/spec/unit/spark_api/authentication/api_auth_spec.rb~ +0 -169
- data/spec/unit/spark_api/authentication/base_auth_spec.rb~ +0 -10
- data/spec/unit/spark_api/authentication/oauth2_impl/grant_type_base_spec.rb~ +0 -10
- data/spec/unit/spark_api/authentication/oauth2_spec.rb~ +0 -205
- data/spec/unit/spark_api/authentication_spec.rb~ +0 -38
- data/spec/unit/spark_api/configuration/yaml_spec.rb~ +0 -72
- data/spec/unit/spark_api/configuration_spec.rb~ +0 -122
- data/spec/unit/spark_api/faraday_spec.rb~ +0 -90
- data/spec/unit/spark_api/models/contact_spec.rb~ +0 -108
- data/spec/unit/spark_api/models/listing_cart_spec.rb~ +0 -127
- data/spec/unit/spark_api/models/listing_spec.rb~ +0 -320
- data/spec/unit/spark_api/models/message_spec.rb~ +0 -47
- data/spec/unit/spark_api/models/note_spec.rb~ +0 -63
- data/spec/unit/spark_api/models/notification_spec.rb~ +0 -62
- data/spec/unit/spark_api/models/shared_listing_spec.rb~ +0 -45
- data/spec/unit/spark_api/multi_client_spec.rb~ +0 -56
- data/spec/unit/spark_api/paginate_spec.rb~ +0 -224
- data/spec/unit/spark_api/primary_array_spec.rb~ +0 -41
- data/spec/unit/spark_api/request_spec.rb~ +0 -344
@@ -1,29 +0,0 @@
|
|
1
|
-
module FlexmlsApi
|
2
|
-
class PrimaryArray < Array
|
3
|
-
|
4
|
-
def primary
|
5
|
-
find_primary
|
6
|
-
end
|
7
|
-
|
8
|
-
private
|
9
|
-
|
10
|
-
# This is a very simplistic but reliable implementation.
|
11
|
-
def find_primary
|
12
|
-
self.each do |arg|
|
13
|
-
if arg.primary?
|
14
|
-
return arg
|
15
|
-
end
|
16
|
-
end
|
17
|
-
nil
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
#=== Primary: interface to implement for elements that are added to a "PrimaryArray" collection
|
22
|
-
module Primary
|
23
|
-
# Return true if the element is the primary resource in a collection.
|
24
|
-
# Default implementation looks for a "Primary" attribute
|
25
|
-
def primary?
|
26
|
-
@attributes.key?("Primary") && self.Primary == true
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
data/lib/spark_api/request.rb~
DELETED
@@ -1,96 +0,0 @@
|
|
1
|
-
require 'cgi'
|
2
|
-
|
3
|
-
module FlexmlsApi
|
4
|
-
# HTTP request wrapper. Performs all the api session mumbo jumbo so that the models don't have to.
|
5
|
-
module Request
|
6
|
-
# Perform an HTTP GET request
|
7
|
-
#
|
8
|
-
# * path - Path of an api resource, excluding version and endpoint (domain) information
|
9
|
-
# * options - Resource request options as specified being supported via and api resource
|
10
|
-
# :returns:
|
11
|
-
# Hash of the json results as documented in the api.
|
12
|
-
# :raises:
|
13
|
-
# FlexmlsApi::ClientError or subclass if the request failed.
|
14
|
-
def get(path, options={})
|
15
|
-
request(:get, path, nil, options)
|
16
|
-
end
|
17
|
-
|
18
|
-
# Perform an HTTP POST request
|
19
|
-
#
|
20
|
-
# * path - Path of an api resource, excluding version and endpoint (domain) information
|
21
|
-
# * body - Hash for post body data
|
22
|
-
# * options - Resource request options as specified being supported via and api resource
|
23
|
-
# :returns:
|
24
|
-
# Hash of the json results as documented in the api.
|
25
|
-
# :raises:
|
26
|
-
# FlexmlsApi::ClientError or subclass if the request failed.
|
27
|
-
def post(path, body={}, options={})
|
28
|
-
request(:post, path, body, options)
|
29
|
-
end
|
30
|
-
|
31
|
-
# Perform an HTTP PUT request
|
32
|
-
#
|
33
|
-
# * path - Path of an api resource, excluding version and endpoint (domain) information
|
34
|
-
# * body - Hash for post body data
|
35
|
-
# * options - Resource request options as specified being supported via and api resource
|
36
|
-
# :returns:
|
37
|
-
# Hash of the json results as documented in the api.
|
38
|
-
# :raises:
|
39
|
-
# FlexmlsApi::ClientError or subclass if the request failed.
|
40
|
-
def put(path, body={}, options={})
|
41
|
-
request(:put, path, body, options)
|
42
|
-
end
|
43
|
-
|
44
|
-
# Perform an HTTP DELETE request
|
45
|
-
#
|
46
|
-
# * path - Path of an api resource, excluding version and endpoint (domain) information
|
47
|
-
# * options - Resource request options as specified being supported via and api resource
|
48
|
-
# :returns:
|
49
|
-
# Hash of the json results as documented in the api.
|
50
|
-
# :raises:
|
51
|
-
# FlexmlsApi::ClientError or subclass if the request failed.
|
52
|
-
def delete(path, options={})
|
53
|
-
request(:delete, path, nil, options)
|
54
|
-
end
|
55
|
-
|
56
|
-
private
|
57
|
-
|
58
|
-
# Perform an HTTP request (no data)
|
59
|
-
def request(method, path, body, options)
|
60
|
-
unless authenticated?
|
61
|
-
authenticate
|
62
|
-
end
|
63
|
-
attempts = 0
|
64
|
-
begin
|
65
|
-
request_opts = {}
|
66
|
-
request_opts.merge!(options)
|
67
|
-
post_data = body.nil? ? nil : {"D" => body }.to_json
|
68
|
-
request_path = "/#{version}#{path}"
|
69
|
-
start_time = Time.now
|
70
|
-
FlexmlsApi.logger.debug("#{method.to_s.upcase} Request: #{request_path}")
|
71
|
-
if post_data.nil?
|
72
|
-
response = authenticator.request(method, request_path, nil, request_opts)
|
73
|
-
else
|
74
|
-
FlexmlsApi.logger.debug("#{method.to_s.upcase} Data: #{post_data}")
|
75
|
-
response = authenticator.request(method, request_path, post_data, request_opts)
|
76
|
-
end
|
77
|
-
request_time = Time.now - start_time
|
78
|
-
FlexmlsApi.logger.info("[#{(request_time * 1000).to_i}ms] Api: #{method.to_s.upcase} #{request_path}")
|
79
|
-
rescue PermissionDenied => e
|
80
|
-
if(ResponseCodes::SESSION_TOKEN_EXPIRED == e.code)
|
81
|
-
unless (attempts +=1) > 1
|
82
|
-
FlexmlsApi.logger.debug("Retrying authentication")
|
83
|
-
authenticate
|
84
|
-
retry
|
85
|
-
end
|
86
|
-
end
|
87
|
-
# No luck authenticating... KABOOM!
|
88
|
-
FlexmlsApi.logger.error("Authentication failed or server is sending us expired tokens, nothing we can do here.")
|
89
|
-
raise
|
90
|
-
end
|
91
|
-
response.body
|
92
|
-
end
|
93
|
-
|
94
|
-
end
|
95
|
-
|
96
|
-
end
|
data/lib/spark_api/response.rb~
DELETED
@@ -1,70 +0,0 @@
|
|
1
|
-
module FlexmlsApi
|
2
|
-
# API Response interface
|
3
|
-
module Response
|
4
|
-
ATTRIBUTES = [:code, :message, :results, :success, :pagination, :details]
|
5
|
-
attr_accessor *ATTRIBUTES
|
6
|
-
def success?
|
7
|
-
@success
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
# All known response codes listed in the API
|
12
|
-
module ResponseCodes
|
13
|
-
NOT_FOUND = 404
|
14
|
-
METHOD_NOT_ALLOWED = 405
|
15
|
-
INVALID_KEY = 1000
|
16
|
-
DISABLED_KEY = 1010
|
17
|
-
API_USER_REQUIRED = 1015
|
18
|
-
SESSION_TOKEN_EXPIRED = 1020
|
19
|
-
SSL_REQUIRED = 1030
|
20
|
-
INVALID_JSON = 1035
|
21
|
-
INVALID_FIELD = 1040
|
22
|
-
MISSING_PARAMETER = 1050
|
23
|
-
INVALID_PARAMETER = 1053
|
24
|
-
CONFLICTING_DATA = 1055
|
25
|
-
NOT_AVAILABLE= 1500
|
26
|
-
RATE_LIMIT_EXCEEDED = 1550
|
27
|
-
end
|
28
|
-
|
29
|
-
# Errors built from API responses
|
30
|
-
class InvalidResponse < StandardError; end
|
31
|
-
class ClientError < StandardError
|
32
|
-
attr_reader :code, :status, :details
|
33
|
-
def initialize (options = {})
|
34
|
-
# Support the standard initializer for errors
|
35
|
-
opts = options.is_a?(Hash) ? options : {:message => options.to_s}
|
36
|
-
@code = opts[:code]
|
37
|
-
@status = opts[:status]
|
38
|
-
@details = opts[:details]
|
39
|
-
super(opts[:message])
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
43
|
-
class NotFound < ClientError; end
|
44
|
-
class PermissionDenied < ClientError; end
|
45
|
-
class NotAllowed < ClientError; end
|
46
|
-
class BadResourceRequest < ClientError; end
|
47
|
-
|
48
|
-
# Nice and handy class wrapper for the api response hash
|
49
|
-
class ApiResponse < ::Array
|
50
|
-
include FlexmlsApi::Response
|
51
|
-
def initialize(d)
|
52
|
-
begin
|
53
|
-
hash = d["D"]
|
54
|
-
if hash.nil? || hash.empty?
|
55
|
-
raise InvalidResponse, "The server response could not be understood"
|
56
|
-
end
|
57
|
-
self.message = hash["Message"]
|
58
|
-
self.code = hash["Code"]
|
59
|
-
self.results = Array(hash["Results"])
|
60
|
-
self.success = hash["Success"]
|
61
|
-
self.pagination = hash["Pagination"]
|
62
|
-
self.details = hash["Details"] || []
|
63
|
-
super(results)
|
64
|
-
rescue Exception => e
|
65
|
-
FlexmlsApi.logger.error "Unable to understand the response! #{d}"
|
66
|
-
raise
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
data/lib/spark_api/version.rb~
DELETED
data/script/console~
DELETED
data/script/example.rb~
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
require "rubygems"
|
3
|
-
|
4
|
-
Bundler.require(:default, "development") if defined?(Bundler)
|
5
|
-
|
6
|
-
path = File.expand_path(File.dirname(__FILE__) + "/../lib/")
|
7
|
-
$LOAD_PATH.unshift(path) unless $LOAD_PATH.include?(path)
|
8
|
-
require path + '/flexmls_api'
|
9
|
-
|
10
|
-
FlexmlsApi.logger.info("Hello!")
|
11
|
-
|
12
|
-
FlexmlsApi.configure do |config|
|
13
|
-
config.api_key = "agent_key"
|
14
|
-
config.api_secret = "agent_secret"
|
15
|
-
config.version = "v1"
|
16
|
-
config.endpoint = "https://api.flexmls.com"
|
17
|
-
end
|
18
|
-
|
19
|
-
client = FlexmlsApi.client
|
20
|
-
|
21
|
-
list = client.get '/contacts'
|
22
|
-
puts "client: #{list.inspect}"
|
23
|
-
list = FlexmlsApi::Models::Contact.get
|
24
|
-
puts "model: #{list.inspect}"
|
25
|
-
|
26
|
-
|
27
|
-
|
@@ -1,23 +0,0 @@
|
|
1
|
-
require './spec/spec_helper'
|
2
|
-
|
3
|
-
describe FlexmlsApi do
|
4
|
-
after(:each) do
|
5
|
-
reset_config
|
6
|
-
end
|
7
|
-
|
8
|
-
it "should load the version" do
|
9
|
-
subject::VERSION.should match(/\d+\.\d+\.\d+/)
|
10
|
-
end
|
11
|
-
|
12
|
-
it "should give me a client connection" do
|
13
|
-
subject.client.should be_a(FlexmlsApi::Client)
|
14
|
-
end
|
15
|
-
|
16
|
-
it "should reset my connection" do
|
17
|
-
c1 = subject.client
|
18
|
-
subject.reset
|
19
|
-
subject.client.should_not eq(c1)
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
|
@@ -1,169 +0,0 @@
|
|
1
|
-
require './spec/spec_helper'
|
2
|
-
|
3
|
-
describe FlexmlsApi::Authentication::ApiAuth do
|
4
|
-
subject {FlexmlsApi::Authentication::ApiAuth.new(nil) }
|
5
|
-
describe "build_param_hash" do
|
6
|
-
it "should return a blank string when passed nil" do
|
7
|
-
subject.build_param_string(nil).should be_empty
|
8
|
-
end
|
9
|
-
it "should return a correct param string for one item" do
|
10
|
-
subject.build_param_string({:foo => "bar"}).should match("foobar")
|
11
|
-
end
|
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"
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
describe "authenticate" do
|
20
|
-
let(:client) { FlexmlsApi::Client.new({:api_key => "my_key", :api_secret => "my_secret"}) }
|
21
|
-
subject do
|
22
|
-
s = FlexmlsApi::Authentication::ApiAuth.new(client)
|
23
|
-
client.authenticator = s
|
24
|
-
s
|
25
|
-
end
|
26
|
-
it "should authenticate the api credentials" do
|
27
|
-
stub_request(:post, "https://api.flexmls.com/#{FlexmlsApi.version}/session").
|
28
|
-
with(:query => {:ApiKey => "my_key", :ApiSig => "c731cf2455fbc7a4ef937b2301108d7a"}).
|
29
|
-
to_return(:body => fixture("session.json"))
|
30
|
-
subject.authenticate()
|
31
|
-
end
|
32
|
-
it "should raise an error when api credentials are invalid" do
|
33
|
-
stub_request(:post, "https://api.flexmls.com/#{FlexmlsApi.version}/session").
|
34
|
-
with(:query => {:ApiKey => "my_key", :ApiSig => "c731cf2455fbc7a4ef937b2301108d7a"}).
|
35
|
-
to_return(:body => fixture("authentication_failure.json"), :status=>401)
|
36
|
-
expect {subject.authenticate()}.to raise_error(FlexmlsApi::ClientError){ |e| e.status.should == 401 }
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
describe "authenticated?" do
|
41
|
-
let(:session) { Object.new }
|
42
|
-
it "should return true when session is active" do
|
43
|
-
subject.session = session
|
44
|
-
session.stub(:expired?) { false }
|
45
|
-
subject.authenticated?.should eq(true)
|
46
|
-
end
|
47
|
-
it "should return false when session is expired" do
|
48
|
-
subject.session = session
|
49
|
-
session.stub(:expired?) { true }
|
50
|
-
subject.authenticated?.should eq(false)
|
51
|
-
end
|
52
|
-
it "should return false when session is uninitialized" do
|
53
|
-
subject.authenticated?.should eq(false)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
describe "logout" do
|
58
|
-
let(:session) { mock_session }
|
59
|
-
let(:client) { Object.new }
|
60
|
-
subject {FlexmlsApi::Authentication::ApiAuth.new(client) }
|
61
|
-
it "should logout when there is an active session" do
|
62
|
-
logged_out = false
|
63
|
-
subject.session = session
|
64
|
-
client.stub(:delete).with("/session/1234") { logged_out = true }
|
65
|
-
subject.logout
|
66
|
-
subject.session.should eq(nil)
|
67
|
-
logged_out.should eq(true)
|
68
|
-
end
|
69
|
-
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)
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
# Since the request method is overly complex, the following tests just go through the whole stack
|
76
|
-
# with some semi realistic requests. Performing this type of test here should allow us to safely
|
77
|
-
# mock out authentication for the rest of our unit tests and still have some decent coverage.
|
78
|
-
describe "request" do
|
79
|
-
let(:client) { FlexmlsApi::Client.new({:api_key => "my_key", :api_secret => "my_secret"}) }
|
80
|
-
let(:session) { mock_session }
|
81
|
-
subject do
|
82
|
-
s = FlexmlsApi::Authentication::ApiAuth.new(client)
|
83
|
-
client.authenticator = s
|
84
|
-
s.session = session
|
85
|
-
s
|
86
|
-
end
|
87
|
-
it "should handle a get request" do
|
88
|
-
stub_auth_request
|
89
|
-
args = {
|
90
|
-
:ApiUser => "foobar",
|
91
|
-
:_limit => '10',
|
92
|
-
:_page => '1',
|
93
|
-
:_pagination => '1'
|
94
|
-
}
|
95
|
-
stub_request(:get, "#{FlexmlsApi.endpoint}/#{FlexmlsApi.version}/listings").
|
96
|
-
with(:query => {
|
97
|
-
:ApiSig => "1cb789831f8f4c6925dc708c93762a2c",
|
98
|
-
:AuthToken => "1234"}.merge(args)).
|
99
|
-
to_return(:body => fixture("listings/no_subresources.json"))
|
100
|
-
subject.session = session
|
101
|
-
subject.request(:get, "/#{FlexmlsApi.version}/listings", nil, args).status.should eq(200)
|
102
|
-
end
|
103
|
-
it "should handle a post request" do
|
104
|
-
stub_auth_request
|
105
|
-
args = {:ApiUser => "foobar"}
|
106
|
-
contact = '{"D":{"Contacts":[{"DisplayName":"Contact Four","PrimaryEmail":"contact4@fbsdata.com"}]}}'
|
107
|
-
stub_request(:post, "#{FlexmlsApi.endpoint}/#{FlexmlsApi.version}/contacts").
|
108
|
-
with(:query => {
|
109
|
-
:ApiSig => "82898ef88d22e1b31bd2e2ea6bb8efe7",
|
110
|
-
:AuthToken => "1234"}.merge(args),
|
111
|
-
:body => contact
|
112
|
-
).
|
113
|
-
to_return(:body => '{"D": {
|
114
|
-
"Success": true,
|
115
|
-
"Results": [
|
116
|
-
{
|
117
|
-
"ResourceUri":"/v1/contacts/20101230223226074204000000"
|
118
|
-
}]}
|
119
|
-
}',
|
120
|
-
:status=>201)
|
121
|
-
subject.request(:post, "/#{FlexmlsApi.version}/contacts", contact, args).status.should eq(201)
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
describe "sign" do
|
126
|
-
it "should sign the auth parameters correctly" do
|
127
|
-
sign_token = "my_secretApiKeymy_key"
|
128
|
-
subject.sign(sign_token).should eq("c731cf2455fbc7a4ef937b2301108d7a")
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
describe "sign_token" do
|
133
|
-
let(:client) { FlexmlsApi::Client.new({:api_key => "my_key", :api_secret => "my_secret"}) }
|
134
|
-
subject {FlexmlsApi::Authentication::ApiAuth.new(client) }
|
135
|
-
it "should fully sign the token" do
|
136
|
-
parms = {:AuthToken => "1234", :ApiUser => "CoolAsIce"}
|
137
|
-
subject.sign_token("/test", parms).should eq("7bbe3384a8b64368357f8551cab271e3")
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
context "when the server says the session is expired (even if we disagree)" do
|
142
|
-
it "should reset the session and reauthenticate" do
|
143
|
-
reset_config
|
144
|
-
count = 0
|
145
|
-
# Make sure the auth request goes out twice.
|
146
|
-
stub_request(:post, "https://api.flexmls.com/#{FlexmlsApi.version}/session").
|
147
|
-
with(:query => {:ApiKey => "", :ApiSig => "806737984ab19be2fd08ba36030549ac"}).
|
148
|
-
to_return do |r|
|
149
|
-
count += 1
|
150
|
-
{:body => fixture("session.json")}
|
151
|
-
end
|
152
|
-
# Fail the first time, but then return the correct value after reauthentication
|
153
|
-
stub_request(:get, "#{FlexmlsApi.endpoint}/#{FlexmlsApi.version}/listings/1234").
|
154
|
-
with(:query => {
|
155
|
-
:ApiSig => "554b6e2a3efec8719b782647c19d238d",
|
156
|
-
:AuthToken => "c401736bf3d3f754f07c04e460e09573",
|
157
|
-
:ApiUser => "foobar",
|
158
|
-
:_expand => "Documents"
|
159
|
-
}).
|
160
|
-
to_return(:body => fixture('errors/expired.json'), :status => 401).times(1).then.
|
161
|
-
to_return(:body => fixture('listings/with_documents.json'))
|
162
|
-
l = Listing.find('1234', :_expand => "Documents")
|
163
|
-
|
164
|
-
count.should eq(2)
|
165
|
-
FlexmlsApi.client.session.expired?.should eq(false)
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
end
|
@@ -1,10 +0,0 @@
|
|
1
|
-
require './spec/spec_helper'
|
2
|
-
|
3
|
-
describe FlexmlsApi::Authentication::BaseAuth do
|
4
|
-
subject {FlexmlsApi::Authentication::BaseAuth.new(nil) }
|
5
|
-
it "should raise an error" do
|
6
|
-
expect {subject.authenticate()}.to raise_error(){ |e| e.message.should == "Implement me!"}
|
7
|
-
expect {subject.logout()}.to raise_error(){ |e| e.message.should == "Implement me!"}
|
8
|
-
expect {subject.request(nil, nil, nil, nil)}.to raise_error(){ |e| e.message.should == "Implement me!"}
|
9
|
-
end
|
10
|
-
end
|