solidus_core 1.0.2 → 1.0.3
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 +1 -0
- data/Gemfile +3 -0
- data/Rakefile +16 -0
- data/script/rails +9 -0
- data/solidus_core.gemspec +48 -0
- data/spec/fixtures/thinking-cat.jpg +0 -0
- data/spec/helpers/base_helper_spec.rb +173 -0
- data/spec/helpers/order_helper_spec.rb +12 -0
- data/spec/helpers/products_helper_spec.rb +220 -0
- data/spec/helpers/taxons_helper_spec.rb +17 -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/search/variant_spec.rb +92 -0
- data/spec/lib/spree/core/controller_helpers/auth_spec.rb +66 -0
- data/spec/lib/spree/core/controller_helpers/order_spec.rb +92 -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/current_store_spec.rb +36 -0
- data/spec/lib/spree/core/delegate_belongs_to_spec.rb +22 -0
- data/spec/lib/spree/core/importer/order_spec.rb +431 -0
- data/spec/lib/spree/core/role_configuration_spec.rb +138 -0
- data/spec/lib/spree/core/validators/email_spec.rb +48 -0
- data/spec/lib/spree/localized_number_spec.rb +38 -0
- data/spec/lib/spree/migrations_spec.rb +36 -0
- data/spec/lib/spree/money_spec.rb +127 -0
- data/spec/lib/tasks/exchanges_spec.rb +231 -0
- data/spec/lib/tasks/migrations/copy_shipped_shipments_to_cartons_spec.rb +115 -0
- data/spec/lib/tasks/order_capturing_spec.rb +56 -0
- data/spec/mailers/carton_mailer_spec.rb +43 -0
- data/spec/mailers/order_mailer_spec.rb +122 -0
- data/spec/mailers/reimbursement_mailer_spec.rb +40 -0
- data/spec/mailers/test_mailer_spec.rb +15 -0
- data/spec/models/spree/ability_spec.rb +276 -0
- data/spec/models/spree/address_spec.rb +250 -0
- data/spec/models/spree/adjustment_reason_spec.rb +13 -0
- data/spec/models/spree/adjustment_spec.rb +177 -0
- data/spec/models/spree/app_configuration_spec.rb +20 -0
- data/spec/models/spree/asset_spec.rb +24 -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/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 +30 -0
- data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +36 -0
- data/spec/models/spree/calculator/tiered_percent_spec.rb +47 -0
- data/spec/models/spree/calculator_spec.rb +36 -0
- data/spec/models/spree/carton_spec.rb +133 -0
- data/spec/models/spree/classification_spec.rb +15 -0
- data/spec/models/spree/concerns/display_money_spec.rb +43 -0
- data/spec/models/spree/concerns/user_methods_spec.rb +41 -0
- data/spec/models/spree/credit_card_spec.rb +334 -0
- data/spec/models/spree/customer_return_spec.rb +276 -0
- data/spec/models/spree/exchange_spec.rb +79 -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 +82 -0
- data/spec/models/spree/inventory_unit_spec.rb +307 -0
- data/spec/models/spree/item_adjustments_spec.rb +256 -0
- data/spec/models/spree/line_item_spec.rb +191 -0
- data/spec/models/spree/option_type_spec.rb +14 -0
- data/spec/models/spree/option_value_spec.rb +22 -0
- data/spec/models/spree/order/address_spec.rb +50 -0
- data/spec/models/spree/order/adjustments_spec.rb +39 -0
- data/spec/models/spree/order/callbacks_spec.rb +42 -0
- data/spec/models/spree/order/checkout_spec.rb +902 -0
- data/spec/models/spree/order/currency_updater_spec.rb +32 -0
- data/spec/models/spree/order/finalizing_spec.rb +111 -0
- data/spec/models/spree/order/payment_spec.rb +210 -0
- data/spec/models/spree/order/risk_assessment_spec.rb +68 -0
- data/spec/models/spree/order/state_machine_spec.rb +221 -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_cancellations_spec.rb +120 -0
- data/spec/models/spree/order_capturing_spec.rb +116 -0
- data/spec/models/spree/order_contents_spec.rb +265 -0
- data/spec/models/spree/order_inventory_spec.rb +228 -0
- data/spec/models/spree/order_mutex_spec.rb +85 -0
- data/spec/models/spree/order_promotion_spec.rb +31 -0
- data/spec/models/spree/order_shipping_spec.rb +247 -0
- data/spec/models/spree/order_spec.rb +1412 -0
- data/spec/models/spree/order_stock_location_spec.rb +18 -0
- data/spec/models/spree/order_updater_spec.rb +299 -0
- data/spec/models/spree/payment_method/store_credit_spec.rb +294 -0
- data/spec/models/spree/payment_method_spec.rb +96 -0
- data/spec/models/spree/payment_spec.rb +1044 -0
- data/spec/models/spree/permission_sets/base_spec.rb +12 -0
- data/spec/models/spree/permission_sets/configuration_display.rb +82 -0
- data/spec/models/spree/permission_sets/configuration_management_spec.rb +50 -0
- data/spec/models/spree/permission_sets/dashboard_display_spec.rb +22 -0
- data/spec/models/spree/permission_sets/order_display_spec.rb +49 -0
- data/spec/models/spree/permission_sets/order_management_spec.rb +36 -0
- data/spec/models/spree/permission_sets/product_display_spec.rb +60 -0
- data/spec/models/spree/permission_sets/product_management_spec.rb +40 -0
- data/spec/models/spree/permission_sets/promotion_display_spec.rb +34 -0
- data/spec/models/spree/permission_sets/promotion_management_spec.rb +26 -0
- data/spec/models/spree/permission_sets/report_display_spec.rb +24 -0
- data/spec/models/spree/permission_sets/restricted_transfer_management_spec.rb +132 -0
- data/spec/models/spree/permission_sets/stock_display_spec.rb +26 -0
- data/spec/models/spree/permission_sets/stock_management_spec.rb +24 -0
- data/spec/models/spree/permission_sets/user_display_spec.rb +36 -0
- data/spec/models/spree/permission_sets/user_management_spec.rb +28 -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 +294 -0
- data/spec/models/spree/preferences/scoped_store_spec.rb +58 -0
- data/spec/models/spree/preferences/static_model_preferences_spec.rb +78 -0
- data/spec/models/spree/preferences/statically_configurable_spec.rb +60 -0
- data/spec/models/spree/preferences/store_spec.rb +39 -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_property_spec.rb +20 -0
- data/spec/models/spree/product_spec.rb +437 -0
- data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +96 -0
- data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +165 -0
- data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +115 -0
- data/spec/models/spree/promotion/actions/free_shipping_spec.rb +40 -0
- data/spec/models/spree/promotion/rules/first_order_spec.rb +75 -0
- data/spec/models/spree/promotion/rules/item_total_spec.rb +67 -0
- data/spec/models/spree/promotion/rules/nth_order_spec.rb +70 -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 +94 -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_builder_spec.rb +118 -0
- data/spec/models/spree/promotion_category_spec.rb +17 -0
- data/spec/models/spree/promotion_code/code_builder_spec.rb +79 -0
- data/spec/models/spree/promotion_code_spec.rb +187 -0
- data/spec/models/spree/promotion_handler/cart_spec.rb +114 -0
- data/spec/models/spree/promotion_handler/coupon_spec.rb +335 -0
- data/spec/models/spree/promotion_handler/free_shipping_spec.rb +47 -0
- data/spec/models/spree/promotion_handler/page_spec.rb +44 -0
- data/spec/models/spree/promotion_rule_spec.rb +28 -0
- data/spec/models/spree/promotion_spec.rb +767 -0
- data/spec/models/spree/refund_spec.rb +204 -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 +231 -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 +107 -0
- data/spec/models/spree/reimbursement_type/store_credit_spec.rb +97 -0
- data/spec/models/spree/return_authorization_spec.rb +290 -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 +85 -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 +775 -0
- data/spec/models/spree/returns_calculator_spec.rb +14 -0
- data/spec/models/spree/shipment_spec.rb +709 -0
- data/spec/models/spree/shipping_calculator_spec.rb +45 -0
- data/spec/models/spree/shipping_method_spec.rb +88 -0
- data/spec/models/spree/shipping_rate_spec.rb +142 -0
- data/spec/models/spree/state_spec.rb +14 -0
- data/spec/models/spree/stock/availability_validator_spec.rb +83 -0
- data/spec/models/spree/stock/coordinator_spec.rb +116 -0
- data/spec/models/spree/stock/differentiator_spec.rb +39 -0
- data/spec/models/spree/stock/estimator_spec.rb +146 -0
- data/spec/models/spree/stock/inventory_unit_builder_spec.rb +38 -0
- data/spec/models/spree/stock/package_spec.rb +163 -0
- data/spec/models/spree/stock/packer_spec.rb +91 -0
- data/spec/models/spree/stock/prioritizer_spec.rb +125 -0
- data/spec/models/spree/stock/quantifier_spec.rb +115 -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 +50 -0
- data/spec/models/spree/stock/splitter/weight_spec.rb +29 -0
- data/spec/models/spree/stock_item_spec.rb +426 -0
- data/spec/models/spree/stock_location_spec.rb +279 -0
- data/spec/models/spree/stock_movement_spec.rb +56 -0
- data/spec/models/spree/stock_transfer_spec.rb +290 -0
- data/spec/models/spree/store_credit_category_spec.rb +17 -0
- data/spec/models/spree/store_credit_event_spec.rb +314 -0
- data/spec/models/spree/store_credit_spec.rb +876 -0
- data/spec/models/spree/store_spec.rb +55 -0
- data/spec/models/spree/tax_category_spec.rb +27 -0
- data/spec/models/spree/tax_rate_spec.rb +378 -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/transfer_item_spec.rb +264 -0
- data/spec/models/spree/unit_cancel_spec.rb +148 -0
- data/spec/models/spree/user_spec.rb +223 -0
- data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +23 -0
- data/spec/models/spree/variant/scopes_spec.rb +55 -0
- data/spec/models/spree/variant_spec.rb +546 -0
- data/spec/models/spree/zone_spec.rb +305 -0
- data/spec/spec_helper.rb +78 -0
- data/spec/support/big_decimal.rb +5 -0
- data/spec/support/concerns/default_price.rb +34 -0
- data/spec/support/dummy_ability.rb +4 -0
- data/spec/support/test_gateway.rb +2 -0
- metadata +229 -3
- data/lib/spree/testing_support/rspec-activemodel-mocks_patch.rb +0 -8
|
@@ -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,78 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module Spree
|
|
4
|
+
RSpec.describe Preferences::StaticModelPreferences do
|
|
5
|
+
let(:preference_class) do
|
|
6
|
+
Class.new do
|
|
7
|
+
include Preferences::Preferable
|
|
8
|
+
preference :color, :string
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
let(:other_class){ Class.new }
|
|
12
|
+
let(:definitions){ subject.for_class(preference_class) }
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
it "is empty by default" do
|
|
16
|
+
expect(definitions).to be_empty
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "can store preferences" do
|
|
20
|
+
subject.add(preference_class, 'my_definition', {})
|
|
21
|
+
# just testing that it was added here
|
|
22
|
+
expect(definitions).to have_key('my_definition')
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "errors assigning invalid preferences" do
|
|
26
|
+
expect {
|
|
27
|
+
subject.add(preference_class, 'my_definition', {ice_cream: 'chocolate'})
|
|
28
|
+
}.to raise_error(/\APreference :ice_cream is not defined/)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
context "with stored definitions" do
|
|
32
|
+
before do
|
|
33
|
+
subject.add(preference_class, 'light', {color: 'white'})
|
|
34
|
+
subject.add(preference_class, 'dark', {color: 'black'})
|
|
35
|
+
subject.add(preference_class, 'no_preference', {})
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
describe "complete definition" do
|
|
39
|
+
let(:definition){ definitions['dark'] }
|
|
40
|
+
it "can fetch value" do
|
|
41
|
+
expect(definition.fetch(:color)).to eq 'black'
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "can be converted to hash" do
|
|
45
|
+
expect(definition.to_hash).to eq({color: 'black'})
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it "ignores assignment" do
|
|
49
|
+
definition[:color] = 'maroon'
|
|
50
|
+
expect(definition.fetch(:color)).to eq 'black'
|
|
51
|
+
expect(definition.to_hash).to eq({color: 'black'})
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
describe "empty definition" do
|
|
56
|
+
let(:definition){ definitions['no_preference'] }
|
|
57
|
+
|
|
58
|
+
it "uses fallback value" do
|
|
59
|
+
expect(definition.fetch(:color){ 'red' }).to eq 'red'
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it "can be converted to hash" do
|
|
63
|
+
expect(definition.to_hash).to eq({})
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "ignores assignment" do
|
|
67
|
+
definition[:color] = 'maroon'
|
|
68
|
+
expect(definition.fetch(:color){ 'red' }).to eq 'red'
|
|
69
|
+
expect(definition.to_hash).to eq({})
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it "is still empty for other classes" do
|
|
74
|
+
expect(subject.for_class(other_class)).to be_empty
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module Spree
|
|
4
|
+
RSpec.describe Preferences::StaticallyConfigurable do
|
|
5
|
+
let(:superklass) do
|
|
6
|
+
# Same interface activerecord's serialization would provide
|
|
7
|
+
Class.new do
|
|
8
|
+
attr_accessor :preferences
|
|
9
|
+
def initialize
|
|
10
|
+
@preferences = {color: 'blue'}
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
let(:klass) do
|
|
15
|
+
Class.new(superklass) do
|
|
16
|
+
include Preferences::Preferable
|
|
17
|
+
include Preferences::StaticallyConfigurable
|
|
18
|
+
|
|
19
|
+
preference :color, :string
|
|
20
|
+
|
|
21
|
+
attr_accessor :preference_source
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
subject do
|
|
26
|
+
klass.new.tap do |o|
|
|
27
|
+
o.preference_source = preference_source
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
before do
|
|
32
|
+
Spree::Config.static_model_preferences.add(klass, 'credentials', color: 'red')
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
describe "available_preference_sources" do
|
|
36
|
+
it "should contain the defined preference sets" do
|
|
37
|
+
expect(klass.available_preference_sources).to eq ['credentials']
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
context "with no preference_source" do
|
|
42
|
+
let(:preference_source) { nil }
|
|
43
|
+
it "uses the persisted preference" do
|
|
44
|
+
expect(subject.preferred_color).to eq "blue"
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
context "with preference_source set" do
|
|
49
|
+
let(:preference_source) { 'credentials' }
|
|
50
|
+
it "uses the statically configured preference" do
|
|
51
|
+
expect(subject.preferred_color).to eq "red"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "ignores assignment" do
|
|
55
|
+
subject.preferences = {color: 'orange'}
|
|
56
|
+
expect(subject.preferred_color).to eq "red"
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
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 nil when key can't be found and fallback value is not supplied" do
|
|
36
|
+
expect(@store.get(:random_key){ nil }).to be_nil
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
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 999,999.99' do
|
|
26
|
+
let(:amount) { 1_000_000 }
|
|
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 999999.99'
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
context 'when the amount is between 0 and 999,999.99' do
|
|
38
|
+
let(:amount) { 100 }
|
|
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
|