spree_core 3.2.1 → 3.2.2
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/lib/spree/core/version.rb +1 -1
- data/spree_core.gemspec +1 -1
- metadata +3 -206
- data/spec/fixtures/microdata.html +0 -22
- data/spec/fixtures/microdata_itemref.html +0 -15
- data/spec/fixtures/microdata_no_itemscope.html +0 -20
- data/spec/fixtures/thinking-cat.jpg +0 -0
- data/spec/helpers/base_helper_spec.rb +0 -200
- data/spec/helpers/products_helper_spec.rb +0 -289
- data/spec/lib/calculated_adjustments_spec.rb +0 -7
- data/spec/lib/i18n_spec.rb +0 -123
- data/spec/lib/search/base_spec.rb +0 -86
- data/spec/lib/spree/core/controller_helpers/auth_spec.rb +0 -103
- data/spec/lib/spree/core/controller_helpers/order_spec.rb +0 -110
- data/spec/lib/spree/core/controller_helpers/search_spec.rb +0 -17
- data/spec/lib/spree/core/controller_helpers/store_spec.rb +0 -72
- data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +0 -39
- data/spec/lib/spree/core/delegate_belongs_to_spec.rb +0 -22
- data/spec/lib/spree/core/importer/order_spec.rb +0 -605
- data/spec/lib/spree/core/number_generator_spec.rb +0 -175
- data/spec/lib/spree/core/token_generator_spec.rb +0 -24
- data/spec/lib/spree/core/validators/email_spec.rb +0 -53
- data/spec/lib/spree/core_spec.rb +0 -23
- data/spec/lib/spree/localized_number_spec.rb +0 -48
- data/spec/lib/spree/migrations_spec.rb +0 -36
- data/spec/lib/spree/money_spec.rb +0 -122
- data/spec/lib/tasks/exchanges_spec.rb +0 -136
- data/spec/mailers/order_mailer_spec.rb +0 -122
- data/spec/mailers/reimbursement_mailer_spec.rb +0 -47
- data/spec/mailers/shipment_mailer_spec.rb +0 -81
- data/spec/mailers/test_mailer_spec.rb +0 -38
- data/spec/models/option_type_prototype_spec.rb +0 -9
- data/spec/models/spree/ability_spec.rb +0 -251
- data/spec/models/spree/address_spec.rb +0 -402
- data/spec/models/spree/adjustable/adjuster/base_spec.rb +0 -10
- data/spec/models/spree/adjustable/adjuster/promotion_spec.rb +0 -211
- data/spec/models/spree/adjustable/adjuster/tax_spec.rb +0 -86
- data/spec/models/spree/adjustable/adjustments_updater_spec.rb +0 -26
- data/spec/models/spree/adjustment_spec.rb +0 -189
- data/spec/models/spree/app_configuration_spec.rb +0 -26
- data/spec/models/spree/asset_spec.rb +0 -28
- data/spec/models/spree/calculator/default_tax_spec.rb +0 -152
- data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +0 -25
- data/spec/models/spree/calculator/flat_rate_spec.rb +0 -47
- data/spec/models/spree/calculator/flexi_rate_spec.rb +0 -41
- data/spec/models/spree/calculator/percent_on_line_item_spec.rb +0 -15
- data/spec/models/spree/calculator/price_sack_spec.rb +0 -30
- data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +0 -47
- data/spec/models/spree/calculator/shipping.rb +0 -8
- data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +0 -23
- data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +0 -13
- data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +0 -52
- data/spec/models/spree/calculator/shipping/per_item_spec.rb +0 -20
- data/spec/models/spree/calculator/shipping/price_sack_spec.rb +0 -29
- data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +0 -40
- data/spec/models/spree/calculator/tiered_percent_spec.rb +0 -51
- data/spec/models/spree/calculator_spec.rb +0 -69
- data/spec/models/spree/classification_spec.rb +0 -93
- data/spec/models/spree/concerns/display_money_spec.rb +0 -43
- data/spec/models/spree/concerns/user_methods_spec.rb +0 -82
- data/spec/models/spree/concerns/vat_price_calculation_spec.rb +0 -66
- data/spec/models/spree/country_spec.rb +0 -55
- data/spec/models/spree/credit_card_spec.rb +0 -328
- data/spec/models/spree/customer_return_spec.rb +0 -240
- data/spec/models/spree/exchange_spec.rb +0 -75
- data/spec/models/spree/gateway/bogus_simple.rb +0 -20
- data/spec/models/spree/gateway/bogus_spec.rb +0 -13
- data/spec/models/spree/gateway_spec.rb +0 -61
- data/spec/models/spree/image_spec.rb +0 -8
- data/spec/models/spree/inventory_unit_spec.rb +0 -256
- data/spec/models/spree/line_item_spec.rb +0 -346
- data/spec/models/spree/option_type_spec.rb +0 -14
- data/spec/models/spree/option_value_spec.rb +0 -18
- data/spec/models/spree/order/address_spec.rb +0 -50
- data/spec/models/spree/order/adjustments_spec.rb +0 -29
- data/spec/models/spree/order/callbacks_spec.rb +0 -42
- data/spec/models/spree/order/checkout_spec.rb +0 -770
- data/spec/models/spree/order/currency_updater_spec.rb +0 -32
- data/spec/models/spree/order/finalizing_spec.rb +0 -114
- data/spec/models/spree/order/helpers_spec.rb +0 -5
- data/spec/models/spree/order/payment_spec.rb +0 -214
- data/spec/models/spree/order/risk_assessment_spec.rb +0 -84
- data/spec/models/spree/order/shipments_spec.rb +0 -43
- data/spec/models/spree/order/state_machine_spec.rb +0 -212
- data/spec/models/spree/order/store_credit_spec.rb +0 -426
- data/spec/models/spree/order/tax_spec.rb +0 -84
- data/spec/models/spree/order/totals_spec.rb +0 -24
- data/spec/models/spree/order/updating_spec.rb +0 -18
- data/spec/models/spree/order/validations_spec.rb +0 -15
- data/spec/models/spree/order_contents_spec.rb +0 -297
- data/spec/models/spree/order_inventory_spec.rb +0 -239
- data/spec/models/spree/order_merger_spec.rb +0 -135
- data/spec/models/spree/order_spec.rb +0 -1046
- data/spec/models/spree/order_updater_spec.rb +0 -305
- data/spec/models/spree/payment/gateway_options_spec.rb +0 -127
- data/spec/models/spree/payment/store_credit_spec.rb +0 -60
- data/spec/models/spree/payment_method/store_credit_spec.rb +0 -291
- data/spec/models/spree/payment_method_spec.rb +0 -103
- data/spec/models/spree/payment_spec.rb +0 -919
- data/spec/models/spree/preference_spec.rb +0 -80
- data/spec/models/spree/preferences/configuration_spec.rb +0 -30
- data/spec/models/spree/preferences/preferable_spec.rb +0 -344
- data/spec/models/spree/preferences/scoped_store_spec.rb +0 -58
- data/spec/models/spree/preferences/store_spec.rb +0 -46
- data/spec/models/spree/price_spec.rb +0 -128
- data/spec/models/spree/product/scopes_spec.rb +0 -183
- data/spec/models/spree/product_duplicator_spec.rb +0 -103
- data/spec/models/spree/product_filter_spec.rb +0 -26
- data/spec/models/spree/product_option_type_spec.rb +0 -9
- data/spec/models/spree/product_promotion_rule_spec.rb +0 -9
- data/spec/models/spree/product_property_spec.rb +0 -26
- data/spec/models/spree/product_spec.rb +0 -629
- data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +0 -113
- data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +0 -148
- data/spec/models/spree/promotion/actions/create_line_items_spec.rb +0 -86
- data/spec/models/spree/promotion/actions/free_shipping_spec.rb +0 -36
- data/spec/models/spree/promotion/rules/country_spec.rb +0 -36
- data/spec/models/spree/promotion/rules/first_order_spec.rb +0 -75
- data/spec/models/spree/promotion/rules/item_total_spec.rb +0 -282
- data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +0 -42
- data/spec/models/spree/promotion/rules/option_value_spec.rb +0 -90
- data/spec/models/spree/promotion/rules/product_spec.rb +0 -143
- data/spec/models/spree/promotion/rules/taxon_spec.rb +0 -102
- data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +0 -27
- data/spec/models/spree/promotion/rules/user_spec.rb +0 -45
- data/spec/models/spree/promotion_action_spec.rb +0 -10
- data/spec/models/spree/promotion_category_spec.rb +0 -17
- data/spec/models/spree/promotion_handler/cart_spec.rb +0 -102
- data/spec/models/spree/promotion_handler/coupon_spec.rb +0 -323
- data/spec/models/spree/promotion_handler/free_shipping_spec.rb +0 -48
- data/spec/models/spree/promotion_handler/page_spec.rb +0 -44
- data/spec/models/spree/promotion_rule_spec.rb +0 -29
- data/spec/models/spree/promotion_rule_taxon_spec.rb +0 -9
- data/spec/models/spree/promotion_rule_user_spec.rb +0 -9
- data/spec/models/spree/promotion_spec.rb +0 -679
- data/spec/models/spree/property_prototype_spec.rb +0 -9
- data/spec/models/spree/property_spec.rb +0 -5
- data/spec/models/spree/prototype_spec.rb +0 -5
- data/spec/models/spree/prototype_taxon_spec.rb +0 -9
- data/spec/models/spree/refund_reason_spec.rb +0 -20
- data/spec/models/spree/refund_spec.rb +0 -195
- data/spec/models/spree/reimbursement/credit_spec.rb +0 -36
- data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +0 -140
- data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +0 -83
- data/spec/models/spree/reimbursement_performer_spec.rb +0 -30
- data/spec/models/spree/reimbursement_spec.rb +0 -188
- data/spec/models/spree/reimbursement_tax_calculator_spec.rb +0 -63
- data/spec/models/spree/reimbursement_type/credit_spec.rb +0 -53
- data/spec/models/spree/reimbursement_type/exchange_spec.rb +0 -46
- data/spec/models/spree/reimbursement_type/original_payment_spec.rb +0 -55
- data/spec/models/spree/reimbursement_type/store_credit_spec.rb +0 -101
- data/spec/models/spree/return_authorization_reason_spec.rb +0 -7
- data/spec/models/spree/return_authorization_spec.rb +0 -230
- data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +0 -77
- data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +0 -58
- data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +0 -61
- data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +0 -32
- data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +0 -29
- data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +0 -35
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +0 -65
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +0 -43
- data/spec/models/spree/return_item_spec.rb +0 -731
- data/spec/models/spree/returns_calculator_spec.rb +0 -14
- data/spec/models/spree/role_spec.rb +0 -7
- data/spec/models/spree/shipment_spec.rb +0 -742
- data/spec/models/spree/shipping_calculator_spec.rb +0 -45
- data/spec/models/spree/shipping_category_spec.rb +0 -19
- data/spec/models/spree/shipping_method_spec.rb +0 -95
- data/spec/models/spree/shipping_rate_spec.rb +0 -140
- data/spec/models/spree/state_spec.rb +0 -29
- data/spec/models/spree/stock/availability_validator_spec.rb +0 -36
- data/spec/models/spree/stock/content_item_spec.rb +0 -31
- data/spec/models/spree/stock/coordinator_spec.rb +0 -61
- data/spec/models/spree/stock/differentiator_spec.rb +0 -39
- data/spec/models/spree/stock/estimator_spec.rb +0 -202
- data/spec/models/spree/stock/inventory_unit_builder_spec.rb +0 -38
- data/spec/models/spree/stock/package_spec.rb +0 -182
- data/spec/models/spree/stock/packer_spec.rb +0 -70
- data/spec/models/spree/stock/prioritizer_spec.rb +0 -125
- data/spec/models/spree/stock/quantifier_spec.rb +0 -126
- data/spec/models/spree/stock/splitter/backordered_spec.rb +0 -29
- data/spec/models/spree/stock/splitter/base_spec.rb +0 -21
- data/spec/models/spree/stock/splitter/shipping_category_spec.rb +0 -47
- data/spec/models/spree/stock/splitter/weight_spec.rb +0 -32
- data/spec/models/spree/stock_item_spec.rb +0 -432
- data/spec/models/spree/stock_location_spec.rb +0 -243
- data/spec/models/spree/stock_movement_spec.rb +0 -120
- data/spec/models/spree/stock_transfer_spec.rb +0 -50
- data/spec/models/spree/store_credit_event_spec.rb +0 -101
- data/spec/models/spree/store_credit_spec.rb +0 -786
- data/spec/models/spree/store_spec.rb +0 -78
- data/spec/models/spree/tax_category_spec.rb +0 -32
- data/spec/models/spree/tax_rate_spec.rb +0 -561
- data/spec/models/spree/taxon_spec.rb +0 -85
- data/spec/models/spree/taxonomy_spec.rb +0 -18
- data/spec/models/spree/tracker_spec.rb +0 -21
- data/spec/models/spree/user_spec.rb +0 -203
- data/spec/models/spree/variant_spec.rb +0 -818
- data/spec/models/spree/zone_member_spec.rb +0 -38
- data/spec/models/spree/zone_spec.rb +0 -472
- data/spec/spec_helper.rb +0 -79
- data/spec/support/big_decimal.rb +0 -5
- data/spec/support/concerns/adjustment_source.rb +0 -23
- data/spec/support/concerns/default_price.rb +0 -37
- data/spec/support/rake.rb +0 -13
- data/spec/support/test_gateway.rb +0 -2
|
@@ -1,402 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Spree::Address, type: :model do
|
|
4
|
-
|
|
5
|
-
describe 'Callbacks' do
|
|
6
|
-
it { is_expected.to callback(:clear_invalid_state_entities).before(:validation).on(:update) }
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
describe "clone" do
|
|
10
|
-
it "creates a copy of the address with the exception of the id, updated_at and created_at attributes" do
|
|
11
|
-
state = create(:state)
|
|
12
|
-
original = create(:address,
|
|
13
|
-
address1: 'address1',
|
|
14
|
-
address2: 'address2',
|
|
15
|
-
alternative_phone: 'alternative_phone',
|
|
16
|
-
city: 'city',
|
|
17
|
-
country: Spree::Country.first,
|
|
18
|
-
firstname: 'firstname',
|
|
19
|
-
lastname: 'lastname',
|
|
20
|
-
company: 'company',
|
|
21
|
-
phone: 'phone',
|
|
22
|
-
state_id: state.id,
|
|
23
|
-
state_name: state.name,
|
|
24
|
-
zipcode: '10001')
|
|
25
|
-
|
|
26
|
-
cloned = original.clone
|
|
27
|
-
|
|
28
|
-
expect(cloned.address1).to eq(original.address1)
|
|
29
|
-
expect(cloned.address2).to eq(original.address2)
|
|
30
|
-
expect(cloned.alternative_phone).to eq(original.alternative_phone)
|
|
31
|
-
expect(cloned.city).to eq(original.city)
|
|
32
|
-
expect(cloned.country_id).to eq(original.country_id)
|
|
33
|
-
expect(cloned.firstname).to eq(original.firstname)
|
|
34
|
-
expect(cloned.lastname).to eq(original.lastname)
|
|
35
|
-
expect(cloned.company).to eq(original.company)
|
|
36
|
-
expect(cloned.phone).to eq(original.phone)
|
|
37
|
-
expect(cloned.state_id).to eq(original.state_id)
|
|
38
|
-
expect(cloned.state_name).to eq(original.state_name)
|
|
39
|
-
expect(cloned.zipcode).to eq(original.zipcode)
|
|
40
|
-
|
|
41
|
-
expect(cloned.id).not_to eq(original.id)
|
|
42
|
-
expect(cloned.created_at).not_to eq(original.created_at)
|
|
43
|
-
expect(cloned.updated_at).not_to eq(original.updated_at)
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
context "aliased attributes" do
|
|
48
|
-
let(:address) { Spree::Address.new }
|
|
49
|
-
|
|
50
|
-
it "first_name" do
|
|
51
|
-
address.firstname = "Ryan"
|
|
52
|
-
expect(address.first_name).to eq("Ryan")
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
it "last_name" do
|
|
56
|
-
address.lastname = "Bigg"
|
|
57
|
-
expect(address.last_name).to eq("Bigg")
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
context "validation" do
|
|
62
|
-
before do
|
|
63
|
-
configure_spree_preferences do |config|
|
|
64
|
-
config.address_requires_state = true
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
let(:country) { stub_model(Spree::Country, states: [state], states_required: true) }
|
|
69
|
-
let(:state) { stub_model(Spree::State, name: 'maryland', abbr: 'md') }
|
|
70
|
-
let(:address) { build(:address, country: country) }
|
|
71
|
-
|
|
72
|
-
before do
|
|
73
|
-
allow(country.states).to receive_messages find_all_by_name_or_abbr: [state]
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
it "state_name is not nil and country does not have any states" do
|
|
77
|
-
address.state = nil
|
|
78
|
-
address.state_name = 'alabama'
|
|
79
|
-
expect(address).to be_valid
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
it "errors when state_name is nil" do
|
|
83
|
-
address.state_name = nil
|
|
84
|
-
address.state = nil
|
|
85
|
-
expect(address).not_to be_valid
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
it "full state name is in state_name and country does contain that state" do
|
|
89
|
-
address.state_name = 'alabama'
|
|
90
|
-
# called by state_validate to set up state_id.
|
|
91
|
-
# Perhaps this should be a before_validation instead?
|
|
92
|
-
expect(address).to be_valid
|
|
93
|
-
expect(address.state).not_to be_nil
|
|
94
|
-
expect(address.state_name).to be_nil
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
it "state abbr is in state_name and country does contain that state" do
|
|
98
|
-
address.state_name = state.abbr
|
|
99
|
-
expect(address).to be_valid
|
|
100
|
-
expect(address.state_id).not_to be_nil
|
|
101
|
-
expect(address.state_name).to be_nil
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
it "state is entered but country does not contain that state" do
|
|
105
|
-
address.state = state
|
|
106
|
-
address.country = stub_model(Spree::Country, states_required: true)
|
|
107
|
-
address.valid?
|
|
108
|
-
expect(address.errors["state"]).to eq(['is invalid'])
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
it "both state and state_name are entered but country does not contain the state" do
|
|
112
|
-
address.state = state
|
|
113
|
-
address.state_name = 'maryland'
|
|
114
|
-
address.country = stub_model(Spree::Country, states_required: true)
|
|
115
|
-
expect(address).to be_valid
|
|
116
|
-
expect(address.state_id).to be_nil
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
it "both state and state_name are entered and country does contain the state" do
|
|
120
|
-
address.state = state
|
|
121
|
-
address.state_name = 'maryland'
|
|
122
|
-
expect(address).to be_valid
|
|
123
|
-
expect(address.state_name).to be_nil
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
it "address_requires_state preference is false" do
|
|
127
|
-
Spree::Config.set address_requires_state: false
|
|
128
|
-
address.state = nil
|
|
129
|
-
address.state_name = nil
|
|
130
|
-
expect(address).to be_valid
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
it "requires phone" do
|
|
134
|
-
address.phone = ""
|
|
135
|
-
address.valid?
|
|
136
|
-
expect(address.errors["phone"]).to eq(["can't be blank"])
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
it "requires zipcode" do
|
|
140
|
-
address.zipcode = ""
|
|
141
|
-
address.valid?
|
|
142
|
-
expect(address.errors['zipcode']).to include("can't be blank")
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
context "zipcode validation" do
|
|
146
|
-
it "validates the zipcode" do
|
|
147
|
-
allow(address.country).to receive(:iso).and_return('US')
|
|
148
|
-
address.zipcode = 'abc'
|
|
149
|
-
address.valid?
|
|
150
|
-
expect(address.errors['zipcode']).to include('is invalid')
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
it "accepts a zip code with surrounding white space" do
|
|
154
|
-
allow(address.country).to receive(:iso).and_return('US')
|
|
155
|
-
address.zipcode = ' 12345 '
|
|
156
|
-
address.valid?
|
|
157
|
-
expect(address.errors['zipcode']).not_to include('is invalid')
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
context 'does not validate' do
|
|
161
|
-
it 'does not have a country' do
|
|
162
|
-
address.country = nil
|
|
163
|
-
address.valid?
|
|
164
|
-
expect(address.errors['zipcode']).not_to include('is invalid')
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
it 'country does not requires zipcode' do
|
|
168
|
-
allow(address.country).to receive(:zipcode_required?).and_return(false)
|
|
169
|
-
address.valid?
|
|
170
|
-
expect(address.errors['zipcode']).not_to include('is invalid')
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
it 'does not have an iso' do
|
|
174
|
-
allow(address.country).to receive(:iso).and_return(nil)
|
|
175
|
-
address.valid?
|
|
176
|
-
expect(address.errors['zipcode']).not_to include('is invalid')
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
it 'does not have a zipcode' do
|
|
180
|
-
address.zipcode = ""
|
|
181
|
-
address.valid?
|
|
182
|
-
expect(address.errors['zipcode']).not_to include('is invalid')
|
|
183
|
-
end
|
|
184
|
-
|
|
185
|
-
it 'does not have a supported country iso' do
|
|
186
|
-
allow(address.country).to receive(:iso).and_return('BO')
|
|
187
|
-
address.valid?
|
|
188
|
-
expect(address.errors['zipcode']).not_to include('is invalid')
|
|
189
|
-
end
|
|
190
|
-
end
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
context "phone not required" do
|
|
194
|
-
before { allow(address).to receive_messages require_phone?: false }
|
|
195
|
-
|
|
196
|
-
it "shows no errors when phone is blank" do
|
|
197
|
-
address.phone = ""
|
|
198
|
-
address.valid?
|
|
199
|
-
expect(address.errors[:phone].size).to eq 0
|
|
200
|
-
end
|
|
201
|
-
end
|
|
202
|
-
|
|
203
|
-
context "zipcode not required" do
|
|
204
|
-
before { allow(address).to receive_messages require_zipcode?: false }
|
|
205
|
-
|
|
206
|
-
it "shows no errors when phone is blank" do
|
|
207
|
-
address.zipcode = ""
|
|
208
|
-
address.valid?
|
|
209
|
-
expect(address.errors[:zipcode].size).to eq 0
|
|
210
|
-
end
|
|
211
|
-
end
|
|
212
|
-
end
|
|
213
|
-
|
|
214
|
-
context ".default" do
|
|
215
|
-
context "no user given" do
|
|
216
|
-
before do
|
|
217
|
-
@default_country_id = Spree::Config[:default_country_id]
|
|
218
|
-
new_country = create(:country)
|
|
219
|
-
Spree::Config[:default_country_id] = new_country.id
|
|
220
|
-
end
|
|
221
|
-
|
|
222
|
-
after do
|
|
223
|
-
Spree::Config[:default_country_id] = @default_country_id
|
|
224
|
-
end
|
|
225
|
-
|
|
226
|
-
it "sets up a new record with Spree::Config[:default_country_id]" do
|
|
227
|
-
expect(Spree::Address.default.country).to eq(Spree::Country.find(Spree::Config[:default_country_id]))
|
|
228
|
-
end
|
|
229
|
-
|
|
230
|
-
# Regression test for #1142
|
|
231
|
-
it "uses the first available country if :default_country_id is set to an invalid value" do
|
|
232
|
-
Spree::Config[:default_country_id] = "0"
|
|
233
|
-
expect(Spree::Address.default.country).to eq(Spree::Country.first)
|
|
234
|
-
end
|
|
235
|
-
end
|
|
236
|
-
|
|
237
|
-
context "user given" do
|
|
238
|
-
let(:bill_address) { Spree::Address.new(phone: Time.current.to_i) }
|
|
239
|
-
let(:ship_address) { double("ShipAddress") }
|
|
240
|
-
let(:user) { double("User", bill_address: bill_address, ship_address: ship_address) }
|
|
241
|
-
|
|
242
|
-
it "returns a copy of that user bill address" do
|
|
243
|
-
expect(Spree::Address.default(user).phone).to eq bill_address.phone
|
|
244
|
-
end
|
|
245
|
-
|
|
246
|
-
it "falls back to build default when user has no address" do
|
|
247
|
-
allow(user).to receive_messages(bill_address: nil)
|
|
248
|
-
expect(Spree::Address.default(user)).to eq Spree::Address.build_default
|
|
249
|
-
end
|
|
250
|
-
end
|
|
251
|
-
end
|
|
252
|
-
|
|
253
|
-
context '#full_name' do
|
|
254
|
-
context 'both first and last names are present' do
|
|
255
|
-
let(:address) { stub_model(Spree::Address, firstname: 'Michael', lastname: 'Jackson') }
|
|
256
|
-
specify { expect(address.full_name).to eq('Michael Jackson') }
|
|
257
|
-
end
|
|
258
|
-
|
|
259
|
-
context 'first name is blank' do
|
|
260
|
-
let(:address) { stub_model(Spree::Address, firstname: nil, lastname: 'Jackson') }
|
|
261
|
-
specify { expect(address.full_name).to eq('Jackson') }
|
|
262
|
-
end
|
|
263
|
-
|
|
264
|
-
context 'last name is blank' do
|
|
265
|
-
let(:address) { stub_model(Spree::Address, firstname: 'Michael', lastname: nil) }
|
|
266
|
-
specify { expect(address.full_name).to eq('Michael') }
|
|
267
|
-
end
|
|
268
|
-
|
|
269
|
-
context 'both first and last names are blank' do
|
|
270
|
-
let(:address) { stub_model(Spree::Address, firstname: nil, lastname: nil) }
|
|
271
|
-
specify { expect(address.full_name).to eq('') }
|
|
272
|
-
end
|
|
273
|
-
|
|
274
|
-
end
|
|
275
|
-
|
|
276
|
-
context '#state_text' do
|
|
277
|
-
context 'state is blank' do
|
|
278
|
-
let(:address) { stub_model(Spree::Address, state: nil, state_name: 'virginia') }
|
|
279
|
-
specify { expect(address.state_text).to eq('virginia') }
|
|
280
|
-
end
|
|
281
|
-
|
|
282
|
-
context 'both name and abbr is present' do
|
|
283
|
-
let(:state) { stub_model(Spree::State, name: 'virginia', abbr: 'va') }
|
|
284
|
-
let(:address) { stub_model(Spree::Address, state: state) }
|
|
285
|
-
specify { expect(address.state_text).to eq('va') }
|
|
286
|
-
end
|
|
287
|
-
|
|
288
|
-
context 'only name is present' do
|
|
289
|
-
let(:state) { stub_model(Spree::State, name: 'virginia', abbr: nil) }
|
|
290
|
-
let(:address) { stub_model(Spree::Address, state: state) }
|
|
291
|
-
specify { expect(address.state_text).to eq('virginia') }
|
|
292
|
-
end
|
|
293
|
-
end
|
|
294
|
-
|
|
295
|
-
context "defines require_phone? helper method" do
|
|
296
|
-
let(:address) { stub_model(Spree::Address) }
|
|
297
|
-
specify { expect(address.instance_eval{ require_phone? }).to be true}
|
|
298
|
-
end
|
|
299
|
-
|
|
300
|
-
context '#clear_state_entities' do
|
|
301
|
-
let (:address) { create(:address) }
|
|
302
|
-
before { address.state_name = 'maryland' }
|
|
303
|
-
|
|
304
|
-
it { expect { address.send(:clear_state_entities) }.to change { address.state }.to(nil).from(address.state) }
|
|
305
|
-
it { expect { address.send(:clear_state_entities) }.to change { address.state_name }.to(nil).from('maryland') }
|
|
306
|
-
end
|
|
307
|
-
|
|
308
|
-
context '#clear_state' do
|
|
309
|
-
let (:address) { create(:address) }
|
|
310
|
-
before { address.state_name = 'maryland' }
|
|
311
|
-
|
|
312
|
-
it { expect { address.send(:clear_state) }.to change { address.state }.to(nil).from(address.state) }
|
|
313
|
-
it { expect { address.send(:clear_state) }.to_not change(address, :state_name) }
|
|
314
|
-
end
|
|
315
|
-
|
|
316
|
-
context '#clear_state_name' do
|
|
317
|
-
let (:address) { create(:address) }
|
|
318
|
-
before { address.state_name = 'maryland' }
|
|
319
|
-
|
|
320
|
-
it { expect { address.send(:clear_state_name) }.to_not change(address, :state_id) }
|
|
321
|
-
it { expect { address.send(:clear_state_name) }.to change { address.state_name }.to(nil).from('maryland') }
|
|
322
|
-
end
|
|
323
|
-
|
|
324
|
-
context '#clear_invalid_state_entities' do
|
|
325
|
-
let(:country) { create(:country) }
|
|
326
|
-
let(:state) { create(:state, country: country) }
|
|
327
|
-
let (:address) { create(:address, country: country, state: state) }
|
|
328
|
-
|
|
329
|
-
def clear_state_entities
|
|
330
|
-
address.send(:clear_invalid_state_entities)
|
|
331
|
-
end
|
|
332
|
-
|
|
333
|
-
context 'state not present and state_name both not present' do
|
|
334
|
-
before do
|
|
335
|
-
address.state = nil
|
|
336
|
-
address.state_name = nil
|
|
337
|
-
clear_state_entities
|
|
338
|
-
end
|
|
339
|
-
|
|
340
|
-
it { expect(address.state).to be_nil }
|
|
341
|
-
it { expect(address.state_name).to be_nil }
|
|
342
|
-
end
|
|
343
|
-
|
|
344
|
-
context 'state_name not present and state present ' do
|
|
345
|
-
before { address.state_name = nil }
|
|
346
|
-
|
|
347
|
-
context 'state belongs to a different country than to which address is associated' do
|
|
348
|
-
before do
|
|
349
|
-
address.country = create(:country)
|
|
350
|
-
clear_state_entities
|
|
351
|
-
end
|
|
352
|
-
|
|
353
|
-
it { expect(address.state).to be_nil }
|
|
354
|
-
it { expect(address.state_name).to be_nil }
|
|
355
|
-
end
|
|
356
|
-
|
|
357
|
-
context 'state belongs to the same country associated with address' do
|
|
358
|
-
before { clear_state_entities }
|
|
359
|
-
it { expect(address.state).to eq(state) }
|
|
360
|
-
it { expect(address.state_name).to be_nil }
|
|
361
|
-
end
|
|
362
|
-
end
|
|
363
|
-
|
|
364
|
-
context 'state not present and state_name present' do
|
|
365
|
-
before do
|
|
366
|
-
address.state = nil
|
|
367
|
-
address.state_name = state.name
|
|
368
|
-
end
|
|
369
|
-
|
|
370
|
-
context 'when country has no states and state is required' do
|
|
371
|
-
before do
|
|
372
|
-
address.country = create(:country, states_required: true)
|
|
373
|
-
clear_state_entities
|
|
374
|
-
end
|
|
375
|
-
|
|
376
|
-
it { expect(address.state).to be_nil }
|
|
377
|
-
it { expect(address.state_name).to eq(state.name) }
|
|
378
|
-
end
|
|
379
|
-
|
|
380
|
-
context 'when country has states' do
|
|
381
|
-
before do
|
|
382
|
-
address.state_name = state.name
|
|
383
|
-
clear_state_entities
|
|
384
|
-
end
|
|
385
|
-
|
|
386
|
-
it { expect(address.state).to be_nil }
|
|
387
|
-
it { expect(address.state_name).to eq(state.name) }
|
|
388
|
-
end
|
|
389
|
-
|
|
390
|
-
context 'when country has no states and state is not required' do
|
|
391
|
-
before do
|
|
392
|
-
address.country = create(:country, states_required: false)
|
|
393
|
-
address.state_name = state.name
|
|
394
|
-
clear_state_entities
|
|
395
|
-
end
|
|
396
|
-
|
|
397
|
-
it { expect(address.state).to be_nil }
|
|
398
|
-
it { expect(address.state_name).to be_nil }
|
|
399
|
-
end
|
|
400
|
-
end
|
|
401
|
-
end
|
|
402
|
-
end
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Spree::Adjustable::Adjuster::Base, type: :model do
|
|
4
|
-
let(:line_item) { create(:line_item) }
|
|
5
|
-
let(:subject) { Spree::Adjustable::Adjuster::Base }
|
|
6
|
-
|
|
7
|
-
it "raises missing update method" do
|
|
8
|
-
expect { subject.adjust(line_item, {}) }.to raise_error(NotImplementedError)
|
|
9
|
-
end
|
|
10
|
-
end
|
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Spree::Adjustable::Adjuster::Promotion, type: :model do
|
|
4
|
-
let(:order) { create :order_with_line_items, line_items_count: 1 }
|
|
5
|
-
let(:line_item) { order.line_items.first }
|
|
6
|
-
let(:subject) { Spree::Adjustable::AdjustmentsUpdater.new(line_item) }
|
|
7
|
-
let(:order_subject) { Spree::Adjustable::AdjustmentsUpdater.new(order) }
|
|
8
|
-
|
|
9
|
-
context "best promotion is always applied" do
|
|
10
|
-
let(:calculator) { Spree::Calculator::FlatRate.new(preferred_amount: 10) }
|
|
11
|
-
let(:source) { Spree::Promotion::Actions::CreateItemAdjustments.create calculator: calculator }
|
|
12
|
-
|
|
13
|
-
def create_adjustment(label, amount)
|
|
14
|
-
create(:adjustment,
|
|
15
|
-
order: order,
|
|
16
|
-
adjustable: line_item,
|
|
17
|
-
source: source,
|
|
18
|
-
amount: amount,
|
|
19
|
-
state: "closed",
|
|
20
|
-
label: label,
|
|
21
|
-
mandatory: false)
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
describe "competing promos" do
|
|
25
|
-
before { Spree::Adjustment.competing_promos_source_types = ['Spree::PromotionAction', 'Custom'] }
|
|
26
|
-
|
|
27
|
-
it "do not update promo_total" do
|
|
28
|
-
create(:adjustment,
|
|
29
|
-
order: order,
|
|
30
|
-
adjustable: line_item,
|
|
31
|
-
source_type: 'Custom',
|
|
32
|
-
source_id: nil,
|
|
33
|
-
amount: -3.50,
|
|
34
|
-
label: "Other",
|
|
35
|
-
mandatory: false)
|
|
36
|
-
create_adjustment("Promotion A", -2.50)
|
|
37
|
-
|
|
38
|
-
subject.update
|
|
39
|
-
expect(line_item.promo_total).to eql 0.0
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
it "should use only the most valuable promotion" do
|
|
44
|
-
create_adjustment("Promotion A", -100)
|
|
45
|
-
create_adjustment("Promotion B", -200)
|
|
46
|
-
create_adjustment("Promotion C", -300)
|
|
47
|
-
create(:adjustment,
|
|
48
|
-
order: order,
|
|
49
|
-
adjustable: line_item,
|
|
50
|
-
source: nil,
|
|
51
|
-
amount: -500,
|
|
52
|
-
state: "closed",
|
|
53
|
-
label: "Some other credit")
|
|
54
|
-
line_item.adjustments.each { |a| a.update_column(:eligible, true) }
|
|
55
|
-
|
|
56
|
-
subject.update
|
|
57
|
-
|
|
58
|
-
expect(line_item.adjustments.promotion.eligible.count).to eq(1)
|
|
59
|
-
expect(line_item.adjustments.promotion.eligible.first.label).to eq('Promotion C')
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
it "should choose the most recent promotion adjustment when amounts are equal" do
|
|
63
|
-
# Using Timecop is a regression test
|
|
64
|
-
Timecop.freeze do
|
|
65
|
-
create_adjustment("Promotion A", -200)
|
|
66
|
-
create_adjustment("Promotion B", -200)
|
|
67
|
-
end
|
|
68
|
-
line_item.adjustments.each { |a| a.update_column(:eligible, true) }
|
|
69
|
-
|
|
70
|
-
subject.update
|
|
71
|
-
|
|
72
|
-
expect(line_item.adjustments.promotion.eligible.count).to eq(1)
|
|
73
|
-
expect(line_item.adjustments.promotion.eligible.first.label).to eq('Promotion B')
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
context "when previously ineligible promotions become available" do
|
|
77
|
-
let(:order_promo1) do
|
|
78
|
-
create(:promotion,
|
|
79
|
-
:with_order_adjustment,
|
|
80
|
-
:with_item_total_rule,
|
|
81
|
-
weighted_order_adjustment_amount: 5,
|
|
82
|
-
item_total_threshold_amount: 10)
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
let(:order_promo2) do
|
|
86
|
-
create(:promotion,
|
|
87
|
-
:with_order_adjustment,
|
|
88
|
-
:with_item_total_rule,
|
|
89
|
-
weighted_order_adjustment_amount: 10,
|
|
90
|
-
item_total_threshold_amount: 20)
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
let(:order_promos) { [order_promo1, order_promo2] }
|
|
94
|
-
|
|
95
|
-
let(:line_item_promo1) do
|
|
96
|
-
create(:promotion,
|
|
97
|
-
:with_line_item_adjustment,
|
|
98
|
-
:with_item_total_rule,
|
|
99
|
-
adjustment_rate: 2.5,
|
|
100
|
-
item_total_threshold_amount: 10)
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
let(:line_item_promo2) do
|
|
104
|
-
create(:promotion,
|
|
105
|
-
:with_line_item_adjustment,
|
|
106
|
-
:with_item_total_rule,
|
|
107
|
-
adjustment_rate: 5,
|
|
108
|
-
item_total_threshold_amount: 20)
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
let(:line_item_promos) { [line_item_promo1, line_item_promo2] }
|
|
112
|
-
let(:order) { create(:order_with_line_items, line_items_count: 1) }
|
|
113
|
-
|
|
114
|
-
# Apply promotions in different sequences. Results should be the same.
|
|
115
|
-
promo_sequences = [[0, 1], [1, 0]]
|
|
116
|
-
|
|
117
|
-
promo_sequences.each do |promo_sequence|
|
|
118
|
-
it "should pick the best order-level promo according to current eligibility" do
|
|
119
|
-
# apply both promos to the order, even though only promo1 is eligible
|
|
120
|
-
order_promos[promo_sequence[0]].activate order: order
|
|
121
|
-
order_promos[promo_sequence[1]].activate order: order
|
|
122
|
-
|
|
123
|
-
order.reload
|
|
124
|
-
msg = "Expected two adjustments (using sequence #{promo_sequence})"
|
|
125
|
-
expect(order.all_adjustments.count).to eq(2), msg
|
|
126
|
-
|
|
127
|
-
msg = "Expected one elegible adjustment (using sequence #{promo_sequence})"
|
|
128
|
-
expect(order.all_adjustments.eligible.count).to eq(1), msg
|
|
129
|
-
|
|
130
|
-
msg = "Expected promo1 to be used (using sequence #{promo_sequence})"
|
|
131
|
-
expect(order.all_adjustments.eligible.first.source.promotion).to eq(order_promo1), msg
|
|
132
|
-
|
|
133
|
-
order.contents.add create(:variant, price: 10), 1
|
|
134
|
-
order.save
|
|
135
|
-
|
|
136
|
-
order.reload
|
|
137
|
-
msg = "Expected two adjustments (using sequence #{promo_sequence})"
|
|
138
|
-
expect(order.all_adjustments.count).to eq(2), msg
|
|
139
|
-
|
|
140
|
-
msg = "Expected one elegible adjustment (using sequence #{promo_sequence})"
|
|
141
|
-
expect(order.all_adjustments.eligible.count).to eq(1), msg
|
|
142
|
-
|
|
143
|
-
msg = "Expected promo2 to be used (using sequence #{promo_sequence})"
|
|
144
|
-
expect(order.all_adjustments.eligible.first.source.promotion).to eq(order_promo2), msg
|
|
145
|
-
end
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
promo_sequences.each do |promo_sequence|
|
|
149
|
-
it "should pick the best line-item-level promo according to current eligibility" do
|
|
150
|
-
# apply both promos to the order, even though only promo1 is eligible
|
|
151
|
-
line_item_promos[promo_sequence[0]].activate order: order
|
|
152
|
-
line_item_promos[promo_sequence[1]].activate order: order
|
|
153
|
-
|
|
154
|
-
order.reload
|
|
155
|
-
msg = "Expected one adjustment (using sequence #{promo_sequence})"
|
|
156
|
-
expect(order.all_adjustments.count).to eq(1), msg
|
|
157
|
-
|
|
158
|
-
msg = "Expected one elegible adjustment (using sequence #{promo_sequence})"
|
|
159
|
-
expect(order.all_adjustments.eligible.count).to eq(1), msg
|
|
160
|
-
|
|
161
|
-
# line_item_promo1 is the only one that has thus far met the order total threshold,
|
|
162
|
-
# it is the only promo which should be applied.
|
|
163
|
-
msg = "Expected line_item_promo1 to be used (using sequence #{promo_sequence})"
|
|
164
|
-
expect(order.all_adjustments.first.source.promotion).to eq(line_item_promo1), msg
|
|
165
|
-
|
|
166
|
-
order.contents.add create(:variant, price: 10), 1
|
|
167
|
-
order.save
|
|
168
|
-
|
|
169
|
-
order.reload
|
|
170
|
-
msg = "Expected four adjustments (using sequence #{promo_sequence})"
|
|
171
|
-
expect(order.all_adjustments.count).to eq(4), msg
|
|
172
|
-
|
|
173
|
-
msg = "Expected two elegible adjustments (using sequence #{promo_sequence})"
|
|
174
|
-
expect(order.all_adjustments.eligible.count).to eq(2), msg
|
|
175
|
-
|
|
176
|
-
order.all_adjustments.eligible.each do |adjustment|
|
|
177
|
-
msg = "Expected line_item_promo2 to be used (using sequence #{promo_sequence})"
|
|
178
|
-
expect(adjustment.source.promotion).to eq(line_item_promo2), msg
|
|
179
|
-
end
|
|
180
|
-
end
|
|
181
|
-
end
|
|
182
|
-
end
|
|
183
|
-
|
|
184
|
-
context "multiple adjustments and the best one is not eligible" do
|
|
185
|
-
let!(:promo_a) { create_adjustment("Promotion A", -100) }
|
|
186
|
-
let!(:promo_c) { create_adjustment("Promotion C", -300) }
|
|
187
|
-
|
|
188
|
-
before do
|
|
189
|
-
promo_a.update_column(:eligible, true)
|
|
190
|
-
promo_c.update_column(:eligible, false)
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
# regression for #3274
|
|
194
|
-
it "still makes the previous best eligible adjustment valid" do
|
|
195
|
-
subject.update
|
|
196
|
-
expect(line_item.adjustments.promotion.eligible.first.label).to eq('Promotion A')
|
|
197
|
-
end
|
|
198
|
-
end
|
|
199
|
-
|
|
200
|
-
it "should only leave one adjustment even if 2 have the same amount" do
|
|
201
|
-
create_adjustment("Promotion A", -100)
|
|
202
|
-
create_adjustment("Promotion B", -200)
|
|
203
|
-
create_adjustment("Promotion C", -200)
|
|
204
|
-
|
|
205
|
-
subject.update
|
|
206
|
-
|
|
207
|
-
expect(line_item.adjustments.promotion.eligible.count).to eq(1)
|
|
208
|
-
expect(line_item.adjustments.promotion.eligible.first.amount.to_i).to eq(-200)
|
|
209
|
-
end
|
|
210
|
-
end
|
|
211
|
-
end
|