solidus_core 2.2.2 → 2.3.0.beta1

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 (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
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::PaymentMethod::CreditCard, type: :model do
4
+ context "fetching payment sources" do
5
+ let(:store) { create :store }
6
+ let(:user) { create :user }
7
+ let(:order) { Spree::Order.create(user: user, completed_at: completed_at, store: store) }
8
+
9
+ let(:payment_method) { create(:credit_card_payment_method) }
10
+
11
+ let(:cc) do
12
+ create(:credit_card,
13
+ payment_method: payment_method,
14
+ gateway_customer_profile_id: "EFWE",
15
+ user: cc_user)
16
+ end
17
+
18
+ let(:payment) do
19
+ create(:payment, order: order, source: cc, payment_method: payment_method)
20
+ end
21
+
22
+ context 'order is not complete and credit card user is nil' do
23
+ let(:cc_user) { nil }
24
+ let(:completed_at) { nil }
25
+
26
+ it "finds no credit cards associated to the order" do
27
+ expect(payment_method.reusable_sources(payment.order)).to be_empty
28
+ end
29
+ end
30
+
31
+ context 'order is complete but credit card user is nil' do
32
+ let(:cc_user) { nil }
33
+ let(:completed_at) { Date.yesterday }
34
+
35
+ it "finds credit cards associated on a order completed" do
36
+ expect(payment_method.reusable_sources(payment.order)).to eq [cc]
37
+ end
38
+ end
39
+
40
+ context 'order is not complete but credit card has user' do
41
+ let(:cc_user) { user }
42
+ let(:completed_at) { nil }
43
+ before do
44
+ cc_user.wallet.add(cc)
45
+ end
46
+ it "finds credit cards associated to the user" do
47
+ expect(payment_method.reusable_sources(payment.order)).to eq [cc]
48
+ end
49
+ end
50
+ end
51
+
52
+ context 'using preference_source' do
53
+ let(:klass){ Spree::PaymentMethod::BogusCreditCard }
54
+ before do
55
+ Spree::Config.static_model_preferences.add(klass, 'test_preference_source', server: 'bar')
56
+ end
57
+ after do
58
+ Spree::Config.static_model_preferences.for_class(klass).clear
59
+ end
60
+ let(:payment_method){ create(:credit_card_payment_method, preference_source: 'test_preference_source') }
61
+
62
+ it "reads static preferences" do
63
+ expect(payment_method.options).to eq({ server: "bar" })
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::PaymentMethod::SimpleBogusCreditCard, type: :model do
4
+ subject { Spree::PaymentMethod::SimpleBogusCreditCard.new }
5
+
6
+ # regression test for https://github.com/spree/spree/issues/3824
7
+ describe "#capture" do
8
+ it "returns success with the right response code" do
9
+ response = subject.capture(123, '12345', {})
10
+ expect(response.message).to include("success")
11
+ end
12
+
13
+ it "returns failure with the wrong response code" do
14
+ response = subject.capture(123, 'wrong', {})
15
+ expect(response.message).to include("failure")
16
+ end
17
+ end
18
+ end
@@ -180,8 +180,8 @@ describe Spree::PaymentMethod, type: :model do
180
180
  end
181
181
 
182
182
  describe '#auto_capture?' do
183
- class TestGateway < Spree::Gateway
184
- def provider_class
183
+ class TestGateway < Spree::PaymentMethod::CreditCard
184
+ def gateway_class
185
185
  Provider
186
186
  end
187
187
  end
@@ -309,4 +309,49 @@ describe Spree::PaymentMethod, type: :model do
309
309
  end
310
310
  end
311
311
  end
312
+
313
+ describe 'ActiveMerchant methods' do
314
+ class PaymentGateway
315
+ def initialize(options)
316
+ end
317
+
318
+ def authorize; 'authorize'; end
319
+
320
+ def purchase; 'purchase'; end
321
+
322
+ def capture; 'capture'; end
323
+
324
+ def void; 'void'; end
325
+
326
+ def credit; 'credit'; end
327
+ end
328
+
329
+ class TestPaymentMethod < Spree::PaymentMethod
330
+ def gateway_class
331
+ PaymentGateway
332
+ end
333
+ end
334
+
335
+ let(:payment_method) { TestPaymentMethod.new }
336
+
337
+ it "passes through authorize" do
338
+ expect(payment_method.authorize).to eq 'authorize'
339
+ end
340
+
341
+ it "passes through purchase" do
342
+ expect(payment_method.purchase).to eq 'purchase'
343
+ end
344
+
345
+ it "passes through capture" do
346
+ expect(payment_method.capture).to eq 'capture'
347
+ end
348
+
349
+ it "passes through void" do
350
+ expect(payment_method.void).to eq 'void'
351
+ end
352
+
353
+ it "passes through credit" do
354
+ expect(payment_method.credit).to eq 'credit'
355
+ end
356
+ end
312
357
  end
@@ -6,7 +6,7 @@ describe Spree::Payment, type: :model do
6
6
  let(:refund_reason) { create(:refund_reason) }
7
7
 
8
8
  let(:gateway) do
9
- gateway = Spree::Gateway::Bogus.new(active: true, name: 'Bogus gateway')
9
+ gateway = Spree::PaymentMethod::BogusCreditCard.new(active: true, name: 'Bogus gateway')
10
10
  allow(gateway).to receive_messages source_required: true
11
11
  gateway
12
12
  end
@@ -209,7 +209,7 @@ describe Spree::Payment, type: :model do
209
209
  # Regression test for https://github.com/spree/spree/issues/4598
210
210
  it "should allow payments with a gateway_customer_profile_id" do
211
211
  payment.source.update!(gateway_customer_profile_id: "customer_1", brand: 'visa')
212
- expect(payment.payment_method.provider_class).to receive(:supports?).with('visa').and_return(false)
212
+ expect(payment.payment_method.gateway_class).to receive(:supports?).with('visa').and_return(false)
213
213
  expect(payment).to receive(:started_processing!)
214
214
  payment.process!
215
215
  end
@@ -217,7 +217,7 @@ describe Spree::Payment, type: :model do
217
217
  # Another regression test for https://github.com/spree/spree/issues/4598
218
218
  it "should allow payments with a gateway_payment_profile_id" do
219
219
  payment.source.update!(gateway_payment_profile_id: "customer_1", brand: 'visa')
220
- expect(payment.payment_method.provider_class).to receive(:supports?).with('visa').and_return(false)
220
+ expect(payment.payment_method.gateway_class).to receive(:supports?).with('visa').and_return(false)
221
221
  expect(payment).to receive(:started_processing!)
222
222
  payment.process!
223
223
  end
@@ -653,13 +653,12 @@ describe Spree::Payment, type: :model do
653
653
  end
654
654
 
655
655
  context "completed orders" do
656
- let(:payment_method) { create(:check_payment_method) }
657
656
  before { allow(order).to receive_messages completed?: true }
658
657
 
659
658
  it "updates payment_state and shipments" do
660
659
  expect(order.updater).to receive(:update_payment_state)
661
660
  expect(order.updater).to receive(:update_shipment_state)
662
- Spree::Payment.create!(amount: 100, order: order, payment_method: payment_method)
661
+ Spree::Payment.create(amount: 100, order: order)
663
662
  end
664
663
  end
665
664
 
@@ -743,13 +742,12 @@ describe Spree::Payment, type: :model do
743
742
  end
744
743
 
745
744
  describe "invalidating payments updates in memory objects" do
746
- let(:payment_method) { create(:check_payment_method) }
747
745
  before do
748
- Spree::PaymentCreate.new(order, amount: 1, payment_method_id: payment_method.id).build.save!
746
+ Spree::PaymentCreate.new(order, amount: 1).build.save!
749
747
  expect(order.payments.map(&:state)).to contain_exactly(
750
748
  'checkout'
751
749
  )
752
- Spree::PaymentCreate.new(order, amount: 2, payment_method_id: payment_method.id).build.save!
750
+ Spree::PaymentCreate.new(order, amount: 2).build.save!
753
751
  end
754
752
 
755
753
  it 'should not have stale payments' do
@@ -15,7 +15,7 @@ describe Spree::Preference, type: :model do
15
15
  p.key = key
16
16
  p.save
17
17
 
18
- Spree::Preference.find_by_key(key)
18
+ Spree::Preference.find_by(key: key)
19
19
  end
20
20
 
21
21
  it ":boolean" do
@@ -133,7 +133,7 @@ describe Spree::Price, type: :model do
133
133
  describe 'net_amount' do
134
134
  let(:country) { create(:country, iso: "DE") }
135
135
  let(:zone) { create(:zone, countries: [country]) }
136
- let!(:tax_rate) { create(:tax_rate, included_in_price: true, zone: zone, tax_category: variant.tax_category) }
136
+ let!(:tax_rate) { create(:tax_rate, included_in_price: true, zone: zone, tax_categories: [variant.tax_category]) }
137
137
 
138
138
  let(:variant) { create(:product).master }
139
139
 
@@ -113,4 +113,50 @@ describe "Product scopes", type: :model do
113
113
  end
114
114
  end
115
115
  end
116
+
117
+ describe '.available' do
118
+ context "a product with past available_on" do
119
+ let!(:product) { create(:product, available_on: 1.day.ago) }
120
+
121
+ it "includes the product" do
122
+ expect(Spree::Product.available).to match_array([product])
123
+ end
124
+
125
+ context "with no master price" do
126
+ before { product.master.prices.delete_all }
127
+
128
+ it "doesn't include the product" do
129
+ expect(Spree::Product.available).to match_array([])
130
+ end
131
+ end
132
+
133
+ context "with soft-deleted master price" do
134
+ before { product.master.prices.destroy_all }
135
+
136
+ it "doesn't include the product" do
137
+ expect(Spree::Product.available).to match_array([])
138
+ end
139
+ end
140
+
141
+ context "with multiple prices" do
142
+ let!(:second_price) { create(:price, variant: product.master) }
143
+
144
+ it "includes the product only once" do
145
+ expect(Spree::Product.available).to match_array([product])
146
+ end
147
+
148
+ it "has a count of 1" do
149
+ expect(Spree::Product.available.count).to eq(1)
150
+ end
151
+ end
152
+ end
153
+
154
+ context "a product with future available_on" do
155
+ let!(:product) { create(:product, available_on: 1.day.from_now) }
156
+
157
+ it "doesn't include the product" do
158
+ expect(Spree::Product.available).to match_array([])
159
+ end
160
+ end
161
+ end
116
162
  end
@@ -22,6 +22,10 @@ describe Spree::PromotionAction, type: :model do
22
22
  @action_adjustment = order.adjustments.where(source: action).first!
23
23
  end
24
24
 
25
+ it "generates its own partial path" do
26
+ expect(action.to_partial_path).to eq 'spree/admin/promotions/actions/my_promotion_action'
27
+ end
28
+
25
29
  it 'removes the action adjustment' do
26
30
  expect(order.adjustments).to match_array([other_adjustment, @action_adjustment])
27
31
 
@@ -12,7 +12,7 @@ describe Spree::PromotionCode::BatchBuilder do
12
12
  )
13
13
  end
14
14
 
15
- subject { described_class.new promotion_code_batch }
15
+ subject { described_class.new(promotion_code_batch) }
16
16
 
17
17
  describe "#build_promotion_codes" do
18
18
  context "with a failed build" do
@@ -27,6 +27,7 @@ describe Spree::PromotionCode::BatchBuilder do
27
27
  expect(promotion_code_batch.reload.state).to eq("failed")
28
28
  end
29
29
  end
30
+
30
31
  context "with a successful build" do
31
32
  before do
32
33
  allow(Spree::PromotionCodeBatchMailer)
@@ -48,13 +49,34 @@ describe Spree::PromotionCode::BatchBuilder do
48
49
  expect(subject.promotion.codes.map(&:value).uniq.size).to eq(10)
49
50
  end
50
51
 
52
+ it "updates the promotion code batch state to completed" do
53
+ expect(promotion_code_batch.state).to eq("completed")
54
+ end
55
+ end
56
+ end
57
+
58
+ describe "#join_character" do
59
+ context "with the default join charachter _" do
51
60
  it "builds codes with the same base prefix" do
61
+ subject.build_promotion_codes
62
+
52
63
  values = subject.promotion.codes.map(&:value)
53
64
  expect(values.all? { |val| val.starts_with?("#{base_code}_") }).to be true
54
65
  end
66
+ end
55
67
 
56
- it "updates the promotion code batch state to completed" do
57
- expect(promotion_code_batch.state).to eq("completed")
68
+ context "with a custom join separator" do
69
+ around do |example|
70
+ Spree::PromotionCode::BatchBuilder.join_characters = "x"
71
+ example.run
72
+ Spree::PromotionCode::BatchBuilder.join_characters = "_"
73
+ end
74
+
75
+ it "builds codes with the same base prefix" do
76
+ subject.build_promotion_codes
77
+
78
+ values = subject.promotion.codes.map(&:value)
79
+ expect(values.all? { |val| val.starts_with?("#{base_code}x") }).to be true
58
80
  end
59
81
  end
60
82
  end
@@ -1,8 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Spree::PromotionCodeBatch, type: :model do
4
- include ActiveJob::TestHelper
5
-
6
4
  subject do
7
5
  described_class.create!(
8
6
  promotion_id: create(:promotion).id,
@@ -16,12 +14,8 @@ describe Spree::PromotionCodeBatch, type: :model do
16
14
  describe "#process" do
17
15
  context "with a pending code batch" do
18
16
  it "should call the worker" do
19
- ActiveJob::Base.queue_adapter = :test
20
-
21
17
  expect { subject.process }
22
18
  .to have_enqueued_job(Spree::PromotionCodeBatchJob)
23
-
24
- clear_enqueued_jobs
25
19
  end
26
20
 
27
21
  it "should update the state to processing" do
@@ -255,7 +255,7 @@ module Spree
255
255
  let(:order) { create(:order, store: store) }
256
256
  let(:tax_category) { create(:tax_category, name: "Taxable Foo") }
257
257
  let(:zone) { create(:zone, :with_country) }
258
- let!(:tax_rate) { create(:tax_rate, amount: 0.1, tax_category: tax_category, zone: zone )}
258
+ let!(:tax_rate) { create(:tax_rate, amount: 0.1, tax_categories: [tax_category], zone: zone ) }
259
259
 
260
260
  before(:each) do
261
261
  expect(order).to receive(:tax_address).at_least(:once).and_return(Spree::Tax::TaxLocation.new(country: zone.countries.first))
@@ -23,5 +23,10 @@ module Spree
23
23
  p2.promotion_id = 1
24
24
  expect(p2).not_to be_valid
25
25
  end
26
+
27
+ it "generates its own partial path" do
28
+ rule = TestRule.new
29
+ expect(rule.to_partial_path).to eq 'spree/admin/promotions/rules/test_rule'
30
+ end
26
31
  end
27
32
  end
@@ -54,7 +54,7 @@ module Spree
54
54
  context "multiple payment methods" do
55
55
  let(:simulate) { true }
56
56
  let!(:check_payment) { create(:check_payment, order: reimbursement.order, amount: 5.0, state: "completed") }
57
- let(:payment) { reimbursement.order.payments.detect { |p| p.payment_method.is_a? Spree::Gateway::Bogus } }
57
+ let(:payment) { reimbursement.order.payments.detect { |p| p.payment_method.is_a? Spree::PaymentMethod::BogusCreditCard } }
58
58
  let(:refund_amount) { 10.0 }
59
59
 
60
60
  let(:refund_payment_methods) { subject.map { |refund| refund.payment.payment_method } }
@@ -130,7 +130,7 @@ describe Spree::Shipment, type: :model do
130
130
 
131
131
  let!(:ship_address) { create(:address) }
132
132
  let!(:tax_zone) { create(:global_zone) } # will include the above address
133
- let!(:tax_rate) { create(:tax_rate, amount: 0.1, zone: tax_zone, tax_category: tax_category) }
133
+ let!(:tax_rate) { create(:tax_rate, amount: 0.1, zone: tax_zone, tax_categories: [tax_category]) }
134
134
  let(:tax_category) { create(:tax_category) }
135
135
  let(:variant) { create(:variant, tax_category: tax_category) }
136
136
 
@@ -548,7 +548,7 @@ describe Spree::Shipment, type: :model do
548
548
  context "changes shipping rate via general update" do
549
549
  let!(:ship_address) { create(:address) }
550
550
  let!(:tax_zone) { create(:global_zone) } # will include the above address
551
- let!(:tax_rate) { create(:tax_rate, amount: 0.10, zone: tax_zone, tax_category: tax_category) }
551
+ let!(:tax_rate) { create(:tax_rate, amount: 0.10, zone: tax_zone, tax_categories: [tax_category]) }
552
552
  let(:tax_category) { create(:tax_category) }
553
553
 
554
554
  let(:order) do
@@ -797,7 +797,7 @@ describe Spree::Shipment, type: :model do
797
797
 
798
798
  describe '#selected_shipping_rate_id=' do
799
799
  let!(:air_shipping_method) { create(:shipping_method, name: "Air") }
800
- let(:new_rate) { shipment.add_shipping_method(air_shipping_method) }
800
+ let(:new_rate) { shipment.shipping_rates.create!(shipping_method: air_shipping_method) }
801
801
 
802
802
  context 'when the id exists' do
803
803
  it 'sets the new shipping rate as selected' do
@@ -821,4 +821,25 @@ describe Spree::Shipment, type: :model do
821
821
  end
822
822
  end
823
823
  end
824
+
825
+ describe "#shipping_method" do
826
+ let(:shipment) { create(:shipment) }
827
+
828
+ subject { shipment.shipping_method }
829
+
830
+ context "when no shipping rate is selected" do
831
+ before do
832
+ shipment.shipping_rates.update_all(selected: false)
833
+ shipment.reload
834
+ end
835
+
836
+ it { is_expected.to be_nil }
837
+ end
838
+
839
+ context "when a shipping rate is selected" do
840
+ it "is expected to be the shipping rate's shipping method" do
841
+ expect(shipment.shipping_method).to eq(shipment.selected_shipping_rate.shipping_method)
842
+ end
843
+ end
844
+ end
824
845
  end
@@ -33,7 +33,7 @@ describe Spree::ShippingRate, type: :model do
33
33
  included_in_price: true,
34
34
  name: "VAT",
35
35
  zone: default_zone,
36
- tax_category: tax_category
36
+ tax_categories: [tax_category]
37
37
  end
38
38
 
39
39
  let(:order_address) { address }
@@ -64,7 +64,7 @@ describe Spree::ShippingRate, type: :model do
64
64
  included_in_price: true,
65
65
  name: "VAT",
66
66
  zone: default_zone,
67
- tax_category: tax_category
67
+ tax_categories: [tax_category]
68
68
  end
69
69
 
70
70
  let(:order_address) { foreign_address }
@@ -96,7 +96,7 @@ describe Spree::ShippingRate, type: :model do
96
96
  included_in_price: false,
97
97
  name: "Sales Tax",
98
98
  zone: default_zone,
99
- tax_category: tax_category
99
+ tax_categories: [tax_category]
100
100
  end
101
101
 
102
102
  let(:order_address) { address }
@@ -126,7 +126,7 @@ describe Spree::ShippingRate, type: :model do
126
126
  included_in_price: false,
127
127
  name: "Sales Tax",
128
128
  zone: default_zone,
129
- tax_category: tax_category
129
+ tax_categories: [tax_category]
130
130
  end
131
131
 
132
132
  let!(:other_tax_rate) do
@@ -134,7 +134,7 @@ describe Spree::ShippingRate, type: :model do
134
134
  included_in_price: false,
135
135
  name: "Other Sales Tax",
136
136
  zone: default_zone,
137
- tax_category: tax_category,
137
+ tax_categories: [tax_category],
138
138
  amount: 0.05
139
139
  end
140
140
 
@@ -1,10 +1,37 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Spree::State, type: :model do
4
- it "can find a state by name or abbr" do
5
- state = create(:state, name: "California", abbr: "CA")
6
- expect(Spree::State.find_all_by_name_or_abbr("California")).to include(state)
7
- expect(Spree::State.find_all_by_name_or_abbr("CA")).to include(state)
4
+ describe '.with_name_or_abbr' do
5
+ subject do
6
+ Spree::State.with_name_or_abbr(search_term)
7
+ end
8
+
9
+ let!(:state) { create(:state, name: "California", abbr: "CA") }
10
+
11
+ context 'by invalid term' do
12
+ let(:search_term) { 'NonExistent' }
13
+ it { is_expected.to be_empty }
14
+ end
15
+
16
+ context 'by name' do
17
+ let(:search_term) { 'California' }
18
+ it { is_expected.to include(state) }
19
+ end
20
+
21
+ context 'by abbr' do
22
+ let(:search_term) { 'CA' }
23
+ it { is_expected.to include(state) }
24
+ end
25
+
26
+ context 'by case-insensitive abbr' do
27
+ let(:search_term) { 'CaLiFoRnIa' }
28
+ it { is_expected.to include(state) }
29
+ end
30
+
31
+ context 'by case-insensitive abbr' do
32
+ let(:search_term) { 'cA' }
33
+ it { is_expected.to include(state) }
34
+ end
8
35
  end
9
36
 
10
37
  it "can find all states group by country id" do
@@ -194,6 +194,30 @@ module Spree
194
194
  let(:location_2_inventory) { 5 }
195
195
  it_behaves_like "a fulfillable package"
196
196
  end
197
+
198
+ context "with a location configured package" do
199
+ before do
200
+ order.order_stock_locations.create(
201
+ stock_location: stock_location_2,
202
+ quantity: 3,
203
+ variant: variant
204
+ )
205
+ end
206
+ let(:location_quantity) { 3 }
207
+
208
+ context "and sufficient inventory" do
209
+ let(:location_1_inventory) { 5 }
210
+ let(:location_2_inventory) { 5 }
211
+ it_behaves_like "a fulfillable package"
212
+ end
213
+
214
+ context "and insufficient inventory" do
215
+ let(:location_1_inventory) { 0 }
216
+ let(:location_2_inventory) { 3 }
217
+ before { pending "This is broken. The coordinator packages this incorrectly" }
218
+ it_behaves_like "an unfulfillable package"
219
+ end
220
+ end
197
221
  end
198
222
  end
199
223
 
@@ -145,7 +145,7 @@ module Spree
145
145
  let!(:tax_rate) { create(:tax_rate, zone: zone) }
146
146
 
147
147
  before do
148
- shipping_method.update!(tax_category: tax_rate.tax_category)
148
+ shipping_method.update!(tax_category: tax_rate.tax_categories.first)
149
149
  end
150
150
 
151
151
  it "links the shipping rate and the tax rate" do
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::StoreSelector::ByServerName do
4
+ describe "#store" do
5
+ subject { described_class.new(request).store }
6
+
7
+ context "with a default" do
8
+ let(:request) { double(headers: {}, env: {}) }
9
+ let!(:store_1) { create :store, default: true }
10
+
11
+ it "returns the default store" do
12
+ expect(subject).to eq(store_1)
13
+ end
14
+
15
+ context "with a domain match" do
16
+ let(:request) { double(headers: {}, env: { "SERVER_NAME" => url } ) }
17
+ let(:url) { "server-name.org" }
18
+ let!(:store_2) { create :store, default: false, url: url }
19
+
20
+ it "returns the store with the matching domain" do
21
+ expect(subject).to eq(store_2)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::StoreSelector::Legacy do
4
+ describe "#store" do
5
+ subject { described_class.new(request).store }
6
+
7
+ context "with a default" do
8
+ let(:request) { double(headers: {}, env: {}) }
9
+ let!(:store_1) { create :store, default: true }
10
+
11
+ it "returns the default store" do
12
+ expect(subject).to eq(store_1)
13
+ end
14
+
15
+ context "with a domain match" do
16
+ let(:request) { double(headers: {}, env: { "SERVER_NAME" => url } ) }
17
+ let(:url) { "server-name.org" }
18
+ let!(:store_2) { create :store, default: false, url: url }
19
+
20
+ it "returns the store with the matching domain" do
21
+ expect(subject).to eq(store_2)
22
+ end
23
+
24
+ context 'the store has multiple URLs' do
25
+ let!(:store_2) { create :store, default: false, url: "foo\n#{url}\nbar" }
26
+
27
+ it "returns the store with the matching domain" do
28
+ expect(subject).to eq(store_2)
29
+ end
30
+ end
31
+
32
+ context "with headers" do
33
+ let(:request) { double(headers: { "HTTP_SPREE_STORE" => headers_code }, env: {}) }
34
+ let(:headers_code) { "HEADERS" }
35
+ let!(:store_3) { create :store, code: headers_code, default: false }
36
+
37
+ it "returns the store with the matching code" do
38
+ expect(subject).to eq(store_3)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end