solidus_core 2.7.4 → 2.8.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of solidus_core might be problematic. Click here for more details.

Files changed (136) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +19 -17
  3. data/app/assets/images/logo/solidus.svg +18 -0
  4. data/app/assets/javascripts/spree.js.erb +2 -2
  5. data/app/helpers/spree/base_helper.rb +1 -7
  6. data/app/helpers/spree/taxons_helper.rb +2 -2
  7. data/app/mailers/spree/carton_mailer.rb +4 -4
  8. data/app/models/spree/calculator/flat_percent_item_total.rb +4 -1
  9. data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +5 -3
  10. data/app/models/spree/calculator/tiered_percent.rb +2 -1
  11. data/app/models/spree/country.rb +8 -0
  12. data/app/models/spree/fulfilment_changer.rb +9 -1
  13. data/app/models/spree/gallery/product_gallery.rb +18 -0
  14. data/app/models/spree/gallery/variant_gallery.rb +21 -0
  15. data/app/models/spree/image.rb +11 -1
  16. data/app/models/spree/inventory_unit.rb +8 -0
  17. data/app/models/spree/line_item.rb +1 -1
  18. data/app/models/spree/order.rb +0 -4
  19. data/app/models/spree/order_cancellations.rb +31 -10
  20. data/app/models/spree/order_contents.rb +1 -5
  21. data/app/models/spree/order_inventory.rb +5 -4
  22. data/app/models/spree/product.rb +9 -0
  23. data/app/models/spree/product/scopes.rb +3 -4
  24. data/app/models/spree/promotion.rb +1 -6
  25. data/app/models/spree/promotion_handler/coupon.rb +15 -0
  26. data/app/models/spree/reimbursement.rb +21 -6
  27. data/app/models/spree/reimbursement_performer.rb +12 -6
  28. data/app/models/spree/reimbursement_type.rb +1 -1
  29. data/app/models/spree/reimbursement_type/credit.rb +5 -2
  30. data/app/models/spree/reimbursement_type/exchange.rb +1 -1
  31. data/app/models/spree/reimbursement_type/original_payment.rb +1 -1
  32. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +6 -6
  33. data/app/models/spree/reimbursement_type/store_credit.rb +18 -3
  34. data/app/models/spree/shipment.rb +11 -11
  35. data/app/models/spree/stock/allocator/base.rb +19 -0
  36. data/app/models/spree/stock/allocator/on_hand_first.rb +42 -0
  37. data/app/models/spree/stock/content_item.rb +1 -1
  38. data/app/models/spree/stock/inventory_units_finalizer.rb +47 -0
  39. data/app/models/spree/stock/location_sorter/base.rb +38 -0
  40. data/app/models/spree/stock/location_sorter/default_first.rb +15 -0
  41. data/app/models/spree/stock/location_sorter/unsorted.rb +14 -0
  42. data/app/models/spree/stock/simple_coordinator.rb +24 -10
  43. data/app/models/spree/stock_location.rb +2 -0
  44. data/app/models/spree/store_credit.rb +4 -12
  45. data/app/models/spree/store_credit_event.rb +2 -2
  46. data/app/models/spree/store_credit_reason.rb +11 -0
  47. data/app/models/spree/taxon.rb +8 -3
  48. data/app/models/spree/unit_cancel.rb +3 -0
  49. data/app/models/spree/variant.rb +18 -7
  50. data/config/initializers/money.rb +5 -0
  51. data/config/locales/en.yml +661 -527
  52. data/db/default/spree/store_credit.rb +1 -1
  53. data/db/default/spree/zones.rb +2 -2
  54. data/db/migrate/20180710170104_create_spree_store_credit_reasons_table.rb +42 -0
  55. data/db/migrate/20190106184413_remove_code_from_spree_promotions.rb +41 -0
  56. data/lib/generators/spree/dummy/templates/rails/test.rb +0 -3
  57. data/lib/generators/spree/install/install_generator.rb +2 -2
  58. data/lib/generators/spree/install/templates/config/initializers/spree.rb.tt +2 -2
  59. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/backend/all.js +1 -1
  60. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/frontend/all.js +1 -1
  61. data/lib/solidus/migrations/promotions_with_code_handlers.rb +66 -0
  62. data/lib/spree/app_configuration.rb +20 -4
  63. data/lib/spree/core/controller_helpers/common.rb +1 -1
  64. data/lib/spree/core/stock_configuration.rb +12 -0
  65. data/lib/spree/core/version.rb +1 -1
  66. data/lib/spree/i18n.rb +4 -0
  67. data/lib/spree/money.rb +13 -11
  68. data/lib/spree/permission_sets.rb +0 -1
  69. data/lib/spree/permission_sets/promotion_management.rb +1 -0
  70. data/lib/spree/testing_support/dummy_app.rb +13 -2
  71. data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/backend/all.js +1 -1
  72. data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/frontend/all.js +1 -1
  73. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +5 -5
  74. data/lib/spree/testing_support/factories/{store_credit_update_reason_factory.rb → store_credit_reason_factory.rb} +1 -1
  75. data/lib/spree/testing_support/partial_double_verification.rb +13 -0
  76. data/lib/spree/testing_support/shared_examples/gallery.rb +18 -0
  77. data/spec/helpers/products_helper_spec.rb +10 -8
  78. data/spec/helpers/taxons_helper_spec.rb +3 -1
  79. data/spec/lib/i18n_spec.rb +5 -0
  80. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +6 -2
  81. data/spec/lib/spree/core/stock_configuration_spec.rb +19 -0
  82. data/spec/lib/spree/core/testing_support/factories/store_credit_reason_factory_spec.rb +14 -0
  83. data/spec/lib/spree/money_spec.rb +12 -13
  84. data/spec/migrate/20190106184413_remove_code_from_spree_promotions_spec.rb +136 -0
  85. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +10 -1
  86. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +18 -6
  87. data/spec/models/spree/calculator/tiered_percent_spec.rb +7 -1
  88. data/spec/models/spree/country_spec.rb +76 -0
  89. data/spec/models/spree/customer_return_spec.rb +2 -1
  90. data/spec/models/spree/fulfilment_changer_spec.rb +33 -0
  91. data/spec/models/spree/gallery/product_gallery_spec.rb +21 -0
  92. data/spec/models/spree/gallery/variant_gallery_spec.rb +21 -0
  93. data/spec/models/spree/inventory_unit_spec.rb +1 -4
  94. data/spec/models/spree/order/checkout_spec.rb +6 -6
  95. data/spec/models/spree/order/finalizing_spec.rb +1 -20
  96. data/spec/models/spree/order/outstanding_balance_integration_spec.rb +2 -1
  97. data/spec/models/spree/order/updating_spec.rb +1 -1
  98. data/spec/models/spree/order_cancellations_spec.rb +55 -14
  99. data/spec/models/spree/order_inventory_spec.rb +12 -5
  100. data/spec/models/spree/order_merger_spec.rb +6 -3
  101. data/spec/models/spree/order_spec.rb +3 -7
  102. data/spec/models/spree/order_updater_spec.rb +3 -8
  103. data/spec/models/spree/payment/cancellation_spec.rb +4 -3
  104. data/spec/models/spree/payment_spec.rb +1 -17
  105. data/spec/models/spree/permission_sets/promotion_management_spec.rb +2 -0
  106. data/spec/models/spree/product_spec.rb +10 -1
  107. data/spec/models/spree/promotion_handler/coupon_spec.rb +62 -8
  108. data/spec/models/spree/promotion_spec.rb +24 -10
  109. data/spec/models/spree/refund_spec.rb +2 -1
  110. data/spec/models/spree/reimbursement_performer_spec.rb +5 -4
  111. data/spec/models/spree/reimbursement_spec.rb +26 -2
  112. data/spec/models/spree/reimbursement_type/credit_spec.rb +2 -1
  113. data/spec/models/spree/reimbursement_type/exchange_spec.rb +2 -1
  114. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +2 -1
  115. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +14 -2
  116. data/spec/models/spree/return_item_spec.rb +1 -1
  117. data/spec/models/spree/shipment_spec.rb +20 -13
  118. data/spec/models/spree/shipping_calculator_spec.rb +13 -3
  119. data/spec/models/spree/stock/allocator/on_hand_first_spec.rb +146 -0
  120. data/spec/models/spree/stock/content_item_spec.rb +70 -0
  121. data/spec/models/spree/stock/estimator_spec.rb +5 -2
  122. data/spec/models/spree/stock/inventory_units_finalizer_spec.rb +34 -0
  123. data/spec/models/spree/stock/location_sorter/default_first_spec.rb +20 -0
  124. data/spec/models/spree/stock/location_sorter/unsorted_spec.rb +19 -0
  125. data/spec/models/spree/stock/simple_coordinator_spec.rb +17 -0
  126. data/spec/models/spree/store_credit_event_spec.rb +12 -12
  127. data/spec/models/spree/store_credit_spec.rb +2 -2
  128. data/spec/models/spree/unit_cancel_spec.rb +20 -1
  129. data/spec/models/spree/variant_spec.rb +46 -24
  130. data/spec/spec_helper.rb +1 -0
  131. metadata +30 -9
  132. data/.yardopts +0 -1
  133. data/app/models/spree/store_credit_update_reason.rb +0 -4
  134. data/lib/spree/permission_sets/report_display.rb +0 -11
  135. data/spec/lib/spree/core/testing_support/factories/store_credit_update_reason_factory_spec.rb +0 -14
  136. data/spec/models/spree/permission_sets/report_display_spec.rb +0 -25
@@ -35,12 +35,19 @@ RSpec.describe Spree::OrderInventory, type: :model do
35
35
  end
36
36
 
37
37
  context "order is not completed" do
38
- before { order.update_columns completed_at: nil }
38
+ let(:inventory_unit_finalizer) { double(:inventory_unit_finalizer, run!: [true]) }
39
39
 
40
- it "doesn't unstock items" do
41
- expect {
42
- subject.verify(shipment)
43
- }.not_to change { stock_item.reload.count_on_hand }
40
+ before do
41
+ allow(Spree::Stock::InventoryUnitsFinalizer)
42
+ .to receive(:new).and_return(inventory_unit_finalizer)
43
+
44
+ order.update_columns completed_at: nil
45
+ end
46
+
47
+ it "doesn't finalize the items" do
48
+ expect(inventory_unit_finalizer).to_not receive(:run!)
49
+
50
+ subject.verify(shipment)
44
51
  end
45
52
  end
46
53
 
@@ -68,7 +68,6 @@ module Spree
68
68
  context "merging using extension-specific line_item_comparison_hooks" do
69
69
  before do
70
70
  Spree::Order.register_line_item_comparison_hook(:foos_match)
71
- allow(Spree::Variant).to receive(:price_modifier_amount).and_return(0.00)
72
71
  end
73
72
 
74
73
  after do
@@ -83,7 +82,9 @@ module Spree
83
82
  end
84
83
 
85
84
  specify do
86
- expect(order_1).to receive(:foos_match).with(@line_item_1, kind_of(Hash)).and_return(true)
85
+ without_partial_double_verification do
86
+ expect(order_1).to receive(:foos_match).with(@line_item_1, kind_of(Hash)).and_return(true)
87
+ end
87
88
  subject.merge!(order_2)
88
89
  expect(order_1.line_items.count).to eq(1)
89
90
 
@@ -95,7 +96,9 @@ module Spree
95
96
 
96
97
  context "2 different line items" do
97
98
  before do
98
- allow(order_1).to receive(:foos_match).and_return(false)
99
+ without_partial_double_verification do
100
+ allow(order_1).to receive(:foos_match).and_return(false)
101
+ end
99
102
 
100
103
  order_1.contents.add(variant, 1, foos: {})
101
104
  order_2.contents.add(variant, 1, foos: { bar: :zoo })
@@ -15,10 +15,6 @@ RSpec.describe Spree::Order, type: :model do
15
15
  end
16
16
  let(:code) { promotion.codes.first }
17
17
 
18
- before do
19
- allow(Spree::LegacyUser).to receive_messages(current: mock_model(Spree::LegacyUser, id: 123))
20
- end
21
-
22
18
  context '#store' do
23
19
  it { is_expected.to respond_to(:store) }
24
20
 
@@ -324,7 +320,7 @@ RSpec.describe Spree::Order, type: :model do
324
320
  end
325
321
  end
326
322
 
327
- context "add_update_hook" do
323
+ context "add_update_hook", partial_double_verification: false do
328
324
  before do
329
325
  Spree::Order.class_eval do
330
326
  register_update_hook :add_awesome_sauce
@@ -712,7 +708,7 @@ RSpec.describe Spree::Order, type: :model do
712
708
  expect(order.find_line_item_by_variant(mock_model(Spree::Variant))).to be_nil
713
709
  end
714
710
 
715
- context "match line item with options" do
711
+ context "match line item with options", partial_double_verification: false do
716
712
  before do
717
713
  Spree::Order.register_line_item_comparison_hook(:foos_match)
718
714
  end
@@ -1072,7 +1068,7 @@ RSpec.describe Spree::Order, type: :model do
1072
1068
 
1073
1069
  context 'an old-style refund exists' do
1074
1070
  let(:order) { create(:order_ready_to_ship) }
1075
- let(:payment) { order.payments.first.tap { |p| allow(p).to receive_messages(profiles_supported: false) } }
1071
+ let(:payment) { order.payments.first.tap { |p| allow(p).to receive_messages(profiles_supported?: false) } }
1076
1072
  let!(:refund_payment) {
1077
1073
  build(:payment, amount: -1, order: order, state: 'completed', source: payment).tap do |p|
1078
1074
  allow(p).to receive_messages(profiles_supported?: false)
@@ -513,15 +513,10 @@ module Spree
513
513
 
514
514
  it "doesnt update each shipment" do
515
515
  shipment = stub_model(Spree::Shipment)
516
- shipments = [shipment]
517
- allow(order).to receive_messages shipments: shipments
518
- allow(shipments).to receive_messages states: []
519
- allow(shipments).to receive_messages ready: []
520
- allow(shipments).to receive_messages pending: []
521
- allow(shipments).to receive_messages shipped: []
522
-
516
+ order.shipments = [shipment]
517
+ allow(order.shipments).to receive_messages(states: [], ready: [], pending: [], shipped: [])
523
518
  allow(updater).to receive(:update_totals) # Otherwise this gets called and causes a scene
524
- expect(updater).not_to receive(:update_shipments).with(order)
519
+ expect(updater).not_to receive(:update_shipments)
525
520
  updater.update
526
521
  end
527
522
  end
@@ -63,14 +63,15 @@ RSpec.describe Spree::Payment::Cancellation do
63
63
  end
64
64
  end
65
65
 
66
- context 'if the payment_method does not respond to `try_void`' do
66
+ context 'if the payment_method does not respond to `try_void`', partial_double_verification: false do
67
67
  before do
68
68
  allow(payment_method).to receive(:respond_to?) { false }
69
- expect(payment_method).to receive(:cancel) { double }
70
- expect(payment).to receive(:handle_void_response)
69
+ allow(payment_method).to receive(:cancel) { double }
70
+ allow(payment).to receive(:handle_void_response)
71
71
  end
72
72
 
73
73
  it 'calls cancel instead' do
74
+ expect(payment_method).to receive(:cancel)
74
75
  Spree::Deprecation.silence { subject }
75
76
  end
76
77
 
@@ -9,7 +9,7 @@ RSpec.describe Spree::Payment, type: :model do
9
9
 
10
10
  let(:gateway) do
11
11
  gateway = Spree::PaymentMethod::BogusCreditCard.new(active: true, name: 'Bogus gateway')
12
- allow(gateway).to receive_messages source_required: true
12
+ allow(gateway).to receive_messages(source_required?: true)
13
13
  gateway
14
14
  end
15
15
 
@@ -207,22 +207,6 @@ RSpec.describe Spree::Payment, type: :model do
207
207
  expect { payment.process! }.to raise_error(Spree::Core::GatewayError)
208
208
  expect(payment.state).to eq('invalid')
209
209
  end
210
-
211
- # Regression test for https://github.com/spree/spree/issues/4598
212
- it "should allow payments with a gateway_customer_profile_id" do
213
- payment.source.update!(gateway_customer_profile_id: "customer_1", brand: 'visa')
214
- expect(payment.payment_method.gateway_class).to receive(:supports?).with('visa').and_return(false)
215
- expect(payment).to receive(:started_processing!)
216
- payment.process!
217
- end
218
-
219
- # Another regression test for https://github.com/spree/spree/issues/4598
220
- it "should allow payments with a gateway_payment_profile_id" do
221
- payment.source.update!(gateway_payment_profile_id: "customer_1", brand: 'visa')
222
- expect(payment.payment_method.gateway_class).to receive(:supports?).with('visa').and_return(false)
223
- expect(payment).to receive(:started_processing!)
224
- payment.process!
225
- end
226
210
  end
227
211
 
228
212
  describe "#authorize!" do
@@ -16,6 +16,7 @@ RSpec.describe Spree::PermissionSets::PromotionManagement do
16
16
  it { is_expected.to be_able_to(:manage, Spree::PromotionRule) }
17
17
  it { is_expected.to be_able_to(:manage, Spree::PromotionAction) }
18
18
  it { is_expected.to be_able_to(:manage, Spree::PromotionCategory) }
19
+ it { is_expected.to be_able_to(:manage, Spree::PromotionCode) }
19
20
  end
20
21
 
21
22
  context "when not activated" do
@@ -23,5 +24,6 @@ RSpec.describe Spree::PermissionSets::PromotionManagement do
23
24
  it { is_expected.not_to be_able_to(:manage, Spree::PromotionRule) }
24
25
  it { is_expected.not_to be_able_to(:manage, Spree::PromotionAction) }
25
26
  it { is_expected.not_to be_able_to(:manage, Spree::PromotionCategory) }
27
+ it { is_expected.not_to be_able_to(:manage, Spree::PromotionCode) }
26
28
  end
27
29
  end
@@ -27,7 +27,7 @@ RSpec.describe Spree::Product, type: :model do
27
27
  expect(clone.images.size).to eq(product.images.size)
28
28
  end
29
29
 
30
- it 'calls #duplicate_extra' do
30
+ it 'calls #duplicate_extra', partial_double_verification: false do
31
31
  expect_any_instance_of(Spree::Product).to receive(:duplicate_extra) do |product, old_product|
32
32
  product.name = old_product.name.reverse
33
33
  end
@@ -572,4 +572,13 @@ RSpec.describe Spree::Product, type: :model do
572
572
  end
573
573
  end
574
574
  end
575
+
576
+ describe '#gallery' do
577
+ let(:product) { Spree::Product.new }
578
+ subject { product.gallery }
579
+
580
+ it 'responds to #images' do
581
+ expect(subject).to respond_to(:images)
582
+ end
583
+ end
575
584
  end
@@ -42,18 +42,34 @@ module Spree
42
42
  end
43
43
 
44
44
  describe "#set_error_code" do
45
- let(:status) { :coupon_code_not_found }
46
-
47
45
  subject { coupon.set_error_code status }
48
46
 
49
- it 'should have status_code' do
50
- subject
51
- expect(coupon.status_code).to eq(status)
47
+ context 'not found' do
48
+ let(:status) { :coupon_code_not_found }
49
+
50
+ it 'has status_code' do
51
+ subject
52
+ expect(coupon.status_code).to eq(status)
53
+ end
54
+
55
+ it 'has error message' do
56
+ subject
57
+ expect(coupon.error).to eq(I18n.t(status, scope: 'spree'))
58
+ end
52
59
  end
53
60
 
54
- it 'should have error message' do
55
- subject
56
- expect(coupon.error).to eq(I18n.t(status, scope: 'spree'))
61
+ context 'not present' do
62
+ let(:status) { :coupon_code_not_present }
63
+
64
+ it 'has status_code' do
65
+ subject
66
+ expect(coupon.status_code).to eq(status)
67
+ end
68
+
69
+ it 'has error message' do
70
+ subject
71
+ expect(coupon.error).to eq(I18n.t(status, scope: 'spree'))
72
+ end
57
73
  end
58
74
  end
59
75
  end
@@ -360,6 +376,44 @@ module Spree
360
376
  end
361
377
  end
362
378
  end
379
+
380
+ context 'removing a coupon code from an order' do
381
+ let!(:promotion) { promotion_code.promotion }
382
+ let(:promotion_code) { create(:promotion_code, value: '10off') }
383
+ let!(:action) { Promotion::Actions::CreateItemAdjustments.create(promotion: promotion, calculator: calculator) }
384
+ let(:calculator) { Calculator::FlatRate.new(preferred_amount: 10) }
385
+ let(:order) { create(:order_with_line_items, line_items_count: 3) }
386
+
387
+ context 'with an already applied coupon' do
388
+ before do
389
+ order.coupon_code = '10off'
390
+ subject.apply
391
+ order.reload
392
+ expect(order.total).to eq(100)
393
+ end
394
+
395
+ it 'successfully removes the coupon code from the order' do
396
+ subject.remove
397
+ expect(subject.error).to eq nil
398
+ expect(subject.success).to eq I18n.t('spree.coupon_code_removed')
399
+ expect(order.reload.total).to eq(130)
400
+ end
401
+ end
402
+
403
+ context 'with a coupon code not applied to an order' do
404
+ before do
405
+ order.coupon_code = '10off'
406
+ expect(order.total).to eq(130)
407
+ end
408
+
409
+ it 'returns an error' do
410
+ subject.remove
411
+ expect(subject.success).to eq nil
412
+ expect(subject.error).to eq I18n.t('spree.coupon_code_not_present')
413
+ expect(order.reload.total).to eq(130)
414
+ end
415
+ end
416
+ end
363
417
  end
364
418
  end
365
419
  end
@@ -49,6 +49,19 @@ RSpec.describe Spree::Promotion, type: :model do
49
49
  end
50
50
  end
51
51
 
52
+ describe ".coupons" do
53
+ let(:promotion_code) { create(:promotion_code) }
54
+ let!(:promotion_with_code) { promotion_code.promotion }
55
+ let!(:another_promotion_code) { create(:promotion_code, promotion: promotion_with_code) }
56
+ let!(:promotion_without_code) { create(:promotion) }
57
+
58
+ subject { described_class.coupons }
59
+
60
+ it "returns only distinct promotions with a code associated" do
61
+ expect(subject).to eq [promotion_with_code]
62
+ end
63
+ end
64
+
52
65
  describe "#apply_automatically" do
53
66
  subject { build(:promotion) }
54
67
 
@@ -632,15 +645,16 @@ RSpec.describe Spree::Promotion, type: :model do
632
645
  end
633
646
 
634
647
  context "with 'any' match policy" do
635
- let(:promotion) { Spree::Promotion.create(name: "Promo", match_policy: 'any') }
636
648
  let(:promotable) { double('Promotable') }
637
649
 
650
+ before do
651
+ promotion.match_policy = 'any'
652
+ end
653
+
638
654
  it "should have eligible rules if any of the rules are eligible" do
639
- allow_any_instance_of(Spree::PromotionRule).to receive_messages(applicable?: true)
640
- true_rule = Spree::PromotionRule.create(promotion: promotion)
641
- allow(true_rule).to receive_messages(eligible?: true)
642
- allow(promotion).to receive_messages(rules: [true_rule])
643
- allow(promotion).to receive_message_chain(:rules, :for).and_return([true_rule])
655
+ true_rule = mock_model(Spree::PromotionRule, eligible?: true, applicable?: true)
656
+ promotion.promotion_rules = [true_rule]
657
+ allow(promotion.rules).to receive(:for) { promotion.rules }
644
658
  expect(promotion.eligible_rules(promotable)).to eq [true_rule]
645
659
  end
646
660
 
@@ -668,13 +682,13 @@ RSpec.describe Spree::Promotion, type: :model do
668
682
  describe '#line_item_actionable?' do
669
683
  let(:order) { double Spree::Order }
670
684
  let(:line_item) { double Spree::LineItem }
671
- let(:true_rule) { double Spree::PromotionRule, eligible?: true, applicable?: true, actionable?: true }
672
- let(:false_rule) { double Spree::PromotionRule, eligible?: true, applicable?: true, actionable?: false }
685
+ let(:true_rule) { mock_model Spree::PromotionRule, eligible?: true, applicable?: true, actionable?: true }
686
+ let(:false_rule) { mock_model Spree::PromotionRule, eligible?: true, applicable?: true, actionable?: false }
673
687
  let(:rules) { [] }
674
688
 
675
689
  before do
676
- allow(promotion).to receive(:rules) { rules }
677
- allow(rules).to receive(:for) { rules }
690
+ promotion.promotion_rules = rules
691
+ allow(promotion.rules).to receive(:for) { rules }
678
692
  end
679
693
 
680
694
  subject { promotion.line_item_actionable? order, line_item }
@@ -176,11 +176,12 @@ RSpec.describe Spree::Refund, type: :model do
176
176
  let(:customer_return) { reimbursement.customer_return }
177
177
  let(:reimbursement) { create(:reimbursement) }
178
178
  let!(:default_refund_reason) { Spree::RefundReason.find_or_create_by!(name: Spree::RefundReason::RETURN_PROCESSING_REASON, mutable: false) }
179
+ let(:created_by_user) { create(:user, email: 'user@email.com') }
179
180
 
180
181
  subject { Spree::Refund.total_amount_reimbursed_for(reimbursement) }
181
182
 
182
183
  context 'with reimbursements performed' do
183
- before { reimbursement.perform! }
184
+ before { reimbursement.perform!(created_by: created_by_user) }
184
185
 
185
186
  it 'returns the total amount' do
186
187
  amount = Spree::Refund.total_amount_reimbursed_for(reimbursement)
@@ -7,25 +7,26 @@ RSpec.describe Spree::ReimbursementPerformer, type: :model do
7
7
  let(:return_item) { reimbursement.return_items.first }
8
8
  let(:reimbursement_type) { double("ReimbursementType") }
9
9
  let(:reimbursement_type_hash) { { reimbursement_type => [return_item] } }
10
+ let(:created_by_user) { create(:user, email: 'user@email.com') }
10
11
 
11
12
  before do
12
13
  expect(Spree::ReimbursementPerformer).to receive(:calculate_reimbursement_types).and_return(reimbursement_type_hash)
13
14
  end
14
15
 
15
16
  describe ".simulate" do
16
- subject { Spree::ReimbursementPerformer.simulate(reimbursement) }
17
+ subject { Spree::ReimbursementPerformer.simulate(reimbursement, created_by: created_by_user) }
17
18
 
18
19
  it "reimburses each calculated reimbursement types with the correct return items as a simulation" do
19
- expect(reimbursement_type).to receive(:reimburse).with(reimbursement, [return_item], true)
20
+ expect(reimbursement_type).to receive(:reimburse).with(reimbursement, [return_item], true, created_by: created_by_user)
20
21
  subject
21
22
  end
22
23
  end
23
24
 
24
25
  describe '.perform' do
25
- subject { Spree::ReimbursementPerformer.perform(reimbursement) }
26
+ subject { Spree::ReimbursementPerformer.perform(reimbursement, created_by: created_by_user) }
26
27
 
27
28
  it "reimburses each calculated reimbursement types with the correct return items as a simulation" do
28
- expect(reimbursement_type).to receive(:reimburse).with(reimbursement, [return_item], false)
29
+ expect(reimbursement_type).to receive(:reimburse).with(reimbursement, [return_item], false, created_by: created_by_user)
29
30
  subject
30
31
  end
31
32
  end
@@ -3,6 +3,28 @@
3
3
  require 'rails_helper'
4
4
 
5
5
  RSpec.describe Spree::Reimbursement, type: :model do
6
+ describe ".create" do
7
+ let(:customer_return) { create(:customer_return) }
8
+ let(:order) { customer_return.order }
9
+ let(:reimbursement) { build(:reimbursement, order: order) }
10
+
11
+ subject { reimbursement.save }
12
+
13
+ context "when total is not present" do
14
+ before do
15
+ allow(reimbursement).to receive(:calculated_total) { 100 }
16
+ end
17
+
18
+ it { expect { subject }.to change(reimbursement, :total).from(nil).to(100.0) }
19
+ end
20
+
21
+ context "when total is present" do
22
+ let(:reimbursement) { build(:reimbursement, order: order, total: 10) }
23
+
24
+ it { expect { subject }.not_to change(reimbursement, :total).from(10) }
25
+ end
26
+ end
27
+
6
28
  describe ".before_create" do
7
29
  describe "#generate_number" do
8
30
  context "number is assigned" do
@@ -66,8 +88,9 @@ RSpec.describe Spree::Reimbursement, type: :model do
66
88
  let!(:default_refund_reason) { Spree::RefundReason.find_or_create_by!(name: Spree::RefundReason::RETURN_PROCESSING_REASON, mutable: false) }
67
89
 
68
90
  let(:reimbursement) { create(:reimbursement, customer_return: customer_return, order: order, return_items: [return_item]) }
91
+ let(:created_by_user) { create(:user, email: 'user@email.com') }
69
92
 
70
- subject { reimbursement.perform! }
93
+ subject { reimbursement.perform!(created_by: created_by_user) }
71
94
 
72
95
  before do
73
96
  order.shipments.each do |shipment|
@@ -230,13 +253,14 @@ RSpec.describe Spree::Reimbursement, type: :model do
230
253
  end
231
254
 
232
255
  describe "#return_all" do
233
- subject { reimbursement.return_all }
256
+ subject { reimbursement.return_all(created_by: created_by_user) }
234
257
 
235
258
  let!(:default_refund_reason) { Spree::RefundReason.find_or_create_by!(name: Spree::RefundReason::RETURN_PROCESSING_REASON, mutable: false) }
236
259
  let(:order) { create(:shipped_order, line_items_count: 1) }
237
260
  let(:inventory_unit) { order.inventory_units.first }
238
261
  let(:return_item) { build(:return_item, inventory_unit: inventory_unit) }
239
262
  let(:reimbursement) { build(:reimbursement, order: order, return_items: [return_item]) }
263
+ let(:created_by_user) { create(:user, email: 'user@email.com') }
240
264
 
241
265
  it "accepts all the return items" do
242
266
  expect { subject }.to change { return_item.acceptance_status }.to "accepted"