fastspring-saasy 0.4.0 → 0.5.1
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.
- data/.document +1 -1
- data/Gemfile +3 -1
- data/Gemfile.lock +19 -4
- data/README.rdoc +2 -3
- data/VERSION +1 -1
- data/fastspring-saasy.gemspec +14 -5
- data/lib/fastspring-saasy.rb +7 -1
- data/lib/fastspring-saasy/customer.rb +4 -4
- data/lib/fastspring-saasy/localized_store_pricing.rb +89 -0
- data/lib/fastspring-saasy/order.rb +1 -1
- data/lib/fastspring-saasy/{base.rb → private_api_base.rb} +6 -3
- data/lib/fastspring-saasy/public_api_base.rb +18 -0
- data/lib/fastspring-saasy/subscription.rb +1 -1
- data/lib/httparty/txt_parser.rb +20 -0
- data/spec/customer_spec.rb +53 -22
- data/spec/fixtures/basic_localized_store_pricing.txt +9 -0
- data/spec/fixtures/basic_localized_store_pricing_with_3_products.txt +21 -0
- data/spec/localized_store_pricing_spec.rb +152 -0
- data/spec/spec_helper.rb +5 -1
- metadata +33 -16
data/.document
CHANGED
data/Gemfile
CHANGED
@@ -1,14 +1,16 @@
|
|
1
1
|
source :rubygems
|
2
2
|
|
3
3
|
gem 'httparty'
|
4
|
-
gem 'rake'
|
5
4
|
|
6
5
|
group :development do
|
6
|
+
gem 'rake'
|
7
7
|
gem 'bundler'
|
8
8
|
gem 'jeweler'
|
9
|
+
gem 'ruby-debug19', :require => 'ruby-debug'
|
9
10
|
end
|
10
11
|
|
11
12
|
group :test do
|
12
13
|
gem 'rspec'
|
13
14
|
gem 'webmock'
|
15
|
+
gem 'ruby-debug19', :require => 'ruby-debug'
|
14
16
|
end
|
data/Gemfile.lock
CHANGED
@@ -2,6 +2,8 @@ GEM
|
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
4
|
addressable (2.2.6)
|
5
|
+
archive-tar-minitar (0.5.2)
|
6
|
+
columnize (0.3.5)
|
5
7
|
crack (0.3.1)
|
6
8
|
diff-lcs (1.1.3)
|
7
9
|
git (1.2.5)
|
@@ -12,18 +14,30 @@ GEM
|
|
12
14
|
bundler (~> 1.0)
|
13
15
|
git (>= 1.2.5)
|
14
16
|
rake
|
15
|
-
|
17
|
+
linecache19 (0.5.12)
|
18
|
+
ruby_core_source (>= 0.1.4)
|
19
|
+
multi_json (1.0.4)
|
16
20
|
multi_xml (0.4.1)
|
17
|
-
rake (0.9.2)
|
21
|
+
rake (0.9.2.2)
|
18
22
|
rspec (2.7.0)
|
19
23
|
rspec-core (~> 2.7.0)
|
20
24
|
rspec-expectations (~> 2.7.0)
|
21
25
|
rspec-mocks (~> 2.7.0)
|
22
|
-
rspec-core (2.7.
|
26
|
+
rspec-core (2.7.1)
|
23
27
|
rspec-expectations (2.7.0)
|
24
28
|
diff-lcs (~> 1.1.2)
|
25
29
|
rspec-mocks (2.7.0)
|
26
|
-
|
30
|
+
ruby-debug-base19 (0.11.25)
|
31
|
+
columnize (>= 0.3.1)
|
32
|
+
linecache19 (>= 0.5.11)
|
33
|
+
ruby_core_source (>= 0.1.4)
|
34
|
+
ruby-debug19 (0.11.6)
|
35
|
+
columnize (>= 0.3.1)
|
36
|
+
linecache19 (>= 0.5.11)
|
37
|
+
ruby-debug-base19 (>= 0.11.19)
|
38
|
+
ruby_core_source (0.1.5)
|
39
|
+
archive-tar-minitar (>= 0.5.2)
|
40
|
+
webmock (1.7.8)
|
27
41
|
addressable (~> 2.2, > 2.2.5)
|
28
42
|
crack (>= 0.1.7)
|
29
43
|
|
@@ -36,4 +50,5 @@ DEPENDENCIES
|
|
36
50
|
jeweler
|
37
51
|
rake
|
38
52
|
rspec
|
53
|
+
ruby-debug19
|
39
54
|
webmock
|
data/README.rdoc
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.1
|
data/fastspring-saasy.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "fastspring-saasy"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.5.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Richard Patching"]
|
12
|
-
s.date = "
|
12
|
+
s.date = "2012-01-10"
|
13
13
|
s.description = "Ruby lib for using the FastSpring (Saas) subscription management API"
|
14
14
|
s.email = "richard@justaddpixels.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -29,17 +29,23 @@ Gem::Specification.new do |s|
|
|
29
29
|
"lib/fastspring-saasy.rb",
|
30
30
|
"lib/fastspring-saasy/account.rb",
|
31
31
|
"lib/fastspring-saasy/address.rb",
|
32
|
-
"lib/fastspring-saasy/base.rb",
|
33
32
|
"lib/fastspring-saasy/customer.rb",
|
34
33
|
"lib/fastspring-saasy/error.rb",
|
35
34
|
"lib/fastspring-saasy/item.rb",
|
35
|
+
"lib/fastspring-saasy/localized_store_pricing.rb",
|
36
36
|
"lib/fastspring-saasy/order.rb",
|
37
37
|
"lib/fastspring-saasy/payment.rb",
|
38
|
+
"lib/fastspring-saasy/private_api_base.rb",
|
39
|
+
"lib/fastspring-saasy/public_api_base.rb",
|
38
40
|
"lib/fastspring-saasy/subscription.rb",
|
41
|
+
"lib/httparty/txt_parser.rb",
|
39
42
|
"spec/account_spec.rb",
|
40
43
|
"spec/customer_spec.rb",
|
44
|
+
"spec/fixtures/basic_localized_store_pricing.txt",
|
45
|
+
"spec/fixtures/basic_localized_store_pricing_with_3_products.txt",
|
41
46
|
"spec/fixtures/basic_order.xml",
|
42
47
|
"spec/fixtures/basic_subscription.xml",
|
48
|
+
"spec/localized_store_pricing_spec.rb",
|
43
49
|
"spec/order_spec.rb",
|
44
50
|
"spec/spec_helper.rb",
|
45
51
|
"spec/subscription_spec.rb"
|
@@ -47,7 +53,7 @@ Gem::Specification.new do |s|
|
|
47
53
|
s.homepage = "http://github.com/patchfx/fastspring"
|
48
54
|
s.licenses = ["MIT"]
|
49
55
|
s.require_paths = ["lib"]
|
50
|
-
s.rubygems_version = "1.8.
|
56
|
+
s.rubygems_version = "1.8.11"
|
51
57
|
s.summary = "Ruby lib for using the FastSpring (Saasy) API"
|
52
58
|
|
53
59
|
if s.respond_to? :specification_version then
|
@@ -55,15 +61,17 @@ Gem::Specification.new do |s|
|
|
55
61
|
|
56
62
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
57
63
|
s.add_runtime_dependency(%q<httparty>, [">= 0"])
|
58
|
-
s.
|
64
|
+
s.add_development_dependency(%q<rake>, [">= 0"])
|
59
65
|
s.add_development_dependency(%q<bundler>, [">= 0"])
|
60
66
|
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
67
|
+
s.add_development_dependency(%q<ruby-debug19>, [">= 0"])
|
61
68
|
s.add_development_dependency(%q<httparty>, ["~> 0.8.1"])
|
62
69
|
else
|
63
70
|
s.add_dependency(%q<httparty>, [">= 0"])
|
64
71
|
s.add_dependency(%q<rake>, [">= 0"])
|
65
72
|
s.add_dependency(%q<bundler>, [">= 0"])
|
66
73
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
74
|
+
s.add_dependency(%q<ruby-debug19>, [">= 0"])
|
67
75
|
s.add_dependency(%q<httparty>, ["~> 0.8.1"])
|
68
76
|
end
|
69
77
|
else
|
@@ -71,6 +79,7 @@ Gem::Specification.new do |s|
|
|
71
79
|
s.add_dependency(%q<rake>, [">= 0"])
|
72
80
|
s.add_dependency(%q<bundler>, [">= 0"])
|
73
81
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
82
|
+
s.add_dependency(%q<ruby-debug19>, [">= 0"])
|
74
83
|
s.add_dependency(%q<httparty>, ["~> 0.8.1"])
|
75
84
|
end
|
76
85
|
end
|
data/lib/fastspring-saasy.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'httparty'
|
2
2
|
|
3
|
-
require_relative '
|
3
|
+
require_relative 'httparty/txt_parser'
|
4
|
+
|
5
|
+
require_relative 'fastspring-saasy/private_api_base'
|
4
6
|
require_relative 'fastspring-saasy/account'
|
5
7
|
require_relative 'fastspring-saasy/subscription'
|
6
8
|
require_relative 'fastspring-saasy/customer'
|
@@ -8,4 +10,8 @@ require_relative 'fastspring-saasy/order'
|
|
8
10
|
require_relative 'fastspring-saasy/item'
|
9
11
|
require_relative 'fastspring-saasy/payment'
|
10
12
|
require_relative 'fastspring-saasy/address'
|
13
|
+
|
14
|
+
require_relative 'fastspring-saasy/public_api_base'
|
15
|
+
require_relative 'fastspring-saasy/localized_store_pricing'
|
16
|
+
|
11
17
|
require_relative 'fastspring-saasy/error'
|
@@ -3,11 +3,11 @@ module FastSpring
|
|
3
3
|
attr_accessor :first_name, :last_name, :company, :email, :phone_number
|
4
4
|
|
5
5
|
def initialize(details)
|
6
|
-
@first_name = details.fetch('firstName')
|
7
|
-
@last_name = details.fetch('lastName')
|
8
|
-
@company = details.fetch('company')
|
6
|
+
@first_name = details.fetch('firstName', '')
|
7
|
+
@last_name = details.fetch('lastName', '')
|
8
|
+
@company = details.fetch('company', '')
|
9
9
|
@email = details.fetch('email')
|
10
|
-
@phone_number = details.fetch('phoneNumber')
|
10
|
+
@phone_number = details.fetch('phoneNumber', '')
|
11
11
|
end
|
12
12
|
|
13
13
|
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module FastSpring
|
2
|
+
class LocalizedStorePricing < PublicApiBase
|
3
|
+
# Get the localized store pricing from Saasy
|
4
|
+
def find
|
5
|
+
# For some reason the implicit determination of the Txt parser does not work.
|
6
|
+
# So we'll just blatently pass it in right now.
|
7
|
+
@response = self.class.get(base_localized_store_pricing_path, :query => query, :parser => Parser::Txt)
|
8
|
+
self
|
9
|
+
end
|
10
|
+
|
11
|
+
def base_localized_store_pricing_path
|
12
|
+
"/#{@company}/api/price"
|
13
|
+
end
|
14
|
+
|
15
|
+
def query
|
16
|
+
query_hash = Hash.new
|
17
|
+
@product_paths.each_index{ |index| query_hash["product_#{(index + 1)}_path".to_sym] = @product_paths[index] }
|
18
|
+
query_hash.merge({
|
19
|
+
:user_remote_addr => @remote_ip,
|
20
|
+
:user_accept_language => @http_accept_language,
|
21
|
+
:user_x_forwarded_for => @http_x_forwarded_for
|
22
|
+
})
|
23
|
+
end
|
24
|
+
|
25
|
+
def user_country
|
26
|
+
parsed_response['user_country']
|
27
|
+
end
|
28
|
+
|
29
|
+
def user_language
|
30
|
+
parsed_response['user_language']
|
31
|
+
end
|
32
|
+
|
33
|
+
def user_currency
|
34
|
+
parsed_response['user_currency']
|
35
|
+
end
|
36
|
+
|
37
|
+
def product_quantity(product_path)
|
38
|
+
parsed_response[product_path]["quantity"]
|
39
|
+
end
|
40
|
+
|
41
|
+
def product_unit_value(product_path)
|
42
|
+
parsed_response[product_path]["unit_value"]
|
43
|
+
end
|
44
|
+
|
45
|
+
def product_unit_currency(product_path)
|
46
|
+
parsed_response[product_path]["unit_currency"]
|
47
|
+
end
|
48
|
+
|
49
|
+
def product_unit_display(product_path)
|
50
|
+
parsed_response[product_path]["unit_display"]
|
51
|
+
end
|
52
|
+
|
53
|
+
def product_unit_html(product_path)
|
54
|
+
parsed_response[product_path]["unit_html"]
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
protected
|
59
|
+
|
60
|
+
def parsed_response
|
61
|
+
@parsed_response ||= parse_response
|
62
|
+
end
|
63
|
+
|
64
|
+
def parse_response
|
65
|
+
response = Hash.new
|
66
|
+
|
67
|
+
index = 1
|
68
|
+
more_products = true
|
69
|
+
while more_products
|
70
|
+
product_path = @response.parsed_response["product_#{index}_path"]
|
71
|
+
if product_path
|
72
|
+
@response.parsed_response.each do |key, value|
|
73
|
+
if key.match("product_#{index}") && key != "product_#{index}_path" then
|
74
|
+
response[product_path] ||= Hash.new
|
75
|
+
response[product_path][key.match(/\d+_(.*)/)[1]] = value
|
76
|
+
end
|
77
|
+
end
|
78
|
+
index += 1
|
79
|
+
else
|
80
|
+
more_products = false
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
response.merge(
|
85
|
+
@response.parsed_response.reject{ |key, value| key.match(/^product_/) }
|
86
|
+
)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module FastSpring
|
2
|
-
class
|
2
|
+
class PrivateApiBase
|
3
3
|
include HTTParty
|
4
4
|
base_uri 'https://api.fastspring.com'
|
5
5
|
format :xml
|
@@ -8,7 +8,7 @@ module FastSpring
|
|
8
8
|
attr_reader :customer
|
9
9
|
|
10
10
|
def initialize(reference)
|
11
|
-
@auth = {:username => FastSpring::Account.fetch(:username),
|
11
|
+
@auth = {:username => FastSpring::Account.fetch(:username),
|
12
12
|
:password => FastSpring::Account.fetch(:password)}
|
13
13
|
@company = FastSpring::Account.fetch(:company)
|
14
14
|
@reference = reference
|
@@ -17,6 +17,10 @@ module FastSpring
|
|
17
17
|
def self.find(reference)
|
18
18
|
self.new(reference).find
|
19
19
|
end
|
20
|
+
|
21
|
+
def reference
|
22
|
+
@reference
|
23
|
+
end
|
20
24
|
|
21
25
|
# Returns the current status
|
22
26
|
def status
|
@@ -53,6 +57,5 @@ module FastSpring
|
|
53
57
|
def value_for(attribute)
|
54
58
|
parsed_response.fetch(attribute)
|
55
59
|
end
|
56
|
-
|
57
60
|
end
|
58
61
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module FastSpring
|
2
|
+
class PublicApiBase
|
3
|
+
include HTTParty
|
4
|
+
base_uri 'http://sites.fastspring.com'
|
5
|
+
|
6
|
+
def initialize(product_paths, http_request)
|
7
|
+
@company = FastSpring::Account.fetch(:company)
|
8
|
+
@product_paths = product_paths
|
9
|
+
@remote_ip = http_request.respond_to?(:remote_ip) ? http_request.remote_ip : "127.0.0.1"
|
10
|
+
@http_accept_language = http_request.respond_to?(:env) ? http_request.env["HTTP_ACCEPT_LANGUAGE"] : "en"
|
11
|
+
@http_x_forwarded_for = http_request.respond_to?(:env) ? http_request.env["HTTP_X_FORWARDED_FOR"] : ""
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.find(product_path, http_request)
|
15
|
+
self.new(product_path, http_request).find
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class ParseTxt
|
2
|
+
include HTTParty
|
3
|
+
|
4
|
+
# Replace the :plain parser with this text parser
|
5
|
+
class Parser::Txt < HTTParty::Parser
|
6
|
+
SupportedFormats["text/plain"] = :txt
|
7
|
+
|
8
|
+
# perform text parsing on body
|
9
|
+
def txt
|
10
|
+
parsed_response = Hash.new
|
11
|
+
body.each_line do |line|
|
12
|
+
name_value = line.split("=")
|
13
|
+
parsed_response[name_value[0].strip] = name_value[1].strip if name_value.count == 2
|
14
|
+
end
|
15
|
+
parsed_response
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
parser Parser::Txt
|
20
|
+
end
|
data/spec/customer_spec.rb
CHANGED
@@ -3,35 +3,66 @@ require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper.rb'))
|
|
3
3
|
|
4
4
|
describe FastSpring::Customer do
|
5
5
|
context 'new' do
|
6
|
-
|
7
|
-
{
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
6
|
+
context "with all parameters" do
|
7
|
+
let(:customer_details) {
|
8
|
+
{
|
9
|
+
"firstName" => "John",
|
10
|
+
"lastName" => "Doe",
|
11
|
+
"company" => "Doe Inc",
|
12
|
+
"email" => "john@example.com",
|
13
|
+
"phoneNumber" => "0123456789"
|
14
|
+
}
|
13
15
|
}
|
14
|
-
|
15
|
-
subject { FastSpring::Customer.new(customer_details) }
|
16
|
+
subject { FastSpring::Customer.new(customer_details) }
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
18
|
+
it 'has a first name' do
|
19
|
+
subject.first_name.should == 'John'
|
20
|
+
end
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
22
|
+
it 'has a last name' do
|
23
|
+
subject.last_name.should == 'Doe'
|
24
|
+
end
|
24
25
|
|
25
|
-
|
26
|
-
|
27
|
-
|
26
|
+
it 'has a company' do
|
27
|
+
subject.company.should == 'Doe Inc'
|
28
|
+
end
|
28
29
|
|
29
|
-
|
30
|
-
|
30
|
+
it 'has a email address' do
|
31
|
+
subject.email.should == 'john@example.com'
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'has a phone number' do
|
35
|
+
subject.phone_number.should == '0123456789'
|
36
|
+
end
|
31
37
|
end
|
38
|
+
|
39
|
+
context "with only an email" do
|
40
|
+
let(:customer_details) {
|
41
|
+
{
|
42
|
+
"email" => "john@example.com",
|
43
|
+
}
|
44
|
+
}
|
45
|
+
subject { FastSpring::Customer.new(customer_details) }
|
46
|
+
|
47
|
+
it 'has an empty first name' do
|
48
|
+
subject.first_name.should == ''
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'has an empty last name' do
|
52
|
+
subject.last_name.should == ''
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'has an empty company name' do
|
56
|
+
subject.company.should == ''
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'has a email address' do
|
60
|
+
subject.email.should == 'john@example.com'
|
61
|
+
end
|
32
62
|
|
33
|
-
|
34
|
-
|
63
|
+
it 'has an empty phone number' do
|
64
|
+
subject.phone_number.should == ''
|
65
|
+
end
|
35
66
|
end
|
36
67
|
end
|
37
68
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
user_country=US
|
2
|
+
user_language=en
|
3
|
+
user_currency=USD
|
4
|
+
product_1_path=/basic
|
5
|
+
product_1_quantity=1
|
6
|
+
product_1_unit_value=19.00
|
7
|
+
product_1_unit_currency=USD
|
8
|
+
product_1_unit_display=$19.00
|
9
|
+
product_1_unit_html=$19.00
|
10
|
+
product_2_path=/standard
|
11
|
+
product_2_quantity=1
|
12
|
+
product_2_unit_value=35.00
|
13
|
+
product_2_unit_currency=USD
|
14
|
+
product_2_unit_display=$35.00
|
15
|
+
product_2_unit_html=$35.00
|
16
|
+
product_3_path=/plus
|
17
|
+
product_3_quantity=1
|
18
|
+
product_3_unit_value=59.00
|
19
|
+
product_3_unit_currency=USD
|
20
|
+
product_3_unit_display=$59.00
|
21
|
+
product_3_unit_html=$59.00
|
@@ -0,0 +1,152 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../lib/fastspring-saasy.rb'))
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper.rb'))
|
3
|
+
|
4
|
+
describe FastSpring::LocalizedStorePricing do
|
5
|
+
def valid_http_request
|
6
|
+
request = double('request')
|
7
|
+
request.stub(:remote_ip).and_return("192.168.1.1")
|
8
|
+
request.stub(:env).and_return({ "HTTP_ACCEPT_LANGUAGE" => "nl", "HTTP_X_FORWARDED_FOR" => "192.168.1.2" })
|
9
|
+
request
|
10
|
+
end
|
11
|
+
|
12
|
+
def invalid_http_request
|
13
|
+
double('request')
|
14
|
+
end
|
15
|
+
|
16
|
+
def partial_http_request
|
17
|
+
request = double('request')
|
18
|
+
request.stub(:remote_ip).and_return("192.168.1.1")
|
19
|
+
request.stub(:env).and_return({ "HTTP_ACCEPT_LANGUAGE" => "nl" })
|
20
|
+
request
|
21
|
+
end
|
22
|
+
|
23
|
+
before do
|
24
|
+
FastSpring::Account.setup do |config|
|
25
|
+
config[:username] = 'admin'
|
26
|
+
config[:password] = 'test'
|
27
|
+
config[:company] = 'acme'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'url for localized store pricing' do
|
32
|
+
context "with valid http request" do
|
33
|
+
subject { FastSpring::LocalizedStorePricing.find(['/standard'], valid_http_request) }
|
34
|
+
before do
|
35
|
+
stub_request(:get, "http://sites.fastspring.com/acme/api/price?product_1_path=/standard&user_accept_language=nl&user_remote_addr=192.168.1.1&user_x_forwarded_for=192.168.1.2").
|
36
|
+
to_return(:status => 200, :body => "", :headers => {})
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'returns the path for the company' do
|
40
|
+
subject.base_localized_store_pricing_path.should == "/acme/api/price"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "with invalid http request" do
|
45
|
+
subject { FastSpring::LocalizedStorePricing.find(['/standard'], invalid_http_request) }
|
46
|
+
before do
|
47
|
+
stub_request(:get, "http://sites.fastspring.com/acme/api/price?product_1_path=/standard&user_accept_language=en&user_remote_addr=127.0.0.1&user_x_forwarded_for=").
|
48
|
+
to_return(:status => 200, :body => "", :headers => {})
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'returns the path for the company' do
|
52
|
+
subject.base_localized_store_pricing_path.should == "/acme/api/price"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context "with partial http request" do
|
57
|
+
subject { FastSpring::LocalizedStorePricing.find(['/standard'], partial_http_request) }
|
58
|
+
before do
|
59
|
+
stub_request(:get, "http://sites.fastspring.com/acme/api/price?product_1_path=/standard&user_accept_language=nl&user_remote_addr=192.168.1.1&user_x_forwarded_for=").
|
60
|
+
to_return(:status => 200, :body => "", :headers => {})
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'returns the path for the company' do
|
64
|
+
subject.base_localized_store_pricing_path.should == "/acme/api/price"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context "parsed response for 1 product" do
|
70
|
+
subject { FastSpring::LocalizedStorePricing.find(['/standard'], valid_http_request) }
|
71
|
+
before do
|
72
|
+
stub_request(:get, "https://api.fastspring.com/bizplay/api/price?product_1_path=/standard&user_accept_language=nl&user_remote_addr=192.168.1.1&user_x_forwarded_for=192.168.1.2").
|
73
|
+
to_return(stub_http_response_with('basic_localized_store_pricing.txt'))
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'returns "US" as the user country' do
|
77
|
+
subject.user_country.should == "US"
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'returns "en" as the user language' do
|
81
|
+
subject.user_language.should == "en"
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'returns "USD" as the user currency' do
|
85
|
+
subject.user_currency.should == "USD"
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'returns "1" as the quantity of product 1' do
|
89
|
+
subject.product_quantity("/standard").should == "1"
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'returns "35.00" as unit value of product 1' do
|
93
|
+
subject.product_unit_value("/standard").should == "35.00"
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'returns "USD" as the unit currency of product 1' do
|
97
|
+
subject.product_unit_currency("/standard").should == "USD"
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'returns "$35.00" as the unit display of product 1' do
|
101
|
+
subject.product_unit_display("/standard").should == "$35.00"
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'returns "$35.00" as the unit html of product 1' do
|
105
|
+
subject.product_unit_html("/standard").should == "$35.00"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
context "localized pricing details specifically for 3 product" do
|
110
|
+
subject { FastSpring::LocalizedStorePricing.find(['/basic','/standard','/plus'], valid_http_request) }
|
111
|
+
before do
|
112
|
+
stub_request(:get, "http://sites.fastspring.com/acme/api/price?product_1_path=/basic&product_2_path=/standard&product_3_path=/plus&user_accept_language=nl&user_remote_addr=192.168.1.1&user_x_forwarded_for=192.168.1.2").
|
113
|
+
to_return(stub_http_response_with('basic_localized_store_pricing_with_3_products.txt'))
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'it sends "/basic" as the product_1_path' do
|
117
|
+
subject.query[:product_1_path].should == "/basic"
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'it sends "/standard" as the product_2_path' do
|
121
|
+
subject.query[:product_2_path].should == "/standard"
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'it sends "/plus" as the product_3_path' do
|
125
|
+
subject.query[:product_3_path].should == "/plus"
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'returns "US" as the user country' do
|
129
|
+
subject.user_country.should == "US"
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'returns "en" as the user language' do
|
133
|
+
subject.user_language.should == "en"
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'returns "USD" as the user currency' do
|
137
|
+
subject.user_currency.should == "USD"
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'returns "$19.00" as the unit display of product 1' do
|
141
|
+
subject.product_unit_display("/basic").should == "$19.00"
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'returns "$35.00" as the unit display of product 2' do
|
145
|
+
subject.product_unit_display("/standard").should == "$35.00"
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'returns "$59.00" as the unit display of product 3' do
|
149
|
+
subject.product_unit_display("/plus").should == "$59.00"
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -14,7 +14,11 @@ def stub_http_response_with(filename)
|
|
14
14
|
response = Net::HTTPOK.new("1.1", 200, "Content for you")
|
15
15
|
response.stub!(:body).and_return(data)
|
16
16
|
|
17
|
-
|
17
|
+
if format == :txt
|
18
|
+
http_request = HTTParty::Request.new(Net::HTTP::Get, 'http://localhost', :format => format, :parser => HTTParty::Parser::Txt)
|
19
|
+
else
|
20
|
+
http_request = HTTParty::Request.new(Net::HTTP::Get, 'http://localhost', :format => format)
|
21
|
+
end
|
18
22
|
http_request.stub_chain(:http, :request).and_return(response)
|
19
23
|
|
20
24
|
HTTParty::Request.should_receive(:new).and_return(http_request)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastspring-saasy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-01-10 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: httparty
|
16
|
-
requirement: &
|
16
|
+
requirement: &70151054446520 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,21 +21,21 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70151054446520
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
requirement: &
|
27
|
+
requirement: &70151054446040 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '0'
|
33
|
-
type: :
|
33
|
+
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70151054446040
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: bundler
|
38
|
-
requirement: &
|
38
|
+
requirement: &70151054445560 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,21 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70151054445560
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: jeweler
|
49
|
-
requirement: &
|
49
|
+
requirement: &70151054445080 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70151054445080
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: ruby-debug19
|
60
|
+
requirement: &70151054444600 !ruby/object:Gem::Requirement
|
50
61
|
none: false
|
51
62
|
requirements:
|
52
63
|
- - ! '>='
|
@@ -54,10 +65,10 @@ dependencies:
|
|
54
65
|
version: '0'
|
55
66
|
type: :development
|
56
67
|
prerelease: false
|
57
|
-
version_requirements: *
|
68
|
+
version_requirements: *70151054444600
|
58
69
|
- !ruby/object:Gem::Dependency
|
59
70
|
name: httparty
|
60
|
-
requirement: &
|
71
|
+
requirement: &70151054444120 !ruby/object:Gem::Requirement
|
61
72
|
none: false
|
62
73
|
requirements:
|
63
74
|
- - ~>
|
@@ -65,7 +76,7 @@ dependencies:
|
|
65
76
|
version: 0.8.1
|
66
77
|
type: :development
|
67
78
|
prerelease: false
|
68
|
-
version_requirements: *
|
79
|
+
version_requirements: *70151054444120
|
69
80
|
description: Ruby lib for using the FastSpring (Saas) subscription management API
|
70
81
|
email: richard@justaddpixels.com
|
71
82
|
executables: []
|
@@ -86,17 +97,23 @@ files:
|
|
86
97
|
- lib/fastspring-saasy.rb
|
87
98
|
- lib/fastspring-saasy/account.rb
|
88
99
|
- lib/fastspring-saasy/address.rb
|
89
|
-
- lib/fastspring-saasy/base.rb
|
90
100
|
- lib/fastspring-saasy/customer.rb
|
91
101
|
- lib/fastspring-saasy/error.rb
|
92
102
|
- lib/fastspring-saasy/item.rb
|
103
|
+
- lib/fastspring-saasy/localized_store_pricing.rb
|
93
104
|
- lib/fastspring-saasy/order.rb
|
94
105
|
- lib/fastspring-saasy/payment.rb
|
106
|
+
- lib/fastspring-saasy/private_api_base.rb
|
107
|
+
- lib/fastspring-saasy/public_api_base.rb
|
95
108
|
- lib/fastspring-saasy/subscription.rb
|
109
|
+
- lib/httparty/txt_parser.rb
|
96
110
|
- spec/account_spec.rb
|
97
111
|
- spec/customer_spec.rb
|
112
|
+
- spec/fixtures/basic_localized_store_pricing.txt
|
113
|
+
- spec/fixtures/basic_localized_store_pricing_with_3_products.txt
|
98
114
|
- spec/fixtures/basic_order.xml
|
99
115
|
- spec/fixtures/basic_subscription.xml
|
116
|
+
- spec/localized_store_pricing_spec.rb
|
100
117
|
- spec/order_spec.rb
|
101
118
|
- spec/spec_helper.rb
|
102
119
|
- spec/subscription_spec.rb
|
@@ -115,7 +132,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
115
132
|
version: '0'
|
116
133
|
segments:
|
117
134
|
- 0
|
118
|
-
hash: -
|
135
|
+
hash: -3957425532684118813
|
119
136
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
137
|
none: false
|
121
138
|
requirements:
|
@@ -124,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
124
141
|
version: '0'
|
125
142
|
requirements: []
|
126
143
|
rubyforge_project:
|
127
|
-
rubygems_version: 1.8.
|
144
|
+
rubygems_version: 1.8.11
|
128
145
|
signing_key:
|
129
146
|
specification_version: 3
|
130
147
|
summary: Ruby lib for using the FastSpring (Saasy) API
|