stripe-rails 2.0.0.pre → 2.3.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.
data/lib/stripe/rails.rb CHANGED
@@ -4,6 +4,7 @@ require 'stripe/engine'
4
4
  require 'stripe/configuration_builder'
5
5
  require 'stripe/current_api_version'
6
6
  require 'stripe/plans'
7
+ require 'stripe/prices'
7
8
  require 'stripe/billing_tier'
8
9
  require 'stripe/coupons'
9
10
  require 'stripe/products'
@@ -30,6 +30,15 @@ namespace :stripe do
30
30
  Stripe::Coupons.reset!
31
31
  end
32
32
 
33
- desc "create all plans and coupons defined in config/stripe/{products|plans|coupons}.rb"
34
- task 'prepare' => ['products:prepare', 'plans:prepare', 'coupons:prepare']
33
+ task 'prices:prepare' => 'environment' do
34
+ Stripe::Prices.put!
35
+ end
36
+
37
+ desc 'delete and redefine all prices defined in config/stripe/prices.rb'
38
+ task 'prices:reset!' => 'environment' do
39
+ Stripe::Prices.reset!
40
+ end
41
+
42
+ desc "create all plans and coupons defined in config/stripe/{products|plans|prices|coupons}.rb"
43
+ task 'prepare' => ['products:prepare', 'plans:prepare', 'prices:prepare', 'coupons:prepare']
35
44
  end
@@ -1,5 +1,5 @@
1
1
  module Stripe
2
2
  module Rails
3
- VERSION = '2.0.0.pre'.freeze
3
+ VERSION = '2.3.0'.freeze
4
4
  end
5
5
  end
@@ -7,6 +7,7 @@ describe 'building coupons' do
7
7
  describe 'default values' do
8
8
  before do
9
9
  @coupon = Stripe.coupon(:firesale) do |coupon|
10
+ coupon.name = '100% OFF FIRESALE'
10
11
  coupon.duration = 'once'
11
12
  coupon.duration_in_months = 100
12
13
  coupon.amount_off = 100
@@ -0,0 +1,59 @@
1
+ Stripe.price :gold do |price|
2
+ price.name = 'Solid Gold'
3
+ price.unit_amount = 699
4
+ price.recurring = {
5
+ interval: 'month'
6
+ }
7
+ end
8
+
9
+ Stripe.price "Solid Gold".to_sym do |price|
10
+ price.constant_name = 'SOLID_GOLD'
11
+ price.name = 'Solid Gold'
12
+ price.unit_amount = 699
13
+ price.recurring = {
14
+ interval: 'month'
15
+ }
16
+ end
17
+
18
+ Stripe.price :alternative_currency do |price|
19
+ price.name = 'Alternative Currency'
20
+ price.unit_amount = 699
21
+ price.recurring = {
22
+ interval: 'month'
23
+ }
24
+ price.currency = 'cad'
25
+ end
26
+
27
+ Stripe.price :metered do |price|
28
+ price.name = 'Metered'
29
+ price.unit_amount = 699
30
+ price.recurring = {
31
+ interval: 'month',
32
+ aggregate_usage: 'max',
33
+ usage_type: 'metered'
34
+ }
35
+ price.billing_scheme = 'per_unit'
36
+ end
37
+
38
+ Stripe.price :tiered do |price|
39
+ price.name = 'Tiered'
40
+ price.billing_scheme = 'tiered'
41
+ # interval must be either 'day', 'week', 'month' or 'year'
42
+ price.recurring = {
43
+ interval: 'month',
44
+ interval_count: 2,
45
+ aggregate_usage: 'max',
46
+ usage_type: 'metered'
47
+ }
48
+ price.tiers = [
49
+ {
50
+ unit_amount: 1500,
51
+ up_to: 10
52
+ },
53
+ {
54
+ unit_amount: 1000,
55
+ up_to: 'inf'
56
+ }
57
+ ]
58
+ price.tiers_mode = 'graduated'
59
+ end
@@ -9,7 +9,7 @@ describe ApisController do
9
9
  header 'Content-Type', 'application/json'
10
10
  end
11
11
 
12
- describe 'the ping interface' do
12
+ describe 'the apis interface' do
13
13
  subject { get '/apis/' }
14
14
 
15
15
  it { _(subject).must_be :ok? }
@@ -10,6 +10,10 @@ describe Stripe::EventsController do
10
10
  end
11
11
 
12
12
  describe 'the events interface' do
13
+ subject { post '/stripe/events', params.to_json }
14
+
15
+ before { stripe_events_stub }
16
+
13
17
  let(:params) {
14
18
  {
15
19
  id: 'evt_00000000000000',
@@ -17,14 +21,29 @@ describe Stripe::EventsController do
17
21
  data: {object: 'customer'},
18
22
  }
19
23
  }
20
-
21
- before do
24
+ let(:stripe_events_stub) do
22
25
  stub_request(:get, "https://api.stripe.com/v1/events/evt_00000000000000").
23
26
  to_return(status: 200, body: Stripe::Event.construct_from(params).to_json, headers: {})
24
27
  end
25
- subject { post '/stripe/events', params.to_json }
26
28
 
27
29
  it { _(subject).must_be :ok? }
30
+
31
+ it 'should call the stripe_events_stub' do
32
+ subject
33
+ assert_requested(stripe_events_stub)
34
+ end
35
+
36
+ describe 'when signing_secret is nil' do
37
+ before do
38
+ header 'Stripe-Signature', 't=1537832721,v1=123,v0=123'
39
+ app.config.stripe.signing_secret = nil
40
+ end
41
+
42
+ it 'should call the stripe_events_stub' do
43
+ subject
44
+ assert_requested(stripe_events_stub)
45
+ end
46
+ end
28
47
  end
29
48
 
30
49
  describe 'signed webhooks' do
@@ -0,0 +1,7 @@
1
+ {
2
+ "object": "list",
3
+ "count": 0,
4
+ "data": [],
5
+ "has_more": false,
6
+ "url": "/v1/prices"
7
+ }
@@ -140,7 +140,7 @@ describe 'building plans' do
140
140
  }).must_raise Stripe::InvalidConfigurationError
141
141
  end
142
142
 
143
- it 'denies aggregate_usage if usage type is liecensed' do
143
+ it 'denies aggregate_usage if usage type is licensed' do
144
144
  _(lambda {
145
145
  Stripe.plan :broken do |plan|
146
146
  plan.name = 'Acme as a service'
@@ -0,0 +1,594 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'building prices' do
4
+ describe 'simply' do
5
+ before do
6
+ Stripe.price :lite do |price|
7
+ price.name = 'Acme as a service LITE'
8
+ price.unit_amount = 699
9
+ price.recurring = {
10
+ interval: 'month',
11
+ interval_count: 3,
12
+ usage_type: 'metered',
13
+ aggregate_usage: 'sum'
14
+ }
15
+ price.metadata = {:number_of_awesome_things => 5}
16
+ price.statement_descriptor = 'Acme Lite'
17
+ price.active = true
18
+ price.nickname = 'lite'
19
+ price.billing_scheme = 'per_unit'
20
+ price.tiers_mode = 'graduated'
21
+ end
22
+ end
23
+
24
+ after { Stripe::Prices.send(:remove_const, :LITE) }
25
+
26
+ it 'is accessible via id' do
27
+ _(Stripe::Prices::LITE).wont_be_nil
28
+ end
29
+
30
+ it 'is accessible via collection' do
31
+ _(Stripe::Prices.all).must_include Stripe::Prices::LITE
32
+ end
33
+
34
+ it 'is accessible via hash lookup (symbol/string agnostic)' do
35
+ _(Stripe::Prices[:lite]).must_equal Stripe::Prices::LITE
36
+ _(Stripe::Prices['lite']).must_equal Stripe::Prices::LITE
37
+ end
38
+
39
+ it 'sets the lookup key' do
40
+ _(Stripe::Prices::LITE.lookup_key).must_equal 'lite'
41
+ end
42
+
43
+ it 'accepts a billing interval of a day' do
44
+ Stripe.price :daily do |price|
45
+ price.name = 'Acme as a service daily'
46
+ price.unit_amount = 100
47
+ price.recurring = {
48
+ interval: 'day'
49
+ }
50
+ end
51
+
52
+ _(Stripe::Prices::DAILY).wont_be_nil
53
+ end
54
+
55
+ it 'denies a billing interval of a day and excessive intervals' do
56
+ _(lambda {
57
+ Stripe.price :broken do |price|
58
+ price.name = 'Acme as a service daily'
59
+ price.unit_amount = 100
60
+ price.recurring = {
61
+ interval: 'day',
62
+ interval_count: 366
63
+ }
64
+ end
65
+ }).must_raise Stripe::InvalidConfigurationError
66
+ end
67
+
68
+ it 'accepts a billing interval of a week' do
69
+ Stripe.price :weekly do |price|
70
+ price.name = 'Acme as a service weekly'
71
+ price.unit_amount = 100
72
+ price.recurring = {
73
+ interval: 'week'
74
+ }
75
+ end
76
+
77
+ _(Stripe::Prices::WEEKLY).wont_be_nil
78
+ end
79
+
80
+ it 'denies a billing interval of a week and excessive intervals' do
81
+ _(lambda {
82
+ Stripe.price :broken do |price|
83
+ price.name = 'Acme as a service weekly'
84
+ price.unit_amount = 100
85
+ price.recurring = {
86
+ interval: 'week',
87
+ interval_count: 53
88
+ }
89
+ end
90
+ }).must_raise Stripe::InvalidConfigurationError
91
+ end
92
+
93
+ it 'accepts a billing interval of a month' do
94
+ Stripe.price :monthly do |price|
95
+ price.name = 'Acme as a service monthly'
96
+ price.unit_amount = 400
97
+ price.recurring = {
98
+ interval: 'month'
99
+ }
100
+ end
101
+
102
+ _(Stripe::Prices::MONTHLY).wont_be_nil
103
+ end
104
+
105
+ it 'denies a billing interval of a month and excessive intervals' do
106
+ _(lambda {
107
+ Stripe.price :broken do |price|
108
+ price.name = 'Acme as a service monthly'
109
+ price.unit_amount = 400
110
+ price.recurring = {
111
+ interval: 'month',
112
+ interval_count: 13
113
+ }
114
+ end
115
+ }).must_raise Stripe::InvalidConfigurationError
116
+ end
117
+
118
+ it 'accepts a billing interval of a year' do
119
+ Stripe.price :yearly do |price|
120
+ price.name = 'Acme as a service yearly'
121
+ price.unit_amount = 4800
122
+ price.recurring = {
123
+ interval: 'year'
124
+ }
125
+ end
126
+
127
+ _(Stripe::Prices::YEARLY).wont_be_nil
128
+ end
129
+
130
+ it 'denies a billing interval of a year and excessive intervals' do
131
+ _(lambda {
132
+ Stripe.price :broken do |price|
133
+ price.name = 'Acme as a service yearly'
134
+ price.unit_amount = 4800
135
+ price.recurring = {
136
+ interval: 'year',
137
+ interval_count: 2
138
+ }
139
+ end
140
+ }).must_raise Stripe::InvalidConfigurationError
141
+ end
142
+
143
+ it 'denies arbitrary billing intervals' do
144
+ _(lambda {
145
+ Stripe.price :broken do |price|
146
+ price.name = 'Acme as a service BROKEN'
147
+ price.unit_amount = 999
148
+ price.recurring = {
149
+ interval: 'anything'
150
+ }
151
+ end
152
+ }).must_raise Stripe::InvalidConfigurationError
153
+ end
154
+
155
+ it 'accepts empty recurring options' do
156
+ Stripe.price :singular do |price|
157
+ price.name = 'Acme as a service one time'
158
+ price.unit_amount = 888
159
+ end
160
+
161
+ _(Stripe::Prices::SINGULAR).wont_be_nil
162
+ end
163
+
164
+ it 'accepts a statement descriptor' do
165
+ Stripe.price :described do |price|
166
+ price.name = 'Acme as a service'
167
+ price.unit_amount = 999
168
+ price.recurring = {
169
+ interval: 'month'
170
+ }
171
+ price.statement_descriptor = 'ACME Monthly'
172
+ end
173
+
174
+ _(Stripe::Prices::DESCRIBED).wont_be_nil
175
+ end
176
+
177
+ it 'denies statement descriptors that are too long' do
178
+ _(lambda {
179
+ Stripe.price :described do |price|
180
+ price.name = 'Acme as a service'
181
+ price.unit_amount = 999
182
+ price.recurring = {
183
+ interval: 'month'
184
+ }
185
+ price.statement_descriptor = 'ACME as a Service Monthly'
186
+ end
187
+ }).must_raise Stripe::InvalidConfigurationError
188
+ end
189
+
190
+ it 'denies invalid values for active' do
191
+ _(lambda {
192
+ Stripe.price :broken do |price|
193
+ price.name = 'Acme as a service'
194
+ price.unit_amount = 999
195
+ price.recurring = {
196
+ interval: 'month'
197
+ }
198
+ price.active = 'whatever'
199
+ end
200
+ }).must_raise Stripe::InvalidConfigurationError
201
+ end
202
+
203
+ it 'denies invalid values for usage_type' do
204
+ _(lambda {
205
+ Stripe.price :broken do |price|
206
+ price.name = 'Acme as a service'
207
+ price.unit_amount = 999
208
+ price.recurring = {
209
+ interval: 'month',
210
+ usage_type: 'whatever'
211
+ }
212
+ end
213
+ }).must_raise Stripe::InvalidConfigurationError
214
+ end
215
+
216
+ it 'denies invalid values for aggregate_usage' do
217
+ _(lambda {
218
+ Stripe.price :broken do |price|
219
+ price.name = 'Acme as a service'
220
+ price.unit_amount = 999
221
+ price.recurring = {
222
+ interval: 'month',
223
+ aggregate_usage: 'whatever'
224
+ }
225
+ end
226
+ }).must_raise Stripe::InvalidConfigurationError
227
+ end
228
+
229
+ it 'denies aggregate_usage if usage type is licensed' do
230
+ _(lambda {
231
+ Stripe.price :broken do |price|
232
+ price.name = 'Acme as a service'
233
+ price.unit_amount = 999
234
+ price.recurring = {
235
+ interval: 'month',
236
+ usage_type: 'licensed',
237
+ aggregate_usage: 'sum'
238
+ }
239
+ end
240
+ }).must_raise Stripe::InvalidConfigurationError
241
+ end
242
+
243
+
244
+ it 'denies invalid values for billing_scheme' do
245
+ _(lambda {
246
+ Stripe.price :broken do |price|
247
+ price.name = 'Acme as a service'
248
+ price.unit_amount = 999
249
+ price.recurring = {
250
+ interval: 'month'
251
+ }
252
+ price.billing_scheme = 'whatever'
253
+ end
254
+ }).must_raise Stripe::InvalidConfigurationError
255
+ end
256
+
257
+ it 'denies invalid values for tiers_mode' do
258
+ _(lambda {
259
+ Stripe.price :broken do |price|
260
+ price.name = 'Acme as a service'
261
+ price.unit_amount = 999
262
+ price.recurring = {
263
+ interval: 'month'
264
+ }
265
+ price.tiers_mode = 'whatever'
266
+ end
267
+ }).must_raise Stripe::InvalidConfigurationError
268
+ end
269
+
270
+ describe 'name and product id validation' do
271
+ it 'should be valid when using just the product id' do
272
+ Stripe.price :prodded do |price|
273
+ price.product_id = 'acme'
274
+ price.unit_amount = 999
275
+ price.recurring = {
276
+ interval: 'month'
277
+ }
278
+ end
279
+ _(Stripe::Prices::PRODDED).wont_be_nil
280
+ end
281
+
282
+ it 'should be invalid when using both name and product id' do
283
+ _(lambda {
284
+ Stripe.price :broken do |price|
285
+ price.name = 'Acme as a service'
286
+ price.product_id = 'acme'
287
+ price.unit_amount = 999
288
+ price.recurring = {
289
+ interval: 'month'
290
+ }
291
+ end
292
+ }).must_raise Stripe::InvalidConfigurationError
293
+ end
294
+ end
295
+
296
+ describe 'uploading' do
297
+ include FixtureLoader
298
+
299
+ describe 'when none exists on stripe.com' do
300
+ before do
301
+ Stripe::Price.stubs(:list).returns(Stripe::Price.construct_from(data: []))
302
+
303
+ stub_request(:get, "https://api.stripe.com/v1/prices").
304
+ with(headers: { 'Authorization'=>'Bearer XYZ',}).
305
+ to_return(status: 200, body: load_request_fixture('stripe_prices.json'))
306
+ end
307
+
308
+ it 'creates the price online' do
309
+ Stripe::Price.expects(:create).with(
310
+ :lookup_key => 'gold',
311
+ :nickname => 'gold',
312
+ :currency => 'usd',
313
+ :product_data => {
314
+ :name => 'Solid Gold',
315
+ :statement_descriptor => nil
316
+ },
317
+ :unit_amount => 699,
318
+ :recurring => {
319
+ :interval => 'month'
320
+ }
321
+ )
322
+ Stripe::Prices::GOLD.put!
323
+ end
324
+
325
+ it 'creates a price with an alternative currency' do
326
+ Stripe::Price.expects(:create).with(
327
+ :lookup_key => 'alternative_currency',
328
+ :nickname => 'alternative_currency',
329
+ :currency => 'cad',
330
+ :product_data => {
331
+ :name => 'Alternative Currency',
332
+ :statement_descriptor => nil
333
+ },
334
+ :unit_amount => 699,
335
+ :recurring => {
336
+ :interval => 'month'
337
+ }
338
+ )
339
+ Stripe::Prices::ALTERNATIVE_CURRENCY.put!
340
+ end
341
+
342
+ it 'creates a metered price' do
343
+ Stripe::Price.expects(:create).with(
344
+ :lookup_key => 'metered',
345
+ :nickname => 'metered',
346
+ :currency => 'usd',
347
+ :product_data => {
348
+ :name => 'Metered',
349
+ :statement_descriptor => nil,
350
+ },
351
+ :unit_amount => 699,
352
+ :recurring => {
353
+ :interval => 'month',
354
+ :usage_type => 'metered',
355
+ :aggregate_usage => 'max',
356
+ },
357
+ :billing_scheme => 'per_unit'
358
+ )
359
+ Stripe::Prices::METERED.put!
360
+ end
361
+
362
+ it 'creates a tiered price' do
363
+ Stripe::Price.expects(:create).with(
364
+ :lookup_key => 'tiered',
365
+ :nickname => 'tiered',
366
+ :currency => 'usd',
367
+ :product_data => {
368
+ :name => 'Tiered',
369
+ :statement_descriptor => nil,
370
+ },
371
+ :recurring => {
372
+ :interval => 'month',
373
+ :interval_count => 2,
374
+ :usage_type => 'metered',
375
+ :aggregate_usage => 'max'
376
+ },
377
+ :billing_scheme => 'tiered',
378
+ :tiers => [
379
+ {
380
+ :unit_amount => 1500,
381
+ :up_to => 10
382
+ },
383
+ {
384
+ :unit_amount => 1000,
385
+ :up_to => 'inf'
386
+ }
387
+ ],
388
+ :tiers_mode => 'graduated'
389
+ )
390
+ Stripe::Prices::TIERED.put!
391
+ end
392
+
393
+ describe 'when passed invalid arguments for tiered pricing' do
394
+ it 'raises a Stripe::InvalidConfigurationError when billing tiers are invalid' do
395
+ lambda {
396
+ Stripe.price "Bad Tiers".to_sym do |price|
397
+ price.name = 'Acme as a service BAD TIERS'
398
+ price.constant_name = 'BAD_TIERS'
399
+ price.recurring = {
400
+ interval: 'month',
401
+ interval_count: 1,
402
+ usage_type: 'metered',
403
+ aggregate_usage: 'sum'
404
+ }
405
+ price.tiers_mode = 'graduated'
406
+ price.billing_scheme = 'per_unit'
407
+ price.tiers = [
408
+ {
409
+ unit_amount: 1500,
410
+ up_to: 10
411
+ },
412
+ {
413
+ unit_amount: 1000,
414
+ }
415
+ ]
416
+ end
417
+ }.must_raise Stripe::InvalidConfigurationError
418
+ end
419
+
420
+ it 'raises a Stripe::InvalidConfigurationError when billing tiers is not an array' do
421
+ lambda {
422
+ Stripe.price "Bad Tiers".to_sym do |price|
423
+ price.name = 'Acme as a service BAD TIERS'
424
+ price.constant_name = 'BAD_TIERS'
425
+ price.recurring = {
426
+ interval: 'month',
427
+ interval_count: 1,
428
+ usage_type: 'metered',
429
+ aggregate_usage: 'sum'
430
+ }
431
+ price.tiers_mode = 'graduated'
432
+ price.billing_scheme = 'per_unit'
433
+ price.tiers = {
434
+ unit_amount: 1500,
435
+ up_to: 10
436
+ }
437
+ end
438
+ }.must_raise Stripe::InvalidConfigurationError
439
+ end
440
+ end
441
+
442
+ describe 'when using a product id' do
443
+ before do
444
+ Stripe::Prices::GOLD.product_id = 'prod_XXXXXXXXXXXXXX'
445
+ Stripe::Prices::GOLD.name = nil
446
+ end
447
+ after do
448
+ Stripe::Prices::GOLD.product_id = nil
449
+ Stripe::Prices::GOLD.name = 'Solid Gold'
450
+ end
451
+
452
+ it 'creates the price online with the product id' do
453
+ Stripe::Price.expects(:create).with(
454
+ :lookup_key => 'gold',
455
+ :nickname => 'gold',
456
+ :currency => 'usd',
457
+ :product => 'prod_XXXXXXXXXXXXXX',
458
+ :unit_amount => 699,
459
+ :recurring => {
460
+ :interval => 'month'
461
+ }
462
+ )
463
+ Stripe::Prices::GOLD.put!
464
+ end
465
+ end
466
+ end
467
+
468
+ describe 'when it is already present on stripe.com' do
469
+ before do
470
+ Stripe::Prices::GOLD.product_id = nil
471
+ Stripe::Price.stubs(:list).returns(Stripe::Price.construct_from(
472
+ data: [{
473
+ :lookup_key => 'gold',
474
+ :product => 'prod_XXXXXXXXXXXXXX'
475
+ }]))
476
+ end
477
+ after do
478
+ Stripe::Prices::GOLD.product_id = nil
479
+ end
480
+
481
+
482
+ it 'is a no-op on put!' do
483
+ Stripe::Price.expects(:create).never
484
+ Stripe::Prices::GOLD.put!
485
+ end
486
+
487
+ it 'transfers lookup key on reset!' do
488
+ Stripe::Price.expects(:create).with(
489
+ :lookup_key => 'gold',
490
+ :transfer_lookup_key => true,
491
+ :nickname => 'gold',
492
+ :currency => 'usd',
493
+ :product => 'prod_XXXXXXXXXXXXXX',
494
+ :unit_amount => 699,
495
+ :recurring => {
496
+ :interval => 'month'
497
+ }
498
+ )
499
+
500
+ Stripe::Prices::GOLD.reset!
501
+ end
502
+ end
503
+ end
504
+ end
505
+
506
+ describe 'with missing mandatory values' do
507
+ it 'raises an exception after configuring it' do
508
+ _(-> { Stripe.price(:bad) {} }).must_raise Stripe::InvalidConfigurationError
509
+ end
510
+ end
511
+
512
+ describe 'with custom constant name' do
513
+ before do
514
+ Stripe.price "Lite price".to_sym do |price|
515
+ price.name = 'Acme as a service LITE'
516
+ price.constant_name = 'LITE_PRICE'
517
+ price.unit_amount = 699
518
+ price.recurring = {
519
+ interval: 'month',
520
+ interval_count: 3,
521
+ usage_type: 'metered',
522
+ aggregate_usage: 'sum'
523
+ }
524
+ price.metadata = {:number_of_awesome_things => 5}
525
+ price.statement_descriptor = 'Acme Lite'
526
+ price.active = true
527
+ price.nickname = 'lite'
528
+ price.billing_scheme = 'per_unit'
529
+ price.tiers_mode = 'graduated'
530
+ end
531
+ end
532
+
533
+ after { Stripe::Prices.send(:remove_const, :LITE_PRICE) }
534
+
535
+ it 'is accessible via upcased constant_name' do
536
+ _(Stripe::Prices::LITE_PRICE).wont_be_nil
537
+ end
538
+
539
+ it 'is accessible via collection' do
540
+ _(Stripe::Prices.all).must_include Stripe::Prices::LITE_PRICE
541
+ end
542
+
543
+ it 'is accessible via hash lookup (symbol/string agnostic)' do
544
+ _(Stripe::Prices[:lite_price]).must_equal Stripe::Prices::LITE_PRICE
545
+ _(Stripe::Prices['lite_price']).must_equal Stripe::Prices::LITE_PRICE
546
+ end
547
+
548
+ describe 'constant name validation' do
549
+ it 'should be invalid when providing a constant name that can not be used for Ruby constant' do
550
+ _(lambda {
551
+ Stripe.price "Lite price".to_sym do |price|
552
+ price.name = 'Acme as a service LITE'
553
+ price.constant_name = 'LITE PRICE'
554
+ price.unit_amount = 999
555
+ price.recurring = {
556
+ interval: 'month'
557
+ }
558
+ end
559
+ }).must_raise Stripe::InvalidConfigurationError
560
+ end
561
+ end
562
+
563
+ describe 'uploading' do
564
+ include FixtureLoader
565
+
566
+ describe 'when none exists on stripe.com' do
567
+ before do
568
+ Stripe::Price.stubs(:list).returns(Stripe::Price.construct_from(data: []))
569
+
570
+ stub_request(:get, "https://api.stripe.com/v1/prices").
571
+ with(headers: { 'Authorization'=>'Bearer XYZ',}).
572
+ to_return(status: 200, body: load_request_fixture('stripe_prices.json'))
573
+ end
574
+
575
+ it 'creates the price online' do
576
+ Stripe::Price.expects(:create).with(
577
+ :lookup_key => "Solid Gold",
578
+ :nickname => "Solid Gold",
579
+ :currency => 'usd',
580
+ :product_data => {
581
+ :name => 'Solid Gold',
582
+ :statement_descriptor => nil
583
+ },
584
+ :unit_amount => 699,
585
+ :recurring => {
586
+ :interval => 'month'
587
+ }
588
+ )
589
+ Stripe::Prices::SOLID_GOLD.put!
590
+ end
591
+ end
592
+ end
593
+ end
594
+ end