stripe 1.30.3 → 2.0.0
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/.gitattributes +4 -0
- data/.github/ISSUE_TEMPLATE.md +5 -0
- data/.travis.yml +3 -14
- data/Gemfile +28 -4
- data/History.txt +180 -0
- data/README.md +147 -0
- data/Rakefile +10 -0
- data/VERSION +1 -1
- data/bin/stripe-console +12 -5
- data/lib/data/ca-certificates.crt +3868 -5114
- data/lib/stripe/account.rb +43 -23
- data/lib/stripe/alipay_account.rb +20 -0
- data/lib/stripe/api_operations/create.rb +2 -2
- data/lib/stripe/api_operations/delete.rb +2 -2
- data/lib/stripe/api_operations/list.rb +2 -3
- data/lib/stripe/api_operations/request.rb +9 -3
- data/lib/stripe/api_operations/save.rb +85 -0
- data/lib/stripe/api_resource.rb +38 -5
- data/lib/stripe/apple_pay_domain.rb +12 -0
- data/lib/stripe/application_fee.rb +8 -8
- data/lib/stripe/application_fee_refund.rb +7 -3
- data/lib/stripe/balance_transaction.rb +1 -1
- data/lib/stripe/bank_account.rb +13 -4
- data/lib/stripe/bitcoin_receiver.rb +6 -6
- data/lib/stripe/bitcoin_transaction.rb +1 -1
- data/lib/stripe/card.rb +9 -5
- data/lib/stripe/charge.rb +38 -20
- data/lib/stripe/country_spec.rb +9 -0
- data/lib/stripe/coupon.rb +1 -1
- data/lib/stripe/customer.rb +12 -10
- data/lib/stripe/dispute.rb +4 -5
- data/lib/stripe/errors.rb +92 -0
- data/lib/stripe/file_upload.rb +1 -1
- data/lib/stripe/invoice.rb +7 -7
- data/lib/stripe/invoice_item.rb +1 -1
- data/lib/stripe/list_object.rb +8 -7
- data/lib/stripe/order.rb +12 -4
- data/lib/stripe/order_return.rb +9 -0
- data/lib/stripe/plan.rb +1 -1
- data/lib/stripe/product.rb +2 -10
- data/lib/stripe/recipient.rb +1 -1
- data/lib/stripe/refund.rb +1 -1
- data/lib/stripe/reversal.rb +7 -3
- data/lib/stripe/singleton_api_resource.rb +3 -3
- data/lib/stripe/sku.rb +2 -2
- data/lib/stripe/source.rb +11 -0
- data/lib/stripe/stripe_client.rb +396 -0
- data/lib/stripe/stripe_object.rb +167 -91
- data/lib/stripe/stripe_response.rb +48 -0
- data/lib/stripe/subscription.rb +15 -9
- data/lib/stripe/subscription_item.rb +12 -0
- data/lib/stripe/three_d_secure.rb +9 -0
- data/lib/stripe/transfer.rb +4 -5
- data/lib/stripe/util.rb +105 -33
- data/lib/stripe/version.rb +1 -1
- data/lib/stripe.rb +69 -266
- data/spec/fixtures.json +1409 -0
- data/spec/fixtures.yaml +1153 -0
- data/spec/spec.json +19949 -0
- data/spec/spec.yaml +15504 -0
- data/stripe.gemspec +5 -18
- data/test/api_fixtures.rb +29 -0
- data/test/api_stub_helpers.rb +125 -0
- data/test/stripe/account_test.rb +163 -211
- data/test/stripe/alipay_account_test.rb +19 -0
- data/test/stripe/api_operations_test.rb +31 -0
- data/test/stripe/api_resource_test.rb +174 -340
- data/test/stripe/apple_pay_domain_test.rb +33 -0
- data/test/stripe/application_fee_refund_test.rb +22 -31
- data/test/stripe/application_fee_test.rb +6 -14
- data/test/stripe/balance_test.rb +3 -3
- data/test/stripe/bank_account_test.rb +41 -0
- data/test/stripe/bitcoin_receiver_test.rb +51 -42
- data/test/stripe/bitcoin_transaction_test.rb +11 -19
- data/test/stripe/charge_test.rb +39 -98
- data/test/stripe/country_spec_test.rb +20 -0
- data/test/stripe/coupon_test.rb +35 -11
- data/test/stripe/customer_card_test.rb +25 -46
- data/test/stripe/customer_test.rb +89 -61
- data/test/stripe/dispute_test.rb +28 -31
- data/test/stripe/errors_test.rb +18 -0
- data/test/stripe/file_upload_test.rb +32 -24
- data/test/stripe/invoice_item_test.rb +55 -0
- data/test/stripe/invoice_test.rb +50 -24
- data/test/stripe/list_object_test.rb +57 -45
- data/test/stripe/order_return_test.rb +21 -0
- data/test/stripe/order_test.rb +41 -34
- data/test/stripe/plan_test.rb +52 -0
- data/test/stripe/product_test.rb +31 -25
- data/test/stripe/recipient_card_test.rb +23 -40
- data/test/stripe/recipient_test.rb +50 -0
- data/test/stripe/refund_test.rb +20 -36
- data/test/stripe/reversal_test.rb +27 -31
- data/test/stripe/sku_test.rb +39 -13
- data/test/stripe/source_test.rb +43 -0
- data/test/stripe/stripe_client_test.rb +428 -0
- data/test/stripe/stripe_object_test.rb +186 -13
- data/test/stripe/stripe_response_test.rb +46 -0
- data/test/stripe/subscription_item_test.rb +54 -0
- data/test/stripe/subscription_test.rb +40 -52
- data/test/stripe/three_d_secure_test.rb +23 -0
- data/test/stripe/transfer_test.rb +38 -13
- data/test/stripe/util_test.rb +48 -16
- data/test/stripe_test.rb +25 -0
- data/test/test_data.rb +5 -621
- data/test/test_helper.rb +24 -24
- metadata +60 -139
- data/README.rdoc +0 -68
- data/gemfiles/default-with-activesupport.gemfile +0 -10
- data/gemfiles/json.gemfile +0 -12
- data/gemfiles/yajl.gemfile +0 -12
- data/lib/stripe/api_operations/update.rb +0 -58
- data/lib/stripe/errors/api_connection_error.rb +0 -4
- data/lib/stripe/errors/api_error.rb +0 -4
- data/lib/stripe/errors/authentication_error.rb +0 -4
- data/lib/stripe/errors/card_error.rb +0 -12
- data/lib/stripe/errors/invalid_request_error.rb +0 -11
- data/lib/stripe/errors/rate_limit_error.rb +0 -4
- data/lib/stripe/errors/stripe_error.rb +0 -26
- data/test/stripe/charge_refund_test.rb +0 -55
- data/test/stripe/metadata_test.rb +0 -129
data/stripe.gemspec
CHANGED
@@ -5,28 +5,15 @@ require 'stripe/version'
|
|
5
5
|
spec = Gem::Specification.new do |s|
|
6
6
|
s.name = 'stripe'
|
7
7
|
s.version = Stripe::VERSION
|
8
|
+
s.required_ruby_version = '>= 1.9.3'
|
8
9
|
s.summary = 'Ruby bindings for the Stripe API'
|
9
10
|
s.description = 'Stripe is the easiest way to accept payments online. See https://stripe.com for details.'
|
10
|
-
s.
|
11
|
-
s.email =
|
12
|
-
s.homepage = 'https://stripe.com/api'
|
11
|
+
s.author = 'Stripe'
|
12
|
+
s.email = 'support@stripe.com'
|
13
|
+
s.homepage = 'https://stripe.com/docs/api/ruby'
|
13
14
|
s.license = 'MIT'
|
14
15
|
|
15
|
-
s.add_dependency('
|
16
|
-
s.add_dependency('json', '~> 1.8.1')
|
17
|
-
|
18
|
-
s.add_development_dependency('mocha', '~> 0.13.2')
|
19
|
-
s.add_development_dependency('shoulda', '~> 3.4.0')
|
20
|
-
s.add_development_dependency('test-unit')
|
21
|
-
s.add_development_dependency('rake')
|
22
|
-
|
23
|
-
# to avoid problems, bring Byebug in on just versions of Ruby under which
|
24
|
-
# it's known to work well
|
25
|
-
if Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new('2.0.0')
|
26
|
-
s.add_development_dependency("byebug")
|
27
|
-
s.add_development_dependency("pry")
|
28
|
-
s.add_development_dependency("pry-byebug")
|
29
|
-
end
|
16
|
+
s.add_dependency('faraday', '~> 0')
|
30
17
|
|
31
18
|
s.files = `git ls-files`.split("\n")
|
32
19
|
s.test_files = `git ls-files -- test/*`.split("\n")
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# APIFixtures loads fixture data generated by the core Stripe API so that we
|
2
|
+
# can have slightly more accurate and up-to-date resource information in our
|
3
|
+
# tests.
|
4
|
+
class APIFixtures
|
5
|
+
def initialize
|
6
|
+
@fixtures = ::JSON.parse(File.read("#{PROJECT_ROOT}/spec/fixtures.json"),
|
7
|
+
symbolize_names: true)
|
8
|
+
freeze_recursively(@fixtures)
|
9
|
+
end
|
10
|
+
|
11
|
+
def [](name)
|
12
|
+
@fixtures[name]
|
13
|
+
end
|
14
|
+
|
15
|
+
def fetch(*args)
|
16
|
+
@fixtures.fetch(*args)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def freeze_recursively(data)
|
22
|
+
data.each do |k, v|
|
23
|
+
if v.is_a?(Hash)
|
24
|
+
freeze_recursively(v)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
data.freeze
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require "json"
|
2
|
+
|
3
|
+
# Provides a set of helpers for a test suite that help to mock out the Stripe
|
4
|
+
# API.
|
5
|
+
module APIStubHelpers
|
6
|
+
protected
|
7
|
+
|
8
|
+
# Uses Webmock to stub out the Stripe API for testing purposes. The stub will
|
9
|
+
# by default respond on any routes that are defined in the bundled OpenAPI
|
10
|
+
# spec with generated response data.
|
11
|
+
#
|
12
|
+
# An `override_app` can be specified to get finer grain control over how a
|
13
|
+
# stubbed endpoint responds. It can be used to modify generated responses,
|
14
|
+
# mock expectations, or even to override the default stub completely.
|
15
|
+
def stub_api
|
16
|
+
stub_request(:any, /^#{Stripe.api_base}/).to_rack(new_api_stub)
|
17
|
+
end
|
18
|
+
|
19
|
+
def stub_connect
|
20
|
+
stub_request(:any, /^#{Stripe.connect_base}/).to_return(:body => "{}")
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
# APIStubMiddleware intercepts a response generated by Committee's stubbing
|
26
|
+
# middleware, and tries to replace it with a better version from a set of
|
27
|
+
# sample fixtures data generated from Stripe's core API service.
|
28
|
+
class APIStubMiddleware
|
29
|
+
API_FIXTURES = APIFixtures.new
|
30
|
+
|
31
|
+
def initialize(app)
|
32
|
+
@app = app
|
33
|
+
end
|
34
|
+
|
35
|
+
def call(env)
|
36
|
+
# We use a vendor specific prefix (`x-resourceId`) embedded in the schema
|
37
|
+
# of any resource in our spec to identify it (e.g. "charge"). This allows
|
38
|
+
# us to cross-reference that response with some data that we might find
|
39
|
+
# in our fixtures file so that we can respond with a higher fidelity
|
40
|
+
# response.
|
41
|
+
schema = env["committee.response_schema"]
|
42
|
+
resource_id = schema.data["x-resourceId"] || ""
|
43
|
+
|
44
|
+
if data = API_FIXTURES[resource_id.to_sym]
|
45
|
+
# standard top-level API resource
|
46
|
+
data = fixturize_lists_recursively(schema, data)
|
47
|
+
env["committee.response"] = data
|
48
|
+
elsif schema.properties["object"].enum == ["list"]
|
49
|
+
# top level list (like from a list endpoint)
|
50
|
+
data = fixturize_list(schema, env["committee.response"])
|
51
|
+
env["committee.response"] = data
|
52
|
+
else
|
53
|
+
raise "no fixture for: #{resource_id}"
|
54
|
+
end
|
55
|
+
@app.call(env)
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
# If schema looks like a Stripe list object, then we look up the resource
|
61
|
+
# that the list is supposed to include and inject it into `data` as a
|
62
|
+
# fixture. Also calls into that other schema recursively so that sublists
|
63
|
+
# within it will also be assigned a fixture.
|
64
|
+
def fixturize_list(schema, data)
|
65
|
+
object_schema = schema.properties["object"]
|
66
|
+
if object_schema && object_schema.enum == ["list"]
|
67
|
+
subschema = schema.properties["data"].items
|
68
|
+
resource_id = subschema.data["x-resourceId"] || ""
|
69
|
+
if subdata = API_FIXTURES[resource_id.to_sym]
|
70
|
+
subdata = fixturize_lists_recursively(subschema, subdata)
|
71
|
+
|
72
|
+
data = data ? data.dup : {}
|
73
|
+
data[:data] = [subdata]
|
74
|
+
end
|
75
|
+
end
|
76
|
+
data
|
77
|
+
end
|
78
|
+
|
79
|
+
# Examines each of the given schema's properties and calls #fixturize_list
|
80
|
+
# on them so that any sublists will be populated with sample fixture data.
|
81
|
+
def fixturize_lists_recursively(schema, data)
|
82
|
+
data = data.dup
|
83
|
+
schema.properties.each do |key, subschema|
|
84
|
+
data[key.to_sym] = fixturize_list(subschema, data[key.to_sym])
|
85
|
+
end
|
86
|
+
data
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# A descendant of the standard `Sinatra::Base` that we can use to enrich
|
91
|
+
# certain types of responses.
|
92
|
+
class APIStubApp < Sinatra::Base
|
93
|
+
not_found do
|
94
|
+
"endpoint not found in API stub: #{request.request_method} #{request.path_info}"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# Finds the latest OpenAPI specification in ROOT/spec/ and parses it for
|
99
|
+
# use with Committee.
|
100
|
+
def self.initialize_spec
|
101
|
+
schema_data = ::JSON.parse(File.read("#{PROJECT_ROOT}/spec/spec.json"))
|
102
|
+
|
103
|
+
driver = Committee::Drivers::OpenAPI2.new
|
104
|
+
driver.parse(schema_data)
|
105
|
+
end
|
106
|
+
|
107
|
+
# Creates a new Rack app with Committee middleware it.
|
108
|
+
def new_api_stub
|
109
|
+
Rack::Builder.new {
|
110
|
+
use Committee::Middleware::RequestValidation, schema: @@spec,
|
111
|
+
params_response: true, strict: true
|
112
|
+
use Committee::Middleware::Stub, schema: @@spec,
|
113
|
+
call: true
|
114
|
+
use APIStubMiddleware
|
115
|
+
run APIStubApp.new
|
116
|
+
}
|
117
|
+
end
|
118
|
+
|
119
|
+
# Parse and initialize the OpenAPI spec only once for the entire test suite.
|
120
|
+
@@spec = initialize_spec
|
121
|
+
|
122
|
+
# The default override app. Doesn't respond on any route so generated
|
123
|
+
# responses will always take precedence.
|
124
|
+
@@default_override_app = Sinatra.new
|
125
|
+
end
|
data/test/stripe/account_test.rb
CHANGED
@@ -2,251 +2,203 @@ require File.expand_path('../../test_helper', __FILE__)
|
|
2
2
|
|
3
3
|
module Stripe
|
4
4
|
class AccountTest < Test::Unit::TestCase
|
5
|
-
|
6
|
-
resp = make_account({
|
7
|
-
:charges_enabled => false,
|
8
|
-
:details_submitted => false,
|
9
|
-
:email => "test+bindings@stripe.com",
|
10
|
-
})
|
11
|
-
@mock.expects(:get).
|
12
|
-
once.
|
13
|
-
with('https://api.stripe.com/v1/account', nil, nil).
|
14
|
-
returns(make_response(resp))
|
15
|
-
a = Stripe::Account.retrieve
|
16
|
-
assert_equal "test+bindings@stripe.com", a.email
|
17
|
-
assert !a.charges_enabled
|
18
|
-
assert !a.details_submitted
|
19
|
-
end
|
5
|
+
FIXTURE = API_FIXTURES.fetch(:account)
|
20
6
|
|
21
|
-
should "be
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
})
|
27
|
-
@mock.expects(:get).
|
28
|
-
once.
|
29
|
-
with('https://api.stripe.com/v1/accounts/acct_foo', nil, nil).
|
30
|
-
returns(make_response(resp))
|
31
|
-
a = Stripe::Account.retrieve('acct_foo')
|
32
|
-
assert_equal "test+bindings@stripe.com", a.email
|
33
|
-
assert !a.charges_enabled
|
34
|
-
assert !a.details_submitted
|
7
|
+
should "be listable" do
|
8
|
+
accounts = Stripe::Account.list
|
9
|
+
assert_requested :get, "#{Stripe.api_base}/v1/accounts"
|
10
|
+
assert accounts.data.kind_of?(Array)
|
11
|
+
assert accounts.data[0].kind_of?(Stripe::Account)
|
35
12
|
end
|
36
13
|
|
37
|
-
should "be retrievable using
|
38
|
-
account =
|
39
|
-
|
40
|
-
account.
|
41
|
-
Stripe::Account.retrieve('sk_foobar')
|
14
|
+
should "be retrievable using singular endpoint" do
|
15
|
+
account = Stripe::Account.retrieve
|
16
|
+
assert_requested :get, "#{Stripe.api_base}/v1/account"
|
17
|
+
assert account.kind_of?(Stripe::Account)
|
42
18
|
end
|
43
19
|
|
44
|
-
should "
|
45
|
-
account = Stripe::Account.
|
46
|
-
|
47
|
-
|
48
|
-
:secret => 'secret-key',
|
49
|
-
}
|
50
|
-
}))
|
51
|
-
assert_equal 'publishable-key', account.keys.publishable
|
52
|
-
assert_equal 'secret-key', account.keys.secret
|
20
|
+
should "be retrievable using plural endpoint" do
|
21
|
+
account = Stripe::Account.retrieve(FIXTURE[:id])
|
22
|
+
assert_requested :get, "#{Stripe.api_base}/v1/accounts/#{FIXTURE[:id]}"
|
23
|
+
assert account.kind_of?(Stripe::Account)
|
53
24
|
end
|
54
25
|
|
55
|
-
should "be
|
56
|
-
|
57
|
-
|
58
|
-
:
|
59
|
-
:address => {
|
60
|
-
:line1 => '1 Two Three'
|
61
|
-
}
|
62
|
-
}
|
63
|
-
}
|
64
|
-
@mock.expects(:get).
|
65
|
-
once.
|
66
|
-
with('https://api.stripe.com/v1/accounts/acct_foo', nil, nil).
|
67
|
-
returns(make_response(resp))
|
68
|
-
|
69
|
-
@mock.expects(:post).
|
70
|
-
once.
|
71
|
-
with('https://api.stripe.com/v1/accounts/acct_foo', nil, 'legal_entity[address][line1]=2+Three+Four&legal_entity[first_name]=Bob').
|
72
|
-
returns(make_response(resp))
|
73
|
-
|
74
|
-
a = Stripe::Account.retrieve('acct_foo')
|
75
|
-
a.legal_entity.first_name = 'Bob'
|
76
|
-
a.legal_entity.address.line1 = '2 Three Four'
|
77
|
-
a.save
|
78
|
-
end
|
26
|
+
should "be rejectable" do
|
27
|
+
account_data = {:id => 'acct_foo'}
|
28
|
+
stub_request(:get, "#{Stripe.api_base}/v1/accounts/acct_foo").
|
29
|
+
to_return(body: JSON.generate(account_data))
|
79
30
|
|
80
|
-
|
81
|
-
|
82
|
-
:keys => {
|
83
|
-
:publishable => 'publishable-key',
|
84
|
-
:secret => 'secret-key',
|
85
|
-
},
|
86
|
-
:legal_entity => {
|
87
|
-
:first_name => 'Bling'
|
88
|
-
}
|
89
|
-
}))
|
31
|
+
stub_request(:post, "#{Stripe.api_base}/v1/accounts/acct_foo/reject").
|
32
|
+
to_return(body: JSON.generate(account_data))
|
90
33
|
|
91
|
-
|
92
|
-
|
93
|
-
|
34
|
+
account = Stripe::Account.retrieve('acct_foo')
|
35
|
+
account.reject(:reason => 'fraud')
|
36
|
+
end
|
94
37
|
|
95
|
-
|
38
|
+
should "be creatable" do
|
39
|
+
account = Stripe::Account.create(:metadata => {})
|
40
|
+
assert_requested :post, "#{Stripe.api_base}/v1/accounts"
|
41
|
+
assert account.kind_of?(Stripe::Account)
|
96
42
|
end
|
97
43
|
|
98
|
-
should "be
|
99
|
-
|
100
|
-
|
101
|
-
|
44
|
+
should "be saveable" do
|
45
|
+
account = Stripe::Account.retrieve(FIXTURE[:id])
|
46
|
+
account.metadata['key'] = 'value'
|
47
|
+
account.save
|
48
|
+
assert_requested :post, "#{Stripe.api_base}/v1/accounts/#{FIXTURE[:id]}"
|
49
|
+
end
|
102
50
|
|
51
|
+
should "be updateable" do
|
52
|
+
account = Stripe::Account.update(FIXTURE[:id], metadata: {foo: 'bar'})
|
53
|
+
assert_requested :post, "#{Stripe.api_base}/v1/accounts/#{FIXTURE[:id]}"
|
54
|
+
assert account.kind_of?(Stripe::Account)
|
55
|
+
end
|
103
56
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
57
|
+
should "be deletable" do
|
58
|
+
account = Stripe::Account.retrieve(FIXTURE[:id])
|
59
|
+
account = account.delete
|
60
|
+
assert_requested :delete, "#{Stripe.api_base}/v1/accounts/#{FIXTURE[:id]}"
|
61
|
+
assert account.kind_of?(Stripe::Account)
|
108
62
|
end
|
109
63
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
64
|
+
context "#bank_account=" do
|
65
|
+
should "warn that #bank_account= is deprecated" do
|
66
|
+
old_stderr = $stderr
|
67
|
+
$stderr = StringIO.new
|
68
|
+
begin
|
69
|
+
account = Stripe::Account.retrieve(FIXTURE[:id])
|
70
|
+
account.bank_account = "tok_123"
|
71
|
+
message = "NOTE: Stripe::Account#bank_account= is " +
|
72
|
+
"deprecated; use #external_account= instead"
|
73
|
+
assert_match Regexp.new(message), $stderr.string
|
74
|
+
ensure
|
75
|
+
$stderr = old_stderr
|
76
|
+
end
|
116
77
|
end
|
117
78
|
end
|
118
79
|
|
119
|
-
|
120
|
-
|
121
|
-
:id
|
122
|
-
:external_accounts => {
|
123
|
-
:object => "list",
|
124
|
-
:url => "/v1/accounts/acct_1234/external_accounts",
|
125
|
-
:data => [],
|
126
|
-
}
|
127
|
-
}
|
128
|
-
@mock.expects(:get).once.returns(make_response(resp))
|
129
|
-
a = Stripe::Account.retrieve
|
130
|
-
|
131
|
-
@mock.expects(:post).
|
132
|
-
once.
|
133
|
-
with('https://api.stripe.com/v1/accounts/acct_1234/external_accounts', nil, 'external_account=btok_1234').
|
134
|
-
returns(make_response(resp))
|
135
|
-
a.external_accounts.create({:external_account => 'btok_1234'})
|
136
|
-
end
|
80
|
+
context "#deauthorize" do
|
81
|
+
should "deauthorize an account" do
|
82
|
+
account = Stripe::Account.retrieve(FIXTURE[:id])
|
137
83
|
|
138
|
-
|
139
|
-
|
140
|
-
:
|
141
|
-
|
142
|
-
:
|
143
|
-
|
144
|
-
|
145
|
-
:id => "ba_1234",
|
146
|
-
:object => "bank_account",
|
147
|
-
}],
|
148
|
-
}
|
149
|
-
}
|
150
|
-
@mock.expects(:get).once.returns(make_response(resp))
|
151
|
-
a = Stripe::Account.retrieve
|
152
|
-
assert_equal(BankAccount, a.external_accounts.data[0].class)
|
84
|
+
# Unfortunately, the OpenAPI spec doesn't yet cover anything under the
|
85
|
+
# Connect endpoints, so for just stub this out with Webmock.
|
86
|
+
stub_request(:post, "#{Stripe.connect_base}/oauth/deauthorize").
|
87
|
+
with(body: { 'client_id' => 'ca_1234', 'stripe_user_id' => account.id}).
|
88
|
+
to_return(body: JSON.generate({ 'stripe_user_id' => account.id }))
|
89
|
+
account.deauthorize('ca_1234', 'sk_test_1234')
|
90
|
+
end
|
153
91
|
end
|
154
92
|
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
expected = {
|
167
|
-
:legal_entity => {
|
168
|
-
:additional_owners => {
|
169
|
-
"0" => { :first_name => "Joe" },
|
170
|
-
"1" => { :first_name => "Jane" },
|
171
|
-
}
|
172
|
-
}
|
173
|
-
}
|
174
|
-
assert_equal(expected, obj.class.serialize_params(obj))
|
93
|
+
context "#legal_entity=" do
|
94
|
+
should 'disallow direct overrides' do
|
95
|
+
account = Stripe::Account.retrieve(FIXTURE[:id])
|
96
|
+
|
97
|
+
assert_raise NoMethodError do
|
98
|
+
account.legal_entity = {:first_name => 'Blah'}
|
99
|
+
end
|
100
|
+
|
101
|
+
account.legal_entity.first_name = 'Blah'
|
102
|
+
end
|
175
103
|
end
|
176
104
|
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
:
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
105
|
+
context "#serialize_params" do
|
106
|
+
should "serialize an a new additional_owners" do
|
107
|
+
obj = Stripe::Util.convert_to_stripe_object({
|
108
|
+
:object => "account",
|
109
|
+
:legal_entity => Stripe::StripeObject.construct_from({
|
110
|
+
}),
|
111
|
+
}, {})
|
112
|
+
obj.legal_entity.additional_owners = [
|
113
|
+
{ :first_name => "Joe" },
|
114
|
+
{ :first_name => "Jane" },
|
115
|
+
]
|
116
|
+
|
117
|
+
expected = {
|
118
|
+
:legal_entity => {
|
119
|
+
:additional_owners => {
|
120
|
+
"0" => { :first_name => "Joe" },
|
121
|
+
"1" => { :first_name => "Jane" },
|
122
|
+
}
|
123
|
+
}
|
189
124
|
}
|
190
|
-
|
191
|
-
|
125
|
+
assert_equal(expected, obj.serialize_params)
|
126
|
+
end
|
192
127
|
|
193
|
-
|
194
|
-
|
195
|
-
:
|
196
|
-
|
128
|
+
should "serialize on an partially changed additional_owners" do
|
129
|
+
obj = Stripe::Util.convert_to_stripe_object({
|
130
|
+
:object => "account",
|
131
|
+
:legal_entity => {
|
132
|
+
:additional_owners => [
|
133
|
+
Stripe::StripeObject.construct_from({
|
134
|
+
:first_name => "Joe"
|
135
|
+
}),
|
136
|
+
Stripe::StripeObject.construct_from({
|
137
|
+
:first_name => "Jane"
|
138
|
+
}),
|
139
|
+
]
|
140
|
+
}
|
141
|
+
}, {})
|
142
|
+
obj.legal_entity.additional_owners[1].first_name = "Stripe"
|
143
|
+
|
144
|
+
expected = {
|
145
|
+
:legal_entity => {
|
146
|
+
:additional_owners => {
|
147
|
+
"1" => { :first_name => "Stripe" }
|
148
|
+
}
|
197
149
|
}
|
198
150
|
}
|
199
|
-
|
200
|
-
|
201
|
-
end
|
151
|
+
assert_equal(expected, obj.serialize_params)
|
152
|
+
end
|
202
153
|
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
154
|
+
should "serialize on an unchanged additional_owners" do
|
155
|
+
obj = Stripe::Util.convert_to_stripe_object({
|
156
|
+
:object => "account",
|
157
|
+
:legal_entity => {
|
158
|
+
:additional_owners => [
|
159
|
+
Stripe::StripeObject.construct_from({
|
160
|
+
:first_name => "Joe"
|
161
|
+
}),
|
162
|
+
Stripe::StripeObject.construct_from({
|
163
|
+
:first_name => "Jane"
|
164
|
+
}),
|
165
|
+
]
|
166
|
+
}
|
167
|
+
}, {})
|
217
168
|
|
218
|
-
|
219
|
-
|
220
|
-
|
169
|
+
expected = {
|
170
|
+
:legal_entity => {
|
171
|
+
:additional_owners => {}
|
172
|
+
}
|
221
173
|
}
|
222
|
-
|
223
|
-
|
224
|
-
end
|
174
|
+
assert_equal(expected, obj.serialize_params)
|
175
|
+
end
|
225
176
|
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
177
|
+
# Note that the empty string that we send for this one has a special
|
178
|
+
# meaning for the server, which interprets it as an array unset.
|
179
|
+
should "serialize on an unset additional_owners" do
|
180
|
+
obj = Stripe::Util.convert_to_stripe_object({
|
181
|
+
:object => "account",
|
182
|
+
:legal_entity => {
|
183
|
+
:additional_owners => [
|
184
|
+
Stripe::StripeObject.construct_from({
|
185
|
+
:first_name => "Joe"
|
186
|
+
}),
|
187
|
+
Stripe::StripeObject.construct_from({
|
188
|
+
:first_name => "Jane"
|
189
|
+
}),
|
190
|
+
]
|
191
|
+
}
|
192
|
+
}, {})
|
193
|
+
obj.legal_entity.additional_owners = nil
|
243
194
|
|
244
|
-
|
245
|
-
|
246
|
-
|
195
|
+
expected = {
|
196
|
+
:legal_entity => {
|
197
|
+
:additional_owners => ""
|
198
|
+
}
|
247
199
|
}
|
248
|
-
|
249
|
-
|
200
|
+
assert_equal(expected, obj.serialize_params)
|
201
|
+
end
|
250
202
|
end
|
251
203
|
end
|
252
204
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require File.expand_path('../../test_helper', __FILE__)
|
2
|
+
|
3
|
+
module Stripe
|
4
|
+
class AlipayAccountTest < Test::Unit::TestCase
|
5
|
+
FIXTURE = API_FIXTURES.fetch(:alipay_account)
|
6
|
+
|
7
|
+
should "raise on #retrieve" do
|
8
|
+
assert_raises NotImplementedError do
|
9
|
+
Stripe::AlipayAccount.retrieve FIXTURE[:id]
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
should "raise on #update" do
|
14
|
+
assert_raises NotImplementedError do
|
15
|
+
Stripe::AlipayAccount.update FIXTURE[:id], {}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require File.expand_path('../../test_helper', __FILE__)
|
3
|
+
|
4
|
+
module Stripe
|
5
|
+
class ApiOperationsTest < Test::Unit::TestCase
|
6
|
+
class UpdateableResource < APIResource
|
7
|
+
include Stripe::APIOperations::Save
|
8
|
+
|
9
|
+
def self.protected_fields
|
10
|
+
[:protected]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
context ".update" do
|
15
|
+
should "post the correct parameters to the resource URL" do
|
16
|
+
stub_request(:post, "#{Stripe.api_base}/v1/updateableresources/id").
|
17
|
+
with(body: { foo: "bar" }).
|
18
|
+
to_return(body: JSON.generate({ foo: "bar" }))
|
19
|
+
resource = UpdateableResource::update("id", { foo: "bar" })
|
20
|
+
assert_equal('bar', resource.foo)
|
21
|
+
end
|
22
|
+
|
23
|
+
should "error on protected fields" do
|
24
|
+
e = assert_raises do
|
25
|
+
UpdateableResource::update("id", { protected: "bar" })
|
26
|
+
end
|
27
|
+
assert_equal "Cannot update protected field: protected", e.message
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|