solidus_core 2.1.1 → 2.2.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of solidus_core might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Rakefile +0 -1
- data/app/assets/config/solidus_core_manifest.js +1 -0
- data/app/assets/javascripts/spree.js.erb +72 -0
- data/app/helpers/spree/store_helper.rb +5 -0
- data/app/jobs/spree/promotion_code_batch_job.rb +24 -0
- data/app/mailers/spree/promotion_code_batch_mailer.rb +13 -0
- data/app/models/concerns/spree/calculated_adjustments.rb +1 -1
- data/app/models/concerns/spree/ordered_property_value_list.rb +2 -2
- data/app/models/concerns/spree/user_address_book.rb +4 -4
- data/app/models/concerns/spree/user_methods.rb +7 -0
- data/app/models/concerns/spree/user_payment_source.rb +12 -5
- data/app/models/spree/address.rb +14 -3
- data/app/models/spree/adjustment.rb +13 -1
- data/app/models/spree/app_configuration.rb +0 -19
- data/app/models/spree/base.rb +2 -0
- data/app/models/spree/credit_card.rb +34 -43
- data/app/models/spree/gateway/bogus.rb +1 -1
- data/app/models/spree/gateway.rb +6 -4
- data/app/models/spree/inventory_unit.rb +3 -2
- data/app/models/spree/order/checkout.rb +187 -273
- data/app/models/spree/order.rb +137 -71
- data/app/models/spree/order_contents.rb +1 -1
- data/app/models/spree/order_inventory.rb +11 -11
- data/app/models/spree/order_promotion.rb +2 -0
- data/app/models/spree/order_update_attributes.rb +1 -8
- data/app/models/spree/order_updater.rb +67 -63
- data/app/models/spree/payment.rb +0 -1
- data/app/models/spree/payment_create.rb +27 -7
- data/app/models/spree/payment_method/store_credit.rb +3 -3
- data/app/models/spree/payment_method.rb +4 -1
- data/app/models/spree/payment_source.rb +45 -0
- data/app/models/spree/product/scopes.rb +24 -24
- data/app/models/spree/product.rb +4 -4
- data/app/models/spree/promotion.rb +2 -0
- data/app/models/spree/promotion_code/batch_builder.rb +63 -0
- data/app/models/spree/promotion_code.rb +1 -0
- data/app/models/spree/promotion_code_batch.rb +25 -0
- data/app/models/spree/promotion_handler/cart.rb +2 -2
- data/app/models/spree/promotion_handler/coupon.rb +1 -2
- data/app/models/spree/promotion_handler/free_shipping.rb +32 -21
- data/app/models/spree/promotion_handler/page.rb +1 -1
- data/app/models/spree/reimbursement.rb +1 -1
- data/app/models/spree/return_authorization.rb +0 -28
- data/app/models/spree/return_item.rb +1 -1
- data/app/models/spree/shipment.rb +4 -4
- data/app/models/spree/shipping_method.rb +2 -2
- data/app/models/spree/shipping_rate.rb +1 -1
- data/app/models/spree/stock/availability_validator.rb +16 -17
- data/app/models/spree/stock/coordinator.rb +3 -3
- data/app/models/spree/stock/package.rb +1 -1
- data/app/models/spree/stock/quantifier.rb +5 -4
- data/app/models/spree/stock_location.rb +2 -2
- data/app/models/spree/store.rb +2 -2
- data/app/models/spree/store_credit.rb +1 -1
- data/app/models/spree/tax/tax_helpers.rb +3 -3
- data/app/models/spree/tax_rate.rb +7 -1
- data/app/models/spree/taxonomy.rb +1 -1
- data/app/models/spree/variant/scopes.rb +5 -5
- data/app/models/spree/variant/vat_price_generator.rb +8 -5
- data/app/models/spree/variant.rb +1 -0
- data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +19 -10
- data/app/models/spree/wallet/default_payment_builder.rb +6 -6
- data/app/models/spree/wallet.rb +71 -0
- data/app/models/spree/wallet_payment_source.rb +17 -0
- data/app/models/spree/zone.rb +1 -1
- data/app/views/spree/carton_mailer/shipped_email.text.erb +1 -1
- data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_errored.text.erb +2 -0
- data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_finished.text.erb +2 -0
- data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +0 -7
- data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +0 -5
- data/app/views/spree/shared/_error_messages.html.erb +1 -1
- data/app/views/spree/shipment_mailer/shipped_email.html.erb +1 -1
- data/config/initializers/assets.rb +1 -1
- data/config/initializers/friendly_id.rb +1 -1
- data/config/locales/en.yml +50 -12
- data/db/default/spree/store_credit.rb +2 -1
- data/db/migrate/20130826062534_add_depth_to_spree_taxons.rb +4 -6
- data/db/migrate/20160420044191_create_spree_wallet_payment_sources.rb +23 -0
- data/db/migrate/20160420181916_migrate_credit_cards_to_wallet_payment_sources.rb +26 -0
- data/db/migrate/20161017102621_create_spree_promotion_code_batch.rb +36 -0
- data/db/migrate/20161129035810_add_index_to_spree_payments_number.rb +5 -0
- data/db/migrate/20170223235001_remove_spree_store_credits_column.rb +5 -0
- data/lib/generators/spree/dummy/templates/rails/application.rb +1 -1
- data/lib/generators/spree/dummy/templates/rails/test.rb +1 -1
- data/lib/generators/spree/install/install_generator.rb +6 -5
- data/lib/spree/core/controller_helpers/payment_parameters.rb +54 -0
- data/lib/spree/core/engine.rb +6 -9
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/core.rb +0 -1
- data/lib/spree/money.rb +18 -0
- data/lib/spree/permission_sets/default_customer.rb +1 -1
- data/lib/spree/permitted_attributes.rb +1 -1
- data/lib/spree/testing_support/authorization_helpers.rb +1 -0
- data/lib/spree/testing_support/capybara_ext.rb +13 -0
- data/lib/spree/testing_support/factories/order_factory.rb +5 -1
- data/lib/spree/testing_support/factories/payment_factory.rb +1 -1
- data/lib/spree/testing_support/factories/shipment_factory.rb +0 -1
- data/solidus_core.gemspec +3 -3
- data/spec/jobs/promotion_code_batch_job_spec.rb +65 -0
- data/spec/lib/calculated_adjustments_spec.rb +105 -1
- data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +4 -1
- data/spec/lib/spree/core/testing_support/factories/payment_factory_spec.rb +8 -0
- data/spec/lib/spree/money_spec.rb +32 -0
- data/spec/lib/spree/permission_sets/default_customer_spec.rb +20 -0
- data/spec/mailers/promotion_code_batch_mailer_spec.rb +45 -0
- data/spec/models/spree/credit_card_spec.rb +86 -86
- data/spec/models/spree/gateway_spec.rb +3 -1
- data/spec/models/spree/inventory_unit_spec.rb +12 -4
- data/spec/models/spree/order/checkout_spec.rb +11 -32
- data/spec/models/spree/order/tax_spec.rb +2 -2
- data/spec/models/spree/order_contents_spec.rb +24 -1
- data/spec/models/spree/order_inventory_spec.rb +130 -83
- data/spec/models/spree/order_spec.rb +15 -117
- data/spec/models/spree/order_update_attributes_spec.rb +1 -44
- data/spec/models/spree/order_updater_spec.rb +10 -13
- data/spec/models/spree/payment_create_spec.rb +5 -1
- data/spec/models/spree/payment_method_spec.rb +16 -0
- data/spec/models/spree/payment_spec.rb +14 -8
- data/spec/models/spree/promotion_code/batch_builder_spec.rb +61 -0
- data/spec/models/spree/promotion_code_batch_spec.rb +58 -0
- data/spec/models/spree/promotion_code_spec.rb +4 -0
- data/spec/models/spree/promotion_spec.rb +3 -6
- data/spec/models/spree/return_authorization_spec.rb +0 -59
- data/spec/models/spree/shipment_spec.rb +4 -4
- data/spec/models/spree/stock/availability_validator_spec.rb +64 -9
- data/spec/models/spree/tax/item_adjuster_spec.rb +1 -2
- data/spec/models/spree/unit_cancel_spec.rb +0 -85
- data/spec/models/spree/user_spec.rb +3 -1
- data/spec/models/spree/variant/vat_price_generator_spec.rb +8 -2
- data/spec/models/spree/variant_spec.rb +16 -4
- data/spec/models/spree/wallet_payment_source_spec.rb +46 -0
- data/spec/models/spree/wallet_spec.rb +128 -0
- data/spec/support/concerns/payment_source.rb +64 -0
- metadata +51 -25
- data/app/assets/javascripts/spree.js.coffee.erb +0 -64
- data/app/models/spree/promotion_builder.rb +0 -55
- data/app/models/spree/promotion_code/code_builder.rb +0 -62
- data/config/initializers/premailer_assets.rb +0 -1
- data/lib/spree/core/unreturned_item_charger.rb +0 -106
- data/lib/tasks/exchanges.rake +0 -47
- data/spec/lib/spree/core/unreturned_item_charger_spec.rb +0 -126
- data/spec/lib/tasks/exchanges_spec.rb +0 -220
- data/spec/models/spree/promotion_builder_spec.rb +0 -120
- data/spec/models/spree/promotion_code/code_builder_spec.rb +0 -77
@@ -19,12 +19,35 @@ describe Spree::OrderContents, type: :model do
|
|
19
19
|
end
|
20
20
|
|
21
21
|
context 'given a shipment' do
|
22
|
+
let!(:shipment) { create(:shipment) }
|
23
|
+
|
22
24
|
it "ensure shipment calls update_amounts instead of order calling ensure_updated_shipments" do
|
23
|
-
shipment = create(:shipment)
|
24
25
|
expect(subject.order).to_not receive(:ensure_updated_shipments)
|
25
26
|
expect(shipment).to receive(:update_amounts)
|
26
27
|
subject.add(variant, 1, shipment: shipment)
|
27
28
|
end
|
29
|
+
|
30
|
+
context "with quantity=1" do
|
31
|
+
it "creates correct inventory" do
|
32
|
+
subject.add(variant, 1, shipment: shipment)
|
33
|
+
expect(order.inventory_units.count).to eq(1)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "with quantity=2" do
|
38
|
+
it "creates correct inventory" do
|
39
|
+
subject.add(variant, 2, shipment: shipment)
|
40
|
+
expect(order.inventory_units.count).to eq(2)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "called multiple times" do
|
45
|
+
it "creates correct inventory" do
|
46
|
+
subject.add(variant, 1, shipment: shipment)
|
47
|
+
subject.add(variant, 1, shipment: shipment)
|
48
|
+
expect(order.inventory_units.count).to eq(2)
|
49
|
+
end
|
50
|
+
end
|
28
51
|
end
|
29
52
|
|
30
53
|
context 'not given a shipment' do
|
@@ -3,37 +3,57 @@ require 'spec_helper'
|
|
3
3
|
describe Spree::OrderInventory, type: :model do
|
4
4
|
let(:order) { create :completed_order_with_totals }
|
5
5
|
let(:line_item) { order.line_items.first }
|
6
|
+
let(:shipment) { order.shipments.first }
|
7
|
+
let(:variant) { subject.variant }
|
8
|
+
let(:stock_item) { shipment.stock_location.stock_item(variant) }
|
9
|
+
|
6
10
|
|
7
11
|
subject { described_class.new(order, line_item) }
|
8
12
|
|
9
|
-
context "
|
10
|
-
|
13
|
+
context "insufficient inventory units" do
|
14
|
+
let(:old_quantity) { 1 }
|
15
|
+
let(:new_quantity) { 3 }
|
16
|
+
|
17
|
+
before do
|
18
|
+
line_item.update_attributes!(quantity: old_quantity)
|
19
|
+
|
20
|
+
line_item.update_column(:quantity, new_quantity)
|
21
|
+
subject.line_item.reload
|
22
|
+
end
|
11
23
|
|
12
24
|
it 'creates the proper number of inventory units' do
|
13
|
-
|
14
|
-
|
25
|
+
expect(line_item.inventory_units.count).to eq(old_quantity)
|
26
|
+
subject.verify(shipment)
|
27
|
+
expect(line_item.inventory_units.count).to eq(new_quantity)
|
15
28
|
end
|
16
|
-
end
|
17
29
|
|
18
|
-
|
19
|
-
|
30
|
+
it "unstocks items" do
|
31
|
+
expect {
|
32
|
+
subject.verify(shipment)
|
33
|
+
}.to change { stock_item.reload.count_on_hand }.by(-2)
|
34
|
+
end
|
20
35
|
|
21
36
|
context "order is not completed" do
|
22
|
-
before {
|
37
|
+
before { order.update_columns completed_at: nil }
|
23
38
|
|
24
39
|
it "doesn't unstock items" do
|
25
|
-
expect
|
26
|
-
|
40
|
+
expect {
|
41
|
+
subject.verify(shipment)
|
42
|
+
}.not_to change { stock_item.reload.count_on_hand }
|
27
43
|
end
|
28
44
|
end
|
29
45
|
|
30
46
|
context "inventory units state" do
|
31
47
|
before { shipment.inventory_units.destroy_all }
|
48
|
+
let(:new_quantity) { 5 }
|
32
49
|
|
33
50
|
it 'sets inventory_units state as per stock location availability' do
|
34
|
-
|
51
|
+
stock_item.update_columns(
|
52
|
+
backorderable: true,
|
53
|
+
count_on_hand: 3
|
54
|
+
)
|
35
55
|
|
36
|
-
|
56
|
+
subject.verify
|
37
57
|
|
38
58
|
units = shipment.inventory_units_for(subject.variant).group_by(&:state)
|
39
59
|
expect(units['backordered'].size).to eq(2)
|
@@ -42,33 +62,31 @@ describe Spree::OrderInventory, type: :model do
|
|
42
62
|
end
|
43
63
|
|
44
64
|
context "store doesnt track inventory" do
|
45
|
-
let(:
|
65
|
+
let(:new_quantity) { 1 }
|
46
66
|
|
47
67
|
before { Spree::Config.track_inventory_levels = false }
|
48
68
|
|
49
|
-
it "creates
|
69
|
+
it "creates on hand inventory units" do
|
50
70
|
variant.stock_items.destroy_all
|
51
71
|
|
52
|
-
|
53
|
-
line_item = order.contents.add variant, 1, shipment: shipment
|
72
|
+
subject.verify(shipment)
|
54
73
|
|
55
|
-
units = shipment.inventory_units_for(
|
74
|
+
units = shipment.inventory_units_for(variant)
|
56
75
|
expect(units.count).to eq 1
|
57
76
|
expect(units.first).to be_on_hand
|
58
77
|
end
|
59
78
|
end
|
60
79
|
|
61
80
|
context "variant doesnt track inventory" do
|
62
|
-
|
63
|
-
|
81
|
+
before { variant.update_attributes!(track_inventory: false) }
|
82
|
+
let(:new_quantity) { 1 }
|
64
83
|
|
65
|
-
it "creates
|
84
|
+
it "creates on hand inventory units" do
|
66
85
|
variant.stock_items.destroy_all
|
67
86
|
|
68
|
-
line_item = order.contents.add variant, 1
|
69
87
|
subject.verify(shipment)
|
70
88
|
|
71
|
-
units = shipment.inventory_units_for(
|
89
|
+
units = shipment.inventory_units_for(variant)
|
72
90
|
expect(units.count).to eq 1
|
73
91
|
expect(units.first).to be_on_hand
|
74
92
|
end
|
@@ -79,9 +97,21 @@ describe Spree::OrderInventory, type: :model do
|
|
79
97
|
|
80
98
|
stock_item = shipment.stock_location.stock_item(subject.variant)
|
81
99
|
movement = stock_item.stock_movements.last
|
82
|
-
|
100
|
+
expect(movement.originator).to eq(shipment)
|
83
101
|
expect(movement.quantity).to eq(-5)
|
84
102
|
end
|
103
|
+
|
104
|
+
context "calling multiple times" do
|
105
|
+
it "creates the correct number of inventory units" do
|
106
|
+
line_item.update_columns(quantity: 2)
|
107
|
+
subject.verify(shipment)
|
108
|
+
expect(line_item.inventory_units.count).to eq(2)
|
109
|
+
|
110
|
+
line_item.update_columns(quantity: 3)
|
111
|
+
subject.verify(shipment)
|
112
|
+
expect(line_item.inventory_units.count).to eq(3)
|
113
|
+
end
|
114
|
+
end
|
85
115
|
end
|
86
116
|
|
87
117
|
context "#determine_target_shipment" do
|
@@ -122,11 +152,13 @@ describe Spree::OrderInventory, type: :model do
|
|
122
152
|
end
|
123
153
|
|
124
154
|
context 'when order has too many inventory units' do
|
155
|
+
let(:old_quantity) { 3 }
|
156
|
+
let(:new_quantity) { 2 }
|
157
|
+
|
125
158
|
before do
|
126
|
-
line_item.quantity
|
127
|
-
line_item.save!
|
159
|
+
line_item.update_attributes!(quantity: old_quantity)
|
128
160
|
|
129
|
-
line_item.update_column(:quantity,
|
161
|
+
line_item.update_column(:quantity, new_quantity)
|
130
162
|
subject.line_item.reload
|
131
163
|
end
|
132
164
|
|
@@ -137,93 +169,108 @@ describe Spree::OrderInventory, type: :model do
|
|
137
169
|
|
138
170
|
it 'should decrease the number of inventory units' do
|
139
171
|
subject.verify
|
140
|
-
expect(
|
172
|
+
expect(line_item.inventory_units.count).to eq 2
|
173
|
+
expect(order.inventory_units.count).to eq 2
|
141
174
|
end
|
142
175
|
|
143
|
-
context
|
144
|
-
|
145
|
-
let(:variant) { subject.variant }
|
176
|
+
context "order is not completed" do
|
177
|
+
before { order.update_columns(completed_at: nil) }
|
146
178
|
|
147
|
-
|
148
|
-
|
179
|
+
it "doesn't restock items" do
|
180
|
+
expect(shipment.stock_location).not_to receive(:restock)
|
149
181
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
182
|
+
expect {
|
183
|
+
subject.verify(shipment)
|
184
|
+
}.not_to change { stock_item.reload.count_on_hand }
|
185
|
+
|
186
|
+
expect(line_item.inventory_units.count).to eq(new_quantity)
|
154
187
|
end
|
188
|
+
end
|
189
|
+
|
190
|
+
it 'should change count_on_hand' do
|
191
|
+
expect {
|
192
|
+
subject.verify(shipment)
|
193
|
+
}.to change { stock_item.reload.count_on_hand }.by(1)
|
194
|
+
end
|
155
195
|
|
156
|
-
|
157
|
-
|
196
|
+
it 'should create stock_movement' do
|
197
|
+
stock_item = shipment.stock_location.stock_item(variant)
|
158
198
|
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
199
|
+
expect {
|
200
|
+
subject.verify(shipment)
|
201
|
+
}.to change { stock_item.stock_movements.count }.by(1)
|
202
|
+
|
203
|
+
movement = stock_item.stock_movements.last
|
204
|
+
expect(movement.originator).to eq shipment
|
205
|
+
expect(movement.quantity).to eq(1)
|
206
|
+
end
|
207
|
+
|
208
|
+
context 'with some backordered' do
|
209
|
+
let(:new_quantity) { 1 }
|
210
|
+
|
211
|
+
before do
|
212
|
+
line_item.inventory_units[0].update_columns(state: 'backordered')
|
213
|
+
line_item.inventory_units[1].update_columns(state: 'on_hand')
|
214
|
+
line_item.inventory_units[2].update_columns(state: 'backordered')
|
163
215
|
end
|
164
216
|
|
165
217
|
it 'should destroy backordered units first' do
|
166
|
-
|
167
|
-
mock_model(Spree::InventoryUnit, variant_id: variant.id, state: 'backordered'),
|
168
|
-
mock_model(Spree::InventoryUnit, variant_id: variant.id, state: 'on_hand'),
|
169
|
-
mock_model(Spree::InventoryUnit, variant_id: variant.id, state: 'backordered')
|
170
|
-
])
|
218
|
+
on_hand_unit = line_item.inventory_units.find_by state: 'on_hand'
|
171
219
|
|
172
|
-
|
173
|
-
expect(shipment.inventory_units_for_item[1]).not_to receive(:destroy)
|
174
|
-
expect(shipment.inventory_units_for_item[2]).to receive(:destroy)
|
220
|
+
subject.verify(shipment)
|
175
221
|
|
176
|
-
expect(
|
222
|
+
expect(line_item.inventory_units.reload).to eq([on_hand_unit])
|
177
223
|
end
|
224
|
+
end
|
178
225
|
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
mock_model(Spree::InventoryUnit, variant_id: variant.id, state: 'on_hand')
|
183
|
-
])
|
226
|
+
context 'with some shipped items' do
|
227
|
+
let(:old_quantity) { 2 }
|
228
|
+
let(:new_quantity) { 1 }
|
184
229
|
|
185
|
-
|
186
|
-
|
230
|
+
let(:shipped_unit) { line_item.inventory_units[0] }
|
231
|
+
before do
|
232
|
+
shipped_unit.update_columns(state: 'shipped')
|
233
|
+
end
|
234
|
+
|
235
|
+
it 'should destroy unshipped units first' do
|
236
|
+
subject.verify(shipment)
|
187
237
|
|
188
|
-
expect(
|
238
|
+
expect(line_item.inventory_units.reload).to eq([shipped_unit])
|
189
239
|
end
|
190
240
|
|
191
|
-
|
192
|
-
|
193
|
-
mock_model(Spree::InventoryUnit, variant_id: variant.id, state: 'shipped'),
|
194
|
-
mock_model(Spree::InventoryUnit, variant_id: variant.id, state: 'on_hand')
|
195
|
-
])
|
241
|
+
context 'trying to remove shipped units' do
|
242
|
+
let(:new_quantity) { 0 }
|
196
243
|
|
197
|
-
|
198
|
-
|
244
|
+
it 'only attempts to destroy as many units as are eligible, and return amount destroyed' do
|
245
|
+
subject.verify(shipment)
|
199
246
|
|
200
|
-
|
247
|
+
expect(line_item.inventory_units.reload).to eq([shipped_unit])
|
248
|
+
end
|
201
249
|
end
|
250
|
+
end
|
202
251
|
|
203
|
-
|
204
|
-
|
205
|
-
shipment.inventory_units.reload
|
252
|
+
context 'destroying all units' do
|
253
|
+
let(:new_quantity) { 0 }
|
206
254
|
|
255
|
+
it 'should destroy shipment' do
|
207
256
|
expect {
|
208
|
-
|
257
|
+
subject.verify(shipment)
|
209
258
|
}.to change{ order.shipments.count }.from(1).to(0)
|
210
259
|
end
|
260
|
+
end
|
211
261
|
|
212
|
-
|
213
|
-
|
262
|
+
context "inventory unit line item and variant points to different products" do
|
263
|
+
let(:new_quantity) { 0 }
|
264
|
+
let(:different_line_item) { create(:line_item, order: order) }
|
214
265
|
|
215
|
-
|
216
|
-
|
217
|
-
|
266
|
+
let!(:different_inventory) do
|
267
|
+
shipment.set_up_inventory("on_hand", variant, order, different_line_item)
|
268
|
+
end
|
218
269
|
|
219
|
-
|
220
|
-
|
270
|
+
it "removes only units that match both line item and variant" do
|
271
|
+
subject.verify(shipment)
|
221
272
|
|
222
|
-
|
223
|
-
subject.send(:remove_from_shipment, shipment, shipment.inventory_units.count)
|
224
|
-
expect(different_inventory.reload).to be_persisted
|
225
|
-
end
|
226
|
-
end
|
273
|
+
expect(different_inventory.reload).to be_persisted
|
227
274
|
end
|
228
275
|
end
|
229
276
|
end
|
@@ -107,10 +107,11 @@ describe Spree::Order, type: :model do
|
|
107
107
|
|
108
108
|
it "update and persist totals" do
|
109
109
|
expect(shipment).to receive :update_amounts
|
110
|
-
expect(order.updater).to receive :
|
111
|
-
expect(order.updater).to receive :persist_totals
|
110
|
+
expect(order.updater).to receive :update
|
112
111
|
|
113
|
-
|
112
|
+
Spree::Deprecation.silence do
|
113
|
+
order.set_shipments_cost
|
114
|
+
end
|
114
115
|
end
|
115
116
|
end
|
116
117
|
|
@@ -537,6 +538,16 @@ describe Spree::Order, type: :model do
|
|
537
538
|
expect(order.available_payment_methods).to include(payment_method)
|
538
539
|
end
|
539
540
|
|
541
|
+
it "does not include inactive payment methods" do
|
542
|
+
Spree::PaymentMethod.create!({
|
543
|
+
name: "Fake",
|
544
|
+
active: false,
|
545
|
+
available_to_users: true,
|
546
|
+
available_to_admin: true
|
547
|
+
})
|
548
|
+
expect(order.available_payment_methods.count).to eq(0)
|
549
|
+
end
|
550
|
+
|
540
551
|
context "with more than one payment method" do
|
541
552
|
subject { order.available_payment_methods }
|
542
553
|
|
@@ -550,7 +561,7 @@ describe Spree::Order, type: :model do
|
|
550
561
|
end
|
551
562
|
|
552
563
|
it "respects the order of methods based on position" do
|
553
|
-
expect(subject).to
|
564
|
+
expect(subject).to eq([second_method, first_method])
|
554
565
|
end
|
555
566
|
end
|
556
567
|
|
@@ -956,25 +967,6 @@ describe Spree::Order, type: :model do
|
|
956
967
|
|
957
968
|
expect { shipment.reload }.not_to raise_error
|
958
969
|
end
|
959
|
-
|
960
|
-
context "unreturned exchange" do
|
961
|
-
let!(:first_shipment) do
|
962
|
-
create(:shipment, order: subject, state: first_shipment_state, created_at: 5.days.ago)
|
963
|
-
end
|
964
|
-
let!(:second_shipment) do
|
965
|
-
create(:shipment, order: subject, state: second_shipment_state, created_at: 5.days.ago)
|
966
|
-
end
|
967
|
-
|
968
|
-
context "all shipments are shipped" do
|
969
|
-
let(:first_shipment_state) { "shipped" }
|
970
|
-
let(:second_shipment_state) { "shipped" }
|
971
|
-
|
972
|
-
it "returns the shipments" do
|
973
|
-
subject.create_proposed_shipments
|
974
|
-
expect(subject.shipments).to match_array [first_shipment, second_shipment]
|
975
|
-
end
|
976
|
-
end
|
977
|
-
end
|
978
970
|
end
|
979
971
|
|
980
972
|
describe "#all_inventory_units_returned?" do
|
@@ -1007,48 +999,6 @@ describe Spree::Order, type: :model do
|
|
1007
999
|
end
|
1008
1000
|
end
|
1009
1001
|
|
1010
|
-
describe "#unreturned_exchange?" do
|
1011
|
-
let(:order) { create(:order_with_line_items) }
|
1012
|
-
subject { order.reload.unreturned_exchange? }
|
1013
|
-
|
1014
|
-
context "the order does not have a shipment" do
|
1015
|
-
before { order.shipments.destroy_all }
|
1016
|
-
|
1017
|
-
it { is_expected.to be false }
|
1018
|
-
end
|
1019
|
-
|
1020
|
-
context "shipment created after order" do
|
1021
|
-
it { is_expected.to be false }
|
1022
|
-
end
|
1023
|
-
|
1024
|
-
context "shipment created before order" do
|
1025
|
-
before do
|
1026
|
-
order.shipments.first.update_attributes!(created_at: order.created_at - 1.day)
|
1027
|
-
end
|
1028
|
-
|
1029
|
-
it { is_expected.to be true }
|
1030
|
-
end
|
1031
|
-
end
|
1032
|
-
|
1033
|
-
describe '.unreturned_exchange' do
|
1034
|
-
let(:order) { create(:order_with_line_items) }
|
1035
|
-
subject { described_class.unreturned_exchange }
|
1036
|
-
|
1037
|
-
it 'includes orders that have a shipment created prior to the order' do
|
1038
|
-
order.shipments.first.update_attributes!(created_at: order.created_at - 1.day)
|
1039
|
-
expect(subject).to include order
|
1040
|
-
end
|
1041
|
-
|
1042
|
-
it 'excludes orders that were created prior to their shipment' do
|
1043
|
-
expect(subject).not_to include order
|
1044
|
-
end
|
1045
|
-
|
1046
|
-
it 'excludes orders with no shipment' do
|
1047
|
-
order.shipments.destroy_all
|
1048
|
-
expect(subject).not_to include order
|
1049
|
-
end
|
1050
|
-
end
|
1051
|
-
|
1052
1002
|
context "store credit" do
|
1053
1003
|
shared_examples "check total store credit from payments" do
|
1054
1004
|
context "with valid payments" do
|
@@ -1459,56 +1409,4 @@ describe Spree::Order, type: :model do
|
|
1459
1409
|
end
|
1460
1410
|
end
|
1461
1411
|
end
|
1462
|
-
|
1463
|
-
describe "#validate_payments_attributes" do
|
1464
|
-
let(:attributes) { [ActionController::Parameters.new(payment_method_id: payment_method.id)] }
|
1465
|
-
subject do
|
1466
|
-
order.validate_payments_attributes(attributes)
|
1467
|
-
end
|
1468
|
-
|
1469
|
-
context "with empty array" do
|
1470
|
-
let(:attributes) { [] }
|
1471
|
-
it "doesn't error" do
|
1472
|
-
subject
|
1473
|
-
end
|
1474
|
-
end
|
1475
|
-
|
1476
|
-
context "with no payment method specified" do
|
1477
|
-
let(:attributes) { [ActionController::Parameters.new({})] }
|
1478
|
-
it "doesn't error" do
|
1479
|
-
subject
|
1480
|
-
end
|
1481
|
-
end
|
1482
|
-
|
1483
|
-
context "with valid payment method" do
|
1484
|
-
let(:payment_method) { create(:check_payment_method) }
|
1485
|
-
it "doesn't error" do
|
1486
|
-
subject
|
1487
|
-
end
|
1488
|
-
end
|
1489
|
-
|
1490
|
-
context "with inactive payment method" do
|
1491
|
-
let(:payment_method) { create(:check_payment_method, active: false) }
|
1492
|
-
|
1493
|
-
it "raises RecordNotFound" do
|
1494
|
-
expect { subject }.to raise_error(ActiveRecord::RecordNotFound)
|
1495
|
-
end
|
1496
|
-
end
|
1497
|
-
|
1498
|
-
context "with unavailable payment method" do
|
1499
|
-
let(:payment_method) { create(:check_payment_method, available_to_users: false) }
|
1500
|
-
|
1501
|
-
it "raises RecordNotFound" do
|
1502
|
-
expect { subject }.to raise_error(ActiveRecord::RecordNotFound)
|
1503
|
-
end
|
1504
|
-
end
|
1505
|
-
|
1506
|
-
context "with soft-deleted payment method" do
|
1507
|
-
let(:payment_method) { create(:check_payment_method, deleted_at: Time.current) }
|
1508
|
-
|
1509
|
-
it "raises RecordNotFound" do
|
1510
|
-
expect { subject }.to raise_error(ActiveRecord::RecordNotFound)
|
1511
|
-
end
|
1512
|
-
end
|
1513
|
-
end
|
1514
1412
|
end
|
@@ -3,7 +3,6 @@ require 'spec_helper'
|
|
3
3
|
module Spree
|
4
4
|
RSpec.describe OrderUpdateAttributes do
|
5
5
|
let(:order) { create(:order) }
|
6
|
-
let(:payment_method) { create(:payment_method) }
|
7
6
|
let(:request_env) { nil }
|
8
7
|
let(:update) { described_class.new(order, attributes, request_env: request_env) }
|
9
8
|
|
@@ -26,10 +25,7 @@ module Spree
|
|
26
25
|
let(:attributes) do
|
27
26
|
{
|
28
27
|
payments_attributes: [
|
29
|
-
{
|
30
|
-
payment_method_id: payment_method.id,
|
31
|
-
source_attributes: attributes_for(:credit_card)
|
32
|
-
}
|
28
|
+
{ source_attributes: attributes_for(:credit_card) }
|
33
29
|
]
|
34
30
|
}
|
35
31
|
end
|
@@ -43,44 +39,5 @@ module Spree
|
|
43
39
|
end
|
44
40
|
end
|
45
41
|
end
|
46
|
-
|
47
|
-
context 'when changing shipping method' do
|
48
|
-
let!(:order) { create(:order_with_line_items, shipping_method: shipping_method1) }
|
49
|
-
let(:shipment){ order.shipments.first }
|
50
|
-
let!(:zone) { create(:zone) }
|
51
|
-
let!(:shipping_method1){ create(:shipping_method, cost: 10, zones: [zone]) }
|
52
|
-
let!(:shipping_method2){ create(:shipping_method, cost: 20, zones: [zone]) }
|
53
|
-
|
54
|
-
let(:attributes) do
|
55
|
-
{
|
56
|
-
shipments_attributes: {
|
57
|
-
0 => { selected_shipping_rate_id: shipping_method2, id: shipment.id }
|
58
|
-
}
|
59
|
-
}
|
60
|
-
end
|
61
|
-
|
62
|
-
it "updates shipment costs" do
|
63
|
-
zone.zone_members.create!(zoneable: order.ship_address.country)
|
64
|
-
order.create_proposed_shipments
|
65
|
-
order.set_shipments_cost
|
66
|
-
|
67
|
-
shipping_rate2 = shipment.shipping_rates.find_by(shipping_method_id: shipping_method2.id)
|
68
|
-
|
69
|
-
expect(order.shipment_total).to eq(10)
|
70
|
-
|
71
|
-
# We need an order which doesn't have shipping_rates loaded
|
72
|
-
order.reload
|
73
|
-
|
74
|
-
described_class.new(
|
75
|
-
order,
|
76
|
-
shipments_attributes: {
|
77
|
-
0 => { selected_shipping_rate_id: shipping_rate2.id, id: shipment.id }
|
78
|
-
}
|
79
|
-
).apply
|
80
|
-
|
81
|
-
expect(order.shipment_total).to eq(20)
|
82
|
-
expect(order.shipments.first.cost).to eq(20)
|
83
|
-
end
|
84
|
-
end
|
85
42
|
end
|
86
43
|
end
|
@@ -16,20 +16,22 @@ module Spree
|
|
16
16
|
context 'with refund' do
|
17
17
|
it "updates payment totals" do
|
18
18
|
create(:payment_with_refund, order: order, amount: 33.25, refund_amount: 3)
|
19
|
-
|
19
|
+
updater.update
|
20
20
|
expect(order.payment_total).to eq(30.25)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
24
|
it "update item total" do
|
25
|
-
|
26
|
-
|
25
|
+
expect {
|
26
|
+
updater.update
|
27
|
+
}.to change { order.item_total }.to 20
|
27
28
|
end
|
28
29
|
|
29
30
|
it "update shipment total" do
|
30
31
|
create(:shipment, order: order, cost: 10)
|
31
|
-
|
32
|
-
|
32
|
+
expect {
|
33
|
+
updater.update
|
34
|
+
}.to change { order.shipment_total }.to 10
|
33
35
|
end
|
34
36
|
|
35
37
|
context 'with order promotion followed by line item addition' do
|
@@ -60,7 +62,7 @@ module Spree
|
|
60
62
|
create(:adjustment, adjustable: order, order: order, source: nil, amount: 10)
|
61
63
|
|
62
64
|
expect {
|
63
|
-
updater.
|
65
|
+
updater.update
|
64
66
|
}.to change {
|
65
67
|
order.adjustment_total
|
66
68
|
}.from(0).to(10)
|
@@ -483,17 +485,12 @@ module Spree
|
|
483
485
|
|
484
486
|
it "updates each shipment" do
|
485
487
|
expect(shipment).to receive(:update!)
|
486
|
-
updater.
|
487
|
-
end
|
488
|
-
|
489
|
-
it "refreshes shipment rates" do
|
490
|
-
expect(shipment).to receive(:refresh_rates)
|
491
|
-
updater.update_shipments
|
488
|
+
updater.update
|
492
489
|
end
|
493
490
|
|
494
491
|
it "updates the shipment amount" do
|
495
492
|
expect(shipment).to receive(:update_amounts)
|
496
|
-
updater.
|
493
|
+
updater.update
|
497
494
|
end
|
498
495
|
end
|
499
496
|
end
|
@@ -68,7 +68,7 @@ module Spree
|
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
|
-
context 'with
|
71
|
+
context 'with the deprecated existing_card_id attribute' do
|
72
72
|
let(:user) { create(:user) }
|
73
73
|
let!(:credit_card) { create(:credit_card, user: order.user) }
|
74
74
|
|
@@ -81,6 +81,10 @@ module Spree
|
|
81
81
|
}
|
82
82
|
end
|
83
83
|
|
84
|
+
around do |example|
|
85
|
+
Spree::Deprecation.silence { example.run }
|
86
|
+
end
|
87
|
+
|
84
88
|
it 'sets the existing card as the source for the new payment' do
|
85
89
|
expect(new_payment.source).to eq(credit_card)
|
86
90
|
end
|