stripe-ruby-mock 2.5.0 → 2.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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/stripe_mock.rb +3 -0
- data/lib/stripe_mock/api/account_balance.rb +14 -0
- data/lib/stripe_mock/api/webhooks.rb +2 -0
- data/lib/stripe_mock/client.rb +4 -0
- data/lib/stripe_mock/data.rb +78 -3
- data/lib/stripe_mock/instance.rb +21 -4
- data/lib/stripe_mock/request_handlers/accounts.rb +18 -2
- data/lib/stripe_mock/request_handlers/balance.rb +17 -0
- data/lib/stripe_mock/request_handlers/helpers/subscription_helpers.rb +27 -6
- data/lib/stripe_mock/request_handlers/invoices.rb +20 -4
- data/lib/stripe_mock/request_handlers/payouts.rb +32 -0
- data/lib/stripe_mock/request_handlers/subscriptions.rb +65 -9
- data/lib/stripe_mock/request_handlers/tokens.rb +6 -0
- data/lib/stripe_mock/request_handlers/validators/param_validators.rb +7 -1
- data/lib/stripe_mock/server.rb +4 -0
- data/lib/stripe_mock/util.rb +8 -2
- data/lib/stripe_mock/version.rb +1 -1
- data/lib/stripe_mock/webhook_fixtures/account.updated.json +1 -1
- data/lib/stripe_mock/webhook_fixtures/charge.updated.json +58 -0
- data/lib/stripe_mock/webhook_fixtures/customer.subscription.created.json +40 -10
- data/lib/stripe_mock/webhook_fixtures/customer.subscription.deleted.json +39 -10
- data/lib/stripe_mock/webhook_fixtures/customer.subscription.trial_will_end.json +39 -10
- data/lib/stripe_mock/webhook_fixtures/customer.subscription.updated.json +39 -10
- data/lib/stripe_mock/webhook_fixtures/invoice.payment_succeeded.json +92 -85
- data/spec/shared_stripe_examples/account_examples.rb +8 -0
- data/spec/shared_stripe_examples/balance_examples.rb +11 -0
- data/spec/shared_stripe_examples/bank_examples.rb +27 -0
- data/spec/shared_stripe_examples/dispute_examples.rb +10 -0
- data/spec/shared_stripe_examples/invoice_examples.rb +68 -6
- data/spec/shared_stripe_examples/payout_examples.rb +68 -0
- data/spec/shared_stripe_examples/plan_examples.rb +7 -1
- data/spec/shared_stripe_examples/subscription_examples.rb +132 -2
- data/spec/shared_stripe_examples/webhook_event_examples.rb +69 -0
- data/spec/support/stripe_examples.rb +2 -0
- data/spec/util_spec.rb +35 -1
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 27d9481d4fc8140fc2d42f733fc529fbb7a121cf
|
4
|
+
data.tar.gz: a8eeabea5e8b7d9181f597b9968e6e98b8fba4ed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b089c35e1b06284105b79baa151a5c61ebf54ec1e405406e3d0f827964c9e30f6e33b02a92dfc11ee83ec4a0e71a8a7fa35448c9a859476481bbbff2f60d15a1
|
7
|
+
data.tar.gz: e913cc264d89d765911c9de0066cc57a819f5235b3a2fb4d6266f7dd5561669e3ebe45e12faa5be8e12a74cc4a67ed51ca6adc2064bdcc02b1394dc5cf298899
|
data/README.md
CHANGED
data/lib/stripe_mock.rb
CHANGED
@@ -26,6 +26,7 @@ require 'stripe_mock/api/client'
|
|
26
26
|
require 'stripe_mock/api/server'
|
27
27
|
|
28
28
|
require 'stripe_mock/api/bank_tokens'
|
29
|
+
require 'stripe_mock/api/account_balance'
|
29
30
|
require 'stripe_mock/api/conversion_rate'
|
30
31
|
require 'stripe_mock/api/card_tokens'
|
31
32
|
require 'stripe_mock/api/debug'
|
@@ -45,6 +46,7 @@ require 'stripe_mock/request_handlers/helpers/token_helpers.rb'
|
|
45
46
|
require 'stripe_mock/request_handlers/validators/param_validators.rb'
|
46
47
|
|
47
48
|
require 'stripe_mock/request_handlers/accounts.rb'
|
49
|
+
require 'stripe_mock/request_handlers/balance.rb'
|
48
50
|
require 'stripe_mock/request_handlers/balance_transactions.rb'
|
49
51
|
require 'stripe_mock/request_handlers/charges.rb'
|
50
52
|
require 'stripe_mock/request_handlers/cards.rb'
|
@@ -60,6 +62,7 @@ require 'stripe_mock/request_handlers/plans.rb'
|
|
60
62
|
require 'stripe_mock/request_handlers/recipients.rb'
|
61
63
|
require 'stripe_mock/request_handlers/refunds.rb'
|
62
64
|
require 'stripe_mock/request_handlers/transfers.rb'
|
65
|
+
require 'stripe_mock/request_handlers/payouts.rb'
|
63
66
|
require 'stripe_mock/request_handlers/subscriptions.rb'
|
64
67
|
require 'stripe_mock/request_handlers/tokens.rb'
|
65
68
|
require 'stripe_mock/request_handlers/country_spec.rb'
|
@@ -18,6 +18,7 @@ module StripeMock
|
|
18
18
|
json[:account] = params.delete(:account) if params.key?(:account)
|
19
19
|
json[:data][:object] = Util.rmerge(json[:data][:object], params)
|
20
20
|
json.delete(:id)
|
21
|
+
json[:created] = params[:created] || Time.now.to_i
|
21
22
|
|
22
23
|
if @state == 'local'
|
23
24
|
event_data = instance.generate_webhook_event(json)
|
@@ -43,6 +44,7 @@ module StripeMock
|
|
43
44
|
'account.external_account.deleted',
|
44
45
|
'balance.available',
|
45
46
|
'charge.succeeded',
|
47
|
+
'charge.updated',
|
46
48
|
'charge.failed',
|
47
49
|
'charge.refunded',
|
48
50
|
'charge.dispute.created',
|
data/lib/stripe_mock/client.rb
CHANGED
@@ -73,6 +73,10 @@ module StripeMock
|
|
73
73
|
timeout_wrap { @pipe.set_conversion_rate(value) }
|
74
74
|
end
|
75
75
|
|
76
|
+
def set_account_balance(value)
|
77
|
+
timeout_wrap { @pipe.set_account_balance(value) }
|
78
|
+
end
|
79
|
+
|
76
80
|
def destroy_resource(type, id)
|
77
81
|
timeout_wrap { @pipe.destroy_resource(type, id) }
|
78
82
|
end
|
data/lib/stripe_mock/data.rb
CHANGED
@@ -12,7 +12,7 @@ module StripeMock
|
|
12
12
|
timezone: "US/Pacific",
|
13
13
|
details_submitted: false,
|
14
14
|
charges_enabled: false,
|
15
|
-
|
15
|
+
payouts_enabled: false,
|
16
16
|
currencies_supported: [
|
17
17
|
"usd"
|
18
18
|
],
|
@@ -103,7 +103,7 @@ module StripeMock
|
|
103
103
|
|
104
104
|
def self.mock_customer(sources, params)
|
105
105
|
cus_id = params[:id] || "test_cus_default"
|
106
|
-
currency = params[:currency] ||
|
106
|
+
currency = params[:currency] || 'usd'
|
107
107
|
sources.each {|source| source[:customer] = cus_id}
|
108
108
|
{
|
109
109
|
email: 'stripe_mock@example.com',
|
@@ -207,7 +207,8 @@ module StripeMock
|
|
207
207
|
metadata: {},
|
208
208
|
charge: "ch_4fWhYjzQ23UFWT",
|
209
209
|
receipt_number: nil,
|
210
|
-
status: "succeeded"
|
210
|
+
status: "succeeded",
|
211
|
+
reason: "requested_by_customer"
|
211
212
|
}.merge(params)
|
212
213
|
end
|
213
214
|
|
@@ -284,6 +285,7 @@ module StripeMock
|
|
284
285
|
def self.mock_subscription(params={})
|
285
286
|
StripeMock::Util.rmerge({
|
286
287
|
created: 1478204116,
|
288
|
+
billing: 'charge_automatically',
|
287
289
|
current_period_start: 1308595038,
|
288
290
|
current_period_end: 1308681468,
|
289
291
|
status: 'trialing',
|
@@ -620,6 +622,21 @@ module StripeMock
|
|
620
622
|
}.merge(params)
|
621
623
|
end
|
622
624
|
|
625
|
+
def self.mock_payout(params={})
|
626
|
+
currency = params[:currency] || 'usd'
|
627
|
+
id = params[:id] || 'po_test_payout'
|
628
|
+
{
|
629
|
+
:amount => 100,
|
630
|
+
:id => id,
|
631
|
+
:livemode => false,
|
632
|
+
:metadata => {},
|
633
|
+
:currency => currency,
|
634
|
+
:object => "payout",
|
635
|
+
:date => 1304114826,
|
636
|
+
:description => "Payout description",
|
637
|
+
}.merge(params)
|
638
|
+
end
|
639
|
+
|
623
640
|
def self.mock_disputes(ids=[])
|
624
641
|
disputes = {}
|
625
642
|
ids.each do |id|
|
@@ -909,6 +926,38 @@ module StripeMock
|
|
909
926
|
}
|
910
927
|
end
|
911
928
|
|
929
|
+
def self.mock_balance(usd_balance = 10000)
|
930
|
+
{
|
931
|
+
object: "balance",
|
932
|
+
available: [
|
933
|
+
{
|
934
|
+
currency: "usd",
|
935
|
+
amount: usd_balance,
|
936
|
+
source_types: {
|
937
|
+
card: 25907032203,
|
938
|
+
bank_account: 108476658,
|
939
|
+
bitcoin_receiver: 1545182
|
940
|
+
}
|
941
|
+
}],
|
942
|
+
connect_reserved: [
|
943
|
+
{
|
944
|
+
currency: "usd",
|
945
|
+
amount: 4700
|
946
|
+
}],
|
947
|
+
livemode: false,
|
948
|
+
pending: [
|
949
|
+
{
|
950
|
+
currency: "usd",
|
951
|
+
amount: 22738833554,
|
952
|
+
source_types: {
|
953
|
+
card: 22738826610,
|
954
|
+
bank_account: 0,
|
955
|
+
bitcoin_receiver: 6944
|
956
|
+
}
|
957
|
+
}]
|
958
|
+
}
|
959
|
+
end
|
960
|
+
|
912
961
|
def self.mock_balance_transactions(ids=[])
|
913
962
|
bts = {}
|
914
963
|
ids.each do |id|
|
@@ -952,5 +1001,31 @@ module StripeMock
|
|
952
1001
|
type: "charge"
|
953
1002
|
}.merge(params)
|
954
1003
|
end
|
1004
|
+
|
1005
|
+
def self.mock_subscription_item(params = {})
|
1006
|
+
iid = params[:id] || 'test_txn_default'
|
1007
|
+
{
|
1008
|
+
id: iid,
|
1009
|
+
object: 'subscription_item',
|
1010
|
+
created: 1504716183,
|
1011
|
+
metadata: {
|
1012
|
+
},
|
1013
|
+
plan: {
|
1014
|
+
id: 'PER_USER_PLAN1',
|
1015
|
+
object: 'plan',
|
1016
|
+
amount: 1337,
|
1017
|
+
created: 1504716177,
|
1018
|
+
currency: 'usd',
|
1019
|
+
interval: 'month',
|
1020
|
+
interval_count: 1,
|
1021
|
+
livemode: false,
|
1022
|
+
metadata: {},
|
1023
|
+
name: 'StripeMock Default Plan ID',
|
1024
|
+
statement_descriptor: nil,
|
1025
|
+
trial_period_days: nil
|
1026
|
+
},
|
1027
|
+
quantity: 2
|
1028
|
+
}.merge(params)
|
1029
|
+
end
|
955
1030
|
end
|
956
1031
|
end
|
data/lib/stripe_mock/instance.rb
CHANGED
@@ -21,6 +21,7 @@ module StripeMock
|
|
21
21
|
end
|
22
22
|
|
23
23
|
include StripeMock::RequestHandlers::Accounts
|
24
|
+
include StripeMock::RequestHandlers::Balance
|
24
25
|
include StripeMock::RequestHandlers::BalanceTransactions
|
25
26
|
include StripeMock::RequestHandlers::Charges
|
26
27
|
include StripeMock::RequestHandlers::Cards
|
@@ -39,16 +40,17 @@ module StripeMock
|
|
39
40
|
include StripeMock::RequestHandlers::Transfers
|
40
41
|
include StripeMock::RequestHandlers::Tokens
|
41
42
|
include StripeMock::RequestHandlers::CountrySpec
|
43
|
+
include StripeMock::RequestHandlers::Payouts
|
42
44
|
|
43
|
-
|
44
|
-
attr_reader :accounts, :balance_transactions, :bank_tokens, :charges, :coupons, :customers,
|
45
|
+
attr_reader :accounts, :balance, :balance_transactions, :bank_tokens, :charges, :coupons, :customers,
|
45
46
|
:disputes, :events, :invoices, :invoice_items, :orders, :plans, :recipients,
|
46
|
-
:refunds, :transfers, :subscriptions, :country_spec
|
47
|
+
:refunds, :transfers, :payouts, :subscriptions, :country_spec, :subscriptions_items
|
47
48
|
|
48
|
-
attr_accessor :error_queue, :debug, :conversion_rate
|
49
|
+
attr_accessor :error_queue, :debug, :conversion_rate, :account_balance
|
49
50
|
|
50
51
|
def initialize
|
51
52
|
@accounts = {}
|
53
|
+
@balance = Data.mock_balance
|
52
54
|
@balance_transactions = Data.mock_balance_transactions(['txn_05RsQX2eZvKYlo2C0FRTGSSA','txn_15RsQX2eZvKYlo2C0ERTYUIA', 'txn_25RsQX2eZvKYlo2C0ZXCVBNM', 'txn_35RsQX2eZvKYlo2C0QAZXSWE', 'txn_45RsQX2eZvKYlo2C0EDCVFRT', 'txn_55RsQX2eZvKYlo2C0OIKLJUY', 'txn_65RsQX2eZvKYlo2C0ASDFGHJ', 'txn_75RsQX2eZvKYlo2C0EDCXSWQ', 'txn_85RsQX2eZvKYlo2C0UJMCDET', 'txn_95RsQX2eZvKYlo2C0EDFRYUI'])
|
53
55
|
@bank_tokens = {}
|
54
56
|
@card_tokens = {}
|
@@ -64,14 +66,18 @@ module StripeMock
|
|
64
66
|
@recipients = {}
|
65
67
|
@refunds = {}
|
66
68
|
@transfers = {}
|
69
|
+
@payouts = {}
|
67
70
|
@subscriptions = {}
|
71
|
+
@subscriptions_items = []
|
68
72
|
@country_spec = {}
|
69
73
|
|
70
74
|
@debug = false
|
71
75
|
@error_queue = ErrorQueue.new
|
72
76
|
@id_counter = 0
|
73
77
|
@balance_transaction_counter = 0
|
78
|
+
@dispute_counter = 0
|
74
79
|
@conversion_rate = 1.0
|
80
|
+
@account_balance = 10000
|
75
81
|
|
76
82
|
# This is basically a cache for ParamValidators
|
77
83
|
@base_strategy = TestStrategies::Base.new
|
@@ -125,6 +131,8 @@ module StripeMock
|
|
125
131
|
case object
|
126
132
|
when :balance_transaction
|
127
133
|
id = new_balance_transaction('txn', attributes)
|
134
|
+
when :dispute
|
135
|
+
id = new_dispute('dp', attributes)
|
128
136
|
else
|
129
137
|
raise UnsupportedRequestError.new "Unsupported stripe object `#{object}`"
|
130
138
|
end
|
@@ -134,6 +142,9 @@ module StripeMock
|
|
134
142
|
when :balance_transaction
|
135
143
|
btxn = assert_existence :balance_transaction, id, @balance_transactions[id]
|
136
144
|
btxn.merge!(attributes)
|
145
|
+
when :dispute
|
146
|
+
dispute = assert_existence :dispute, id, @disputes[id]
|
147
|
+
dispute.merge!(attributes)
|
137
148
|
else
|
138
149
|
raise UnsupportedRequestError.new "Unsupported stripe object `#{object}`"
|
139
150
|
end
|
@@ -169,6 +180,12 @@ module StripeMock
|
|
169
180
|
id
|
170
181
|
end
|
171
182
|
|
183
|
+
def new_dispute(prefix, params = {})
|
184
|
+
id = "#{StripeMock.global_id_prefix}#{prefix}_#{@dispute_counter += 1}"
|
185
|
+
@disputes[id] = Data.mock_dispute(params.merge(id: id))
|
186
|
+
id
|
187
|
+
end
|
188
|
+
|
172
189
|
def symbolize_names(hash)
|
173
190
|
Stripe::Util.symbolize_names(hash)
|
174
191
|
end
|
@@ -26,8 +26,12 @@ module StripeMock
|
|
26
26
|
|
27
27
|
def update_account(route, method_url, params, headers)
|
28
28
|
route =~ method_url
|
29
|
-
assert_existence :account, $1, accounts[$1]
|
30
|
-
|
29
|
+
account = assert_existence :account, $1, accounts[$1]
|
30
|
+
account.merge!(params)
|
31
|
+
if blank_value?(params[:tos_acceptance], :date)
|
32
|
+
raise Stripe::InvalidRequestError.new("Invalid integer: ", "tos_acceptance[date]", http_status: 400)
|
33
|
+
end
|
34
|
+
account
|
31
35
|
end
|
32
36
|
|
33
37
|
def list_accounts(route, method_url, params, headers)
|
@@ -49,6 +53,18 @@ module StripeMock
|
|
49
53
|
accounts[acc[:id]] = acc
|
50
54
|
end
|
51
55
|
end
|
56
|
+
|
57
|
+
# Checks if setting a blank value
|
58
|
+
#
|
59
|
+
# returns true if the key is included in the hash
|
60
|
+
# and its value is empty or nil
|
61
|
+
def blank_value?(hash, key)
|
62
|
+
if hash.key?(key)
|
63
|
+
value = hash[key]
|
64
|
+
return true if value.nil? || "" == value
|
65
|
+
end
|
66
|
+
false
|
67
|
+
end
|
52
68
|
end
|
53
69
|
end
|
54
70
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module StripeMock
|
2
|
+
module RequestHandlers
|
3
|
+
module Balance
|
4
|
+
|
5
|
+
def Balance.included(klass)
|
6
|
+
klass.add_handler 'get /v1/balance', :get_balance
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_balance(route, method_url, params, headers)
|
10
|
+
route =~ method_url
|
11
|
+
|
12
|
+
return_balance = Data.mock_balance(account_balance)
|
13
|
+
return_balance
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -9,12 +9,14 @@ module StripeMock
|
|
9
9
|
def custom_subscription_params(plan, cus, options = {})
|
10
10
|
verify_trial_end(options[:trial_end]) if options[:trial_end]
|
11
11
|
|
12
|
-
|
13
|
-
|
12
|
+
now = Time.now.utc.to_i
|
13
|
+
created_time = options[:created] || now
|
14
|
+
start_time = options[:current_period_start] || now
|
15
|
+
params = { plan: plan, customer: cus[:id], current_period_start: start_time, created: created_time }
|
14
16
|
params.merge! options.select {|k,v| k =~ /application_fee_percent|quantity|metadata|tax_percent/}
|
15
17
|
# TODO: Implement coupon logic
|
16
18
|
|
17
|
-
if ((plan[:trial_period_days]||0) == 0 && options[:trial_end].nil?) || options[:trial_end] == "now"
|
19
|
+
if (((plan && plan[:trial_period_days]) || 0) == 0 && options[:trial_end].nil?) || options[:trial_end] == "now"
|
18
20
|
end_time = get_ending_time(start_time, plan)
|
19
21
|
params.merge!({status: 'active', current_period_end: end_time, trial_start: nil, trial_end: nil})
|
20
22
|
else
|
@@ -28,12 +30,16 @@ module StripeMock
|
|
28
30
|
def add_subscription_to_customer(cus, sub)
|
29
31
|
if sub[:trial_end].nil? || sub[:trial_end] == "now"
|
30
32
|
id = new_id('ch')
|
31
|
-
charges[id] = Data.mock_charge(
|
33
|
+
charges[id] = Data.mock_charge(
|
34
|
+
:id => id,
|
35
|
+
:customer => cus[:id],
|
36
|
+
:amount => (sub[:plan] ? sub[:plan][:amount] : total_items_amount(sub[:items][:data]))
|
37
|
+
)
|
32
38
|
end
|
33
39
|
|
34
40
|
if cus[:currency].nil?
|
35
|
-
cus[:currency] = sub[:plan][:currency]
|
36
|
-
elsif cus[:currency] != sub[:plan][:currency]
|
41
|
+
cus[:currency] = sub[:items][:data][0][:plan][:currency]
|
42
|
+
elsif cus[:currency] != sub[:items][:data][0][:plan][:currency]
|
37
43
|
raise Stripe::InvalidRequestError.new( "Can't combine currencies on a single customer. This customer has had a subscription, coupon, or invoice item with currency #{cus[:currency]}", 'currency', http_status: 400)
|
38
44
|
end
|
39
45
|
cus[:subscriptions][:total_count] = (cus[:subscriptions][:total_count] || 0) + 1
|
@@ -50,6 +56,8 @@ module StripeMock
|
|
50
56
|
# `intervals` is set to 1 when calculating current_period_end from current_period_start & plan
|
51
57
|
# `intervals` is set to 2 when calculating Stripe::Invoice.upcoming end from current_period_start & plan
|
52
58
|
def get_ending_time(start_time, plan, intervals = 1)
|
59
|
+
return start_time unless plan
|
60
|
+
|
53
61
|
case plan[:interval]
|
54
62
|
when "week"
|
55
63
|
start_time + (604800 * (plan[:interval_count] || 1) * intervals)
|
@@ -74,6 +82,19 @@ module StripeMock
|
|
74
82
|
end
|
75
83
|
end
|
76
84
|
|
85
|
+
def total_items_amount(items)
|
86
|
+
total = 0
|
87
|
+
items.each { |i| total += (i[:quantity] || 1) * i[:plan][:amount] }
|
88
|
+
total
|
89
|
+
end
|
90
|
+
|
91
|
+
def mock_subscription_items(items = [])
|
92
|
+
data = []
|
93
|
+
items.each do |i|
|
94
|
+
data << Data.mock_subscription_item(i.merge(plan: plans[i[:plan].to_s]))
|
95
|
+
end
|
96
|
+
data
|
97
|
+
end
|
77
98
|
end
|
78
99
|
end
|
79
100
|
end
|
@@ -73,7 +73,7 @@ module StripeMock
|
|
73
73
|
else
|
74
74
|
customer[:subscriptions][:data].min_by { |sub| sub[:current_period_end] }
|
75
75
|
end
|
76
|
-
|
76
|
+
|
77
77
|
if params[:subscription_proration_date] && !((subscription[:current_period_start]..subscription[:current_period_end]) === params[:subscription_proration_date])
|
78
78
|
raise Stripe::InvalidRequestError.new('Cannot specify proration date outside of current subscription period', nil, http_status: 400)
|
79
79
|
end
|
@@ -112,14 +112,30 @@ module StripeMock
|
|
112
112
|
quantity: subscription[:quantity],
|
113
113
|
proration: true
|
114
114
|
)
|
115
|
+
|
116
|
+
preview_plan = assert_existence :plan, params[:subscription_plan], plans[params[:subscription_plan]]
|
117
|
+
if preview_plan[:interval] == subscription[:plan][:interval] && preview_plan[:interval_count] == subscription[:plan][:interval_count] && params[:subscription_trial_end].nil?
|
118
|
+
remaining_amount = preview_plan[:amount] * subscription_quantity * (subscription[:current_period_end] - subscription_proration_date.to_i) / (subscription[:current_period_end] - subscription[:current_period_start])
|
119
|
+
invoice_lines << Data.mock_line_item(
|
120
|
+
id: new_id('ii'),
|
121
|
+
amount: remaining_amount,
|
122
|
+
description: 'Remaining time',
|
123
|
+
plan: preview_plan,
|
124
|
+
period: {
|
125
|
+
start: subscription_proration_date.to_i,
|
126
|
+
end: subscription[:current_period_end]
|
127
|
+
},
|
128
|
+
quantity: subscription_quantity,
|
129
|
+
proration: true
|
130
|
+
)
|
131
|
+
end
|
115
132
|
end
|
116
133
|
|
117
134
|
subscription_line = get_mock_subscription_line_item(preview_subscription)
|
118
135
|
invoice_lines << subscription_line
|
119
136
|
|
120
|
-
|
121
|
-
|
122
|
-
id: id,
|
137
|
+
Data.mock_invoice(invoice_lines,
|
138
|
+
id: new_id('in'),
|
123
139
|
customer: customer[:id],
|
124
140
|
discount: customer[:discount],
|
125
141
|
date: invoice_date,
|