solidus_core 2.2.2 → 2.3.0.beta1

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 (175) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -7
  3. data/app/assets/javascripts/spree.js.erb +2 -2
  4. data/app/helpers/spree/base_helper.rb +3 -4
  5. data/app/models/spree/address.rb +1 -1
  6. data/app/models/spree/adjustment.rb +3 -1
  7. data/app/models/spree/app_configuration.rb +43 -0
  8. data/app/models/spree/billing_integration.rb +2 -2
  9. data/app/models/spree/calculator/default_tax.rb +3 -1
  10. data/app/models/spree/calculator/distributed_amount.rb +24 -0
  11. data/app/models/spree/calculator/free_shipping.rb +0 -1
  12. data/app/models/spree/calculator/tiered_flat_rate.rb +17 -3
  13. data/app/models/spree/calculator/tiered_percent.rb +18 -3
  14. data/app/models/spree/distributed_amounts_handler.rb +43 -0
  15. data/app/models/spree/gateway/bogus.rb +7 -83
  16. data/app/models/spree/gateway/bogus_simple.rb +7 -20
  17. data/app/models/spree/gateway.rb +8 -58
  18. data/app/models/spree/image.rb +1 -1
  19. data/app/models/spree/line_item.rb +1 -1
  20. data/app/models/spree/option_value.rb +1 -1
  21. data/app/models/spree/order/checkout.rb +1 -4
  22. data/app/models/spree/order/number_generator.rb +43 -0
  23. data/app/models/spree/order.rb +33 -38
  24. data/app/models/spree/order_contents.rb +1 -1
  25. data/app/models/spree/order_taxation.rb +79 -0
  26. data/app/models/spree/order_update_attributes.rb +0 -2
  27. data/app/models/spree/order_updater.rb +55 -33
  28. data/app/models/spree/payment.rb +0 -1
  29. data/app/models/spree/payment_method/bogus_credit_card.rb +87 -0
  30. data/app/models/spree/payment_method/check.rb +14 -6
  31. data/app/models/spree/payment_method/credit_card.rb +41 -0
  32. data/app/models/spree/payment_method/simple_bogus_credit_card.rb +24 -0
  33. data/app/models/spree/payment_method/store_credit.rb +5 -13
  34. data/app/models/spree/payment_method.rb +126 -40
  35. data/app/models/spree/preferences/preferable.rb +5 -1
  36. data/app/models/spree/preferences/store.rb +2 -2
  37. data/app/models/spree/product/scopes.rb +14 -1
  38. data/app/models/spree/product.rb +10 -4
  39. data/app/models/spree/promotion_action.rb +4 -0
  40. data/app/models/spree/promotion_code/batch_builder.rb +3 -2
  41. data/app/models/spree/promotion_rule.rb +4 -0
  42. data/app/models/spree/role.rb +2 -0
  43. data/app/models/spree/role_user.rb +2 -0
  44. data/app/models/spree/shipment.rb +4 -2
  45. data/app/models/spree/shipping_method.rb +3 -1
  46. data/app/models/spree/shipping_rate.rb +1 -1
  47. data/app/models/spree/state.rb +10 -2
  48. data/app/models/spree/stock_item.rb +3 -3
  49. data/app/models/spree/store.rb +5 -0
  50. data/app/models/spree/store_credit.rb +2 -2
  51. data/app/models/spree/store_credit_event.rb +1 -1
  52. data/app/models/spree/store_selector/by_server_name.rb +30 -0
  53. data/app/models/spree/store_selector/legacy.rb +48 -0
  54. data/app/models/spree/tax/item_tax.rb +20 -0
  55. data/app/models/spree/tax/order_adjuster.rb +2 -14
  56. data/app/models/spree/tax/order_tax.rb +18 -0
  57. data/app/models/spree/tax/shipping_rate_taxer.rb +4 -13
  58. data/app/models/spree/tax/tax_helpers.rb +5 -3
  59. data/app/models/spree/tax_calculator/default.rb +83 -0
  60. data/app/models/spree/tax_calculator/shipping_rate.rb +46 -0
  61. data/app/models/spree/tax_category.rb +9 -1
  62. data/app/models/spree/tax_rate.rb +31 -7
  63. data/app/models/spree/tax_rate_tax_category.rb +6 -0
  64. data/app/models/spree/taxon.rb +1 -1
  65. data/app/models/spree/variant.rb +1 -1
  66. data/app/views/spree/{shipment_mailer → carton_mailer}/shipped_email.html.erb +3 -3
  67. data/app/views/spree/order_mailer/cancel_email.html.erb +3 -3
  68. data/app/views/spree/order_mailer/confirm_email.html.erb +2 -2
  69. data/app/views/spree/order_mailer/inventory_cancellation_email.html.erb +26 -0
  70. data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +2 -2
  71. data/app/views/spree/test_mailer/test_email.html.erb +2 -2
  72. data/config/locales/en.yml +66 -57
  73. data/db/default/spree/refund_reasons.rb +1 -0
  74. data/db/default/spree/shipping_categories.rb +1 -0
  75. data/db/default/spree/stock_locations.rb +2 -0
  76. data/db/default/spree/stores.rb +3 -4
  77. data/db/migrate/20170412103617_transform_tax_rate_category_relation.rb +48 -0
  78. data/db/migrate/20170422134804_add_roles_unique_constraints.rb +6 -0
  79. data/db/migrate/20170522143442_add_time_range_to_tax_rate.rb +6 -0
  80. data/db/migrate/20170608074534_rename_bogus_gateways.rb +13 -0
  81. data/lib/generators/spree/custom_user/custom_user_generator.rb +1 -1
  82. data/lib/generators/spree/dummy/dummy_generator.rb +10 -4
  83. data/lib/generators/spree/dummy/templates/rails/database.yml +12 -12
  84. data/lib/generators/spree/install/install_generator.rb +5 -5
  85. data/lib/generators/spree/install/templates/config/initializers/{spree.rb → solidus.rb} +0 -0
  86. data/lib/solidus/migrations/rename_gateways.rb +39 -0
  87. data/lib/spree/core/controller_helpers/auth.rb +1 -1
  88. data/lib/spree/core/controller_helpers/order.rb +10 -5
  89. data/lib/spree/core/controller_helpers/store.rb +1 -9
  90. data/lib/spree/core/current_store.rb +6 -14
  91. data/lib/spree/core/engine.rb +4 -3
  92. data/lib/spree/core/importer/order.rb +4 -4
  93. data/lib/spree/core/version.rb +1 -1
  94. data/lib/spree/core.rb +0 -1
  95. data/lib/spree/localized_number.rb +2 -1
  96. data/lib/spree/permitted_attributes.rb +12 -6
  97. data/lib/spree/testing_support/capybara_ext.rb +0 -1
  98. data/lib/spree/testing_support/factories/adjustment_factory.rb +5 -1
  99. data/lib/spree/testing_support/factories/order_factory.rb +26 -24
  100. data/lib/spree/testing_support/factories/payment_factory.rb +4 -0
  101. data/lib/spree/testing_support/factories/payment_method_factory.rb +3 -3
  102. data/lib/spree/testing_support/factories/shipment_factory.rb +7 -3
  103. data/lib/spree/testing_support/factories/tax_rate_factory.rb +1 -1
  104. data/lib/spree/testing_support/factories/variant_factory.rb +3 -1
  105. data/lib/tasks/migrations/copy_order_bill_address_to_credit_card.rake +0 -4
  106. data/lib/tasks/migrations/migrate_user_addresses.rake +2 -2
  107. data/lib/tasks/migrations/rename_gateways.rake +19 -0
  108. data/solidus_core.gemspec +2 -3
  109. data/spec/lib/spree/core/controller_helpers/order_spec.rb +32 -6
  110. data/spec/lib/spree/core/controller_helpers/payment_parameters_spec.rb +0 -1
  111. data/spec/lib/spree/core/current_store_spec.rb +6 -11
  112. data/spec/lib/spree/core/price_migrator_spec.rb +4 -4
  113. data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +199 -91
  114. data/spec/lib/spree/core/testing_support/factories/variant_factory_spec.rb +18 -0
  115. data/spec/lib/spree/localized_number_spec.rb +6 -0
  116. data/spec/mailers/carton_mailer_spec.rb +3 -3
  117. data/spec/models/spree/address_spec.rb +3 -3
  118. data/spec/models/spree/adjustment_spec.rb +71 -27
  119. data/spec/models/spree/calculator/default_tax_spec.rb +72 -1
  120. data/spec/models/spree/calculator/distributed_amount_spec.rb +32 -0
  121. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +20 -1
  122. data/spec/models/spree/calculator/tiered_percent_spec.rb +20 -1
  123. data/spec/models/spree/distributed_amounts_handler_spec.rb +79 -0
  124. data/spec/models/spree/gateway/bogus_simple.rb +7 -13
  125. data/spec/models/spree/gateway/bogus_spec.rb +8 -4
  126. data/spec/models/spree/gateway_spec.rb +6 -105
  127. data/spec/models/spree/image_spec.rb +23 -0
  128. data/spec/models/spree/order/checkout_spec.rb +3 -18
  129. data/spec/models/spree/order/number_generator_spec.rb +45 -0
  130. data/spec/models/spree/order/outstanding_balance_integration_spec.rb +135 -0
  131. data/spec/models/spree/order/payment_spec.rb +7 -2
  132. data/spec/models/spree/order/state_machine_spec.rb +4 -2
  133. data/spec/models/spree/order_capturing_spec.rb +8 -8
  134. data/spec/models/spree/order_contents_spec.rb +8 -1
  135. data/spec/models/spree/order_shipping_spec.rb +5 -1
  136. data/spec/models/spree/order_spec.rb +156 -83
  137. data/spec/models/spree/order_taxation_spec.rb +126 -0
  138. data/spec/models/spree/order_update_attributes_spec.rb +1 -5
  139. data/spec/models/spree/order_updater_spec.rb +20 -21
  140. data/spec/models/spree/payment_create_spec.rb +14 -6
  141. data/spec/models/spree/payment_method/bogus_credit_card_spec.rb +8 -0
  142. data/spec/models/spree/payment_method/check_spec.rb +78 -0
  143. data/spec/models/spree/payment_method/credit_card_spec.rb +66 -0
  144. data/spec/models/spree/payment_method/simple_bogus_credit_card_spec.rb +18 -0
  145. data/spec/models/spree/payment_method_spec.rb +47 -2
  146. data/spec/models/spree/payment_spec.rb +6 -8
  147. data/spec/models/spree/preference_spec.rb +1 -1
  148. data/spec/models/spree/price_spec.rb +1 -1
  149. data/spec/models/spree/product/scopes_spec.rb +46 -0
  150. data/spec/models/spree/promotion_action_spec.rb +4 -0
  151. data/spec/models/spree/promotion_code/batch_builder_spec.rb +25 -3
  152. data/spec/models/spree/promotion_code_batch_spec.rb +0 -6
  153. data/spec/models/spree/promotion_handler/coupon_spec.rb +1 -1
  154. data/spec/models/spree/promotion_rule_spec.rb +5 -0
  155. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +1 -1
  156. data/spec/models/spree/shipment_spec.rb +24 -3
  157. data/spec/models/spree/shipping_rate_spec.rb +5 -5
  158. data/spec/models/spree/state_spec.rb +31 -4
  159. data/spec/models/spree/stock/coordinator_spec.rb +24 -0
  160. data/spec/models/spree/stock/estimator_spec.rb +1 -1
  161. data/spec/models/spree/store_selector/by_server_name_spec.rb +26 -0
  162. data/spec/models/spree/store_selector/legacy_spec.rb +44 -0
  163. data/spec/models/spree/store_spec.rb +10 -2
  164. data/spec/models/spree/tax/order_adjuster_spec.rb +11 -21
  165. data/spec/models/spree/tax/shipping_rate_taxer_spec.rb +10 -3
  166. data/spec/models/spree/tax/taxation_integration_spec.rb +43 -8
  167. data/spec/models/spree/tax_calculator/default_spec.rb +54 -0
  168. data/spec/models/spree/tax_rate_spec.rb +92 -0
  169. data/spec/models/spree/variant/vat_price_generator_spec.rb +4 -4
  170. data/spec/models/spree/variant_spec.rb +8 -2
  171. data/spec/spec_helper.rb +2 -1
  172. data/spec/support/test_gateway.rb +1 -1
  173. metadata +45 -24
  174. data/app/models/spree/tax/item_adjuster.rb +0 -51
  175. data/spec/models/spree/tax/item_adjuster_spec.rb +0 -82
@@ -1,9 +1,17 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Spree::Order, type: :model do
4
- let(:store) { build_stubbed(:store) }
5
- let(:user) { stub_model(Spree::LegacyUser, email: "spree@example.com") }
6
- let(:order) { stub_model(Spree::Order, user: user, store: store) }
4
+ let(:store) { create(:store) }
5
+ let(:user) { create(:user, email: "spree@example.com") }
6
+ let(:order) { create(:order, user: user, store: store) }
7
+ let(:promotion) do
8
+ FactoryGirl.create(
9
+ :promotion,
10
+ :with_order_adjustment,
11
+ code: "discount"
12
+ )
13
+ end
14
+ let(:code) { promotion.codes.first }
7
15
 
8
16
  before do
9
17
  allow(Spree::LegacyUser).to receive_messages(current: mock_model(Spree::LegacyUser, id: 123))
@@ -171,12 +179,14 @@ describe Spree::Order, type: :model do
171
179
  create(:line_item, order: order)
172
180
  create(:shipment, order: order)
173
181
  create(:adjustment, adjustable: order, order: order)
182
+ promotion.activate(order: order, promotion_code: code)
174
183
  order.update!
175
184
 
176
185
  # Make sure we are asserting changes
177
186
  expect(order.line_items).not_to be_empty
178
187
  expect(order.shipments).not_to be_empty
179
188
  expect(order.adjustments).not_to be_empty
189
+ expect(order.promotions).not_to be_empty
180
190
  expect(order.item_total).not_to eq 0
181
191
  expect(order.item_count).not_to eq 0
182
192
  expect(order.shipment_total).not_to eq 0
@@ -188,6 +198,7 @@ describe Spree::Order, type: :model do
188
198
  expect(order.line_items).to be_empty
189
199
  expect(order.shipments).to be_empty
190
200
  expect(order.adjustments).to be_empty
201
+ expect(order.promotions).to be_empty
191
202
  expect(order.item_total).to eq 0
192
203
  expect(order.item_count).to eq 0
193
204
  expect(order.shipment_total).to eq 0
@@ -195,6 +206,21 @@ describe Spree::Order, type: :model do
195
206
  end
196
207
  end
197
208
 
209
+ context '#outstanding_balance' do
210
+ let(:order) { create(:order_ready_to_ship, line_items_count: 3) }
211
+ let(:payment) { order.payments.first }
212
+
213
+ it "should handle refunds properly" do
214
+ order.cancellations.short_ship([order.inventory_units.first])
215
+ expect(order.outstanding_balance).to be_negative
216
+ expect(order.payment_state).to eq('credit_owed')
217
+ create(:refund, amount: order.outstanding_balance.abs, payment: payment, transaction_id: nil)
218
+ order.reload
219
+ expect(order.outstanding_balance).to eq(0)
220
+ expect(order.payment_state).to eq('paid')
221
+ end
222
+ end
223
+
198
224
  context "#display_outstanding_balance" do
199
225
  it "returns the value as a spree money" do
200
226
  allow(order).to receive(:outstanding_balance) { 10.55 }
@@ -491,7 +517,9 @@ describe Spree::Order, type: :model do
491
517
  order.update_column(:payment_state, 'balance_due')
492
518
  order.payment_state = 'paid'
493
519
  expect(order.state_changes).to be_empty
494
- order.state_changed('payment')
520
+ Spree::Deprecation.silence do
521
+ order.state_changed('payment')
522
+ end
495
523
  state_change = order.state_changes.find_by(name: 'payment')
496
524
  expect(state_change.previous_state).to eq('balance_due')
497
525
  expect(state_change.next_state).to eq('paid')
@@ -500,7 +528,9 @@ describe Spree::Order, type: :model do
500
528
  it "does not do anything if state does not change" do
501
529
  order.update_column(:payment_state, 'balance_due')
502
530
  expect(order.state_changes).to be_empty
503
- order.state_changed('payment')
531
+ Spree::Deprecation.silence do
532
+ order.state_changed('payment')
533
+ end
504
534
  expect(order.state_changes).to be_empty
505
535
  end
506
536
  end
@@ -508,7 +538,7 @@ describe Spree::Order, type: :model do
508
538
  # Regression test for https://github.com/spree/spree/issues/4199
509
539
  context "#available_payment_methods" do
510
540
  it "includes frontend payment methods" do
511
- payment_method = Spree::PaymentMethod.create!({
541
+ payment_method = Spree::PaymentMethod::Check.create!({
512
542
  name: "Fake",
513
543
  active: true,
514
544
  available_to_users: true,
@@ -518,7 +548,7 @@ describe Spree::Order, type: :model do
518
548
  end
519
549
 
520
550
  it "includes 'both' payment methods" do
521
- payment_method = Spree::PaymentMethod.create!({
551
+ payment_method = Spree::PaymentMethod::Check.create!({
522
552
  name: "Fake",
523
553
  active: true,
524
554
  available_to_users: true,
@@ -528,7 +558,7 @@ describe Spree::Order, type: :model do
528
558
  end
529
559
 
530
560
  it "does not include a payment method twice" do
531
- payment_method = Spree::PaymentMethod.create!({
561
+ payment_method = Spree::PaymentMethod::Check.create!({
532
562
  name: "Fake",
533
563
  active: true,
534
564
  available_to_users: true,
@@ -539,7 +569,7 @@ describe Spree::Order, type: :model do
539
569
  end
540
570
 
541
571
  it "does not include inactive payment methods" do
542
- Spree::PaymentMethod.create!({
572
+ Spree::PaymentMethod::Check.create!({
543
573
  name: "Fake",
544
574
  active: false,
545
575
  available_to_users: true,
@@ -675,39 +705,52 @@ describe Spree::Order, type: :model do
675
705
  end
676
706
  end
677
707
 
678
- context "#generate_order_number" do
679
- context "when no configure" do
680
- let(:default_length) { Spree::Order::ORDER_NUMBER_LENGTH + Spree::Order::ORDER_NUMBER_PREFIX.length }
681
- subject(:order_number) { order.generate_order_number }
708
+ describe "#generate_order_number" do
709
+ let(:order) { build(:order) }
710
+
711
+ context "with default app configuration" do
712
+ it 'calls the default order number generator' do
713
+ expect_any_instance_of(Spree::Order::NumberGenerator).to receive(:generate)
714
+ order.generate_order_number
715
+ end
716
+ end
717
+
718
+ context "with order number generator configured" do
719
+ class TruthNumberGenerator
720
+ def initialize(options = {}); end
682
721
 
683
- describe '#class' do
684
- subject { super().class }
685
- it { is_expected.to eq String }
722
+ def generate
723
+ '42'
724
+ end
686
725
  end
687
726
 
688
- describe '#length' do
689
- subject { super().length }
690
- it { is_expected.to eq default_length }
727
+ before do
728
+ expect(Spree::Config).to receive(:order_number_generator) do
729
+ TruthNumberGenerator.new
730
+ end
691
731
  end
692
- it { is_expected.to match /^#{Spree::Order::ORDER_NUMBER_PREFIX}/ }
693
- end
694
732
 
695
- context "when length option is 5" do
696
- let(:option_length) { 5 + Spree::Order::ORDER_NUMBER_PREFIX.length }
697
- it "should be option length for order number" do
698
- expect(order.generate_order_number(length: 5).length).to eq option_length
733
+ it 'calls the configured order number generator' do
734
+ order.generate_order_number
735
+ expect(order.number).to eq '42'
699
736
  end
700
737
  end
701
738
 
702
- context "when letters option is true" do
703
- it "generates order number include letter" do
704
- expect(order.generate_order_number(length: 100, letters: true)).to match /[A-Z]/
739
+ context "with number already present" do
740
+ before do
741
+ order.number = '123'
742
+ end
743
+
744
+ it 'does not generate new number' do
745
+ order.generate_order_number
746
+ expect(order.number).to eq '123'
705
747
  end
706
748
  end
707
749
 
708
- context "when prefix option is 'P'" do
709
- it "generates order number and it prefix is 'P'" do
710
- expect(order.generate_order_number(prefix: 'P')).to match /^P/
750
+ context "passing options" do
751
+ it 'is deprecated' do
752
+ expect(Spree::Deprecation).to receive(:warn)
753
+ order.generate_order_number(length: 2)
711
754
  end
712
755
  end
713
756
  end
@@ -768,6 +811,88 @@ describe Spree::Order, type: :model do
768
811
  end
769
812
  end
770
813
 
814
+ context "#assign_default_user_addresses" do
815
+ let(:order) { Spree::Order.new }
816
+
817
+ subject { order.assign_default_user_addresses }
818
+
819
+ context "when no user is associated to the order" do
820
+ it "does not associate any bill address" do
821
+ expect { subject }.not_to change { order.bill_address }.from(nil)
822
+ end
823
+
824
+ it "does not associate any ship address" do
825
+ expect { subject }.not_to change { order.ship_address }.from(nil)
826
+ end
827
+ end
828
+
829
+ context "when user is associated to the order" do
830
+ let(:user) { build_stubbed(:user) }
831
+ let(:bill_address) { nil }
832
+ let(:ship_address) { nil }
833
+
834
+ before do
835
+ order.associate_user!(user)
836
+ user.bill_address = bill_address
837
+ user.ship_address = ship_address
838
+ end
839
+
840
+ context "but has no bill address associated" do
841
+ it "does not associate any bill address" do
842
+ expect { subject }.not_to change { order.bill_address }.from(nil)
843
+ end
844
+ end
845
+
846
+ context "and has an invalid bill address associated " do
847
+ let(:bill_address) { build(:address, firstname: nil) } # invalid address
848
+
849
+ it "does not associate any bill address" do
850
+ expect { subject }.not_to change { order.bill_address }.from(nil)
851
+ end
852
+ end
853
+
854
+ context "and has a valid address associated " do
855
+ let(:bill_address) { build(:address) }
856
+
857
+ it "does associate user bill address" do
858
+ expect { subject }.to change { order.bill_address }.from(nil).to(bill_address)
859
+ end
860
+ end
861
+
862
+ context "but has no ship address associated" do
863
+ it "does not associate any ship address" do
864
+ expect { subject }.not_to change { order.ship_address }.from(nil)
865
+ end
866
+ end
867
+
868
+ context "and has an invalid ship address associated " do
869
+ let(:ship_address) { build(:address, firstname: nil) } # invalid address
870
+
871
+ it "does not associate any ship address" do
872
+ expect { subject }.not_to change { order.ship_address }.from(nil)
873
+ end
874
+ end
875
+
876
+ context "and has a valid ship address associated" do
877
+ let(:ship_address) { build(:address) }
878
+
879
+ it "does associate user ship address" do
880
+ expect { subject }.to change { order.ship_address }.from(nil).to(ship_address)
881
+ end
882
+
883
+ context 'when checkout step does not include delivery' do
884
+ before do
885
+ expect(order).to receive(:checkout_steps) { %w[some step] }
886
+ end
887
+
888
+ it "does not associate any ship address" do
889
+ expect { subject }.not_to change { order.ship_address }.from(nil)
890
+ end
891
+ end
892
+ end
893
+ end
894
+ end
895
+
771
896
  context "#can_ship?" do
772
897
  let(:order) { Spree::Order.create }
773
898
 
@@ -1409,56 +1534,4 @@ describe Spree::Order, type: :model do
1409
1534
  end
1410
1535
  end
1411
1536
  end
1412
-
1413
- describe "#validate_payments_attributes" do
1414
- let(:attributes) { [ActionController::Parameters.new(payment_method_id: payment_method.id)] }
1415
- subject do
1416
- order.validate_payments_attributes(attributes)
1417
- end
1418
-
1419
- context "with empty array" do
1420
- let(:attributes) { [] }
1421
- it "doesn't error" do
1422
- subject
1423
- end
1424
- end
1425
-
1426
- context "with no payment method specified" do
1427
- let(:attributes) { [ActionController::Parameters.new({})] }
1428
- it "doesn't error" do
1429
- subject
1430
- end
1431
- end
1432
-
1433
- context "with valid payment method" do
1434
- let(:payment_method) { create(:check_payment_method) }
1435
- it "doesn't error" do
1436
- subject
1437
- end
1438
- end
1439
-
1440
- context "with inactive payment method" do
1441
- let(:payment_method) { create(:check_payment_method, active: false) }
1442
-
1443
- it "raises RecordNotFound" do
1444
- expect { subject }.to raise_error(ActiveRecord::RecordNotFound)
1445
- end
1446
- end
1447
-
1448
- context "with unavailable payment method" do
1449
- let(:payment_method) { create(:check_payment_method, available_to_users: false) }
1450
-
1451
- it "raises RecordNotFound" do
1452
- expect { subject }.to raise_error(ActiveRecord::RecordNotFound)
1453
- end
1454
- end
1455
-
1456
- context "with soft-deleted payment method" do
1457
- let(:payment_method) { create(:check_payment_method, deleted_at: Time.current) }
1458
-
1459
- it "raises RecordNotFound" do
1460
- expect { subject }.to raise_error(ActiveRecord::RecordNotFound)
1461
- end
1462
- end
1463
- end
1464
1537
  end
@@ -0,0 +1,126 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Spree::OrderTaxation do
4
+ let(:shipping_address) { FactoryGirl.create(:address, state: new_york) }
5
+ let(:order) { FactoryGirl.create(:order, ship_address: shipping_address, state: "delivery") }
6
+
7
+ let(:new_york) { FactoryGirl.create(:state, state_code: "NY") }
8
+ let(:new_york_zone) { FactoryGirl.create(:zone, states: [new_york]) }
9
+
10
+ let(:books_category) { FactoryGirl.create(:tax_category, name: "Books") }
11
+ let(:book_tax_rate) do
12
+ FactoryGirl.create(
13
+ :tax_rate,
14
+ name: "New York Sales Tax",
15
+ tax_categories: [books_category],
16
+ zone: new_york_zone,
17
+ included_in_price: false,
18
+ amount: 0.05
19
+ )
20
+ end
21
+
22
+ let(:book) do
23
+ FactoryGirl.create(
24
+ :product,
25
+ price: 20,
26
+ name: "Book",
27
+ tax_category: books_category,
28
+ )
29
+ end
30
+
31
+ let(:taxation) { described_class.new(order) }
32
+
33
+ describe "#apply" do
34
+ let(:line_item) { order.contents.add(book.master) }
35
+
36
+ let(:line_item_tax) do
37
+ Spree::Tax::ItemTax.new(
38
+ item_id: line_item.id,
39
+ label: "Tax!",
40
+ tax_rate: book_tax_rate,
41
+ amount: 5,
42
+ included_in_price: false
43
+ )
44
+ end
45
+
46
+ let(:taxes) do
47
+ Spree::Tax::OrderTax.new(
48
+ order_id: order.id,
49
+ line_item_taxes: [line_item_tax],
50
+ shipment_taxes: []
51
+ )
52
+ end
53
+
54
+ before { taxation.apply(taxes) }
55
+
56
+ it "creates a new tax adjustment", aggregate_failures: true do
57
+ expect(line_item.adjustments.count).to eq 1
58
+
59
+ tax_adjustment = line_item.adjustments.first
60
+ expect(tax_adjustment.label).to eq "Tax!"
61
+ expect(tax_adjustment.source).to eq book_tax_rate
62
+ expect(tax_adjustment.amount).to eq 5
63
+ expect(tax_adjustment.included).to be false
64
+ end
65
+
66
+ context "when new taxes are applied" do
67
+ let(:new_line_item_tax) do
68
+ Spree::Tax::ItemTax.new(
69
+ item_id: line_item.id,
70
+ label: "Tax!",
71
+ tax_rate: book_tax_rate,
72
+ amount: 10,
73
+ included_in_price: false
74
+ )
75
+ end
76
+
77
+ let(:new_taxes) do
78
+ Spree::Tax::OrderTax.new(
79
+ order_id: order.id,
80
+ line_item_taxes: [new_line_item_tax],
81
+ shipment_taxes: []
82
+ )
83
+ end
84
+
85
+ it "updates the existing tax amount", aggregate_failures: true do
86
+ expect {
87
+ taxation.apply(new_taxes)
88
+ }.to change {
89
+ line_item.adjustments.first.amount
90
+ }.from(5).to(10)
91
+ end
92
+
93
+ context "and the adjustment is finalized" do
94
+ before do
95
+ line_item.adjustments.first.finalize!
96
+ end
97
+
98
+ it "does not update the tax amount", aggregate_failures: true do
99
+ expect {
100
+ taxation.apply(new_taxes)
101
+ }.to change {
102
+ line_item.adjustments.first.amount
103
+ }.from(5).to(10)
104
+ end
105
+ end
106
+ end
107
+
108
+ context "when taxes are removed" do
109
+ let(:new_taxes) do
110
+ Spree::Tax::OrderTax.new(
111
+ order_id: order.id,
112
+ line_item_taxes: [],
113
+ shipment_taxes: []
114
+ )
115
+ end
116
+
117
+ it "removes the tax adjustment" do
118
+ expect {
119
+ taxation.apply(new_taxes)
120
+ }.to change {
121
+ line_item.adjustments.count
122
+ }.from(1).to(0)
123
+ end
124
+ end
125
+ end
126
+ end
@@ -3,7 +3,6 @@ require 'spec_helper'
3
3
  module Spree
4
4
  RSpec.describe OrderUpdateAttributes do
5
5
  let(:order) { create(:order) }
6
- let(:payment_method) { create(:payment_method) }
7
6
  let(:request_env) { nil }
8
7
  let(:update) { described_class.new(order, attributes, request_env: request_env) }
9
8
 
@@ -26,10 +25,7 @@ module Spree
26
25
  let(:attributes) do
27
26
  {
28
27
  payments_attributes: [
29
- {
30
- payment_method_id: payment_method.id,
31
- source_attributes: attributes_for(:credit_card)
32
- }
28
+ { source_attributes: attributes_for(:credit_card) }
33
29
  ]
34
30
  }
35
31
  end
@@ -34,6 +34,17 @@ module Spree
34
34
  }.to change { order.shipment_total }.to 10
35
35
  end
36
36
 
37
+ context 'with a source-less line item adjustment' do
38
+ let(:line_item) { create(:line_item, order: order, price: 10) }
39
+ before do
40
+ create(:adjustment, source: nil, adjustable: line_item, order: order, amount: -5)
41
+ end
42
+
43
+ it "updates the line item total" do
44
+ expect { updater.update }.to change { line_item.reload.adjustment_total }.from(0).to(-5)
45
+ end
46
+ end
47
+
37
48
  context 'with order promotion followed by line item addition' do
38
49
  let(:promotion) { Spree::Promotion.create!(name: "10% off") }
39
50
  let(:calculator) { Calculator::FlatPercentItemTotal.new(preferred_flat_percent: 10) }
@@ -273,7 +284,7 @@ module Spree
273
284
  describe 'tax recalculation' do
274
285
  let!(:ship_address) { create(:address) }
275
286
  let!(:tax_zone) { create(:global_zone) } # will include the above address
276
- let!(:tax_rate) { create(:tax_rate, zone: tax_zone, tax_category: tax_category) }
287
+ let!(:tax_rate) { create(:tax_rate, zone: tax_zone, tax_categories: [tax_category]) }
277
288
 
278
289
  let(:order) do
279
290
  create(
@@ -301,18 +312,20 @@ module Spree
301
312
  end
302
313
  end
303
314
 
304
- context 'with a custom tax_adjuster_class' do
305
- let(:custom_adjuster_class) { double }
306
- let(:custom_adjuster_instance) { double }
315
+ context 'with a custom tax_calculator_class' do
316
+ let(:custom_calculator_class) { double }
317
+ let(:custom_calculator_instance) { double }
307
318
 
308
319
  before do
309
320
  order # generate this first so we can expect it
310
- Spree::Config.tax_adjuster_class = custom_adjuster_class
321
+ Spree::Config.tax_calculator_class = custom_calculator_class
311
322
  end
312
323
 
313
324
  it 'uses the configured class' do
314
- expect(custom_adjuster_class).to receive(:new).with(order).at_least(:once).and_return(custom_adjuster_instance)
315
- expect(custom_adjuster_instance).to receive(:adjust!).at_least(:once)
325
+ expect(custom_calculator_class).to receive(:new).with(order).at_least(:once).and_return(custom_calculator_instance)
326
+ expect(custom_calculator_instance).to receive(:calculate).at_least(:once).and_return(
327
+ Spree::Tax::OrderTax.new(order_id: order.id, line_item_taxes: [], shipment_taxes: [])
328
+ )
316
329
 
317
330
  order.update!
318
331
  end
@@ -452,20 +465,6 @@ module Spree
452
465
  end
453
466
  end
454
467
 
455
- it "state change" do
456
- order.shipment_state = 'shipped'
457
- state_changes = double
458
- allow(order).to receive_messages state_changes: state_changes
459
- expect(state_changes).to receive(:create).with(
460
- previous_state: nil,
461
- next_state: 'shipped',
462
- name: 'shipment',
463
- user_id: nil
464
- )
465
-
466
- order.state_changed('shipment')
467
- end
468
-
469
468
  context "completed order" do
470
469
  before { allow(order).to receive_messages completed?: true }
471
470
 
@@ -154,12 +154,20 @@ module Spree
154
154
  context "unpermitted" do
155
155
  let(:attributes) { ActionController::Parameters.new(valid_attributes) }
156
156
 
157
- it "ignores all attributes" do
158
- expect(new_payment).to have_attributes(
159
- amount: 0,
160
- payment_method: nil,
161
- source: nil
162
- )
157
+ if Rails.gem_version < Gem::Version.new('5.1')
158
+ it "ignores all attributes" do
159
+ expect(new_payment).to have_attributes(
160
+ amount: 0,
161
+ payment_method: nil,
162
+ source: nil
163
+ )
164
+ end
165
+ else
166
+ it "raises an exception" do
167
+ expect {
168
+ new_payment
169
+ }.to raise_exception(ActionController::UnfilteredParameters)
170
+ end
163
171
  end
164
172
  end
165
173
 
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ describe PaymentMethod::BogusCreditCard, type: :model do
5
+ let(:bogus) { create(:credit_card_payment_method) }
6
+ let!(:cc) { create(:credit_card, payment_method: bogus, gateway_customer_profile_id: "BGS-RERTERT") }
7
+ end
8
+ end
@@ -0,0 +1,78 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::PaymentMethod::Check do
4
+ let(:order) { create(:order) }
5
+ subject { described_class.new }
6
+
7
+ context "#can_capture?" do
8
+ let(:payment) { create(:payment, order: order, state: state) }
9
+
10
+ context "with payment in state checkout" do
11
+ let(:state) { "checkout" }
12
+
13
+ it "returns true" do
14
+ expect(subject.can_capture?(payment)).to be_truthy
15
+ end
16
+ end
17
+
18
+ context "with payment in state pending" do
19
+ let(:state) { "pending" }
20
+
21
+ it "returns true" do
22
+ expect(subject.can_capture?(payment)).to be_truthy
23
+ end
24
+ end
25
+
26
+ context "with payment in state failed" do
27
+ let(:state) { "failed" }
28
+
29
+ it "returns false" do
30
+ expect(subject.can_capture?(payment)).to be_falsy
31
+ end
32
+ end
33
+ end
34
+
35
+ context "#can_void?" do
36
+ let(:payment) { create(:payment, order: order, state: state) }
37
+
38
+ context "with payment in state checkout" do
39
+ let(:state) { "checkout" }
40
+
41
+ it "returns true" do
42
+ expect(subject.can_void?(payment)).to be_truthy
43
+ end
44
+ end
45
+
46
+ context "with payment in state void" do
47
+ let(:state) { "void" }
48
+
49
+ it "returns false" do
50
+ expect(subject.can_void?(payment)).to be_falsy
51
+ end
52
+ end
53
+ end
54
+
55
+ context "#capture" do
56
+ it "succeds" do
57
+ expect(subject.capture).to be_success
58
+ end
59
+ end
60
+
61
+ context "#cancel" do
62
+ it "returns nil" do
63
+ expect(subject.cancel).to be_nil
64
+ end
65
+ end
66
+
67
+ context "#void" do
68
+ it "succeds" do
69
+ expect(subject.void).to be_success
70
+ end
71
+ end
72
+
73
+ context "#credit" do
74
+ it "succeds" do
75
+ expect(subject.credit).to be_success
76
+ end
77
+ end
78
+ end