effective_orders 3.0.0 → 3.0.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.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/effective_orders/version.rb +1 -1
  4. metadata +10 -258
  5. data/spec/controllers/admin/orders_controller_spec.rb +0 -243
  6. data/spec/controllers/carts_controller_spec.rb +0 -143
  7. data/spec/controllers/ccbill_orders_controller_spec.rb +0 -103
  8. data/spec/controllers/moneris_orders_controller_spec.rb +0 -133
  9. data/spec/controllers/orders_controller_spec.rb +0 -500
  10. data/spec/controllers/stripe_orders_controller_spec.rb +0 -128
  11. data/spec/controllers/webhooks_controller_spec.rb +0 -170
  12. data/spec/dummy/README.rdoc +0 -8
  13. data/spec/dummy/Rakefile +0 -6
  14. data/spec/dummy/app/assets/javascripts/application.js +0 -13
  15. data/spec/dummy/app/assets/stylesheets/application.css +0 -15
  16. data/spec/dummy/app/controllers/application_controller.rb +0 -5
  17. data/spec/dummy/app/helpers/application_helper.rb +0 -2
  18. data/spec/dummy/app/models/product.rb +0 -9
  19. data/spec/dummy/app/models/product_with_float_price.rb +0 -9
  20. data/spec/dummy/app/models/user.rb +0 -11
  21. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  22. data/spec/dummy/bin/bundle +0 -3
  23. data/spec/dummy/bin/rails +0 -4
  24. data/spec/dummy/bin/rake +0 -4
  25. data/spec/dummy/config.ru +0 -4
  26. data/spec/dummy/config/application.rb +0 -32
  27. data/spec/dummy/config/boot.rb +0 -5
  28. data/spec/dummy/config/database.yml +0 -25
  29. data/spec/dummy/config/environment.rb +0 -5
  30. data/spec/dummy/config/environments/development.rb +0 -37
  31. data/spec/dummy/config/environments/production.rb +0 -80
  32. data/spec/dummy/config/environments/test.rb +0 -36
  33. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  34. data/spec/dummy/config/initializers/cookies_serializer.rb +0 -3
  35. data/spec/dummy/config/initializers/devise.rb +0 -254
  36. data/spec/dummy/config/initializers/effective_addresses.rb +0 -15
  37. data/spec/dummy/config/initializers/effective_orders.rb +0 -269
  38. data/spec/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  39. data/spec/dummy/config/initializers/inflections.rb +0 -16
  40. data/spec/dummy/config/initializers/mime_types.rb +0 -4
  41. data/spec/dummy/config/initializers/session_store.rb +0 -3
  42. data/spec/dummy/config/initializers/simple_form.rb +0 -189
  43. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  44. data/spec/dummy/config/locales/en.yml +0 -23
  45. data/spec/dummy/config/routes.rb +0 -3
  46. data/spec/dummy/config/secrets.yml +0 -22
  47. data/spec/dummy/db/schema.rb +0 -158
  48. data/spec/dummy/db/test.sqlite3 +0 -0
  49. data/spec/dummy/log/development.log +0 -164
  50. data/spec/dummy/log/test.log +0 -60
  51. data/spec/dummy/public/404.html +0 -67
  52. data/spec/dummy/public/422.html +0 -67
  53. data/spec/dummy/public/500.html +0 -66
  54. data/spec/dummy/public/favicon.ico +0 -0
  55. data/spec/fixtures/stripe_webhooks/invoice.payment_succeeded.without_renewals.json +0 -76
  56. data/spec/helpers/effective_orders_helper_spec.rb +0 -21
  57. data/spec/models/acts_as_purchasable_spec.rb +0 -75
  58. data/spec/models/customer_spec.rb +0 -72
  59. data/spec/models/factories_spec.rb +0 -35
  60. data/spec/models/order_item_spec.rb +0 -35
  61. data/spec/models/order_spec.rb +0 -445
  62. data/spec/models/stripe_charge_spec.rb +0 -39
  63. data/spec/models/subscription_spec.rb +0 -103
  64. data/spec/spec_helper.rb +0 -46
  65. data/spec/support/factories.rb +0 -139
@@ -1,35 +0,0 @@
1
- require 'spec_helper'
2
-
3
- # Attributes
4
- describe 'Factories' do
5
- let(:factories) { [:user, :customer, :subscription, :address, :product, :cart, :order_item, :order, :purchased_order, :declined_order, :cart_with_subscription, :order_with_subscription] }
6
-
7
- before { StripeMock.start }
8
- after { StripeMock.stop }
9
-
10
- it 'should have all valid factories' do
11
- factories.each do |factory|
12
- obj = FactoryGirl.create(factory)
13
-
14
- puts "Invalid factory #{factory}: #{obj.errors.inspect}" unless obj.valid?
15
-
16
- obj.valid?.should eq true
17
- end
18
- end
19
-
20
- it 'should have created an Order with a billing_address and shipping_address' do
21
- order = FactoryGirl.create(:order)
22
-
23
- order.billing_address.present?.should eq true
24
- order.shipping_address.present?.should eq true
25
-
26
- order.billing_address.valid?.should eq true
27
- order.shipping_address.valid?.should eq true
28
-
29
- order.billing_address.full_name.present?.should eq true
30
- order.shipping_address.full_name.present?.should eq true
31
-
32
- order.save.should eq true
33
- end
34
-
35
- end
@@ -1,35 +0,0 @@
1
- require 'spec_helper'
2
-
3
- # # Attributes
4
- describe Effective::OrderItem do
5
- let(:order) { FactoryGirl.create(:order) }
6
- let(:order_item) { FactoryGirl.create(:order_item) }
7
-
8
- describe 'validations' do
9
- it 'is invalid without required fields' do
10
- order_item = Effective::OrderItem.new()
11
- order_item.valid?.should eq false
12
-
13
- order_item.errors[:title].present?.should eq true
14
- order_item.errors[:quantity].present?.should eq true
15
- order_item.errors[:tax_exempt].present?.should eq true
16
- order_item.errors[:purchasable].present?.should eq true
17
- end
18
- end
19
-
20
- describe 'scopes' do
21
- it 'is included in the Sold scope when order is purchased' do
22
- order.purchase!
23
- (order.order_items.size > 0).should eq true
24
-
25
- sold_items = Effective::OrderItem.sold.to_a
26
- sold_items.size.should eq order.order_items.size
27
-
28
- order.order_items.each { |oi| sold_items.include?(oi).should eq true }
29
- end
30
-
31
- end
32
-
33
-
34
-
35
- end
@@ -1,445 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Effective::Order, type: :model do
4
- let(:cart) { FactoryGirl.create(:cart) }
5
- let(:order) { FactoryGirl.create(:order) }
6
- let(:user) { FactoryGirl.create(:user) }
7
- let(:product) { FactoryGirl.create(:product) }
8
- let(:product2) { FactoryGirl.create(:product) }
9
-
10
- it 'calculates dollars based on its order items' do
11
- order.subtotal.should eq order.order_items.collect(&:subtotal).sum
12
- order.total.should eq (order.order_items.collect(&:subtotal).sum + order.tax.to_i)
13
- order.num_items.should eq order.order_items.collect(&:quantity).sum
14
- end
15
-
16
- describe '#initialize' do
17
- it 'creates appropriate OrderItems when initialized with a Cart' do
18
- order = Effective::Order.new(cart)
19
-
20
- order.order_items.each_with_index do |order_item, x|
21
- order_item.title.should eq cart.cart_items[x].title
22
- order_item.price.should eq cart.cart_items[x].price
23
- order_item.quantity.should eq cart.cart_items[x].quantity
24
- order_item.purchasable.should eq cart.cart_items[x].purchasable
25
- end
26
-
27
- order.order_items.length.should eq cart.cart_items.length
28
- order.subtotal.should eq cart.subtotal
29
- end
30
-
31
- it 'creates appropriate OrderItems when initialized with an array of purchasables' do
32
- order = Effective::Order.new([product, product2])
33
- order.order_items.size.should eq 2
34
-
35
- order.subtotal.should eq (product.price + product2.price)
36
- end
37
-
38
- it 'creates appropriate OrderItems when initialized with a single purchasable' do
39
- order = Effective::Order.new(product)
40
- order.order_items.size.should eq 1
41
-
42
- order_item = order.order_items.first
43
-
44
- order_item.title.should eq product.title
45
- order_item.price.should eq product.price
46
- order_item.purchasable.should eq product
47
- order_item.quantity.should eq 1
48
- end
49
-
50
- it 'throws an Exception when passed something unexpected' do
51
- expect { Effective::Order.new(Object.new()) }.to raise_error(Exception)
52
- end
53
- end
54
-
55
- describe 'minimum zero math' do
56
- it 'has a minimum order total of 0' do
57
- order.subtotal = nil
58
- order.total = nil
59
-
60
- order.order_items.each { |oi| oi.price = -1000; oi.tax_exempt = true; }
61
- order.order_items.collect(&:total).sum.should eq -3000
62
-
63
- order.total.should eq 0
64
- end
65
-
66
- it 'has no minimum subtotal' do
67
- order.subtotal = nil
68
-
69
- order.order_items.each { |oi| oi.price = -1000; oi.tax_exempt = true; }
70
- order.order_items.collect(&:subtotal).sum.should eq -3000
71
-
72
- order.subtotal.should eq -3000
73
- end
74
- end
75
-
76
- describe 'user=' do
77
- it 'assigns the user' do
78
- order = Effective::Order.new()
79
- order.user = user
80
- order.user.should eq user
81
- end
82
-
83
- it 'assigns addresses from the user' do
84
- order = Effective::Order.new()
85
-
86
- user.billing_address = FactoryGirl.create(:address, category: :billing)
87
- user.shipping_address = FactoryGirl.create(:address, category: :shipping)
88
-
89
- order.user = user
90
-
91
- order.billing_address.should eq user.billing_address
92
- order.save_billing_address.should eq true
93
-
94
- order.shipping_address.should eq user.shipping_address
95
- order.save_shipping_address.should eq true
96
- end
97
- end
98
-
99
- describe 'validations' do
100
- it 'should validate inclusion of purchase state' do
101
- expect(subject).to validate_inclusion_of(:purchase_state).in_array([nil, EffectiveOrders::PURCHASED, EffectiveOrders::DECLINED, EffectiveOrders::PENDING])
102
- end
103
-
104
- it 'should be invalid without a user or order_items' do
105
- order = Effective::Order.new()
106
- order.valid?.should eq false
107
-
108
- order.errors[:user_id].present?.should eq true
109
- order.errors[:order_items].present?.should eq true
110
- end
111
-
112
- it 'should be invalid when user is invalid' do
113
- allow(order.user).to receive(:valid?).and_return(false)
114
- order.valid?.should eq false
115
-
116
- order.errors[:user].present?.should eq true
117
- end
118
-
119
- it 'should be invalid when an order_item is invalid' do
120
- allow(order.order_items.first).to receive(:valid?).and_return(false)
121
- order.valid?.should eq false
122
-
123
- order.errors[:order_items].present?.should eq true
124
- end
125
-
126
- it 'should be invalid when less than the minimum charge' do
127
- order.order_items.each { |oi| oi.price = 1 }
128
- order.valid?.should eq false
129
-
130
- order.errors[:total].present?.should eq true
131
- order.errors[:total].first.downcase.include?('minimum order of 50 is required').should eq true
132
- end
133
-
134
- it 'should be valid when >= minimum charge' do
135
- allow(order).to receive(:total).and_return(50)
136
- order.valid?.should eq true
137
-
138
- allow(order).to receive(:total).and_return(51)
139
- order.valid?.should eq true
140
- end
141
-
142
- it 'should be valid for a free order' do
143
- order.order_items.each { |order_item| allow(order_item).to receive(:total).and_return(0) }
144
-
145
- order.valid?.should eq true
146
- order.errors[:total].present?.should eq false
147
- end
148
- end
149
-
150
- describe 'tax and tax rate' do
151
- it 'is invalid with no tax rate' do
152
- order = Effective::Order.new()
153
- order.tax_rate.should eq nil
154
- order.valid?.should eq false
155
- order.errors[:tax_rate].present?.should eq true
156
- end
157
-
158
- it 'is valid with no tax rate when skip_buyer_validations = true' do
159
- order = Effective::Order.new()
160
- order.skip_buyer_validations = true
161
- order.tax_rate.should eq nil
162
- order.errors[:tax_rate].present?.should eq false
163
- end
164
-
165
- it 'sets a tax rate when billing_address is present' do
166
- order = FactoryGirl.create(:order)
167
- order.billing_address.present?.should eq true
168
- order.valid?.should eq true
169
- order.errors[:tax_rate].blank?.should eq true
170
- end
171
-
172
- it 'updates the tax rate on valid? when billing_address changes' do
173
- order = FactoryGirl.create(:order)
174
-
175
- order.billing_address = FactoryGirl.create(:address, state_code: 'AB') # 5.0% tax
176
- order.valid?.should eq true
177
- order.tax_rate.should eq 5.0
178
- order.tax.should eq (order.subtotal * 0.05)
179
- order.total.should eq (order.subtotal + order.tax)
180
- total_one = order.total
181
-
182
- order.billing_address = FactoryGirl.create(:address, state_code: 'ON') # 13.0% tax
183
- order.valid?.should eq true
184
- order.tax_rate.should eq 13.0
185
- order.tax.should eq (order.subtotal * 0.13)
186
- order.total.should eq (order.subtotal + order.tax)
187
- total_two = order.total
188
-
189
- total_one.should_not eq total_two
190
- end
191
-
192
- end
193
-
194
- describe 'create_as_pending' do
195
- it 'sets the pending state' do
196
- order = FactoryGirl.build(:order)
197
- order.order_items << FactoryGirl.build(:order_item, order: order)
198
-
199
- order.create_as_pending.should eq true
200
- order.pending?.should eq true
201
- end
202
-
203
- it 'disregards invalid addresses' do
204
- order = FactoryGirl.build(:order)
205
- order.order_items << FactoryGirl.build(:order_item, order: order)
206
-
207
- order.billing_address = Effective::Address.new(address1: 'invalid')
208
- order.shipping_address = Effective::Address.new(address1: 'invalid')
209
-
210
- success = order.create_as_pending
211
-
212
- success.should eq true
213
- end
214
-
215
- it 'sends a request for payment when send_payment_request_to_buyer is true' do
216
- Effective::OrdersMailer.deliveries.clear
217
-
218
- order = FactoryGirl.build(:order)
219
- order.order_items << FactoryGirl.build(:order_item, order: order)
220
-
221
- order.send_payment_request_to_buyer = true
222
-
223
- order.create_as_pending.should eq true
224
- order.send_payment_request_to_buyer?.should eq true
225
-
226
- Effective::OrdersMailer.deliveries.length.should eq 1
227
- end
228
-
229
- it 'does not send a request for payment when send_payment_request_to_buyer is false' do
230
- Effective::OrdersMailer.deliveries.clear
231
-
232
- order = FactoryGirl.build(:order)
233
- order.order_items << FactoryGirl.build(:order_item, order: order)
234
-
235
- order.create_as_pending.should eq true
236
-
237
- Effective::OrdersMailer.deliveries.length.should eq 0
238
- end
239
-
240
- end
241
-
242
- describe 'save as pending' do
243
- let(:order) { FactoryGirl.build(:order, billing_address: FactoryGirl.build(:address), shipping_address: FactoryGirl.build(:address)) }
244
-
245
- it 'sets the pending state' do
246
- order.order_items << FactoryGirl.build(:order_item, order: order)
247
-
248
- order.purchase_state = EffectiveOrders::PENDING
249
-
250
- order.save.should eq true
251
- order.pending?.should eq true
252
- end
253
-
254
- it 'does not accept invalid addresses' do
255
- order.order_items << FactoryGirl.build(:order_item, order: order)
256
-
257
- order.billing_address = Effective::Address.new(address1: 'invalid')
258
- order.shipping_address = Effective::Address.new(address1: 'invalid')
259
-
260
- order.purchase_state = EffectiveOrders::PENDING
261
-
262
- order.save.should eq false
263
- end
264
- end
265
-
266
- describe 'purchase!' do
267
- it 'assigns the purchase_state, purchase_at and payment' do
268
- order.purchase!(details: 'by a test').should eq true
269
-
270
- order.purchase_state.should eq EffectiveOrders::PURCHASED
271
- order.purchased_at.kind_of?(Time).should eq true
272
- order.payment[:details].should eq 'by a test'
273
- end
274
-
275
- it 'sends purchased callback to all order_items' do
276
- order.order_items.each { |oi| oi.purchasable.should_receive(:purchased!).with(order, oi) }
277
- order.purchase!(details: 'by a test')
278
- end
279
-
280
- it 'returns true when purchased twice' do
281
- order.purchase!(details: 'first time by a test')
282
- order.purchase!(details: 'second time by a test').should eq false
283
- end
284
-
285
- it 'sends emails to the admin, buyer and seller' do
286
- Effective::OrdersMailer.deliveries.clear
287
-
288
- order.purchase!(details: 'by a test')
289
-
290
- Effective::OrdersMailer.deliveries.length.should eq 2
291
-
292
- Effective::OrdersMailer.deliveries[0].to.first.should eq 'admin@example.com'
293
- Effective::OrdersMailer.deliveries[0].subject.include?("Order Receipt: ##{order.to_param}").should eq true
294
-
295
- Effective::OrdersMailer.deliveries[1].to.first.should eq order.user.email
296
- Effective::OrdersMailer.deliveries[1].subject.include?("Order Receipt: ##{order.to_param}").should eq true
297
- end
298
-
299
- it 'does not send email if passed email: false' do
300
- Effective::OrdersMailer.deliveries.clear
301
-
302
- order.purchase!(details: 'by a test', email: false)
303
-
304
- Effective::OrdersMailer.deliveries.length.should eq 0
305
- end
306
-
307
- it 'is included with the purchased scope' do
308
- order.purchase!(details: 'by a test')
309
- Effective::Order.purchased.to_a.include?(order).should eq true
310
- Effective::Order.purchased_by(order.user).to_a.include?(order).should eq true
311
- end
312
-
313
- it 'is not included with the declined scope' do
314
- order.purchase!(details: 'by a test')
315
- Effective::Order.declined.to_a.include?(order).should eq false
316
- end
317
-
318
- it 'should return false when the Order is invalid' do
319
- allow(order).to receive(:valid?).and_return(false)
320
- expect { order.purchase!(details: 'by a test') }.to raise_exception(Exception)
321
- end
322
-
323
- it 'should return true when the Order is invalid and validate: false is passed' do
324
- allow(order).to receive(:valid?).and_return(false)
325
- order.purchase!(details: 'by a test', validate: false).should eq true
326
- end
327
-
328
- end
329
-
330
- describe 'purchased?' do
331
- it 'returns true when a purchased order' do
332
- order.purchase!(details: 'by a test')
333
- order.purchased?.should eq true
334
- end
335
-
336
- it 'returns false when not purchased' do
337
- order.purchased?.should eq false
338
- end
339
-
340
- it 'returns false when declined' do
341
- order.decline!(details: 'by a test')
342
- order.purchased?.should eq false
343
- end
344
- end
345
-
346
- describe 'decline!' do
347
- it 'assigns the purchase_state' do
348
- order.decline!(details: 'by a test').should eq true
349
-
350
- order.purchase_state.should eq EffectiveOrders::DECLINED
351
- order.payment[:details].should eq 'by a test'
352
- order.purchased_at.should eq nil
353
- end
354
-
355
- it 'sends declined callback to all order_items' do
356
- order.order_items.each { |oi| oi.purchasable.should_receive(:declined!).with(order, oi) }
357
- order.decline!(details: 'by a test')
358
- end
359
-
360
- it 'returns false when declined twice' do
361
- order.decline!(details: 'first time')
362
- order.decline!(details: 'second time').should eq false
363
- end
364
-
365
- it 'returns false when declined twice' do
366
- order.decline!(details: 'first time')
367
- order.decline!(details: 'second time').should eq false
368
- end
369
-
370
- it 'is included with the declined scope' do
371
- order.decline!(details: 'by a test')
372
- Effective::Order.declined.to_a.include?(order).should eq true
373
- end
374
-
375
- it 'is not included with the purchased scope' do
376
- order.decline!(details: 'by a test')
377
- Effective::Order.purchased.to_a.include?(order).should eq false
378
- Effective::Order.purchased_by(order.user).to_a.include?(order).should eq false
379
- end
380
- end
381
-
382
- describe 'declined?' do
383
- it 'returns true when a declined order' do
384
- order.decline!(details: 'by a test')
385
- order.declined?.should eq true
386
- end
387
-
388
- it 'returns false when not declined' do
389
- order.declined?.should eq false
390
- end
391
-
392
- it 'returns false when purchased' do
393
- order.purchase!(details: 'by a test')
394
- order.declined?.should eq false
395
- end
396
- end
397
-
398
- describe '#save_billing_address?' do
399
- it 'is true when save_billing_address is 1' do
400
- order.save_billing_address = '1'
401
- order.save_billing_address?.should eq true
402
- end
403
-
404
- it 'is false when save_billing_address is 0' do
405
- order.save_billing_address = '0'
406
- order.save_billing_address?.should eq false
407
- end
408
-
409
- it 'is false when save_billing_address is nil' do
410
- order.save_billing_address = nil
411
- order.save_billing_address?.should eq false
412
- end
413
- end
414
-
415
- describe '#save_shipping_address?' do
416
- it 'is true when save_shipping_address is 1' do
417
- order.save_shipping_address = '1'
418
- order.save_shipping_address?.should eq true
419
- end
420
-
421
- it 'is false when save_shipping_address is 0' do
422
- order.save_shipping_address = '0'
423
- order.save_shipping_address?.should eq false
424
- end
425
-
426
- it 'is false when save_shipping_address is nil' do
427
- order.save_shipping_address = nil
428
- order.save_shipping_address?.should eq false
429
- end
430
- end
431
-
432
- describe '#to_param' do
433
- it 'returns an obfuscated ID' do
434
- (order.to_param.length >= 10).should eq true
435
- end
436
- end
437
-
438
- describe '#pending?' do
439
- it 'should return true for pending orders only' do
440
- expect(FactoryGirl.create(:purchased_order).pending?).to be_falsey
441
- expect(FactoryGirl.create(:declined_order).pending?).to be_falsey
442
- expect(FactoryGirl.create(:pending_order).pending?).to be_truthy
443
- end
444
- end
445
- end