stripe-ruby-mock 3.1.0 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/rspec_tests.yml +1 -1
- data/CHANGELOG.md +8 -0
- data/Gemfile +0 -5
- data/README.md +3 -3
- data/lib/stripe_mock/api/client.rb +1 -1
- data/lib/stripe_mock/instance.rb +1 -1
- data/lib/stripe_mock/request_handlers/charges.rb +20 -1
- data/lib/stripe_mock/request_handlers/customers.rb +12 -1
- data/lib/stripe_mock/request_handlers/helpers/search_helpers.rb +67 -0
- data/lib/stripe_mock/request_handlers/invoices.rb +10 -1
- data/lib/stripe_mock/request_handlers/payment_intents.rb +10 -1
- data/lib/stripe_mock/request_handlers/prices.rb +13 -4
- data/lib/stripe_mock/request_handlers/products.rb +14 -5
- data/lib/stripe_mock/request_handlers/subscriptions.rb +10 -1
- data/lib/stripe_mock/version.rb +1 -1
- data/lib/stripe_mock.rb +1 -0
- data/spec/shared_stripe_examples/bank_token_examples.rb +5 -7
- data/spec/shared_stripe_examples/charge_examples.rb +97 -0
- data/spec/shared_stripe_examples/customer_examples.rb +56 -0
- data/spec/shared_stripe_examples/invoice_examples.rb +86 -1
- data/spec/shared_stripe_examples/payment_intent_examples.rb +62 -0
- data/spec/shared_stripe_examples/price_examples.rb +70 -1
- data/spec/shared_stripe_examples/product_examples.rb +68 -0
- data/spec/shared_stripe_examples/subscription_examples.rb +65 -6
- data/spec/spec_helper.rb +1 -1
- data/stripe-ruby-mock.gemspec +2 -3
- metadata +8 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: be25dafb9048c0f9fea9671c8dfa3c25f51121afcd11e2a83fb28033d84fb609
|
4
|
+
data.tar.gz: 5ccd183891c8ee2a67aa21b7be2508226850a514b9d1f5c8bbe994e374b832df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d3be1ba24da98944abb23977d94ab25205ef5458fbe1504bff4293fa55b6d0ae57f922ede65d28f80872c60e66086fd68a32f5b4a96dd5c23ab59a20639f1c74
|
7
|
+
data.tar.gz: b06bea97f9417cfaf61e4c4a4dc86c914ef1dc76ec170bda9514fd782eddabeceac62b60a65fef771220b59c7b83aeba0c60a809a641c0b02984c1fa8378ce15
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
### Unreleased
|
2
2
|
|
3
|
+
### 4.0.0 (2024-08-07)
|
4
|
+
- [#905](https://github.com/stripe-ruby-mock/stripe-ruby-mock/pull/905) Allow Stripe SDK v11 by [@stevenharman ](https://github.com/stevenharman)
|
5
|
+
- [#830](https://github.com/stripe-ruby-mock/stripe-ruby-mock/pull/830) Implement search API by [@adamstegman](https://github.com/adamstegman)
|
6
|
+
- [#848](https://github.com/stripe-ruby-mock/stripe-ruby-mock/pull/848) Extending runtime dependency on Stripe gem from version 5 through 11 by [@smakani](https://github.com/smakani)
|
7
|
+
- [#893](https://github.com/stripe-ruby-mock/stripe-ruby-mock/pull/893) Adds support for stripe-ruby v10 by [@fabianoarruda](https://github.com/fabianoarruda)
|
8
|
+
|
9
|
+
|
10
|
+
### 3.1.0 (2024-01-03)
|
3
11
|
- [#693](https://github.com/stripe-ruby-mock/stripe-ruby-mock/pull/693) gemspec: add change,issue,source_code URL by [@mtmail](https://github.com/mtmail)
|
4
12
|
- [#700](https://github.com/stripe-ruby-mock/stripe-ruby-mock/pull/700) update the balance API to respond with instant_available by [@iamnader](https://github.com/iamnader)
|
5
13
|
- [#687](https://github.com/stripe-ruby-mock/stripe-ruby-mock/pull/687) Add PaymentIntent Webhooks by [@klaustopher](https://github.com/klaustopher)
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -12,7 +12,7 @@ This gem has unexpectedly grown in popularity and I've gotten pretty busy, so I'
|
|
12
12
|
|
13
13
|
In your gemfile:
|
14
14
|
|
15
|
-
gem 'stripe-ruby-mock',
|
15
|
+
gem 'stripe-ruby-mock', :require => 'stripe_mock'
|
16
16
|
|
17
17
|
## !!! Important
|
18
18
|
|
@@ -29,8 +29,8 @@ version `3.0.0` has [breaking changes](https://github.com/stripe-ruby-mock/strip
|
|
29
29
|
|
30
30
|
### Requirements
|
31
31
|
|
32
|
-
* ruby >= 2.
|
33
|
-
* stripe
|
32
|
+
* ruby >= 2.7.0
|
33
|
+
* stripe > 5 & < 11
|
34
34
|
|
35
35
|
### Specifications
|
36
36
|
|
@@ -27,7 +27,7 @@ module StripeMock
|
|
27
27
|
|
28
28
|
private
|
29
29
|
|
30
|
-
def self.redirect_to_mock_server(method, url, api_key: nil, api_base: nil, params: {}, headers: {})
|
30
|
+
def self.redirect_to_mock_server(method, url, api_key: nil, api_base: nil, usage: [], params: {}, headers: {})
|
31
31
|
handler = Instance.handler_for_method_url("#{method} #{url}")
|
32
32
|
|
33
33
|
if mock_error = client.error_queue.error_for_handler_name(handler[:name])
|
data/lib/stripe_mock/instance.rb
CHANGED
@@ -109,7 +109,7 @@ module StripeMock
|
|
109
109
|
@base_strategy = TestStrategies::Base.new
|
110
110
|
end
|
111
111
|
|
112
|
-
def mock_request(method, url, api_key: nil, api_base: nil, params: {}, headers: {})
|
112
|
+
def mock_request(method, url, api_key: nil, api_base: nil, usage: [], params: {}, headers: {})
|
113
113
|
return {} if method == :xtest
|
114
114
|
|
115
115
|
api_key ||= (Stripe.api_key || DUMMY_API_KEY)
|
@@ -5,7 +5,8 @@ module StripeMock
|
|
5
5
|
def Charges.included(klass)
|
6
6
|
klass.add_handler 'post /v1/charges', :new_charge
|
7
7
|
klass.add_handler 'get /v1/charges', :get_charges
|
8
|
-
klass.add_handler 'get /v1/charges/
|
8
|
+
klass.add_handler 'get /v1/charges/search', :search_charges
|
9
|
+
klass.add_handler 'get /v1/charges/((?!search).*)', :get_charge
|
9
10
|
klass.add_handler 'post /v1/charges/(.*)/capture', :capture_charge
|
10
11
|
klass.add_handler 'post /v1/charges/(.*)/refund', :refund_charge
|
11
12
|
klass.add_handler 'post /v1/charges/(.*)/refunds', :refund_charge
|
@@ -90,6 +91,24 @@ module StripeMock
|
|
90
91
|
Data.mock_list_object(clone.values, params)
|
91
92
|
end
|
92
93
|
|
94
|
+
SEARCH_FIELDS = [
|
95
|
+
"amount",
|
96
|
+
"currency",
|
97
|
+
"customer",
|
98
|
+
"payment_method_details.card.brand",
|
99
|
+
"payment_method_details.card.exp_month",
|
100
|
+
"payment_method_details.card.exp_year",
|
101
|
+
"payment_method_details.card.fingerprint",
|
102
|
+
"payment_method_details.card.last4",
|
103
|
+
"status",
|
104
|
+
].freeze
|
105
|
+
def search_charges(route, method_url, params, headers)
|
106
|
+
require_param(:query) unless params[:query]
|
107
|
+
|
108
|
+
results = search_results(charges.values, params[:query], fields: SEARCH_FIELDS, resource_name: "charges")
|
109
|
+
Data.mock_list_object(results, params)
|
110
|
+
end
|
111
|
+
|
93
112
|
def get_charge(route, method_url, params, headers)
|
94
113
|
route =~ method_url
|
95
114
|
charge_id = $1 || params[:charge]
|
@@ -5,9 +5,10 @@ module StripeMock
|
|
5
5
|
def Customers.included(klass)
|
6
6
|
klass.add_handler 'post /v1/customers', :new_customer
|
7
7
|
klass.add_handler 'post /v1/customers/([^/]*)', :update_customer
|
8
|
-
klass.add_handler 'get /v1/customers/([^/]*)',
|
8
|
+
klass.add_handler 'get /v1/customers/((?!search)[^/]*)', :get_customer
|
9
9
|
klass.add_handler 'delete /v1/customers/([^/]*)', :delete_customer
|
10
10
|
klass.add_handler 'get /v1/customers', :list_customers
|
11
|
+
klass.add_handler 'get /v1/customers/search', :search_customers
|
11
12
|
klass.add_handler 'delete /v1/customers/([^/]*)/discount', :delete_customer_discount
|
12
13
|
end
|
13
14
|
|
@@ -140,6 +141,16 @@ module StripeMock
|
|
140
141
|
Data.mock_list_object(customers[stripe_account]&.values, params)
|
141
142
|
end
|
142
143
|
|
144
|
+
SEARCH_FIELDS = ["email", "name", "phone"].freeze
|
145
|
+
def search_customers(route, method_url, params, headers)
|
146
|
+
require_param(:query) unless params[:query]
|
147
|
+
|
148
|
+
stripe_account = headers && headers[:stripe_account] || Stripe.api_key
|
149
|
+
all_customers = customers[stripe_account]&.values
|
150
|
+
results = search_results(all_customers, params[:query], fields: SEARCH_FIELDS, resource_name: "customers")
|
151
|
+
Data.mock_list_object(results, params)
|
152
|
+
end
|
153
|
+
|
143
154
|
def delete_customer_discount(route, method_url, params, headers)
|
144
155
|
stripe_account = headers && headers[:stripe_account] || Stripe.api_key
|
145
156
|
route =~ method_url
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module StripeMock
|
2
|
+
module RequestHandlers
|
3
|
+
module Helpers
|
4
|
+
# Only supports exact matches on a single field, e.g.
|
5
|
+
# - 'amount:100'
|
6
|
+
# - 'email:"name@domain.com"'
|
7
|
+
# - 'name:"Foo Bar"'
|
8
|
+
# - 'metadata["foo"]:"bar"'
|
9
|
+
QUERYSTRING_PATTERN = /\A(?<field>[\w\.]+)(\[['"](?<metadata_key>[^'"]*)['"]\])?:['"]?(?<value>[^'"]*)['"]?\z/
|
10
|
+
def search_results(all_values, querystring, fields: [], resource_name:)
|
11
|
+
values = all_values.dup
|
12
|
+
query_match = QUERYSTRING_PATTERN.match(querystring)
|
13
|
+
raise Stripe::InvalidRequestError.new(
|
14
|
+
'We were unable to parse your search query.' \
|
15
|
+
' Try using the format `metadata["key"]:"value"` to query for metadata or key:"value" to query for other fields.',
|
16
|
+
nil,
|
17
|
+
http_status: 400,
|
18
|
+
) unless query_match
|
19
|
+
|
20
|
+
case query_match[:field]
|
21
|
+
when *fields
|
22
|
+
values = values.select { |resource|
|
23
|
+
exact_match?(actual: field_value(resource, field: query_match[:field]), expected: query_match[:value])
|
24
|
+
}
|
25
|
+
when "metadata"
|
26
|
+
values = values.select { |resource|
|
27
|
+
resource[:metadata] &&
|
28
|
+
exact_match?(actual: resource[:metadata][query_match[:metadata_key].to_sym], expected: query_match[:value])
|
29
|
+
}
|
30
|
+
else
|
31
|
+
raise Stripe::InvalidRequestError.new(
|
32
|
+
"Field `#{query_match[:field]}` is an unsupported search field for resource `#{resource_name}`." \
|
33
|
+
" See http://stripe.com/docs/search#query-fields-for-#{resource_name.gsub('_', '-')} for a list of supported fields.",
|
34
|
+
nil,
|
35
|
+
http_status: 400,
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
values
|
40
|
+
end
|
41
|
+
|
42
|
+
def exact_match?(actual:, expected:)
|
43
|
+
# allow comparisons of integers
|
44
|
+
if actual.respond_to?(:to_i) && actual.to_i == actual
|
45
|
+
expected = expected.to_i
|
46
|
+
end
|
47
|
+
# allow comparisons of boolean
|
48
|
+
case expected
|
49
|
+
when "true"
|
50
|
+
expected = true
|
51
|
+
when "false"
|
52
|
+
expected = false
|
53
|
+
end
|
54
|
+
|
55
|
+
actual == expected
|
56
|
+
end
|
57
|
+
|
58
|
+
def field_value(resource, field:)
|
59
|
+
value = resource
|
60
|
+
field.split('.').each do |segment|
|
61
|
+
value = value[segment.to_sym]
|
62
|
+
end
|
63
|
+
value
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -6,7 +6,8 @@ module StripeMock
|
|
6
6
|
klass.add_handler 'post /v1/invoices', :new_invoice
|
7
7
|
klass.add_handler 'get /v1/invoices/upcoming', :upcoming_invoice
|
8
8
|
klass.add_handler 'get /v1/invoices/(.*)/lines', :get_invoice_line_items
|
9
|
-
klass.add_handler 'get /v1/invoices/(.*)',
|
9
|
+
klass.add_handler 'get /v1/invoices/((?!search).*)', :get_invoice
|
10
|
+
klass.add_handler 'get /v1/invoices/search', :search_invoices
|
10
11
|
klass.add_handler 'get /v1/invoices', :list_invoices
|
11
12
|
klass.add_handler 'post /v1/invoices/(.*)/pay', :pay_invoice
|
12
13
|
klass.add_handler 'post /v1/invoices/(.*)', :update_invoice
|
@@ -25,6 +26,14 @@ module StripeMock
|
|
25
26
|
invoices[$1].merge!(params)
|
26
27
|
end
|
27
28
|
|
29
|
+
SEARCH_FIELDS = ["currency", "customer", "number", "receipt_number", "subscription", "total"].freeze
|
30
|
+
def search_invoices(route, method_url, params, headers)
|
31
|
+
require_param(:query) unless params[:query]
|
32
|
+
|
33
|
+
results = search_results(invoices.values, params[:query], fields: SEARCH_FIELDS, resource_name: "invoices")
|
34
|
+
Data.mock_list_object(results, params)
|
35
|
+
end
|
36
|
+
|
28
37
|
def list_invoices(route, method_url, params, headers)
|
29
38
|
params[:offset] ||= 0
|
30
39
|
params[:limit] ||= 10
|
@@ -6,7 +6,8 @@ module StripeMock
|
|
6
6
|
def PaymentIntents.included(klass)
|
7
7
|
klass.add_handler 'post /v1/payment_intents', :new_payment_intent
|
8
8
|
klass.add_handler 'get /v1/payment_intents', :get_payment_intents
|
9
|
-
klass.add_handler 'get /v1/payment_intents/(.*)',
|
9
|
+
klass.add_handler 'get /v1/payment_intents/((?!search).*)', :get_payment_intent
|
10
|
+
klass.add_handler 'get /v1/payment_intents/search', :search_payment_intents
|
10
11
|
klass.add_handler 'post /v1/payment_intents/(.*)/confirm', :confirm_payment_intent
|
11
12
|
klass.add_handler 'post /v1/payment_intents/(.*)/capture', :capture_payment_intent
|
12
13
|
klass.add_handler 'post /v1/payment_intents/(.*)/cancel', :cancel_payment_intent
|
@@ -70,6 +71,14 @@ module StripeMock
|
|
70
71
|
payment_intent
|
71
72
|
end
|
72
73
|
|
74
|
+
SEARCH_FIELDS = ["amount", "currency", "customer", "status"].freeze
|
75
|
+
def search_payment_intents(route, method_url, params, headers)
|
76
|
+
require_param(:query) unless params[:query]
|
77
|
+
|
78
|
+
results = search_results(payment_intents.values, params[:query], fields: SEARCH_FIELDS, resource_name: "payment_intents")
|
79
|
+
Data.mock_list_object(results, params)
|
80
|
+
end
|
81
|
+
|
73
82
|
def capture_payment_intent(route, method_url, params, headers)
|
74
83
|
route =~ method_url
|
75
84
|
payment_intent = assert_existence :payment_intent, $1, payment_intents[$1]
|
@@ -3,10 +3,11 @@ module StripeMock
|
|
3
3
|
module Prices
|
4
4
|
|
5
5
|
def Prices.included(klass)
|
6
|
-
klass.add_handler 'post /v1/prices',
|
7
|
-
klass.add_handler 'post /v1/prices/(.*)',
|
8
|
-
klass.add_handler 'get /v1/prices/(.*)',
|
9
|
-
klass.add_handler 'get /v1/prices', :
|
6
|
+
klass.add_handler 'post /v1/prices', :new_price
|
7
|
+
klass.add_handler 'post /v1/prices/(.*)', :update_price
|
8
|
+
klass.add_handler 'get /v1/prices/((?!search).*)', :get_price
|
9
|
+
klass.add_handler 'get /v1/prices/search', :search_prices
|
10
|
+
klass.add_handler 'get /v1/prices', :list_prices
|
10
11
|
end
|
11
12
|
|
12
13
|
def new_price(route, method_url, params, headers)
|
@@ -57,6 +58,14 @@ module StripeMock
|
|
57
58
|
|
58
59
|
Data.mock_list_object(price_data.first(limit), params.merge!(limit: limit))
|
59
60
|
end
|
61
|
+
|
62
|
+
SEARCH_FIELDS = ["active", "currency", "lookup_key", "product", "type"].freeze
|
63
|
+
def search_prices(route, method_url, params, headers)
|
64
|
+
require_param(:query) unless params[:query]
|
65
|
+
|
66
|
+
results = search_results(prices.values, params[:query], fields: SEARCH_FIELDS, resource_name: "prices")
|
67
|
+
Data.mock_list_object(results, params)
|
68
|
+
end
|
60
69
|
end
|
61
70
|
end
|
62
71
|
end
|
@@ -2,11 +2,12 @@ module StripeMock
|
|
2
2
|
module RequestHandlers
|
3
3
|
module Products
|
4
4
|
def self.included(base)
|
5
|
-
base.add_handler 'post /v1/products',
|
6
|
-
base.add_handler 'get /v1/products/(.*)',
|
7
|
-
base.add_handler '
|
8
|
-
base.add_handler '
|
9
|
-
base.add_handler '
|
5
|
+
base.add_handler 'post /v1/products', :create_product
|
6
|
+
base.add_handler 'get /v1/products/((?!search).*)', :retrieve_product
|
7
|
+
base.add_handler 'get /v1/products/search', :search_products
|
8
|
+
base.add_handler 'post /v1/products/(.*)', :update_product
|
9
|
+
base.add_handler 'get /v1/products', :list_products
|
10
|
+
base.add_handler 'delete /v1/products/(.*)', :destroy_product
|
10
11
|
end
|
11
12
|
|
12
13
|
def create_product(_route, _method_url, params, _headers)
|
@@ -32,6 +33,14 @@ module StripeMock
|
|
32
33
|
Data.mock_list_object(products.values.take(limit), params)
|
33
34
|
end
|
34
35
|
|
36
|
+
SEARCH_FIELDS = ["active", "description", "name", "shippable", "url"].freeze
|
37
|
+
def search_products(route, method_url, params, headers)
|
38
|
+
require_param(:query) unless params[:query]
|
39
|
+
|
40
|
+
results = search_results(products.values, params[:query], fields: SEARCH_FIELDS, resource_name: "products")
|
41
|
+
Data.mock_list_object(results, params)
|
42
|
+
end
|
43
|
+
|
35
44
|
def destroy_product(route, method_url, _params, _headers)
|
36
45
|
id = method_url.match(route).captures.first
|
37
46
|
assert_existence :product, id, products[id]
|
@@ -5,8 +5,9 @@ module StripeMock
|
|
5
5
|
def Subscriptions.included(klass)
|
6
6
|
klass.add_handler 'get /v1/subscriptions', :retrieve_subscriptions
|
7
7
|
klass.add_handler 'post /v1/subscriptions', :create_subscription
|
8
|
-
klass.add_handler 'get /v1/subscriptions/(.*)', :retrieve_subscription
|
8
|
+
klass.add_handler 'get /v1/subscriptions/((?!search).*)', :retrieve_subscription
|
9
9
|
klass.add_handler 'post /v1/subscriptions/(.*)', :update_subscription
|
10
|
+
klass.add_handler 'get /v1/subscriptions/search', :search_subscriptions
|
10
11
|
klass.add_handler 'delete /v1/subscriptions/(.*)', :cancel_subscription
|
11
12
|
|
12
13
|
klass.add_handler 'post /v1/customers/(.*)/subscription(?:s)?', :create_customer_subscription
|
@@ -343,6 +344,14 @@ module StripeMock
|
|
343
344
|
subscription
|
344
345
|
end
|
345
346
|
|
347
|
+
SEARCH_FIELDS = ["status"].freeze
|
348
|
+
def search_subscriptions(route, method_url, params, headers)
|
349
|
+
require_param(:query) unless params[:query]
|
350
|
+
|
351
|
+
results = search_results(subscriptions.values, params[:query], fields: SEARCH_FIELDS, resource_name: "subscriptions")
|
352
|
+
Data.mock_list_object(results, params)
|
353
|
+
end
|
354
|
+
|
346
355
|
private
|
347
356
|
|
348
357
|
def get_subscription_plans_from_params(params)
|
data/lib/stripe_mock/version.rb
CHANGED
data/lib/stripe_mock.rb
CHANGED
@@ -42,6 +42,7 @@ require 'stripe_mock/request_handlers/helpers/external_account_helpers.rb'
|
|
42
42
|
require 'stripe_mock/request_handlers/helpers/card_helpers.rb'
|
43
43
|
require 'stripe_mock/request_handlers/helpers/charge_helpers.rb'
|
44
44
|
require 'stripe_mock/request_handlers/helpers/coupon_helpers.rb'
|
45
|
+
require 'stripe_mock/request_handlers/helpers/search_helpers.rb'
|
45
46
|
require 'stripe_mock/request_handlers/helpers/subscription_helpers.rb'
|
46
47
|
require 'stripe_mock/request_handlers/helpers/token_helpers.rb'
|
47
48
|
|
@@ -28,20 +28,19 @@ shared_examples 'Bank Account Token Mocking' do
|
|
28
28
|
expect(bank_token).to match /^test_btok/
|
29
29
|
end
|
30
30
|
|
31
|
-
it "assigns the generated bank account to a new
|
31
|
+
it "assigns the generated bank account to a new customer" do
|
32
32
|
bank_token = StripeMock.generate_bank_token(
|
33
33
|
:bank_name => "Bank Token Mocking",
|
34
34
|
:last4 => "7777"
|
35
35
|
)
|
36
36
|
|
37
|
-
|
37
|
+
customer = Stripe::Customer.create({
|
38
38
|
name: "Fred Flinstone",
|
39
|
-
type: "individual",
|
40
39
|
email: 'blah@domain.co',
|
41
|
-
|
40
|
+
source: bank_token
|
42
41
|
})
|
43
|
-
expect(
|
44
|
-
expect(
|
42
|
+
expect(customer.sources.first.last4).to eq("7777")
|
43
|
+
expect(customer.sources.first.bank_name).to eq("Bank Token Mocking")
|
45
44
|
end
|
46
45
|
|
47
46
|
it "retrieves a created token" do
|
@@ -55,5 +54,4 @@ shared_examples 'Bank Account Token Mocking' do
|
|
55
54
|
expect(token.bank_account.last4).to eq("3939")
|
56
55
|
expect(token.bank_account.bank_name).to eq("Cha-ching Banking")
|
57
56
|
end
|
58
|
-
|
59
57
|
end
|
@@ -494,4 +494,101 @@ shared_examples 'Charge API' do
|
|
494
494
|
end
|
495
495
|
end
|
496
496
|
|
497
|
+
context "search" do
|
498
|
+
# the Search API requires about a minute between writes and reads, so add sleeps accordingly when running live
|
499
|
+
it "searches charges for exact matches", :aggregate_failures do
|
500
|
+
response = Stripe::Charge.search({query: 'amount:100'}, stripe_version: '2020-08-27')
|
501
|
+
expect(response.data.size).to eq(0)
|
502
|
+
|
503
|
+
customer = Stripe::Customer.create(email: 'johnny@appleseed.com')
|
504
|
+
one = Stripe::Charge.create(
|
505
|
+
customer: customer.id,
|
506
|
+
amount: 100,
|
507
|
+
currency: "usd",
|
508
|
+
payment_method_details: {
|
509
|
+
card: StripeMock::Data.mock_charge[:payment_method_details][:card].merge(
|
510
|
+
brand: "mastercard",
|
511
|
+
exp_month: 1,
|
512
|
+
exp_year: 2111,
|
513
|
+
fingerprint: "un",
|
514
|
+
last4: "1111",
|
515
|
+
),
|
516
|
+
},
|
517
|
+
status: "succeeded",
|
518
|
+
metadata: {key: 'uno'},
|
519
|
+
)
|
520
|
+
two = Stripe::Charge.create(
|
521
|
+
customer: customer.id,
|
522
|
+
amount: 200,
|
523
|
+
currency: "gbp",
|
524
|
+
payment_method_details: {
|
525
|
+
card: StripeMock::Data.mock_charge[:payment_method_details][:card].merge(
|
526
|
+
brand: "visa",
|
527
|
+
exp_month: 2,
|
528
|
+
exp_year: 2222,
|
529
|
+
fingerprint: "deux",
|
530
|
+
last4: "2222",
|
531
|
+
),
|
532
|
+
},
|
533
|
+
status: "pending",
|
534
|
+
metadata: {key: 'dos'},
|
535
|
+
)
|
536
|
+
|
537
|
+
response = Stripe::Charge.search({query: 'amount:100'}, stripe_version: '2020-08-27')
|
538
|
+
expect(response.data.map(&:id)).to match_array([one.id])
|
539
|
+
|
540
|
+
response = Stripe::Charge.search({query: 'currency:"gbp"'}, stripe_version: '2020-08-27')
|
541
|
+
expect(response.data.map(&:id)).to match_array([two.id])
|
542
|
+
|
543
|
+
response = Stripe::Charge.search({query: %(customer:"#{customer.id}")}, stripe_version: '2020-08-27')
|
544
|
+
expect(response.data.map(&:id)).to match_array([one.id, two.id])
|
545
|
+
|
546
|
+
response = Stripe::Charge.search({query: 'payment_method_details.card.brand:mastercard'}, stripe_version: '2020-08-27')
|
547
|
+
expect(response.data.map(&:id)).to match_array([one.id])
|
548
|
+
|
549
|
+
response = Stripe::Charge.search({query: 'payment_method_details.card.exp_month:2'}, stripe_version: '2020-08-27')
|
550
|
+
expect(response.data.map(&:id)).to match_array([two.id])
|
551
|
+
|
552
|
+
response = Stripe::Charge.search({query: 'payment_method_details.card.exp_year:2111'}, stripe_version: '2020-08-27')
|
553
|
+
expect(response.data.map(&:id)).to match_array([one.id])
|
554
|
+
|
555
|
+
response = Stripe::Charge.search({query: 'payment_method_details.card.fingerprint:un'}, stripe_version: '2020-08-27')
|
556
|
+
expect(response.data.map(&:id)).to match_array([one.id])
|
557
|
+
|
558
|
+
response = Stripe::Charge.search({query: 'payment_method_details.card.last4:2222'}, stripe_version: '2020-08-27')
|
559
|
+
expect(response.data.map(&:id)).to match_array([two.id])
|
560
|
+
|
561
|
+
response = Stripe::Charge.search({query: 'status:"succeeded"'}, stripe_version: '2020-08-27')
|
562
|
+
expect(response.data.map(&:id)).to match_array([one.id])
|
563
|
+
|
564
|
+
response = Stripe::Charge.search({query: 'metadata["key"]:"uno"'}, stripe_version: '2020-08-27')
|
565
|
+
expect(response.data.map(&:id)).to match_array([one.id])
|
566
|
+
end
|
567
|
+
|
568
|
+
it "respects limit", :aggregate_failures do
|
569
|
+
customer = Stripe::Customer.create(email: 'johnny@appleseed.com')
|
570
|
+
11.times do
|
571
|
+
Stripe::Charge.create(customer: customer.id, amount: 100, currency: "usd")
|
572
|
+
end
|
573
|
+
|
574
|
+
response = Stripe::Charge.search({query: %(customer:"#{customer.id}")}, stripe_version: '2020-08-27')
|
575
|
+
expect(response.data.size).to eq(10)
|
576
|
+
response = Stripe::Charge.search({query: %(customer:"#{customer.id}"), limit: 1}, stripe_version: '2020-08-27')
|
577
|
+
expect(response.data.size).to eq(1)
|
578
|
+
end
|
579
|
+
|
580
|
+
it "reports search errors", :aggregate_failures do
|
581
|
+
expect {
|
582
|
+
Stripe::Charge.search({limit: 1}, stripe_version: '2020-08-27')
|
583
|
+
}.to raise_error(Stripe::InvalidRequestError, /Missing required param: query./)
|
584
|
+
|
585
|
+
expect {
|
586
|
+
Stripe::Charge.search({query: 'asdf'}, stripe_version: '2020-08-27')
|
587
|
+
}.to raise_error(Stripe::InvalidRequestError, /We were unable to parse your search query./)
|
588
|
+
|
589
|
+
expect {
|
590
|
+
Stripe::Charge.search({query: 'foo:"bar"'}, stripe_version: '2020-08-27')
|
591
|
+
}.to raise_error(Stripe::InvalidRequestError, /Field `foo` is an unsupported search field for resource `charges`./)
|
592
|
+
end
|
593
|
+
end
|
497
594
|
end
|
@@ -349,6 +349,62 @@ shared_examples 'Customer API' do
|
|
349
349
|
expect(all.data.map &:email).to include('one@one.com', 'two@two.com')
|
350
350
|
end
|
351
351
|
|
352
|
+
context "search" do
|
353
|
+
# the Search API requires about a minute between writes and reads, so add sleeps accordingly when running live
|
354
|
+
it "searches customers for exact matches", :aggregate_failures do
|
355
|
+
response = Stripe::Customer.search({query: 'email:"one@one.com"'}, stripe_version: '2020-08-27')
|
356
|
+
expect(response.data.size).to eq(0)
|
357
|
+
|
358
|
+
one = Stripe::Customer.create(email: 'one@one.com', name: 'one', phone: '1111111111', metadata: {key: 'uno'})
|
359
|
+
two = Stripe::Customer.create(email: 'two@two.com', name: 'two', phone: '2222222222', metadata: {key: 'dos'})
|
360
|
+
|
361
|
+
response = Stripe::Customer.search({query: 'email:"one@one.com"'}, stripe_version: '2020-08-27')
|
362
|
+
expect(response.data.map(&:id)).to match_array([one.id])
|
363
|
+
|
364
|
+
response = Stripe::Customer.search({query: 'name:"two"'}, stripe_version: '2020-08-27')
|
365
|
+
expect(response.data.map(&:id)).to match_array([two.id])
|
366
|
+
|
367
|
+
response = Stripe::Customer.search({query: 'phone:"2222222222"'}, stripe_version: '2020-08-27')
|
368
|
+
expect(response.data.map(&:id)).to match_array([two.id])
|
369
|
+
|
370
|
+
response = Stripe::Customer.search({query: 'metadata["key"]:"uno"'}, stripe_version: '2020-08-27')
|
371
|
+
expect(response.data.map(&:id)).to match_array([one.id])
|
372
|
+
end
|
373
|
+
|
374
|
+
it "respects limit", :aggregate_failures do
|
375
|
+
one = Stripe::Customer.create(email: 'one@one.com', name: 'one')
|
376
|
+
two = Stripe::Customer.create(email: 'two@two.com', name: 'one')
|
377
|
+
three = Stripe::Customer.create(email: 'three@three.com', name: 'one')
|
378
|
+
four = Stripe::Customer.create(email: 'four@four.com', name: 'one')
|
379
|
+
five = Stripe::Customer.create(email: 'five@five.com', name: 'one')
|
380
|
+
six = Stripe::Customer.create(email: 'six@six.com', name: 'one')
|
381
|
+
seven = Stripe::Customer.create(email: 'seven@seven.com', name: 'one')
|
382
|
+
eight = Stripe::Customer.create(email: 'eight@eight.com', name: 'one')
|
383
|
+
nine = Stripe::Customer.create(email: 'nine@nine.com', name: 'one')
|
384
|
+
ten = Stripe::Customer.create(email: 'ten@ten.com', name: 'one')
|
385
|
+
eleven = Stripe::Customer.create(email: 'eleven@eleven.com', name: 'one')
|
386
|
+
|
387
|
+
response = Stripe::Customer.search({query: 'name:"one"'}, stripe_version: '2020-08-27')
|
388
|
+
expect(response.data.size).to eq(10)
|
389
|
+
response = Stripe::Customer.search({query: 'name:"one"', limit: 1}, stripe_version: '2020-08-27')
|
390
|
+
expect(response.data.size).to eq(1)
|
391
|
+
end
|
392
|
+
|
393
|
+
it "reports search errors", :aggregate_failures do
|
394
|
+
expect {
|
395
|
+
Stripe::Customer.search({limit: 1}, stripe_version: '2020-08-27')
|
396
|
+
}.to raise_error(Stripe::InvalidRequestError, /Missing required param: query./)
|
397
|
+
|
398
|
+
expect {
|
399
|
+
Stripe::Customer.search({query: 'asdf'}, stripe_version: '2020-08-27')
|
400
|
+
}.to raise_error(Stripe::InvalidRequestError, /We were unable to parse your search query./)
|
401
|
+
|
402
|
+
expect {
|
403
|
+
Stripe::Customer.search({query: 'foo:"bar"'}, stripe_version: '2020-08-27')
|
404
|
+
}.to raise_error(Stripe::InvalidRequestError, /Field `foo` is an unsupported search field for resource `customers`./)
|
405
|
+
end
|
406
|
+
end
|
407
|
+
|
352
408
|
it "updates a stripe customer" do
|
353
409
|
original = Stripe::Customer.create(id: 'test_customer_update')
|
354
410
|
email = original.email
|
@@ -79,6 +79,88 @@ shared_examples 'Invoice API' do
|
|
79
79
|
end
|
80
80
|
end
|
81
81
|
|
82
|
+
context "searching invoices" do
|
83
|
+
# the Search API requires about a minute between writes and reads, so add sleeps accordingly when running live
|
84
|
+
it "searches invoices for exact matches", :aggregate_failures do
|
85
|
+
response = Stripe::Invoice.search({query: 'currency:"usd"'}, stripe_version: '2020-08-27')
|
86
|
+
expect(response.data.size).to eq(0)
|
87
|
+
|
88
|
+
product = stripe_helper.create_product
|
89
|
+
stripe_helper.create_plan(
|
90
|
+
amount: 500,
|
91
|
+
interval: 'month',
|
92
|
+
product: product.id,
|
93
|
+
currency: 'usd',
|
94
|
+
id: 'Sample5',
|
95
|
+
)
|
96
|
+
customer = Stripe::Customer.create(email: 'johnny@appleseed.com', source: stripe_helper.generate_card_token)
|
97
|
+
subscription = Stripe::Subscription.create(customer: customer.id, items: [{plan: 'Sample5'}])
|
98
|
+
one = Stripe::Invoice.create(
|
99
|
+
customer: customer.id,
|
100
|
+
currency: 'usd',
|
101
|
+
subscription: subscription.id,
|
102
|
+
metadata: {key: 'uno'},
|
103
|
+
number: 'one-1',
|
104
|
+
receipt_number: '111',
|
105
|
+
)
|
106
|
+
two = Stripe::Invoice.create(
|
107
|
+
customer: customer.id,
|
108
|
+
currency: 'gbp',
|
109
|
+
subscription: subscription.id,
|
110
|
+
metadata: {key: 'dos'},
|
111
|
+
number: 'two-2',
|
112
|
+
receipt_number: '222',
|
113
|
+
)
|
114
|
+
|
115
|
+
response = Stripe::Invoice.search({query: 'currency:"gbp"'}, stripe_version: '2020-08-27')
|
116
|
+
expect(response.data.map(&:id)).to match_array([two.id])
|
117
|
+
|
118
|
+
response = Stripe::Invoice.search({query: %(customer:"#{customer.id}")}, stripe_version: '2020-08-27')
|
119
|
+
expect(response.data.map(&:id)).to match_array([one.id, two.id])
|
120
|
+
|
121
|
+
response = Stripe::Invoice.search({query: 'number:"one-1"'}, stripe_version: '2020-08-27')
|
122
|
+
expect(response.data.map(&:id)).to match_array([one.id])
|
123
|
+
|
124
|
+
response = Stripe::Invoice.search({query: 'receipt_number:"222"'}, stripe_version: '2020-08-27')
|
125
|
+
expect(response.data.map(&:id)).to match_array([two.id])
|
126
|
+
|
127
|
+
response = Stripe::Invoice.search({query: %(subscription:"#{subscription.id}")}, stripe_version: '2020-08-27')
|
128
|
+
expect(response.data.map(&:id)).to match_array([one.id, two.id])
|
129
|
+
|
130
|
+
response = Stripe::Invoice.search({query: 'total:1000'}, stripe_version: '2020-08-27')
|
131
|
+
expect(response.data.map(&:id)).to match_array([one.id, two.id])
|
132
|
+
|
133
|
+
response = Stripe::Invoice.search({query: 'metadata["key"]:"uno"'}, stripe_version: '2020-08-27')
|
134
|
+
expect(response.data.map(&:id)).to match_array([one.id])
|
135
|
+
end
|
136
|
+
|
137
|
+
it "respects limit", :aggregate_failures do
|
138
|
+
customer = Stripe::Customer.create(email: 'one@one.com', name: 'one', phone: '1111111111', metadata: {key: 'uno'})
|
139
|
+
11.times do
|
140
|
+
Stripe::Invoice.create(customer: customer.id, currency: 'usd')
|
141
|
+
end
|
142
|
+
|
143
|
+
response = Stripe::Invoice.search({query: %(customer:"#{customer.id}")}, stripe_version: '2020-08-27')
|
144
|
+
expect(response.data.size).to eq(10)
|
145
|
+
response = Stripe::Invoice.search({query: %(customer:"#{customer.id}"), limit: 1}, stripe_version: '2020-08-27')
|
146
|
+
expect(response.data.size).to eq(1)
|
147
|
+
end
|
148
|
+
|
149
|
+
it "reports search errors", :aggregate_failures do
|
150
|
+
expect {
|
151
|
+
Stripe::Invoice.search({limit: 1}, stripe_version: '2020-08-27')
|
152
|
+
}.to raise_error(Stripe::InvalidRequestError, /Missing required param: query./)
|
153
|
+
|
154
|
+
expect {
|
155
|
+
Stripe::Invoice.search({query: 'asdf'}, stripe_version: '2020-08-27')
|
156
|
+
}.to raise_error(Stripe::InvalidRequestError, /We were unable to parse your search query./)
|
157
|
+
|
158
|
+
expect {
|
159
|
+
Stripe::Invoice.search({query: 'foo:"bar"'}, stripe_version: '2020-08-27')
|
160
|
+
}.to raise_error(Stripe::InvalidRequestError, /Field `foo` is an unsupported search field for resource `invoices`./)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
82
164
|
context "paying an invoice" do
|
83
165
|
before do
|
84
166
|
@invoice = Stripe::Invoice.create
|
@@ -154,7 +236,10 @@ shared_examples 'Invoice API' do
|
|
154
236
|
describe 'parameter validation' do
|
155
237
|
it 'fails without parameters' do
|
156
238
|
expect { Stripe::Invoice.upcoming() }.to raise_error {|e|
|
157
|
-
|
239
|
+
expect(e).to be_a(Stripe::InvalidRequestError)
|
240
|
+
expect(e.http_status).to eq(400)
|
241
|
+
expect(e.message).to eq('Missing required param: customer if subscription is not provided')
|
242
|
+
}
|
158
243
|
end
|
159
244
|
|
160
245
|
it 'fails without a valid customer' do
|
@@ -218,4 +218,66 @@ shared_examples 'PaymentIntent API' do
|
|
218
218
|
expect(e.http_status).to eq(400)
|
219
219
|
}
|
220
220
|
end
|
221
|
+
|
222
|
+
context "search" do
|
223
|
+
# the Search API requires about a minute between writes and reads, so add sleeps accordingly when running live
|
224
|
+
it "searches payment intents for exact matches", :aggregate_failures do
|
225
|
+
response = Stripe::PaymentIntent.search({query: 'currency:"usd"'}, stripe_version: '2020-08-27')
|
226
|
+
expect(response.data.size).to eq(0)
|
227
|
+
|
228
|
+
customer = Stripe::Customer.create(email: 'johnny@appleseed.com', source: stripe_helper.generate_card_token)
|
229
|
+
one = Stripe::PaymentIntent.create(
|
230
|
+
amount: 100,
|
231
|
+
customer: customer.id,
|
232
|
+
currency: 'usd',
|
233
|
+
metadata: {key: 'uno'},
|
234
|
+
)
|
235
|
+
two = Stripe::PaymentIntent.create(
|
236
|
+
amount: 3184, # status: requires_action
|
237
|
+
customer: customer.id,
|
238
|
+
currency: 'gbp',
|
239
|
+
metadata: {key: 'dos'},
|
240
|
+
)
|
241
|
+
|
242
|
+
response = Stripe::PaymentIntent.search({query: 'amount:100'}, stripe_version: '2020-08-27')
|
243
|
+
expect(response.data.map(&:id)).to match_array([one.id])
|
244
|
+
|
245
|
+
response = Stripe::PaymentIntent.search({query: 'currency:"gbp"'}, stripe_version: '2020-08-27')
|
246
|
+
expect(response.data.map(&:id)).to match_array([two.id])
|
247
|
+
|
248
|
+
response = Stripe::PaymentIntent.search({query: %(customer:"#{customer.id}")}, stripe_version: '2020-08-27')
|
249
|
+
expect(response.data.map(&:id)).to match_array([one.id, two.id])
|
250
|
+
|
251
|
+
response = Stripe::PaymentIntent.search({query: 'status:"requires_action"'}, stripe_version: '2020-08-27')
|
252
|
+
expect(response.data.map(&:id)).to match_array([two.id])
|
253
|
+
|
254
|
+
response = Stripe::PaymentIntent.search({query: 'metadata["key"]:"uno"'}, stripe_version: '2020-08-27')
|
255
|
+
expect(response.data.map(&:id)).to match_array([one.id])
|
256
|
+
end
|
257
|
+
|
258
|
+
it "respects limit", :aggregate_failures do
|
259
|
+
11.times do
|
260
|
+
Stripe::PaymentIntent.create(amount: 100, currency: 'usd')
|
261
|
+
end
|
262
|
+
|
263
|
+
response = Stripe::PaymentIntent.search({query: 'amount:100'}, stripe_version: '2020-08-27')
|
264
|
+
expect(response.data.size).to eq(10)
|
265
|
+
response = Stripe::PaymentIntent.search({query: 'amount:100', limit: 1}, stripe_version: '2020-08-27')
|
266
|
+
expect(response.data.size).to eq(1)
|
267
|
+
end
|
268
|
+
|
269
|
+
it "reports search errors", :aggregate_failures do
|
270
|
+
expect {
|
271
|
+
Stripe::PaymentIntent.search({limit: 1}, stripe_version: '2020-08-27')
|
272
|
+
}.to raise_error(Stripe::InvalidRequestError, /Missing required param: query./)
|
273
|
+
|
274
|
+
expect {
|
275
|
+
Stripe::PaymentIntent.search({query: 'asdf'}, stripe_version: '2020-08-27')
|
276
|
+
}.to raise_error(Stripe::InvalidRequestError, /We were unable to parse your search query./)
|
277
|
+
|
278
|
+
expect {
|
279
|
+
Stripe::PaymentIntent.search({query: 'foo:"bar"'}, stripe_version: '2020-08-27')
|
280
|
+
}.to raise_error(Stripe::InvalidRequestError, /Field `foo` is an unsupported search field for resource `payment_intents`./)
|
281
|
+
end
|
282
|
+
end
|
221
283
|
end
|
@@ -128,7 +128,7 @@ shared_examples 'Price API' do
|
|
128
128
|
expect(two.map &:id).to include('price Two')
|
129
129
|
expect(two.map &:amount).to include(98765)
|
130
130
|
end
|
131
|
-
|
131
|
+
|
132
132
|
it "retrieves prices filtering by currency" do
|
133
133
|
5.times do | i|
|
134
134
|
stripe_helper.create_price(id: "usd price #{i}", product: product_id, amount: 11, currency: 'usd')
|
@@ -165,6 +165,75 @@ shared_examples 'Price API' do
|
|
165
165
|
expect(other_product_prices.all? {|p| p.product == other_product.id }).to be_truthy
|
166
166
|
end
|
167
167
|
|
168
|
+
context "searching prices" do
|
169
|
+
# the Search API requires about a minute between writes and reads, so add sleeps accordingly when running live
|
170
|
+
it "searches prices for exact matches", :aggregate_failures do
|
171
|
+
response = Stripe::Price.search({query: 'currency:"usd"'}, stripe_version: '2020-08-27')
|
172
|
+
expect(response.data.size).to eq(0)
|
173
|
+
|
174
|
+
one = stripe_helper.create_price(
|
175
|
+
amount: 100,
|
176
|
+
currency: 'usd',
|
177
|
+
lookup_key: 'one',
|
178
|
+
product: product_id,
|
179
|
+
metadata: {key: 'uno'},
|
180
|
+
type: "one_time",
|
181
|
+
)
|
182
|
+
two = stripe_helper.create_price(
|
183
|
+
active: false,
|
184
|
+
amount: 200,
|
185
|
+
currency: 'gbp',
|
186
|
+
lookup_key: 'two',
|
187
|
+
product: product_id,
|
188
|
+
recurring: {interval: 'month'},
|
189
|
+
metadata: {key: 'dos'},
|
190
|
+
)
|
191
|
+
|
192
|
+
response = Stripe::Price.search({query: 'active:"true"'}, stripe_version: '2020-08-27')
|
193
|
+
expect(response.data.map(&:id)).to match_array([one.id])
|
194
|
+
|
195
|
+
response = Stripe::Price.search({query: 'currency:"gbp"'}, stripe_version: '2020-08-27')
|
196
|
+
expect(response.data.map(&:id)).to match_array([two.id])
|
197
|
+
|
198
|
+
response = Stripe::Price.search({query: 'lookup_key:"one"'}, stripe_version: '2020-08-27')
|
199
|
+
expect(response.data.map(&:id)).to match_array([one.id])
|
200
|
+
|
201
|
+
response = Stripe::Price.search({query: %(product:"#{product.id}")}, stripe_version: '2020-08-27')
|
202
|
+
expect(response.data.map(&:id)).to match_array([one.id, two.id])
|
203
|
+
|
204
|
+
response = Stripe::Price.search({query: 'type:"recurring"'}, stripe_version: '2020-08-27')
|
205
|
+
expect(response.data.map(&:id)).to match_array([two.id])
|
206
|
+
|
207
|
+
response = Stripe::Price.search({query: 'metadata["key"]:"uno"'}, stripe_version: '2020-08-27')
|
208
|
+
expect(response.data.map(&:id)).to match_array([one.id])
|
209
|
+
end
|
210
|
+
|
211
|
+
it "respects limit", :aggregate_failures do
|
212
|
+
11.times do
|
213
|
+
stripe_helper.create_price(product: product_id)
|
214
|
+
end
|
215
|
+
|
216
|
+
response = Stripe::Price.search({query: %(product:"#{product.id}")}, stripe_version: '2020-08-27')
|
217
|
+
expect(response.data.size).to eq(10)
|
218
|
+
response = Stripe::Price.search({query: %(product:"#{product.id}"), limit: 1}, stripe_version: '2020-08-27')
|
219
|
+
expect(response.data.size).to eq(1)
|
220
|
+
end
|
221
|
+
|
222
|
+
it "reports search errors", :aggregate_failures do
|
223
|
+
expect {
|
224
|
+
Stripe::Price.search({limit: 1}, stripe_version: '2020-08-27')
|
225
|
+
}.to raise_error(Stripe::InvalidRequestError, /Missing required param: query./)
|
226
|
+
|
227
|
+
expect {
|
228
|
+
Stripe::Price.search({query: 'asdf'}, stripe_version: '2020-08-27')
|
229
|
+
}.to raise_error(Stripe::InvalidRequestError, /We were unable to parse your search query./)
|
230
|
+
|
231
|
+
expect {
|
232
|
+
Stripe::Price.search({query: 'foo:"bar"'}, stripe_version: '2020-08-27')
|
233
|
+
}.to raise_error(Stripe::InvalidRequestError, /Field `foo` is an unsupported search field for resource `prices`./)
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
168
237
|
describe "Validations", :live => true do
|
169
238
|
include_context "stripe validator"
|
170
239
|
let(:params) { stripe_helper.create_price_params(product: product_id) }
|
@@ -85,6 +85,74 @@ shared_examples "Product API" do
|
|
85
85
|
expect(all.count).to eq(100)
|
86
86
|
end
|
87
87
|
|
88
|
+
context "searching products" do
|
89
|
+
# the Search API requires about a minute between writes and reads, so add sleeps accordingly when running live
|
90
|
+
it "searches products for exact matches", :aggregate_failures do
|
91
|
+
response = Stripe::Product.search({query: 'name:"one"'}, stripe_version: '2020-08-27')
|
92
|
+
expect(response.data.size).to eq(0)
|
93
|
+
|
94
|
+
one = stripe_helper.create_product(
|
95
|
+
id: "product_1",
|
96
|
+
name: "one",
|
97
|
+
description: "un",
|
98
|
+
shippable: true,
|
99
|
+
url: "http://example.com/one",
|
100
|
+
metadata: {key: "uno"},
|
101
|
+
)
|
102
|
+
two = stripe_helper.create_product(
|
103
|
+
id: "product_2",
|
104
|
+
name: "two",
|
105
|
+
active: false,
|
106
|
+
description: "deux",
|
107
|
+
url: "http://example.com/two",
|
108
|
+
metadata: {key: "dos"},
|
109
|
+
)
|
110
|
+
|
111
|
+
response = Stripe::Product.search({query: 'active:"true"'}, stripe_version: '2020-08-27')
|
112
|
+
expect(response.data.map(&:id)).to match_array([one.id])
|
113
|
+
|
114
|
+
response = Stripe::Product.search({query: 'description:"deux"'}, stripe_version: '2020-08-27')
|
115
|
+
expect(response.data.map(&:id)).to match_array([two.id])
|
116
|
+
|
117
|
+
response = Stripe::Product.search({query: 'name:"one"'}, stripe_version: '2020-08-27')
|
118
|
+
expect(response.data.map(&:id)).to match_array([one.id])
|
119
|
+
|
120
|
+
response = Stripe::Product.search({query: 'shippable:"true"'}, stripe_version: '2020-08-27')
|
121
|
+
expect(response.data.map(&:id)).to match_array([one.id])
|
122
|
+
|
123
|
+
response = Stripe::Product.search({query: 'url:"http://example.com/two"'}, stripe_version: '2020-08-27')
|
124
|
+
expect(response.data.map(&:id)).to match_array([two.id])
|
125
|
+
|
126
|
+
response = Stripe::Product.search({query: 'metadata["key"]:"uno"'}, stripe_version: '2020-08-27')
|
127
|
+
expect(response.data.map(&:id)).to match_array([one.id])
|
128
|
+
end
|
129
|
+
|
130
|
+
it "respects limit", :aggregate_failures do
|
131
|
+
11.times do |i|
|
132
|
+
stripe_helper.create_product(id: "product_#{i}", name: "Product #{i}")
|
133
|
+
end
|
134
|
+
|
135
|
+
response = Stripe::Product.search({query: 'active:"true"'}, stripe_version: '2020-08-27')
|
136
|
+
expect(response.data.size).to eq(10)
|
137
|
+
response = Stripe::Product.search({query: 'active:"true"', limit: 1}, stripe_version: '2020-08-27')
|
138
|
+
expect(response.data.size).to eq(1)
|
139
|
+
end
|
140
|
+
|
141
|
+
it "reports search errors", :aggregate_failures do
|
142
|
+
expect {
|
143
|
+
Stripe::Product.search({limit: 1}, stripe_version: '2020-08-27')
|
144
|
+
}.to raise_error(Stripe::InvalidRequestError, /Missing required param: query./)
|
145
|
+
|
146
|
+
expect {
|
147
|
+
Stripe::Product.search({query: 'asdf'}, stripe_version: '2020-08-27')
|
148
|
+
}.to raise_error(Stripe::InvalidRequestError, /We were unable to parse your search query./)
|
149
|
+
|
150
|
+
expect {
|
151
|
+
Stripe::Product.search({query: 'foo:"bar"'}, stripe_version: '2020-08-27')
|
152
|
+
}.to raise_error(Stripe::InvalidRequestError, /Field `foo` is an unsupported search field for resource `products`./)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
88
156
|
describe "Validation", :live => true do
|
89
157
|
include_context "stripe validator"
|
90
158
|
let(:params) { stripe_helper.create_product_params }
|
@@ -687,7 +687,7 @@ shared_examples 'Customer Subscriptions with plans' do
|
|
687
687
|
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk)
|
688
688
|
|
689
689
|
sub = Stripe::Subscription.create({ items: { '0' => { plan: 'silver' } }, customer: customer.id })
|
690
|
-
sub.
|
690
|
+
sub.cancel(at_period_end: true)
|
691
691
|
|
692
692
|
expect(sub.cancel_at_period_end).to be_truthy
|
693
693
|
expect(sub.save).to be_truthy
|
@@ -752,7 +752,7 @@ shared_examples 'Customer Subscriptions with plans' do
|
|
752
752
|
customer = Stripe::Customer.create(source: gen_card_tk, plan: plan.id)
|
753
753
|
|
754
754
|
subscription = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
755
|
-
subscription.
|
755
|
+
subscription.cancel
|
756
756
|
|
757
757
|
expect { subscription.save }.to raise_error { |e|
|
758
758
|
expect(e).to be_a(Stripe::InvalidRequestError)
|
@@ -765,7 +765,7 @@ shared_examples 'Customer Subscriptions with plans' do
|
|
765
765
|
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk)
|
766
766
|
|
767
767
|
sub = Stripe::Subscription.create({ items: [ { plan: plan.id } ], customer: customer.id })
|
768
|
-
sub.
|
768
|
+
sub.cancel(at_period_end: true)
|
769
769
|
|
770
770
|
expect(sub.cancel_at_period_end).to be_truthy
|
771
771
|
expect(sub.save).to be_truthy
|
@@ -1180,7 +1180,7 @@ shared_examples 'Customer Subscriptions with plans' do
|
|
1180
1180
|
customer = Stripe::Customer.create(source: gen_card_tk, plan: plan.id)
|
1181
1181
|
|
1182
1182
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
1183
|
-
result = sub.
|
1183
|
+
result = sub.cancel
|
1184
1184
|
|
1185
1185
|
expect(result.status).to eq('canceled')
|
1186
1186
|
expect(result.cancel_at_period_end).to eq false
|
@@ -1247,7 +1247,7 @@ shared_examples 'Customer Subscriptions with plans' do
|
|
1247
1247
|
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: "trial")
|
1248
1248
|
|
1249
1249
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
1250
|
-
result = sub.
|
1250
|
+
result = sub.cancel(at_period_end: true)
|
1251
1251
|
|
1252
1252
|
expect(result.status).to eq('trialing')
|
1253
1253
|
|
@@ -1331,7 +1331,7 @@ shared_examples 'Customer Subscriptions with plans' do
|
|
1331
1331
|
it "does not include canceled subscriptions by default" do
|
1332
1332
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
1333
1333
|
subscription = Stripe::Subscription.create({ plan: plan.id, customer: customer.id })
|
1334
|
-
subscription.
|
1334
|
+
subscription.cancel
|
1335
1335
|
|
1336
1336
|
list = Stripe::Subscription.list({customer: customer.id})
|
1337
1337
|
|
@@ -1423,6 +1423,65 @@ shared_examples 'Customer Subscriptions with plans' do
|
|
1423
1423
|
expect(subscription.items.data[0].metadata.to_h).to eq(foo: 'bar')
|
1424
1424
|
end
|
1425
1425
|
end
|
1426
|
+
|
1427
|
+
context "search" do
|
1428
|
+
# the Search API requires about a minute between writes and reads, so add sleeps accordingly when running live
|
1429
|
+
it "searches subscriptions for exact matches", :aggregate_failures do
|
1430
|
+
response = Stripe::Subscription.search({query: 'status:"active"'}, stripe_version: '2020-08-27')
|
1431
|
+
expect(response.data.size).to eq(0)
|
1432
|
+
|
1433
|
+
stripe_helper.create_plan(
|
1434
|
+
amount: 500,
|
1435
|
+
interval: 'month',
|
1436
|
+
product: product.id,
|
1437
|
+
currency: 'usd',
|
1438
|
+
id: 'Sample5'
|
1439
|
+
)
|
1440
|
+
customer = Stripe::Customer.create(email: 'johnny@appleseed.com', source: gen_card_tk)
|
1441
|
+
one = Stripe::Subscription.create(customer: customer.id, items: [{plan: "Sample5"}], metadata: {key: 'uno'})
|
1442
|
+
two = Stripe::Subscription.create(customer: customer.id, items: [{plan: "Sample5"}], metadata: {key: 'dos'})
|
1443
|
+
Stripe::Subscription.cancel(two.id)
|
1444
|
+
|
1445
|
+
response = Stripe::Subscription.search({query: 'status:"active"'}, stripe_version: '2020-08-27')
|
1446
|
+
expect(response.data.map(&:id)).to match_array([one.id])
|
1447
|
+
|
1448
|
+
response = Stripe::Subscription.search({query: 'metadata["key"]:"dos"'}, stripe_version: '2020-08-27')
|
1449
|
+
expect(response.data.map(&:id)).to match_array([two.id])
|
1450
|
+
end
|
1451
|
+
|
1452
|
+
it "respects limit", :aggregate_failures do
|
1453
|
+
stripe_helper.create_plan(
|
1454
|
+
amount: 500,
|
1455
|
+
interval: 'month',
|
1456
|
+
product: product.id,
|
1457
|
+
currency: 'usd',
|
1458
|
+
id: 'Sample5'
|
1459
|
+
)
|
1460
|
+
customer = Stripe::Customer.create(email: 'johnny@appleseed.com', source: gen_card_tk)
|
1461
|
+
11.times do
|
1462
|
+
Stripe::Subscription.create(customer: customer.id, items: [{plan: "Sample5"}])
|
1463
|
+
end
|
1464
|
+
|
1465
|
+
response = Stripe::Subscription.search({query: 'status:"active"'}, stripe_version: '2020-08-27')
|
1466
|
+
expect(response.data.size).to eq(10)
|
1467
|
+
response = Stripe::Subscription.search({query: 'status:"active"', limit: 1}, stripe_version: '2020-08-27')
|
1468
|
+
expect(response.data.size).to eq(1)
|
1469
|
+
end
|
1470
|
+
|
1471
|
+
it "reports search errors", :aggregate_failures do
|
1472
|
+
expect {
|
1473
|
+
Stripe::Subscription.search({limit: 1}, stripe_version: '2020-08-27')
|
1474
|
+
}.to raise_error(Stripe::InvalidRequestError, /Missing required param: query./)
|
1475
|
+
|
1476
|
+
expect {
|
1477
|
+
Stripe::Subscription.search({query: 'asdf'}, stripe_version: '2020-08-27')
|
1478
|
+
}.to raise_error(Stripe::InvalidRequestError, /We were unable to parse your search query./)
|
1479
|
+
|
1480
|
+
expect {
|
1481
|
+
Stripe::Subscription.search({query: 'foo:"bar"'}, stripe_version: '2020-08-27')
|
1482
|
+
}.to raise_error(Stripe::InvalidRequestError, /Field `foo` is an unsupported search field for resource `subscriptions`./)
|
1483
|
+
end
|
1484
|
+
end
|
1426
1485
|
end
|
1427
1486
|
|
1428
1487
|
shared_examples 'Customer Subscriptions with prices' do
|
data/spec/spec_helper.rb
CHANGED
data/stripe-ruby-mock.gemspec
CHANGED
@@ -22,11 +22,10 @@ Gem::Specification.new do |gem|
|
|
22
22
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
23
23
|
gem.require_paths = ['lib']
|
24
24
|
|
25
|
-
gem.add_dependency 'stripe', '> 5', '<
|
25
|
+
gem.add_dependency 'stripe', '> 5', '< 12'
|
26
26
|
gem.add_dependency 'multi_json', '~> 1.0'
|
27
27
|
gem.add_dependency 'dante', '>= 0.2.0'
|
28
28
|
|
29
|
-
gem.add_development_dependency 'rspec', '~> 3.
|
30
|
-
gem.add_development_dependency 'rubygems-tasks', '~> 0.2'
|
29
|
+
gem.add_development_dependency 'rspec', '~> 3.13.0'
|
31
30
|
gem.add_development_dependency 'thin', '~> 1.8.1'
|
32
31
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stripe-ruby-mock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gilbert
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-08-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: stripe
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
version: '5'
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '
|
22
|
+
version: '12'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
version: '5'
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
32
|
+
version: '12'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: multi_json
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -64,28 +64,14 @@ dependencies:
|
|
64
64
|
requirements:
|
65
65
|
- - "~>"
|
66
66
|
- !ruby/object:Gem::Version
|
67
|
-
version: 3.
|
67
|
+
version: 3.13.0
|
68
68
|
type: :development
|
69
69
|
prerelease: false
|
70
70
|
version_requirements: !ruby/object:Gem::Requirement
|
71
71
|
requirements:
|
72
72
|
- - "~>"
|
73
73
|
- !ruby/object:Gem::Version
|
74
|
-
version: 3.
|
75
|
-
- !ruby/object:Gem::Dependency
|
76
|
-
name: rubygems-tasks
|
77
|
-
requirement: !ruby/object:Gem::Requirement
|
78
|
-
requirements:
|
79
|
-
- - "~>"
|
80
|
-
- !ruby/object:Gem::Version
|
81
|
-
version: '0.2'
|
82
|
-
type: :development
|
83
|
-
prerelease: false
|
84
|
-
version_requirements: !ruby/object:Gem::Requirement
|
85
|
-
requirements:
|
86
|
-
- - "~>"
|
87
|
-
- !ruby/object:Gem::Version
|
88
|
-
version: '0.2'
|
74
|
+
version: 3.13.0
|
89
75
|
- !ruby/object:Gem::Dependency
|
90
76
|
name: thin
|
91
77
|
requirement: !ruby/object:Gem::Requirement
|
@@ -162,6 +148,7 @@ files:
|
|
162
148
|
- lib/stripe_mock/request_handlers/helpers/charge_helpers.rb
|
163
149
|
- lib/stripe_mock/request_handlers/helpers/coupon_helpers.rb
|
164
150
|
- lib/stripe_mock/request_handlers/helpers/external_account_helpers.rb
|
151
|
+
- lib/stripe_mock/request_handlers/helpers/search_helpers.rb
|
165
152
|
- lib/stripe_mock/request_handlers/helpers/subscription_helpers.rb
|
166
153
|
- lib/stripe_mock/request_handlers/helpers/token_helpers.rb
|
167
154
|
- lib/stripe_mock/request_handlers/invoice_items.rb
|
@@ -357,7 +344,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
357
344
|
- !ruby/object:Gem::Version
|
358
345
|
version: '0'
|
359
346
|
requirements: []
|
360
|
-
rubygems_version: 3.
|
347
|
+
rubygems_version: 3.4.19
|
361
348
|
signing_key:
|
362
349
|
specification_version: 4
|
363
350
|
summary: TDD with stripe
|