solidus_core 2.1.1 → 2.2.0.beta1
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/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
|