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.
- checksums.yaml +4 -4
- data/README.md +4 -7
- data/app/assets/javascripts/spree.js.erb +2 -2
- data/app/helpers/spree/base_helper.rb +3 -4
- data/app/models/spree/address.rb +1 -1
- data/app/models/spree/adjustment.rb +3 -1
- data/app/models/spree/app_configuration.rb +43 -0
- data/app/models/spree/billing_integration.rb +2 -2
- data/app/models/spree/calculator/default_tax.rb +3 -1
- data/app/models/spree/calculator/distributed_amount.rb +24 -0
- data/app/models/spree/calculator/free_shipping.rb +0 -1
- data/app/models/spree/calculator/tiered_flat_rate.rb +17 -3
- data/app/models/spree/calculator/tiered_percent.rb +18 -3
- data/app/models/spree/distributed_amounts_handler.rb +43 -0
- data/app/models/spree/gateway/bogus.rb +7 -83
- data/app/models/spree/gateway/bogus_simple.rb +7 -20
- data/app/models/spree/gateway.rb +8 -58
- data/app/models/spree/image.rb +1 -1
- data/app/models/spree/line_item.rb +1 -1
- data/app/models/spree/option_value.rb +1 -1
- data/app/models/spree/order/checkout.rb +1 -4
- data/app/models/spree/order/number_generator.rb +43 -0
- data/app/models/spree/order.rb +33 -38
- data/app/models/spree/order_contents.rb +1 -1
- data/app/models/spree/order_taxation.rb +79 -0
- data/app/models/spree/order_update_attributes.rb +0 -2
- data/app/models/spree/order_updater.rb +55 -33
- data/app/models/spree/payment.rb +0 -1
- data/app/models/spree/payment_method/bogus_credit_card.rb +87 -0
- data/app/models/spree/payment_method/check.rb +14 -6
- data/app/models/spree/payment_method/credit_card.rb +41 -0
- data/app/models/spree/payment_method/simple_bogus_credit_card.rb +24 -0
- data/app/models/spree/payment_method/store_credit.rb +5 -13
- data/app/models/spree/payment_method.rb +126 -40
- data/app/models/spree/preferences/preferable.rb +5 -1
- data/app/models/spree/preferences/store.rb +2 -2
- data/app/models/spree/product/scopes.rb +14 -1
- data/app/models/spree/product.rb +10 -4
- data/app/models/spree/promotion_action.rb +4 -0
- data/app/models/spree/promotion_code/batch_builder.rb +3 -2
- data/app/models/spree/promotion_rule.rb +4 -0
- data/app/models/spree/role.rb +2 -0
- data/app/models/spree/role_user.rb +2 -0
- data/app/models/spree/shipment.rb +4 -2
- data/app/models/spree/shipping_method.rb +3 -1
- data/app/models/spree/shipping_rate.rb +1 -1
- data/app/models/spree/state.rb +10 -2
- data/app/models/spree/stock_item.rb +3 -3
- data/app/models/spree/store.rb +5 -0
- data/app/models/spree/store_credit.rb +2 -2
- data/app/models/spree/store_credit_event.rb +1 -1
- data/app/models/spree/store_selector/by_server_name.rb +30 -0
- data/app/models/spree/store_selector/legacy.rb +48 -0
- data/app/models/spree/tax/item_tax.rb +20 -0
- data/app/models/spree/tax/order_adjuster.rb +2 -14
- data/app/models/spree/tax/order_tax.rb +18 -0
- data/app/models/spree/tax/shipping_rate_taxer.rb +4 -13
- data/app/models/spree/tax/tax_helpers.rb +5 -3
- data/app/models/spree/tax_calculator/default.rb +83 -0
- data/app/models/spree/tax_calculator/shipping_rate.rb +46 -0
- data/app/models/spree/tax_category.rb +9 -1
- data/app/models/spree/tax_rate.rb +31 -7
- data/app/models/spree/tax_rate_tax_category.rb +6 -0
- data/app/models/spree/taxon.rb +1 -1
- data/app/models/spree/variant.rb +1 -1
- data/app/views/spree/{shipment_mailer → carton_mailer}/shipped_email.html.erb +3 -3
- data/app/views/spree/order_mailer/cancel_email.html.erb +3 -3
- data/app/views/spree/order_mailer/confirm_email.html.erb +2 -2
- data/app/views/spree/order_mailer/inventory_cancellation_email.html.erb +26 -0
- data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +2 -2
- data/app/views/spree/test_mailer/test_email.html.erb +2 -2
- data/config/locales/en.yml +66 -57
- data/db/default/spree/refund_reasons.rb +1 -0
- data/db/default/spree/shipping_categories.rb +1 -0
- data/db/default/spree/stock_locations.rb +2 -0
- data/db/default/spree/stores.rb +3 -4
- data/db/migrate/20170412103617_transform_tax_rate_category_relation.rb +48 -0
- data/db/migrate/20170422134804_add_roles_unique_constraints.rb +6 -0
- data/db/migrate/20170522143442_add_time_range_to_tax_rate.rb +6 -0
- data/db/migrate/20170608074534_rename_bogus_gateways.rb +13 -0
- data/lib/generators/spree/custom_user/custom_user_generator.rb +1 -1
- data/lib/generators/spree/dummy/dummy_generator.rb +10 -4
- data/lib/generators/spree/dummy/templates/rails/database.yml +12 -12
- data/lib/generators/spree/install/install_generator.rb +5 -5
- data/lib/generators/spree/install/templates/config/initializers/{spree.rb → solidus.rb} +0 -0
- data/lib/solidus/migrations/rename_gateways.rb +39 -0
- data/lib/spree/core/controller_helpers/auth.rb +1 -1
- data/lib/spree/core/controller_helpers/order.rb +10 -5
- data/lib/spree/core/controller_helpers/store.rb +1 -9
- data/lib/spree/core/current_store.rb +6 -14
- data/lib/spree/core/engine.rb +4 -3
- data/lib/spree/core/importer/order.rb +4 -4
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/core.rb +0 -1
- data/lib/spree/localized_number.rb +2 -1
- data/lib/spree/permitted_attributes.rb +12 -6
- data/lib/spree/testing_support/capybara_ext.rb +0 -1
- data/lib/spree/testing_support/factories/adjustment_factory.rb +5 -1
- data/lib/spree/testing_support/factories/order_factory.rb +26 -24
- data/lib/spree/testing_support/factories/payment_factory.rb +4 -0
- data/lib/spree/testing_support/factories/payment_method_factory.rb +3 -3
- data/lib/spree/testing_support/factories/shipment_factory.rb +7 -3
- data/lib/spree/testing_support/factories/tax_rate_factory.rb +1 -1
- data/lib/spree/testing_support/factories/variant_factory.rb +3 -1
- data/lib/tasks/migrations/copy_order_bill_address_to_credit_card.rake +0 -4
- data/lib/tasks/migrations/migrate_user_addresses.rake +2 -2
- data/lib/tasks/migrations/rename_gateways.rake +19 -0
- data/solidus_core.gemspec +2 -3
- data/spec/lib/spree/core/controller_helpers/order_spec.rb +32 -6
- data/spec/lib/spree/core/controller_helpers/payment_parameters_spec.rb +0 -1
- data/spec/lib/spree/core/current_store_spec.rb +6 -11
- data/spec/lib/spree/core/price_migrator_spec.rb +4 -4
- data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +199 -91
- data/spec/lib/spree/core/testing_support/factories/variant_factory_spec.rb +18 -0
- data/spec/lib/spree/localized_number_spec.rb +6 -0
- data/spec/mailers/carton_mailer_spec.rb +3 -3
- data/spec/models/spree/address_spec.rb +3 -3
- data/spec/models/spree/adjustment_spec.rb +71 -27
- data/spec/models/spree/calculator/default_tax_spec.rb +72 -1
- data/spec/models/spree/calculator/distributed_amount_spec.rb +32 -0
- data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +20 -1
- data/spec/models/spree/calculator/tiered_percent_spec.rb +20 -1
- data/spec/models/spree/distributed_amounts_handler_spec.rb +79 -0
- data/spec/models/spree/gateway/bogus_simple.rb +7 -13
- data/spec/models/spree/gateway/bogus_spec.rb +8 -4
- data/spec/models/spree/gateway_spec.rb +6 -105
- data/spec/models/spree/image_spec.rb +23 -0
- data/spec/models/spree/order/checkout_spec.rb +3 -18
- data/spec/models/spree/order/number_generator_spec.rb +45 -0
- data/spec/models/spree/order/outstanding_balance_integration_spec.rb +135 -0
- data/spec/models/spree/order/payment_spec.rb +7 -2
- data/spec/models/spree/order/state_machine_spec.rb +4 -2
- data/spec/models/spree/order_capturing_spec.rb +8 -8
- data/spec/models/spree/order_contents_spec.rb +8 -1
- data/spec/models/spree/order_shipping_spec.rb +5 -1
- data/spec/models/spree/order_spec.rb +156 -83
- data/spec/models/spree/order_taxation_spec.rb +126 -0
- data/spec/models/spree/order_update_attributes_spec.rb +1 -5
- data/spec/models/spree/order_updater_spec.rb +20 -21
- data/spec/models/spree/payment_create_spec.rb +14 -6
- data/spec/models/spree/payment_method/bogus_credit_card_spec.rb +8 -0
- data/spec/models/spree/payment_method/check_spec.rb +78 -0
- data/spec/models/spree/payment_method/credit_card_spec.rb +66 -0
- data/spec/models/spree/payment_method/simple_bogus_credit_card_spec.rb +18 -0
- data/spec/models/spree/payment_method_spec.rb +47 -2
- data/spec/models/spree/payment_spec.rb +6 -8
- data/spec/models/spree/preference_spec.rb +1 -1
- data/spec/models/spree/price_spec.rb +1 -1
- data/spec/models/spree/product/scopes_spec.rb +46 -0
- data/spec/models/spree/promotion_action_spec.rb +4 -0
- data/spec/models/spree/promotion_code/batch_builder_spec.rb +25 -3
- data/spec/models/spree/promotion_code_batch_spec.rb +0 -6
- data/spec/models/spree/promotion_handler/coupon_spec.rb +1 -1
- data/spec/models/spree/promotion_rule_spec.rb +5 -0
- data/spec/models/spree/reimbursement_type/original_payment_spec.rb +1 -1
- data/spec/models/spree/shipment_spec.rb +24 -3
- data/spec/models/spree/shipping_rate_spec.rb +5 -5
- data/spec/models/spree/state_spec.rb +31 -4
- data/spec/models/spree/stock/coordinator_spec.rb +24 -0
- data/spec/models/spree/stock/estimator_spec.rb +1 -1
- data/spec/models/spree/store_selector/by_server_name_spec.rb +26 -0
- data/spec/models/spree/store_selector/legacy_spec.rb +44 -0
- data/spec/models/spree/store_spec.rb +10 -2
- data/spec/models/spree/tax/order_adjuster_spec.rb +11 -21
- data/spec/models/spree/tax/shipping_rate_taxer_spec.rb +10 -3
- data/spec/models/spree/tax/taxation_integration_spec.rb +43 -8
- data/spec/models/spree/tax_calculator/default_spec.rb +54 -0
- data/spec/models/spree/tax_rate_spec.rb +92 -0
- data/spec/models/spree/variant/vat_price_generator_spec.rb +4 -4
- data/spec/models/spree/variant_spec.rb +8 -2
- data/spec/spec_helper.rb +2 -1
- data/spec/support/test_gateway.rb +1 -1
- metadata +45 -24
- data/app/models/spree/tax/item_adjuster.rb +0 -51
- 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::
|
|
184
|
-
def
|
|
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::
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
750
|
+
Spree::PaymentCreate.new(order, amount: 2).build.save!
|
|
753
751
|
end
|
|
754
752
|
|
|
755
753
|
it 'should not have stale payments' 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,
|
|
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
|
|
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
|
-
|
|
57
|
-
|
|
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,
|
|
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))
|
|
@@ -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::
|
|
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,
|
|
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,
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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.
|
|
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
|