stripe-ruby-mock 3.0.1 → 3.1.0.rc2

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.
Files changed (49) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +2 -5
  3. data/CHANGELOG.md +28 -15
  4. data/Gemfile +1 -0
  5. data/lib/stripe_mock.rb +4 -0
  6. data/lib/stripe_mock/api/client.rb +1 -1
  7. data/lib/stripe_mock/api/instance.rb +1 -1
  8. data/lib/stripe_mock/api/webhooks.rb +2 -0
  9. data/lib/stripe_mock/client.rb +2 -1
  10. data/lib/stripe_mock/data.rb +127 -25
  11. data/lib/stripe_mock/data/list.rb +31 -6
  12. data/lib/stripe_mock/instance.rb +7 -2
  13. data/lib/stripe_mock/request_handlers/account_links.rb +15 -0
  14. data/lib/stripe_mock/request_handlers/charges.rb +6 -4
  15. data/lib/stripe_mock/request_handlers/checkout_session.rb +16 -0
  16. data/lib/stripe_mock/request_handlers/customers.rb +22 -13
  17. data/lib/stripe_mock/request_handlers/ephemeral_key.rb +1 -1
  18. data/lib/stripe_mock/request_handlers/express_login_links.rb +15 -0
  19. data/lib/stripe_mock/request_handlers/helpers/subscription_helpers.rb +12 -7
  20. data/lib/stripe_mock/request_handlers/invoices.rb +4 -3
  21. data/lib/stripe_mock/request_handlers/payment_methods.rb +8 -5
  22. data/lib/stripe_mock/request_handlers/prices.rb +44 -0
  23. data/lib/stripe_mock/request_handlers/sources.rb +12 -6
  24. data/lib/stripe_mock/request_handlers/subscriptions.rb +29 -19
  25. data/lib/stripe_mock/request_handlers/tokens.rb +6 -4
  26. data/lib/stripe_mock/request_handlers/validators/param_validators.rb +32 -0
  27. data/lib/stripe_mock/test_strategies/base.rb +26 -0
  28. data/lib/stripe_mock/version.rb +1 -1
  29. data/lib/stripe_mock/webhook_fixtures/balance.available.json +6 -0
  30. data/lib/stripe_mock/webhook_fixtures/payment_intent.payment_failed.json +186 -0
  31. data/lib/stripe_mock/webhook_fixtures/payment_intent.succeeded.json +164 -0
  32. data/spec/instance_spec.rb +4 -6
  33. data/spec/list_spec.rb +23 -0
  34. data/spec/server_spec.rb +4 -2
  35. data/spec/shared_stripe_examples/account_link_examples.rb +16 -0
  36. data/spec/shared_stripe_examples/balance_examples.rb +6 -0
  37. data/spec/shared_stripe_examples/card_token_examples.rb +17 -21
  38. data/spec/shared_stripe_examples/checkout_examples.rb +20 -1
  39. data/spec/shared_stripe_examples/customer_examples.rb +11 -13
  40. data/spec/shared_stripe_examples/express_login_link_examples.rb +12 -0
  41. data/spec/shared_stripe_examples/invoice_examples.rb +8 -8
  42. data/spec/shared_stripe_examples/payment_method_examples.rb +332 -68
  43. data/spec/shared_stripe_examples/price_examples.rb +183 -0
  44. data/spec/shared_stripe_examples/subscription_examples.rb +115 -8
  45. data/spec/spec_helper.rb +4 -0
  46. data/spec/stripe_mock_spec.rb +2 -2
  47. data/spec/support/stripe_examples.rb +5 -1
  48. data/stripe-ruby-mock.gemspec +6 -1
  49. metadata +25 -11
@@ -0,0 +1,183 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples 'Price API' do
4
+ let(:product) { stripe_helper.create_product }
5
+ let(:product_id) { product.id }
6
+
7
+ let(:price_attributes) { {
8
+ :id => "price_abc123",
9
+ :product => product_id,
10
+ :nickname => "My Mock price",
11
+ :amount => 9900,
12
+ :currency => "usd",
13
+ :interval => "month"
14
+ } }
15
+ let(:price) { Stripe::Price.create(price_attributes) }
16
+
17
+ let(:price_attributes_without_id){ price_attributes.merge(id: nil) }
18
+ let(:price_without_id){ Stripe::Price.create(price_attributes_without_id) }
19
+
20
+ let(:price_attributes_with_trial) { price_attributes.merge(id: "prod_TRIAL", :trial_period_days => 30) }
21
+ let(:price_with_trial) { Stripe::Price.create(price_attributes_with_trial) }
22
+
23
+ let(:metadata) { {:description => "desc text", :info => "info text"} }
24
+ let(:price_attributes_with_metadata) { price_attributes.merge(id: "prod_META", metadata: metadata) }
25
+ let(:price_with_metadata) { Stripe::Price.create(price_attributes_with_metadata) }
26
+
27
+ before(:each) do
28
+ product
29
+ end
30
+
31
+ it "creates a stripe price" do
32
+ expect(price.id).to eq('price_abc123')
33
+ expect(price.nickname).to eq('My Mock price')
34
+ expect(price.amount).to eq(9900)
35
+
36
+ expect(price.currency).to eq('usd')
37
+ expect(price.interval).to eq("month")
38
+
39
+ expect(price_with_metadata.metadata.description).to eq('desc text')
40
+ expect(price_with_metadata.metadata.info).to eq('info text')
41
+
42
+ expect(price_with_trial.trial_period_days).to eq(30)
43
+ end
44
+
45
+ it "creates a stripe price without specifying ID" do
46
+ expect(price_attributes_without_id[:id]).to be_nil
47
+ expect(price_without_id.id).to match(/^test_price_1/)
48
+ end
49
+
50
+ it "stores a created stripe price in memory" do
51
+ price
52
+ price2 = Stripe::Price.create(price_attributes.merge(id: "price_def456", amount: 299))
53
+
54
+ data = test_data_source(:prices)
55
+ expect(data[price.id]).to_not be_nil
56
+ expect(data[price.id][:amount]).to eq(9900)
57
+ expect(data[price2.id]).to_not be_nil
58
+ expect(data[price2.id][:amount]).to eq(299)
59
+ end
60
+
61
+ it "retrieves a stripe price" do
62
+ original = stripe_helper.create_price(product: product_id, amount: 1331, id: 'price_943843')
63
+ price = Stripe::Price.retrieve(original.id)
64
+
65
+ expect(price.id).to eq(original.id)
66
+ expect(price.amount).to eq(original.amount)
67
+ end
68
+
69
+ it "updates a stripe price" do
70
+ stripe_helper.create_price(id: 'super_member', product: product_id, amount: 111)
71
+
72
+ price = Stripe::Price.retrieve('super_member')
73
+ expect(price.amount).to eq(111)
74
+
75
+ price.amount = 789
76
+ price.save
77
+ price = Stripe::Price.retrieve('super_member')
78
+ expect(price.amount).to eq(789)
79
+ end
80
+
81
+ it "cannot retrieve a stripe price that doesn't exist" do
82
+ expect { Stripe::Price.retrieve('nope') }.to raise_error {|e|
83
+ expect(e).to be_a Stripe::InvalidRequestError
84
+ expect(e.param).to eq('price')
85
+ expect(e.http_status).to eq(404)
86
+ }
87
+ end
88
+
89
+ it "retrieves all prices" do
90
+ stripe_helper.create_price(id: 'price One', product: product_id, amount: 54321)
91
+ stripe_helper.create_price(id: 'price Two', product: product_id, amount: 98765)
92
+
93
+ all = Stripe::Price.list
94
+ expect(all.count).to eq(2)
95
+ expect(all.map &:id).to include('price One', 'price Two')
96
+ expect(all.map &:amount).to include(54321, 98765)
97
+ end
98
+
99
+ it 'retrieves prices with limit' do
100
+ 101.times do | i|
101
+ stripe_helper.create_price(id: "price #{i}", product: product_id, amount: 11)
102
+ end
103
+ all = Stripe::Price.list(limit: 100)
104
+
105
+ expect(all.count).to eq(100)
106
+ end
107
+
108
+ it "retrieves prices with lookup keys" do
109
+ stripe_helper.create_price(id: 'price One', product: product_id, amount: 54321, lookup_key: 'one')
110
+ stripe_helper.create_price(id: 'price Two', product: product_id, amount: 98765, lookup_key: 'two')
111
+
112
+ all = Stripe::Price.list({lookup_keys: ['one', 'two']})
113
+ expect(all.count).to eq(2)
114
+ expect(all.map &:id).to include('price One', 'price Two')
115
+ expect(all.map &:amount).to include(54321, 98765)
116
+
117
+ one = Stripe::Price.list({lookup_keys: ['one']})
118
+ expect(one.count).to eq(1)
119
+ expect(one.map &:id).to include('price One')
120
+ expect(one.map &:amount).to include(54321)
121
+
122
+ two = Stripe::Price.list({lookup_keys: ['two']})
123
+ expect(two.count).to eq(1)
124
+ expect(two.map &:id).to include('price Two')
125
+ expect(two.map &:amount).to include(98765)
126
+ end
127
+
128
+ describe "Validations", :live => true do
129
+ include_context "stripe validator"
130
+ let(:params) { stripe_helper.create_price_params(product: product_id) }
131
+ let(:subject) { Stripe::Price.create(params) }
132
+
133
+ describe "Associations" do
134
+ let(:not_found_product_id){ "prod_NONEXIST" }
135
+ let(:not_found_message) { stripe_validator.not_found_message(Stripe::Product, not_found_product_id) }
136
+ let(:params) { stripe_helper.create_price_params(product: not_found_product_id) }
137
+ let(:products) { stripe_helper.list_products(100).data }
138
+
139
+ it "validates associated product" do
140
+ expect(products.map(&:id)).to_not include(not_found_product_id)
141
+ expect { subject }.to raise_error(Stripe::InvalidRequestError, not_found_message)
142
+ end
143
+ end
144
+
145
+ describe "Presence" do
146
+ after do
147
+ params.delete(@name)
148
+ message = "Missing required param: #{@name}."
149
+ expect { subject }.to raise_error(Stripe::InvalidRequestError, message)
150
+ end
151
+
152
+ it("validates presence of currency") { @name = :currency }
153
+ end
154
+ end
155
+
156
+ describe "Mock Data" do
157
+ let(:mock_object) { StripeMock::Data.mock_price }
158
+ let(:known_attributes) { [
159
+ :id,
160
+ :object,
161
+ :active,
162
+ :billing_scheme,
163
+ :created,
164
+ :currency,
165
+ :livemode,
166
+ :lookup_key,
167
+ :metadata,
168
+ :nickname,
169
+ :product,
170
+ :recurring,
171
+ :tiers_mode,
172
+ :transform_quantity,
173
+ :type,
174
+ :unit_amount,
175
+ :unit_amount_decimal
176
+ ] }
177
+
178
+ it "includes all retreived attributes" do
179
+ expect(mock_object.keys).to eql(known_attributes)
180
+ end
181
+ end
182
+
183
+ end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
  require 'securerandom'
3
3
 
4
- shared_examples 'Customer Subscriptions' do
4
+ shared_examples 'Customer Subscriptions with plans' do
5
5
  let(:gen_card_tk) { stripe_helper.generate_card_token }
6
6
 
7
7
  let(:product) { stripe_helper.create_product }
@@ -14,7 +14,7 @@ shared_examples 'Customer Subscriptions' do
14
14
  let(:free_plan) { stripe_helper.create_plan(id: 'free', product: product.id, amount: 0) }
15
15
 
16
16
  context "creating a new subscription" do
17
- it "adds a new subscription to customer with none using items", :live => true do
17
+ it "adds a new subscription to customer with none using items", live: true do
18
18
  plan
19
19
  customer = Stripe::Customer.create(source: gen_card_tk)
20
20
 
@@ -49,7 +49,7 @@ shared_examples 'Customer Subscriptions' do
49
49
  expect(subscriptions.data.first.metadata.example).to eq( "yes" )
50
50
  end
51
51
 
52
- it "adds a new subscription to customer with none", :live => true do
52
+ it "adds a new subscription to customer with none", live: true do
53
53
  plan
54
54
  customer = Stripe::Customer.create(source: gen_card_tk)
55
55
  subscriptions = Stripe::Subscription.list(customer: customer.id)
@@ -117,6 +117,33 @@ shared_examples 'Customer Subscriptions' do
117
117
  expect(subscriptions.data.first.metadata.example).to eq( "yes" )
118
118
  end
119
119
 
120
+ it "adds a new subscription with payment method provided as default" do
121
+ plan
122
+ customer = Stripe::Customer.create(source: gen_card_tk)
123
+ payment_method = Stripe::PaymentMethod.create(
124
+ type: 'card',
125
+ card: {
126
+ number: 4242_4242_4242_4242,
127
+ exp_month: 9,
128
+ exp_year: (Time.now.year + 5),
129
+ cvc: 999
130
+ }
131
+ )
132
+ sub = Stripe::Subscription.create(
133
+ plan: 'silver',
134
+ customer: customer,
135
+ metadata: { foo: "bar", example: "yes" },
136
+ collection_method: 'send_invoice',
137
+ default_payment_method: payment_method.id,
138
+ )
139
+
140
+ subscriptions = Stripe::Subscription.list(customer: customer.id)
141
+ expect(subscriptions.count).to eq(1)
142
+ expect(subscriptions.data.first.id).to eq(sub.id)
143
+ expect(subscriptions.data.first.collection_method).to eq('send_invoice')
144
+ expect(subscriptions.data.first.default_payment_method).to eq(payment_method.id)
145
+ end
146
+
120
147
  it "adds a new subscription to customer (string/symbol agnostic)" do
121
148
  customer = Stripe::Customer.create(source: gen_card_tk)
122
149
  subscriptions = Stripe::Subscription.list(customer: customer.id)
@@ -550,7 +577,7 @@ shared_examples 'Customer Subscriptions' do
550
577
  expect(sub1).to eq(sub2)
551
578
  end
552
579
 
553
- it "adds a new subscription to customer with different idempotency key", :live => true do
580
+ it "adds a new subscription to customer with different idempotency key", live: true do
554
581
  product = stripe_helper.create_product(name: 'Silver Product')
555
582
  plan = stripe_helper.create_plan(id: 'silver', product: product.id,
556
583
  amount: 4999, currency: 'usd')
@@ -754,6 +781,43 @@ shared_examples 'Customer Subscriptions' do
754
781
  expect(subscription.pending_invoice_item_interval.interval_count).to eq 3
755
782
  end
756
783
 
784
+ it "updates a subscription's default payment method" do
785
+ plan
786
+ customer = Stripe::Customer.create(source: gen_card_tk)
787
+ payment_method_card = Stripe::PaymentMethod.create(
788
+ type: 'card',
789
+ card: {
790
+ number: 4242_4242_4242_4242,
791
+ exp_month: 9,
792
+ exp_year: (Time.now.year + 5),
793
+ cvc: 999
794
+ }
795
+ )
796
+ payment_method_sepa = Stripe::PaymentMethod.create(
797
+ type: 'sepa_debit',
798
+ sepa_debit: {iban: 'DE89370400440532013000'},
799
+ )
800
+ subscription = Stripe::Subscription.create(
801
+ plan: 'silver',
802
+ customer: customer,
803
+ metadata: { foo: "bar", example: "yes" },
804
+ default_payment_method: payment_method_card.id,
805
+ )
806
+
807
+ subscriptions = Stripe::Subscription.list(customer: customer)
808
+ expect(subscriptions.data.first.default_payment_method).to eq(payment_method_card.id)
809
+
810
+ Stripe::Subscription.update(
811
+ subscription.id,
812
+ default_payment_method: payment_method_sepa.id,
813
+ collection_method: 'send_invoice',
814
+ )
815
+
816
+ subscriptions = Stripe::Subscription.list(customer: customer)
817
+ expect(subscriptions.data.first.collection_method).to eq('send_invoice')
818
+ expect(subscriptions.data.first.default_payment_method).to eq(payment_method_sepa.id)
819
+ end
820
+
757
821
  it 'when adds coupon', live: true do
758
822
  coupon = stripe_helper.create_coupon
759
823
  customer = Stripe::Customer.create(source: gen_card_tk, plan: plan.id)
@@ -971,7 +1035,7 @@ shared_examples 'Customer Subscriptions' do
971
1035
  context "cancelling a subscription" do
972
1036
  let(:customer) { Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: plan.id) }
973
1037
 
974
- it "cancels a stripe customer's subscription", :live => true do
1038
+ it "cancels a stripe customer's subscription", live: true do
975
1039
  customer = Stripe::Customer.create(source: gen_card_tk, plan: plan.id)
976
1040
 
977
1041
  sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
@@ -1051,7 +1115,7 @@ shared_examples 'Customer Subscriptions' do
1051
1115
  expect(customer.subscriptions.data.first.status).to eq('trialing')
1052
1116
  end
1053
1117
 
1054
- it "doesn't require a card when trial_end is present", :live => true do
1118
+ it "doesn't require a card when trial_end is present", live: true do
1055
1119
  plan = stripe_helper.create_plan(
1056
1120
  :amount => 2000,
1057
1121
  :product => product.id,
@@ -1083,7 +1147,7 @@ shared_examples 'Customer Subscriptions' do
1083
1147
  expect(subscription.items.object).to eq('list')
1084
1148
  expect(subscription.items.data.class).to eq(Array)
1085
1149
  expect(subscription.items.data.count).to eq(1)
1086
- expect(subscription.items.data.first.id).to eq('test_txn_default')
1150
+ expect(subscription.items.data.first.id).to include('test_si_')
1087
1151
  expect(subscription.items.data.first.created).to eq(1504716183)
1088
1152
  expect(subscription.items.data.first.object).to eq('subscription_item')
1089
1153
  expect(subscription.items.data.first.plan.amount).to eq(0)
@@ -1122,7 +1186,7 @@ shared_examples 'Customer Subscriptions' do
1122
1186
 
1123
1187
  describe "metadata" do
1124
1188
 
1125
- it "creates a stripe customer and subscribes them to a plan with meta data", :live => true do
1189
+ it "creates a stripe customer and subscribes them to a plan with meta data", live: true do
1126
1190
 
1127
1191
  stripe_helper.
1128
1192
  create_plan(
@@ -1151,3 +1215,46 @@ shared_examples 'Customer Subscriptions' do
1151
1215
  end
1152
1216
 
1153
1217
  end
1218
+
1219
+ shared_examples 'Customer Subscriptions with prices' do
1220
+ let(:gen_card_tk) { stripe_helper.generate_card_token }
1221
+
1222
+ let(:product) { stripe_helper.create_product }
1223
+ let(:price) { stripe_helper.create_price(product: product.id, amount: 4999, currency: 'usd') }
1224
+
1225
+ context "creating a new subscription" do
1226
+ it "adds a new subscription to customer with none using items", live: true do
1227
+ customer = Stripe::Customer.create(source: gen_card_tk)
1228
+
1229
+ expect(customer.subscriptions.data).to be_empty
1230
+ expect(customer.subscriptions.count).to eq(0)
1231
+
1232
+ subscription = Stripe::Subscription.create({
1233
+ customer: customer.id,
1234
+ items: [{ price: price.id }],
1235
+ metadata: { foo: "bar", example: "yes" }
1236
+ })
1237
+
1238
+ expect(subscription.object).to eq('subscription')
1239
+ expect(subscription.plan.to_hash).to eq(price.to_hash)
1240
+ expect(subscription.metadata.foo).to eq("bar")
1241
+ expect(subscription.metadata.example).to eq("yes")
1242
+
1243
+ customer = Stripe::Customer.retrieve(customer.id)
1244
+ subscriptions = Stripe::Subscription.list(customer: customer.id)
1245
+ charges = Stripe::Charge.list(customer: customer.id)
1246
+
1247
+ expect(subscriptions.data).to_not be_empty
1248
+ expect(subscriptions.count).to eq(1)
1249
+ expect(subscriptions.data.length).to eq(1)
1250
+ expect(charges.data.length).to eq(1)
1251
+ expect(customer.currency).to eq("usd")
1252
+
1253
+ expect(subscriptions.data.first.id).to eq(subscription.id)
1254
+ expect(subscriptions.data.first.plan.to_hash).to eq(price.to_hash)
1255
+ expect(subscriptions.data.first.customer).to eq(customer.id)
1256
+ expect(subscriptions.data.first.metadata.foo).to eq( "bar" )
1257
+ expect(subscriptions.data.first.metadata.example).to eq( "yes" )
1258
+ end
1259
+ end
1260
+ end
data/spec/spec_helper.rb CHANGED
@@ -5,6 +5,9 @@ require 'rspec'
5
5
  require 'stripe'
6
6
  require 'stripe_mock'
7
7
  require 'stripe_mock/server'
8
+ require 'dotenv'
9
+
10
+ Dotenv.load('.env')
8
11
 
9
12
  # Requires supporting ruby files with custom matchers and macros, etc,
10
13
  # in spec/support/ and its subdirectories.
@@ -33,6 +36,7 @@ RSpec.configure do |c|
33
36
  when '2.4.6' then ENV['STRIPE_TEST_SECRET_KEY_A']
34
37
  when '2.5.5' then ENV['STRIPE_TEST_SECRET_KEY_B']
35
38
  when '2.6.3' then ENV['STRIPE_TEST_SECRET_KEY_C']
39
+ when '2.7.0' then ENV['STRIPE_TEST_SECRET_KEY_D']
36
40
  end
37
41
  else
38
42
  api_key = ENV['STRIPE_TEST_SECRET_KEY']
@@ -35,8 +35,8 @@ describe StripeMock do
35
35
  StripeMock.stop
36
36
  StripeMock.start
37
37
 
38
- expect(StripeMock.instance.customers[:x]).to be_nil
39
- expect(StripeMock.instance.customers.keys.length).to eq(0)
38
+ expect(StripeMock.instance.customers[''][:x]).to be_nil
39
+ expect(StripeMock.instance.customers[''].keys.length).to eq(0)
40
40
  StripeMock.stop
41
41
  end
42
42
 
@@ -5,6 +5,7 @@ end
5
5
 
6
6
  def it_behaves_like_stripe(&block)
7
7
  it_behaves_like 'Account API', &block
8
+ it_behaves_like 'Account Link API', &block
8
9
  it_behaves_like 'Balance API', &block
9
10
  it_behaves_like 'Balance Transaction API', &block
10
11
  it_behaves_like 'Bank Account Token Mocking', &block
@@ -12,6 +13,7 @@ def it_behaves_like_stripe(&block)
12
13
  it_behaves_like 'Card API', &block
13
14
  it_behaves_like 'Charge API', &block
14
15
  it_behaves_like 'Bank API', &block
16
+ it_behaves_like 'Express Login Link API', &block
15
17
  it_behaves_like 'External Account API', &block
16
18
  it_behaves_like 'Coupon API', &block
17
19
  it_behaves_like 'Customer API', &block
@@ -20,6 +22,7 @@ def it_behaves_like_stripe(&block)
20
22
  it_behaves_like 'Invoice API', &block
21
23
  it_behaves_like 'Invoice Item API', &block
22
24
  it_behaves_like 'Plan API', &block
25
+ it_behaves_like 'Price API', &block
23
26
  it_behaves_like 'Product API', &block
24
27
  it_behaves_like 'Recipient API', &block
25
28
  it_behaves_like 'Refund API', &block
@@ -29,7 +32,8 @@ def it_behaves_like_stripe(&block)
29
32
  it_behaves_like 'PaymentMethod API', &block
30
33
  it_behaves_like 'SetupIntent API', &block
31
34
  it_behaves_like 'Stripe Error Mocking', &block
32
- it_behaves_like 'Customer Subscriptions', &block
35
+ it_behaves_like 'Customer Subscriptions with plans', &block
36
+ it_behaves_like 'Customer Subscriptions with prices', &block
33
37
  it_behaves_like 'Subscription Items API', &block
34
38
  it_behaves_like 'Webhook Events API', &block
35
39
  it_behaves_like 'Country Spec API', &block
@@ -10,7 +10,12 @@ Gem::Specification.new do |gem|
10
10
  gem.license = "MIT"
11
11
  gem.authors = ["Gilbert"]
12
12
  gem.email = "gilbertbgarza@gmail.com"
13
- gem.homepage = "https://github.com/rebelidealist/stripe-ruby-mock"
13
+ gem.homepage = "https://github.com/stripe-ruby-mock/stripe-ruby-mock"
14
+ gem.metadata = {
15
+ "bug_tracker_uri" => "https://github.com/stripe-ruby-mock/stripe-ruby-mock/issues",
16
+ "changelog_uri" => "https://github.com/stripe-ruby-mock/stripe-ruby-mock/blob/master/CHANGELOG.md",
17
+ "source_code_uri" => "https://github.com/stripe-ruby-mock/stripe-ruby-mock"
18
+ }
14
19
 
15
20
  gem.files = `git ls-files`.split($/)
16
21
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }