spree_core 3.0.5 → 3.0.6
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/CHANGELOG.md +4 -0
- data/Gemfile +3 -0
- data/Rakefile +30 -0
- data/app/assets/javascripts/spree.js.coffee.erb +1 -1
- data/app/models/spree/ability.rb +1 -1
- data/app/models/spree/base.rb +3 -1
- data/app/models/spree/order_updater.rb +2 -1
- data/app/models/spree/price.rb +7 -12
- data/app/models/spree/product.rb +3 -2
- data/app/models/spree/reimbursement.rb +1 -1
- data/app/models/spree/state.rb +2 -0
- data/app/models/spree/zone.rb +1 -1
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/testing_support/shoulda_matcher_configuration.rb +6 -0
- data/script/rails +9 -0
- data/spec/fixtures/thinking-cat.jpg +0 -0
- data/spec/helpers/base_helper_spec.rb +137 -0
- data/spec/helpers/products_helper_spec.rb +224 -0
- data/spec/lib/calculated_adjustments_spec.rb +7 -0
- data/spec/lib/i18n_spec.rb +123 -0
- data/spec/lib/search/base_spec.rb +86 -0
- data/spec/lib/spree/core/controller_helpers/auth_spec.rb +101 -0
- data/spec/lib/spree/core/controller_helpers/order_spec.rb +95 -0
- data/spec/lib/spree/core/controller_helpers/search_spec.rb +17 -0
- data/spec/lib/spree/core/controller_helpers/store_spec.rb +16 -0
- data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +39 -0
- data/spec/lib/spree/core/delegate_belongs_to_spec.rb +22 -0
- data/spec/lib/spree/core/importer/order_spec.rb +502 -0
- data/spec/lib/spree/core/validators/email_spec.rb +53 -0
- data/spec/lib/spree/localized_number_spec.rb +38 -0
- data/spec/lib/spree/migrations_spec.rb +34 -0
- data/spec/lib/spree/money_spec.rb +122 -0
- data/spec/lib/tasks/exchanges_spec.rb +136 -0
- data/spec/mailers/order_mailer_spec.rb +124 -0
- data/spec/mailers/reimbursement_mailer_spec.rb +47 -0
- data/spec/mailers/shipment_mailer_spec.rb +63 -0
- data/spec/mailers/test_mailer_spec.rb +24 -0
- data/spec/models/spree/ability_spec.rb +246 -0
- data/spec/models/spree/address_spec.rb +291 -0
- data/spec/models/spree/adjustable/adjustments_updater_spec.rb +286 -0
- data/spec/models/spree/adjustment_spec.rb +163 -0
- data/spec/models/spree/app_configuration_spec.rb +23 -0
- data/spec/models/spree/asset_spec.rb +25 -0
- data/spec/models/spree/calculator/default_tax_spec.rb +127 -0
- data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +25 -0
- data/spec/models/spree/calculator/flat_rate_spec.rb +47 -0
- data/spec/models/spree/calculator/flexi_rate_spec.rb +41 -0
- data/spec/models/spree/calculator/percent_on_line_item_spec.rb +15 -0
- data/spec/models/spree/calculator/price_sack_spec.rb +30 -0
- data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +51 -0
- data/spec/models/spree/calculator/shipping.rb +8 -0
- data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +23 -0
- data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +13 -0
- data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +52 -0
- data/spec/models/spree/calculator/shipping/per_item_spec.rb +20 -0
- data/spec/models/spree/calculator/shipping/price_sack_spec.rb +29 -0
- data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +40 -0
- data/spec/models/spree/calculator/tiered_percent_spec.rb +51 -0
- data/spec/models/spree/calculator_spec.rb +69 -0
- data/spec/models/spree/classification_spec.rb +93 -0
- data/spec/models/spree/concerns/display_money_spec.rb +43 -0
- data/spec/models/spree/country_spec.rb +18 -0
- data/spec/models/spree/credit_card_spec.rb +324 -0
- data/spec/models/spree/customer_return_spec.rb +262 -0
- data/spec/models/spree/exchange_spec.rb +75 -0
- data/spec/models/spree/gateway/bogus_simple.rb +20 -0
- data/spec/models/spree/gateway/bogus_spec.rb +13 -0
- data/spec/models/spree/gateway_spec.rb +54 -0
- data/spec/models/spree/image_spec.rb +5 -0
- data/spec/models/spree/inventory_unit_spec.rb +242 -0
- data/spec/models/spree/line_item_spec.rb +267 -0
- data/spec/models/spree/option_type_spec.rb +14 -0
- data/spec/models/spree/option_value_spec.rb +13 -0
- data/spec/models/spree/order/address_spec.rb +50 -0
- data/spec/models/spree/order/adjustments_spec.rb +29 -0
- data/spec/models/spree/order/callbacks_spec.rb +42 -0
- data/spec/models/spree/order/checkout_spec.rb +764 -0
- data/spec/models/spree/order/currency_updater_spec.rb +32 -0
- data/spec/models/spree/order/finalizing_spec.rb +117 -0
- data/spec/models/spree/order/helpers_spec.rb +5 -0
- data/spec/models/spree/order/payment_spec.rb +214 -0
- data/spec/models/spree/order/risk_assessment_spec.rb +84 -0
- data/spec/models/spree/order/shipments_spec.rb +43 -0
- data/spec/models/spree/order/state_machine_spec.rb +216 -0
- data/spec/models/spree/order/tax_spec.rb +84 -0
- data/spec/models/spree/order/totals_spec.rb +24 -0
- data/spec/models/spree/order/updating_spec.rb +18 -0
- data/spec/models/spree/order/validations_spec.rb +15 -0
- data/spec/models/spree/order_contents_spec.rb +256 -0
- data/spec/models/spree/order_inventory_spec.rb +228 -0
- data/spec/models/spree/order_merger_spec.rb +133 -0
- data/spec/models/spree/order_spec.rb +954 -0
- data/spec/models/spree/order_updater_spec.rb +283 -0
- data/spec/models/spree/payment/gateway_options_spec.rb +119 -0
- data/spec/models/spree/payment_method_spec.rb +95 -0
- data/spec/models/spree/payment_spec.rb +926 -0
- data/spec/models/spree/preference_spec.rb +80 -0
- data/spec/models/spree/preferences/configuration_spec.rb +30 -0
- data/spec/models/spree/preferences/preferable_spec.rb +348 -0
- data/spec/models/spree/preferences/scoped_store_spec.rb +58 -0
- data/spec/models/spree/preferences/store_spec.rb +46 -0
- data/spec/models/spree/price_spec.rb +42 -0
- data/spec/models/spree/product/scopes_spec.rb +148 -0
- data/spec/models/spree/product_duplicator_spec.rb +103 -0
- data/spec/models/spree/product_filter_spec.rb +26 -0
- data/spec/models/spree/product_option_type_spec.rb +5 -0
- data/spec/models/spree/product_property_spec.rb +11 -0
- data/spec/models/spree/product_spec.rb +474 -0
- data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +50 -0
- data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +148 -0
- data/spec/models/spree/promotion/actions/create_line_items_spec.rb +86 -0
- data/spec/models/spree/promotion/actions/free_shipping_spec.rb +36 -0
- data/spec/models/spree/promotion/rules/first_order_spec.rb +75 -0
- data/spec/models/spree/promotion/rules/item_total_spec.rb +282 -0
- data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +42 -0
- data/spec/models/spree/promotion/rules/option_value_spec.rb +90 -0
- data/spec/models/spree/promotion/rules/product_spec.rb +143 -0
- data/spec/models/spree/promotion/rules/taxon_spec.rb +102 -0
- data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +27 -0
- data/spec/models/spree/promotion/rules/user_spec.rb +37 -0
- data/spec/models/spree/promotion_action_spec.rb +10 -0
- data/spec/models/spree/promotion_category_spec.rb +17 -0
- data/spec/models/spree/promotion_handler/cart_spec.rb +102 -0
- data/spec/models/spree/promotion_handler/coupon_spec.rb +323 -0
- data/spec/models/spree/promotion_handler/free_shipping_spec.rb +48 -0
- data/spec/models/spree/promotion_handler/page_spec.rb +44 -0
- data/spec/models/spree/promotion_rule_spec.rb +29 -0
- data/spec/models/spree/promotion_spec.rb +603 -0
- data/spec/models/spree/property_spec.rb +5 -0
- data/spec/models/spree/prototype_spec.rb +5 -0
- data/spec/models/spree/refund_spec.rb +195 -0
- data/spec/models/spree/reimbursement/credit_spec.rb +36 -0
- data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +140 -0
- data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +83 -0
- data/spec/models/spree/reimbursement_performer_spec.rb +30 -0
- data/spec/models/spree/reimbursement_spec.rb +215 -0
- data/spec/models/spree/reimbursement_tax_calculator_spec.rb +51 -0
- data/spec/models/spree/reimbursement_type/credit_spec.rb +53 -0
- data/spec/models/spree/reimbursement_type/exchange_spec.rb +46 -0
- data/spec/models/spree/reimbursement_type/original_payment_spec.rb +55 -0
- data/spec/models/spree/return_authorization_spec.rb +250 -0
- data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +77 -0
- data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +58 -0
- data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +61 -0
- data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +32 -0
- data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +29 -0
- data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +35 -0
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +65 -0
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +43 -0
- data/spec/models/spree/return_item_spec.rb +682 -0
- data/spec/models/spree/returns_calculator_spec.rb +14 -0
- data/spec/models/spree/shipment_spec.rb +740 -0
- data/spec/models/spree/shipping_calculator_spec.rb +45 -0
- data/spec/models/spree/shipping_category_spec.rb +5 -0
- data/spec/models/spree/shipping_method_spec.rb +88 -0
- data/spec/models/spree/shipping_rate_spec.rb +141 -0
- data/spec/models/spree/state_spec.rb +18 -0
- data/spec/models/spree/stock/availability_validator_spec.rb +36 -0
- data/spec/models/spree/stock/content_item_spec.rb +22 -0
- data/spec/models/spree/stock/coordinator_spec.rb +51 -0
- data/spec/models/spree/stock/differentiator_spec.rb +39 -0
- data/spec/models/spree/stock/estimator_spec.rb +154 -0
- data/spec/models/spree/stock/inventory_unit_builder_spec.rb +38 -0
- data/spec/models/spree/stock/package_spec.rb +194 -0
- data/spec/models/spree/stock/packer_spec.rb +70 -0
- data/spec/models/spree/stock/prioritizer_spec.rb +125 -0
- data/spec/models/spree/stock/quantifier_spec.rb +97 -0
- data/spec/models/spree/stock/splitter/backordered_spec.rb +29 -0
- data/spec/models/spree/stock/splitter/base_spec.rb +21 -0
- data/spec/models/spree/stock/splitter/shipping_category_spec.rb +47 -0
- data/spec/models/spree/stock/splitter/weight_spec.rb +32 -0
- data/spec/models/spree/stock_item_spec.rb +410 -0
- data/spec/models/spree/stock_location_spec.rb +243 -0
- data/spec/models/spree/stock_movement_spec.rb +56 -0
- data/spec/models/spree/stock_transfer_spec.rb +50 -0
- data/spec/models/spree/store_spec.rb +50 -0
- data/spec/models/spree/tax_category_spec.rb +27 -0
- data/spec/models/spree/tax_rate_spec.rb +382 -0
- data/spec/models/spree/taxon_spec.rb +74 -0
- data/spec/models/spree/taxonomy_spec.rb +18 -0
- data/spec/models/spree/tracker_spec.rb +21 -0
- data/spec/models/spree/user_spec.rb +130 -0
- data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +24 -0
- data/spec/models/spree/variant_spec.rb +523 -0
- data/spec/models/spree/zone_spec.rb +444 -0
- data/spec/spec_helper.rb +74 -0
- data/spec/support/big_decimal.rb +5 -0
- data/spec/support/concerns/adjustment_source_spec.rb +23 -0
- data/spec/support/concerns/default_price_spec.rb +28 -0
- data/spec/support/rake.rb +13 -0
- data/spec/support/test_gateway.rb +2 -0
- data/spree_core.gemspec +48 -0
- metadata +185 -4
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::Preferences::ScopedStore, :type => :model do
|
|
4
|
+
let(:scoped_store){ described_class.new(prefix, suffix) }
|
|
5
|
+
subject{ scoped_store }
|
|
6
|
+
let(:prefix){ nil }
|
|
7
|
+
let(:suffix){ nil }
|
|
8
|
+
|
|
9
|
+
describe '#store' do
|
|
10
|
+
subject{ scoped_store.store }
|
|
11
|
+
it{ is_expected.to be Spree::Preferences::Store.instance }
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
context 'stubbed store' do
|
|
15
|
+
let(:store){ double(:store) }
|
|
16
|
+
before do
|
|
17
|
+
allow(scoped_store).to receive(:store).and_return(store)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
context "with a prefix" do
|
|
21
|
+
let(:prefix){ 'my_class' }
|
|
22
|
+
|
|
23
|
+
it "can fetch" do
|
|
24
|
+
expect(store).to receive(:fetch).with('my_class/attr')
|
|
25
|
+
scoped_store.fetch('attr'){ 'default' }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "can assign" do
|
|
29
|
+
expect(store).to receive(:[]=).with('my_class/attr', 'val')
|
|
30
|
+
scoped_store['attr'] = 'val'
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "can delete" do
|
|
34
|
+
expect(store).to receive(:delete).with('my_class/attr')
|
|
35
|
+
scoped_store.delete('attr')
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
context "and suffix" do
|
|
39
|
+
let(:suffix){ 123 }
|
|
40
|
+
|
|
41
|
+
it "can fetch" do
|
|
42
|
+
expect(store).to receive(:fetch).with('my_class/attr/123')
|
|
43
|
+
scoped_store.fetch('attr'){ 'default' }
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "can assign" do
|
|
47
|
+
expect(store).to receive(:[]=).with('my_class/attr/123', 'val')
|
|
48
|
+
scoped_store['attr'] = 'val'
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "can delete" do
|
|
52
|
+
expect(store).to receive(:delete).with('my_class/attr/123')
|
|
53
|
+
scoped_store.delete('attr')
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::Preferences::Store, :type => :model do
|
|
4
|
+
before :each do
|
|
5
|
+
@store = Spree::Preferences::StoreInstance.new
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it "sets and gets a key" do
|
|
9
|
+
@store.set :test, 1
|
|
10
|
+
expect(@store.exist?(:test)).to be true
|
|
11
|
+
expect(@store.get(:test)).to eq 1
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "can set and get false values when cache return nil" do
|
|
15
|
+
@store.set :test, false
|
|
16
|
+
expect(@store.get(:test)).to be false
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "will return db value when cache is emtpy and cache the db value" do
|
|
20
|
+
preference = Spree::Preference.where(:key => 'test').first_or_initialize
|
|
21
|
+
preference.value = '123'
|
|
22
|
+
preference.save
|
|
23
|
+
|
|
24
|
+
Rails.cache.clear
|
|
25
|
+
expect(@store.get(:test)).to eq '123'
|
|
26
|
+
expect(Rails.cache.read(:test)).to eq '123'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "should return and cache fallback value when supplied" do
|
|
30
|
+
Rails.cache.clear
|
|
31
|
+
expect(@store.get(:test){ false }).to be false
|
|
32
|
+
expect(Rails.cache.read(:test)).to be false
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "should return but not cache fallback value when persistence is disabled" do
|
|
36
|
+
Rails.cache.clear
|
|
37
|
+
allow(@store).to receive_messages(:should_persist? => false)
|
|
38
|
+
expect(@store.get(:test){ true }).to be true
|
|
39
|
+
expect(Rails.cache.exist?(:test)).to be false
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "should return nil when key can't be found and fallback value is not supplied" do
|
|
43
|
+
expect(@store.get(:random_key){ nil }).to be_nil
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::Price, :type => :model do
|
|
4
|
+
describe 'validations' do
|
|
5
|
+
let(:variant) { stub_model Spree::Variant }
|
|
6
|
+
subject { Spree::Price.new variant: variant, amount: amount }
|
|
7
|
+
|
|
8
|
+
context 'when the amount is nil' do
|
|
9
|
+
let(:amount) { nil }
|
|
10
|
+
it { is_expected.to be_valid }
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
context 'when the amount is less than 0' do
|
|
14
|
+
let(:amount) { -1 }
|
|
15
|
+
|
|
16
|
+
it 'has 1 error_on' do
|
|
17
|
+
expect(subject.error_on(:amount).size).to eq(1)
|
|
18
|
+
end
|
|
19
|
+
it 'populates errors' do
|
|
20
|
+
subject.valid?
|
|
21
|
+
expect(subject.errors.messages[:amount].first).to eq 'must be greater than or equal to 0'
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
context 'when the amount is greater than maximum amount' do
|
|
26
|
+
let(:amount) { Spree::Price::MAXIMUM_AMOUNT + 1 }
|
|
27
|
+
|
|
28
|
+
it 'has 1 error_on' do
|
|
29
|
+
expect(subject.error_on(:amount).size).to eq(1)
|
|
30
|
+
end
|
|
31
|
+
it 'populates errors' do
|
|
32
|
+
subject.valid?
|
|
33
|
+
expect(subject.errors.messages[:amount].first).to eq "must be less than or equal to #{Spree::Price::MAXIMUM_AMOUNT}"
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
context 'when the amount is between 0 and the maximum amount' do
|
|
38
|
+
let(:amount) { Spree::Price::MAXIMUM_AMOUNT }
|
|
39
|
+
it { is_expected.to be_valid }
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe "Product scopes", :type => :model do
|
|
4
|
+
let!(:product) { create(:product) }
|
|
5
|
+
|
|
6
|
+
context "A product assigned to parent and child taxons" do
|
|
7
|
+
before do
|
|
8
|
+
@taxonomy = create(:taxonomy)
|
|
9
|
+
@root_taxon = @taxonomy.root
|
|
10
|
+
|
|
11
|
+
@parent_taxon = create(:taxon, :name => 'Parent', :taxonomy_id => @taxonomy.id, :parent => @root_taxon)
|
|
12
|
+
@child_taxon = create(:taxon, :name =>'Child 1', :taxonomy_id => @taxonomy.id, :parent => @parent_taxon)
|
|
13
|
+
@parent_taxon.reload # Need to reload for descendents to show up
|
|
14
|
+
|
|
15
|
+
product.taxons << @parent_taxon
|
|
16
|
+
product.taxons << @child_taxon
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "calling Product.in_taxon returns products in child taxons" do
|
|
20
|
+
product.taxons -= [@child_taxon]
|
|
21
|
+
expect(product.taxons.count).to eq(1)
|
|
22
|
+
|
|
23
|
+
expect(Spree::Product.in_taxon(@parent_taxon)).to include(product)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "calling Product.in_taxon should not return duplicate records" do
|
|
27
|
+
expect(Spree::Product.in_taxon(@parent_taxon).to_a.count).to eq(1)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
context 'orders products based on their ordering within the classifications' do
|
|
31
|
+
let(:other_taxon) { create(:taxon, products: [product]) }
|
|
32
|
+
let!(:product_2) { create(:product, taxons: [@child_taxon, other_taxon]) }
|
|
33
|
+
|
|
34
|
+
it 'by initial ordering' do
|
|
35
|
+
expect(Spree::Product.in_taxon(@child_taxon)).to eq([product, product_2])
|
|
36
|
+
expect(Spree::Product.in_taxon(other_taxon)).to eq([product, product_2])
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it 'after ordering changed' do
|
|
40
|
+
[@child_taxon, other_taxon].each do |taxon|
|
|
41
|
+
Spree::Classification.find_by(:taxon => taxon, :product => product).insert_at(2)
|
|
42
|
+
expect(Spree::Product.in_taxon(taxon)).to eq([product_2, product])
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
context "property scopes" do
|
|
49
|
+
let(:name) { "A proper tee" }
|
|
50
|
+
let(:value) { "A proper value"}
|
|
51
|
+
let!(:property) { create(:property, name: name)}
|
|
52
|
+
|
|
53
|
+
before do
|
|
54
|
+
product.properties << property
|
|
55
|
+
product.product_properties.find_by(property: property).update_column(:value, value)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
context "with_property" do
|
|
59
|
+
let(:with_property) { Spree::Product.method(:with_property) }
|
|
60
|
+
it "finds by a property's name" do
|
|
61
|
+
expect(with_property.(name).count).to eq(1)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it "doesn't find any properties with an unknown name" do
|
|
65
|
+
expect(with_property.("fake").count).to eq(0)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it "finds by a property" do
|
|
69
|
+
expect(with_property.(property).count).to eq(1)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it "finds by an id" do
|
|
73
|
+
expect(with_property.(property.id).count).to eq(1)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it "cannot find a property with an unknown id" do
|
|
77
|
+
expect(with_property.(0).count).to eq(0)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
context "with_property_value" do
|
|
82
|
+
let(:with_property_value) { Spree::Product.method(:with_property_value) }
|
|
83
|
+
it "finds by a property's name" do
|
|
84
|
+
expect(with_property_value.(name, value).count).to eq(1)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it "cannot find by an unknown property's name" do
|
|
88
|
+
expect(with_property_value.("fake", value).count).to eq(0)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it "cannot find with a name by an incorrect value" do
|
|
92
|
+
expect(with_property_value.(name, "fake").count).to eq(0)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it "finds by a property" do
|
|
96
|
+
expect(with_property_value.(property, value).count).to eq(1)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
it "cannot find with a property by an incorrect value" do
|
|
100
|
+
expect(with_property_value.(property, "fake").count).to eq(0)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it "finds by an id with a value" do
|
|
104
|
+
expect(with_property_value.(property.id, value).count).to eq(1)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it "cannot find with an invalid id" do
|
|
108
|
+
expect(with_property_value.(0, value).count).to eq(0)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
it "cannot find with an invalid value" do
|
|
112
|
+
expect(with_property_value.(property.id, "fake").count).to eq(0)
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
context '#add_simple_scopes' do
|
|
118
|
+
let(:simple_scopes) { [:ascend_by_updated_at, :descend_by_name] }
|
|
119
|
+
|
|
120
|
+
before do
|
|
121
|
+
Spree::Product.add_simple_scopes(simple_scopes)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
context 'define scope' do
|
|
125
|
+
context 'ascend_by_updated_at' do
|
|
126
|
+
context 'on class' do
|
|
127
|
+
it { expect(Spree::Product.ascend_by_updated_at.to_sql).to eq Spree::Product.order("#{Spree::Product.quoted_table_name}.updated_at ASC").to_sql }
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
context 'on ActiveRecord::Relation' do
|
|
131
|
+
it { expect(Spree::Product.limit(2).ascend_by_updated_at.to_sql).to eq Spree::Product.limit(2).order("#{Spree::Product.quoted_table_name}.updated_at ASC").to_sql }
|
|
132
|
+
it { expect(Spree::Product.limit(2).ascend_by_updated_at.to_sql).to eq Spree::Product.ascend_by_updated_at.limit(2).to_sql }
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
context 'descend_by_name' do
|
|
137
|
+
context 'on class' do
|
|
138
|
+
it { expect(Spree::Product.descend_by_name.to_sql).to eq Spree::Product.order("#{Spree::Product.quoted_table_name}.name DESC").to_sql }
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
context 'on ActiveRecord::Relation' do
|
|
142
|
+
it { expect(Spree::Product.limit(2).descend_by_name.to_sql).to eq Spree::Product.limit(2).order("#{Spree::Product.quoted_table_name}.name DESC").to_sql }
|
|
143
|
+
it { expect(Spree::Product.limit(2).descend_by_name.to_sql).to eq Spree::Product.descend_by_name.limit(2).to_sql }
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module Spree
|
|
4
|
+
|
|
5
|
+
describe Spree::ProductDuplicator, :type => :model do
|
|
6
|
+
|
|
7
|
+
let(:product) { create(:product, properties: [create(:property, name: "MyProperty")])}
|
|
8
|
+
let!(:duplicator) { Spree::ProductDuplicator.new(product)}
|
|
9
|
+
|
|
10
|
+
let(:image) { File.open(File.expand_path('../../../fixtures/thinking-cat.jpg', __FILE__)) }
|
|
11
|
+
let(:params) { {:viewable_id => product.master.id, :viewable_type => 'Spree::Variant', :attachment => image, :alt => "position 1", :position => 1} }
|
|
12
|
+
|
|
13
|
+
before do
|
|
14
|
+
Spree::Image.create(params)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "will duplicate the product" do
|
|
18
|
+
expect{duplicator.duplicate}.to change{Spree::Product.count}.by(1)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
context 'when image duplication enabled' do
|
|
22
|
+
|
|
23
|
+
it "will duplicate the product images" do
|
|
24
|
+
expect{duplicator.duplicate}.to change{Spree::Image.count}.by(1)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
context 'when image duplication disabled' do
|
|
30
|
+
|
|
31
|
+
let!(:duplicator) { Spree::ProductDuplicator.new(product, false) }
|
|
32
|
+
|
|
33
|
+
it "will not duplicate the product images" do
|
|
34
|
+
expect{duplicator.duplicate}.to change{Spree::Image.count}.by(0)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
context 'image duplication default' do
|
|
40
|
+
|
|
41
|
+
context 'when default is set to true' do
|
|
42
|
+
|
|
43
|
+
it 'clones images if no flag passed to initializer' do
|
|
44
|
+
expect{duplicator.duplicate}.to change{Spree::Image.count}.by(1)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
context 'when default is set to false' do
|
|
50
|
+
|
|
51
|
+
before do
|
|
52
|
+
ProductDuplicator.clone_images_default = false
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
after do
|
|
56
|
+
ProductDuplicator.clone_images_default = true
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it 'does not clone images if no flag passed to initializer' do
|
|
60
|
+
expect{ProductDuplicator.new(product).duplicate}.to change{Spree::Image.count}.by(0)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
context "product attributes" do
|
|
68
|
+
let!(:new_product) {duplicator.duplicate}
|
|
69
|
+
|
|
70
|
+
it "will set an unique name" do
|
|
71
|
+
expect(new_product.name).to eql "COPY OF #{product.name}"
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it "will set an unique sku" do
|
|
75
|
+
expect(new_product.sku).to include "COPY OF SKU"
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "copied the properties" do
|
|
79
|
+
expect(new_product.product_properties.count).to be 1
|
|
80
|
+
expect(new_product.product_properties.first.property.name).to eql "MyProperty"
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
context "with variants" do
|
|
85
|
+
let(:option_type) { create(:option_type, name: "MyOptionType")}
|
|
86
|
+
let(:option_value1) { create(:option_value, name: "OptionValue1", option_type: option_type)}
|
|
87
|
+
let(:option_value2) { create(:option_value, name: "OptionValue2", option_type: option_type)}
|
|
88
|
+
|
|
89
|
+
let!(:variant1) { create(:variant, product: product, option_values: [option_value1]) }
|
|
90
|
+
let!(:variant2) { create(:variant, product: product, option_values: [option_value2]) }
|
|
91
|
+
|
|
92
|
+
it "will duplciate the variants" do
|
|
93
|
+
# will change the count by 3, since there will be a master variant as well
|
|
94
|
+
expect{duplicator.duplicate}.to change{Spree::Variant.count}.by(3)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "will not duplicate the option values" do
|
|
98
|
+
expect{duplicator.duplicate}.to change{Spree::OptionValue.count}.by(0)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'spree/core/product_filters'
|
|
3
|
+
|
|
4
|
+
describe 'product filters', :type => :model do
|
|
5
|
+
# Regression test for #1709
|
|
6
|
+
context 'finds products filtered by brand' do
|
|
7
|
+
let(:product) { create(:product) }
|
|
8
|
+
before do
|
|
9
|
+
property = Spree::Property.create!(:name => "brand", :presentation => "brand")
|
|
10
|
+
product.set_property("brand", "Nike")
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "does not attempt to call value method on Arel::Table" do
|
|
14
|
+
expect { Spree::Core::ProductFilters.brand_filter }.not_to raise_error
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "can find products in the 'Nike' brand" do
|
|
18
|
+
expect(Spree::Product.brand_any("Nike")).to include(product)
|
|
19
|
+
end
|
|
20
|
+
it "sorts products without brand specified" do
|
|
21
|
+
product.set_property("brand", "Nike")
|
|
22
|
+
create(:product).set_property("brand", nil)
|
|
23
|
+
expect { Spree::Core::ProductFilters.brand_filter[:labels] }.not_to raise_error
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|