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,250 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::Address, :type => :model do
|
|
4
|
+
|
|
5
|
+
subject { Spree::Address }
|
|
6
|
+
|
|
7
|
+
context "aliased attributes" do
|
|
8
|
+
let(:address) { Spree::Address.new firstname: 'Ryan', lastname: 'Bigg'}
|
|
9
|
+
|
|
10
|
+
it " first_name" do
|
|
11
|
+
expect(address.first_name).to eq("Ryan")
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "last_name" do
|
|
15
|
+
expect(address.last_name).to eq("Bigg")
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
context "validation" do
|
|
20
|
+
|
|
21
|
+
let(:country) { mock_model(Spree::Country, :states => [state], :states_required => true) }
|
|
22
|
+
let(:state) { stub_model(Spree::State, :name => 'maryland', :abbr => 'md') }
|
|
23
|
+
let(:address) { build(:address, :country => country) }
|
|
24
|
+
|
|
25
|
+
before do
|
|
26
|
+
allow(country.states).to receive_messages :find_all_by_name_or_abbr => [state]
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
context 'address does not require state' do
|
|
30
|
+
before do
|
|
31
|
+
Spree::Config.address_requires_state = false
|
|
32
|
+
end
|
|
33
|
+
it "address_requires_state preference is false" do
|
|
34
|
+
address.state = nil
|
|
35
|
+
address.state_name = nil
|
|
36
|
+
expect(address).to be_valid
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
context 'address requires state' do
|
|
41
|
+
before do
|
|
42
|
+
Spree::Config.address_requires_state = true
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "state_name is not nil and country does not have any states" do
|
|
46
|
+
address.state = nil
|
|
47
|
+
address.state_name = 'alabama'
|
|
48
|
+
expect(address).to be_valid
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "errors when state_name is nil" do
|
|
52
|
+
address.state_name = nil
|
|
53
|
+
address.state = nil
|
|
54
|
+
expect(address).not_to be_valid
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "full state name is in state_name and country does contain that state" do
|
|
58
|
+
address.state_name = 'alabama'
|
|
59
|
+
# called by state_validate to set up state_id.
|
|
60
|
+
# Perhaps this should be a before_validation instead?
|
|
61
|
+
expect(address).to be_valid
|
|
62
|
+
expect(address.state).not_to be_nil
|
|
63
|
+
expect(address.state_name).to be_nil
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "state abbr is in state_name and country does contain that state" do
|
|
67
|
+
address.state_name = state.abbr
|
|
68
|
+
expect(address).to be_valid
|
|
69
|
+
expect(address.state_id).not_to be_nil
|
|
70
|
+
expect(address.state_name).to be_nil
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it "state is entered but country does not contain that state" do
|
|
74
|
+
address.state = state
|
|
75
|
+
address.country = stub_model(Spree::Country, :states_required => true)
|
|
76
|
+
address.valid?
|
|
77
|
+
expect(address.errors["state"]).to eq(['is invalid'])
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it "both state and state_name are entered but country does not contain the state" do
|
|
81
|
+
address.state = state
|
|
82
|
+
address.state_name = 'maryland'
|
|
83
|
+
address.country = stub_model(Spree::Country, :states_required => true)
|
|
84
|
+
expect(address).to be_valid
|
|
85
|
+
expect(address.state_id).to be_nil
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
it "both state and state_name are entered and country does contain the state" do
|
|
89
|
+
address.state = state
|
|
90
|
+
address.state_name = 'maryland'
|
|
91
|
+
expect(address).to be_valid
|
|
92
|
+
expect(address.state_name).to be_nil
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
it "requires phone" do
|
|
97
|
+
address.phone = ""
|
|
98
|
+
address.valid?
|
|
99
|
+
expect(address.errors["phone"]).to eq(["can't be blank"])
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it "requires zipcode" do
|
|
103
|
+
address.zipcode = ""
|
|
104
|
+
address.valid?
|
|
105
|
+
expect(address.errors['zipcode']).to include("can't be blank")
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
context "zipcode validation" do
|
|
109
|
+
it "validates the zipcode" do
|
|
110
|
+
allow(address.country).to receive(:iso).and_return('US')
|
|
111
|
+
address.zipcode = 'abc'
|
|
112
|
+
address.valid?
|
|
113
|
+
expect(address.errors['zipcode']).to include('is invalid')
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
context 'does not validate' do
|
|
117
|
+
it 'does not have a country' do
|
|
118
|
+
address.country = nil
|
|
119
|
+
address.valid?
|
|
120
|
+
expect(address.errors['zipcode']).not_to include('is invalid')
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
it 'does not have an iso' do
|
|
124
|
+
allow(address.country).to receive(:iso).and_return(nil)
|
|
125
|
+
address.valid?
|
|
126
|
+
expect(address.errors['zipcode']).not_to include('is invalid')
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
it 'does not have a zipcode' do
|
|
130
|
+
address.zipcode = ""
|
|
131
|
+
address.valid?
|
|
132
|
+
expect(address.errors['zipcode']).not_to include('is invalid')
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
it 'does not have a supported country iso' do
|
|
136
|
+
allow(address.country).to receive(:iso).and_return('BO')
|
|
137
|
+
address.valid?
|
|
138
|
+
expect(address.errors['zipcode']).not_to include('is invalid')
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
context "phone not required" do
|
|
144
|
+
before { allow(address).to receive_messages require_phone?: false }
|
|
145
|
+
|
|
146
|
+
it "shows no errors when phone is blank" do
|
|
147
|
+
address.phone = ""
|
|
148
|
+
address.valid?
|
|
149
|
+
expect(address.errors[:phone].size).to eq 0
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
context "zipcode not required" do
|
|
154
|
+
before { allow(address).to receive_messages require_zipcode?: false }
|
|
155
|
+
|
|
156
|
+
it "shows no errors when phone is blank" do
|
|
157
|
+
address.zipcode = ""
|
|
158
|
+
address.valid?
|
|
159
|
+
expect(address.errors[:zipcode].size).to eq 0
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
context ".default" do
|
|
165
|
+
context "no user given" do
|
|
166
|
+
let!(:default_country) { create(:country) }
|
|
167
|
+
|
|
168
|
+
context 'has a default country' do
|
|
169
|
+
before do
|
|
170
|
+
Spree::Config[:default_country_id] = default_country.id
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
it "sets up a new record with Spree::Config[:default_country_id]" do
|
|
174
|
+
expect(Spree::Address.default.country).to eq default_country
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
# Regression test for #1142
|
|
179
|
+
it "uses the first available country if :default_country_id is set to an invalid value" do
|
|
180
|
+
Spree::Config[:default_country_id] = "0"
|
|
181
|
+
expect(Spree::Address.default.country).to eq default_country
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
context "user given" do
|
|
186
|
+
let(:bill_address) { Spree::Address.new(phone: '123-456-7890') }
|
|
187
|
+
let(:user) { double("User", bill_address: bill_address) }
|
|
188
|
+
|
|
189
|
+
it "returns a copy of that user bill address" do
|
|
190
|
+
expect(described_class.default(user).phone).to eq '123-456-7890'
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
context 'has no address' do
|
|
194
|
+
let(:bill_address) { nil }
|
|
195
|
+
|
|
196
|
+
it "falls back to build default when user has no address" do
|
|
197
|
+
expect(described_class.default(user)).to eq described_class.build_default
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
context '#full_name' do
|
|
204
|
+
context 'both first and last names are present' do
|
|
205
|
+
let(:address) { stub_model(Spree::Address, :firstname => 'Michael', :lastname => 'Jackson') }
|
|
206
|
+
specify { expect(address.full_name).to eq('Michael Jackson') }
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
context 'first name is blank' do
|
|
210
|
+
let(:address) { stub_model(Spree::Address, :firstname => nil, :lastname => 'Jackson') }
|
|
211
|
+
specify { expect(address.full_name).to eq('Jackson') }
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
context 'last name is blank' do
|
|
215
|
+
let(:address) { stub_model(Spree::Address, :firstname => 'Michael', :lastname => nil) }
|
|
216
|
+
specify { expect(address.full_name).to eq('Michael') }
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
context 'both first and last names are blank' do
|
|
220
|
+
let(:address) { stub_model(Spree::Address, :firstname => nil, :lastname => nil) }
|
|
221
|
+
specify { expect(address.full_name).to eq('') }
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
context '#state_text' do
|
|
227
|
+
context 'state is blank' do
|
|
228
|
+
let(:address) { stub_model(Spree::Address, :state => nil, :state_name => 'virginia') }
|
|
229
|
+
specify { expect(address.state_text).to eq('virginia') }
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
context 'both name and abbr is present' do
|
|
233
|
+
let(:state) { stub_model(Spree::State, :name => 'virginia', :abbr => 'va') }
|
|
234
|
+
let(:address) { stub_model(Spree::Address, :state => state) }
|
|
235
|
+
specify { expect(address.state_text).to eq('va') }
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
context 'only name is present' do
|
|
239
|
+
let(:state) { stub_model(Spree::State, :name => 'virginia', :abbr => nil) }
|
|
240
|
+
let(:address) { stub_model(Spree::Address, :state => state) }
|
|
241
|
+
specify { expect(address.state_text).to eq('virginia') }
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
context '#requires_phone' do
|
|
246
|
+
subject { described_class.new }
|
|
247
|
+
|
|
248
|
+
it { is_expected.to be_require_phone }
|
|
249
|
+
end
|
|
250
|
+
end
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
|
|
4
|
+
require 'spec_helper'
|
|
5
|
+
|
|
6
|
+
describe Spree::Adjustment, :type => :model do
|
|
7
|
+
|
|
8
|
+
let(:order) { Spree::Order.new }
|
|
9
|
+
let(:line_item) { create :line_item, order: order }
|
|
10
|
+
|
|
11
|
+
let(:adjustment) { Spree::Adjustment.create!(label: 'Adjustment', adjustable: order, order: order, amount: 5) }
|
|
12
|
+
|
|
13
|
+
context '#create & #destroy' do
|
|
14
|
+
let(:adjustment) { Spree::Adjustment.new(label: "Adjustment", amount: 5, order: order, adjustable: line_item) }
|
|
15
|
+
|
|
16
|
+
it 'calls #update_adjustable_adjustment_total' do
|
|
17
|
+
expect(adjustment).to receive(:update_adjustable_adjustment_total).twice
|
|
18
|
+
adjustment.save
|
|
19
|
+
adjustment.destroy
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
context '#save' do
|
|
24
|
+
let(:adjustment) { Spree::Adjustment.create(label: "Adjustment", amount: 5, order: order, adjustable: line_item) }
|
|
25
|
+
|
|
26
|
+
it 'touches the adjustable' do
|
|
27
|
+
expect { adjustment.save }.to change { line_item.updated_at }
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
describe 'non_tax scope' do
|
|
32
|
+
subject do
|
|
33
|
+
Spree::Adjustment.non_tax.to_a
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
let!(:tax_adjustment) { create(:adjustment, order: order, source: create(:tax_rate)) }
|
|
37
|
+
let!(:non_tax_adjustment_with_source) { create(:adjustment, order: order, source_type: 'Spree::Order', source_id: nil) }
|
|
38
|
+
let!(:non_tax_adjustment_without_source) { create(:adjustment, order: order, source: nil) }
|
|
39
|
+
|
|
40
|
+
it 'select non-tax adjustments' do
|
|
41
|
+
expect(subject).to_not include tax_adjustment
|
|
42
|
+
expect(subject).to include non_tax_adjustment_with_source
|
|
43
|
+
expect(subject).to include non_tax_adjustment_without_source
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
context "adjustment state" do
|
|
48
|
+
subject { build(:adjustment, order: order, state: state) }
|
|
49
|
+
|
|
50
|
+
context "#closed?" do
|
|
51
|
+
context 'is closed' do
|
|
52
|
+
let(:state) { 'closed' }
|
|
53
|
+
it { is_expected.to be_closed }
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
context 'is open' do
|
|
57
|
+
let(:state) { 'open' }
|
|
58
|
+
it { is_expected.to_not be_closed }
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
context '#currency' do
|
|
64
|
+
let(:order) { Spree::Order.new currency: 'JPY' }
|
|
65
|
+
|
|
66
|
+
it 'returns the adjustables currency' do
|
|
67
|
+
expect(adjustment.currency).to eq 'JPY'
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
context 'adjustable is nil' do
|
|
71
|
+
before do
|
|
72
|
+
adjustment.adjustable = nil
|
|
73
|
+
end
|
|
74
|
+
it 'uses the global currency of USD' do
|
|
75
|
+
expect(adjustment.currency).to eq 'USD'
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
context "#display_amount" do
|
|
81
|
+
before { adjustment.amount = 10.55 }
|
|
82
|
+
|
|
83
|
+
it "shows the amount" do
|
|
84
|
+
expect(adjustment.display_amount.to_s).to eq "$10.55"
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
context "with currency set to JPY" do
|
|
88
|
+
let(:order) { Spree::Order.new currency: 'JPY' }
|
|
89
|
+
|
|
90
|
+
context "when adjustable is set to an order" do
|
|
91
|
+
it "displays in JPY" do
|
|
92
|
+
expect(adjustment.display_amount.to_s).to eq "¥11"
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
context '#update!' do
|
|
99
|
+
let(:adjustment) { Spree::Adjustment.create!(label: 'Adjustment', order: order, adjustable: order, amount: 5, state: state, source: source) }
|
|
100
|
+
let(:source) { mock_model(Spree::TaxRate, compute_amount: 10) }
|
|
101
|
+
|
|
102
|
+
subject { adjustment.update! }
|
|
103
|
+
|
|
104
|
+
context "when adjustment is closed" do
|
|
105
|
+
let(:state) { 'closed' }
|
|
106
|
+
|
|
107
|
+
it "does not update the adjustment" do
|
|
108
|
+
expect(adjustment).to_not receive(:update_column)
|
|
109
|
+
subject
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
context "when adjustment is open" do
|
|
114
|
+
let(:state) { 'open' }
|
|
115
|
+
|
|
116
|
+
it "updates the amount" do
|
|
117
|
+
expect { subject }.to change { adjustment.amount }.to(10)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
context "it is a promotion adjustment" do
|
|
121
|
+
let(:promotion) { create(:promotion, :with_order_adjustment, starts_at: promo_start_date) }
|
|
122
|
+
let(:promo_start_date) { nil }
|
|
123
|
+
let(:promotion_code) { promotion.codes.first }
|
|
124
|
+
let(:order) { create(:order_with_line_items, line_items_count: 1) }
|
|
125
|
+
|
|
126
|
+
let!(:adjustment) do
|
|
127
|
+
promotion.activate(order: order, promotion_code: promotion_code)
|
|
128
|
+
order.adjustments.first
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
context "the promotion is eligible" do
|
|
132
|
+
it "sets the adjustment elgiible to true" do
|
|
133
|
+
subject
|
|
134
|
+
expect(adjustment.eligible).to eq true
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
context "the promotion is not eligible" do
|
|
139
|
+
let(:promo_start_date) { Date.tomorrow }
|
|
140
|
+
|
|
141
|
+
it "sets the adjustment elgiible to false" do
|
|
142
|
+
subject
|
|
143
|
+
expect(adjustment.eligible).to eq false
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
describe "promotion code presence error" do
|
|
151
|
+
subject do
|
|
152
|
+
adjustment.valid?
|
|
153
|
+
adjustment.errors[:promotion_code]
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
context "when the adjustment is not a promotion adjustment" do
|
|
157
|
+
let(:adjustment) { build(:adjustment) }
|
|
158
|
+
|
|
159
|
+
it { is_expected.to be_blank }
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
context "when the adjustment is a promotion adjustment" do
|
|
163
|
+
let(:adjustment) { build(:adjustment, source: promotion.actions.first) }
|
|
164
|
+
let(:promotion) { create(:promotion, :with_order_adjustment) }
|
|
165
|
+
|
|
166
|
+
context "when the promotion does not have a code" do
|
|
167
|
+
it { is_expected.to be_blank }
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
context "when the promotion has a code" do
|
|
171
|
+
let!(:promotion_code) { create(:promotion_code, promotion: promotion) }
|
|
172
|
+
|
|
173
|
+
it { is_expected.to include("can't be blank") }
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::AppConfiguration, :type => :model do
|
|
4
|
+
|
|
5
|
+
let (:prefs) { Rails.application.config.spree.preferences }
|
|
6
|
+
|
|
7
|
+
it "should be available from the environment" do
|
|
8
|
+
prefs.layout = "my/layout"
|
|
9
|
+
expect(prefs.layout).to eq "my/layout"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "should be available as Spree::Config for legacy access" do
|
|
13
|
+
expect(Spree::Config).to be_a Spree::AppConfiguration
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "uses base searcher class by default" do
|
|
17
|
+
expect(prefs.searcher_class).to eq Spree::Core::Search::Base
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|