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
@@ -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