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.
Files changed (145) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +0 -1
  3. data/app/assets/config/solidus_core_manifest.js +1 -0
  4. data/app/assets/javascripts/spree.js.erb +72 -0
  5. data/app/helpers/spree/store_helper.rb +5 -0
  6. data/app/jobs/spree/promotion_code_batch_job.rb +24 -0
  7. data/app/mailers/spree/promotion_code_batch_mailer.rb +13 -0
  8. data/app/models/concerns/spree/calculated_adjustments.rb +1 -1
  9. data/app/models/concerns/spree/ordered_property_value_list.rb +2 -2
  10. data/app/models/concerns/spree/user_address_book.rb +4 -4
  11. data/app/models/concerns/spree/user_methods.rb +7 -0
  12. data/app/models/concerns/spree/user_payment_source.rb +12 -5
  13. data/app/models/spree/address.rb +14 -3
  14. data/app/models/spree/adjustment.rb +13 -1
  15. data/app/models/spree/app_configuration.rb +0 -19
  16. data/app/models/spree/base.rb +2 -0
  17. data/app/models/spree/credit_card.rb +34 -43
  18. data/app/models/spree/gateway/bogus.rb +1 -1
  19. data/app/models/spree/gateway.rb +6 -4
  20. data/app/models/spree/inventory_unit.rb +3 -2
  21. data/app/models/spree/order/checkout.rb +187 -273
  22. data/app/models/spree/order.rb +137 -71
  23. data/app/models/spree/order_contents.rb +1 -1
  24. data/app/models/spree/order_inventory.rb +11 -11
  25. data/app/models/spree/order_promotion.rb +2 -0
  26. data/app/models/spree/order_update_attributes.rb +1 -8
  27. data/app/models/spree/order_updater.rb +67 -63
  28. data/app/models/spree/payment.rb +0 -1
  29. data/app/models/spree/payment_create.rb +27 -7
  30. data/app/models/spree/payment_method/store_credit.rb +3 -3
  31. data/app/models/spree/payment_method.rb +4 -1
  32. data/app/models/spree/payment_source.rb +45 -0
  33. data/app/models/spree/product/scopes.rb +24 -24
  34. data/app/models/spree/product.rb +4 -4
  35. data/app/models/spree/promotion.rb +2 -0
  36. data/app/models/spree/promotion_code/batch_builder.rb +63 -0
  37. data/app/models/spree/promotion_code.rb +1 -0
  38. data/app/models/spree/promotion_code_batch.rb +25 -0
  39. data/app/models/spree/promotion_handler/cart.rb +2 -2
  40. data/app/models/spree/promotion_handler/coupon.rb +1 -2
  41. data/app/models/spree/promotion_handler/free_shipping.rb +32 -21
  42. data/app/models/spree/promotion_handler/page.rb +1 -1
  43. data/app/models/spree/reimbursement.rb +1 -1
  44. data/app/models/spree/return_authorization.rb +0 -28
  45. data/app/models/spree/return_item.rb +1 -1
  46. data/app/models/spree/shipment.rb +4 -4
  47. data/app/models/spree/shipping_method.rb +2 -2
  48. data/app/models/spree/shipping_rate.rb +1 -1
  49. data/app/models/spree/stock/availability_validator.rb +16 -17
  50. data/app/models/spree/stock/coordinator.rb +3 -3
  51. data/app/models/spree/stock/package.rb +1 -1
  52. data/app/models/spree/stock/quantifier.rb +5 -4
  53. data/app/models/spree/stock_location.rb +2 -2
  54. data/app/models/spree/store.rb +2 -2
  55. data/app/models/spree/store_credit.rb +1 -1
  56. data/app/models/spree/tax/tax_helpers.rb +3 -3
  57. data/app/models/spree/tax_rate.rb +7 -1
  58. data/app/models/spree/taxonomy.rb +1 -1
  59. data/app/models/spree/variant/scopes.rb +5 -5
  60. data/app/models/spree/variant/vat_price_generator.rb +8 -5
  61. data/app/models/spree/variant.rb +1 -0
  62. data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +19 -10
  63. data/app/models/spree/wallet/default_payment_builder.rb +6 -6
  64. data/app/models/spree/wallet.rb +71 -0
  65. data/app/models/spree/wallet_payment_source.rb +17 -0
  66. data/app/models/spree/zone.rb +1 -1
  67. data/app/views/spree/carton_mailer/shipped_email.text.erb +1 -1
  68. data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_errored.text.erb +2 -0
  69. data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_finished.text.erb +2 -0
  70. data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +0 -7
  71. data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +0 -5
  72. data/app/views/spree/shared/_error_messages.html.erb +1 -1
  73. data/app/views/spree/shipment_mailer/shipped_email.html.erb +1 -1
  74. data/config/initializers/assets.rb +1 -1
  75. data/config/initializers/friendly_id.rb +1 -1
  76. data/config/locales/en.yml +50 -12
  77. data/db/default/spree/store_credit.rb +2 -1
  78. data/db/migrate/20130826062534_add_depth_to_spree_taxons.rb +4 -6
  79. data/db/migrate/20160420044191_create_spree_wallet_payment_sources.rb +23 -0
  80. data/db/migrate/20160420181916_migrate_credit_cards_to_wallet_payment_sources.rb +26 -0
  81. data/db/migrate/20161017102621_create_spree_promotion_code_batch.rb +36 -0
  82. data/db/migrate/20161129035810_add_index_to_spree_payments_number.rb +5 -0
  83. data/db/migrate/20170223235001_remove_spree_store_credits_column.rb +5 -0
  84. data/lib/generators/spree/dummy/templates/rails/application.rb +1 -1
  85. data/lib/generators/spree/dummy/templates/rails/test.rb +1 -1
  86. data/lib/generators/spree/install/install_generator.rb +6 -5
  87. data/lib/spree/core/controller_helpers/payment_parameters.rb +54 -0
  88. data/lib/spree/core/engine.rb +6 -9
  89. data/lib/spree/core/version.rb +1 -1
  90. data/lib/spree/core.rb +0 -1
  91. data/lib/spree/money.rb +18 -0
  92. data/lib/spree/permission_sets/default_customer.rb +1 -1
  93. data/lib/spree/permitted_attributes.rb +1 -1
  94. data/lib/spree/testing_support/authorization_helpers.rb +1 -0
  95. data/lib/spree/testing_support/capybara_ext.rb +13 -0
  96. data/lib/spree/testing_support/factories/order_factory.rb +5 -1
  97. data/lib/spree/testing_support/factories/payment_factory.rb +1 -1
  98. data/lib/spree/testing_support/factories/shipment_factory.rb +0 -1
  99. data/solidus_core.gemspec +3 -3
  100. data/spec/jobs/promotion_code_batch_job_spec.rb +65 -0
  101. data/spec/lib/calculated_adjustments_spec.rb +105 -1
  102. data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +4 -1
  103. data/spec/lib/spree/core/testing_support/factories/payment_factory_spec.rb +8 -0
  104. data/spec/lib/spree/money_spec.rb +32 -0
  105. data/spec/lib/spree/permission_sets/default_customer_spec.rb +20 -0
  106. data/spec/mailers/promotion_code_batch_mailer_spec.rb +45 -0
  107. data/spec/models/spree/credit_card_spec.rb +86 -86
  108. data/spec/models/spree/gateway_spec.rb +3 -1
  109. data/spec/models/spree/inventory_unit_spec.rb +12 -4
  110. data/spec/models/spree/order/checkout_spec.rb +11 -32
  111. data/spec/models/spree/order/tax_spec.rb +2 -2
  112. data/spec/models/spree/order_contents_spec.rb +24 -1
  113. data/spec/models/spree/order_inventory_spec.rb +130 -83
  114. data/spec/models/spree/order_spec.rb +15 -117
  115. data/spec/models/spree/order_update_attributes_spec.rb +1 -44
  116. data/spec/models/spree/order_updater_spec.rb +10 -13
  117. data/spec/models/spree/payment_create_spec.rb +5 -1
  118. data/spec/models/spree/payment_method_spec.rb +16 -0
  119. data/spec/models/spree/payment_spec.rb +14 -8
  120. data/spec/models/spree/promotion_code/batch_builder_spec.rb +61 -0
  121. data/spec/models/spree/promotion_code_batch_spec.rb +58 -0
  122. data/spec/models/spree/promotion_code_spec.rb +4 -0
  123. data/spec/models/spree/promotion_spec.rb +3 -6
  124. data/spec/models/spree/return_authorization_spec.rb +0 -59
  125. data/spec/models/spree/shipment_spec.rb +4 -4
  126. data/spec/models/spree/stock/availability_validator_spec.rb +64 -9
  127. data/spec/models/spree/tax/item_adjuster_spec.rb +1 -2
  128. data/spec/models/spree/unit_cancel_spec.rb +0 -85
  129. data/spec/models/spree/user_spec.rb +3 -1
  130. data/spec/models/spree/variant/vat_price_generator_spec.rb +8 -2
  131. data/spec/models/spree/variant_spec.rb +16 -4
  132. data/spec/models/spree/wallet_payment_source_spec.rb +46 -0
  133. data/spec/models/spree/wallet_spec.rb +128 -0
  134. data/spec/support/concerns/payment_source.rb +64 -0
  135. metadata +51 -25
  136. data/app/assets/javascripts/spree.js.coffee.erb +0 -64
  137. data/app/models/spree/promotion_builder.rb +0 -55
  138. data/app/models/spree/promotion_code/code_builder.rb +0 -62
  139. data/config/initializers/premailer_assets.rb +0 -1
  140. data/lib/spree/core/unreturned_item_charger.rb +0 -106
  141. data/lib/tasks/exchanges.rake +0 -47
  142. data/spec/lib/spree/core/unreturned_item_charger_spec.rb +0 -126
  143. data/spec/lib/tasks/exchanges_spec.rb +0 -220
  144. data/spec/models/spree/promotion_builder_spec.rb +0 -120
  145. data/spec/models/spree/promotion_code/code_builder_spec.rb +0 -77
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+ describe Spree::PromotionCodeBatchJob, type: :job do
3
+ let(:email) { "test@email.com" }
4
+ let(:promotion_code_batch) do
5
+ Spree::PromotionCodeBatch.create!(
6
+ promotion_id: create(:promotion).id,
7
+ base_code: "test",
8
+ number_of_codes: 10,
9
+ email: email
10
+ )
11
+ end
12
+
13
+ context "with a successful build" do
14
+ before do
15
+ allow(Spree::PromotionCodeBatchMailer)
16
+ .to receive(:promotion_code_batch_finished)
17
+ .and_call_original
18
+ end
19
+ context "with an email address" do
20
+ it "sends an email" do
21
+ subject.perform(promotion_code_batch)
22
+ expect(Spree::PromotionCodeBatchMailer)
23
+ .to have_received(:promotion_code_batch_finished)
24
+ end
25
+ end
26
+ context "with no email address" do
27
+ let(:email) { nil }
28
+ it "sends an email" do
29
+ subject.perform(promotion_code_batch)
30
+ expect(Spree::PromotionCodeBatchMailer)
31
+ .to_not have_received(:promotion_code_batch_finished)
32
+ end
33
+ end
34
+ end
35
+
36
+ context "with a failed build" do
37
+ before do
38
+ allow_any_instance_of(Spree::PromotionCode::BatchBuilder)
39
+ .to receive(:build_promotion_codes)
40
+ .and_raise("Error")
41
+
42
+ allow(Spree::PromotionCodeBatchMailer)
43
+ .to receive(:promotion_code_batch_errored)
44
+ .and_call_original
45
+
46
+ expect { subject.perform(promotion_code_batch) }
47
+ .to raise_error RuntimeError
48
+ end
49
+
50
+ context "with an email address" do
51
+ it "sends an email" do
52
+ expect(Spree::PromotionCodeBatchMailer)
53
+ .to have_received(:promotion_code_batch_errored)
54
+ end
55
+ end
56
+
57
+ context "with no email address" do
58
+ let(:email) { nil }
59
+ it "sends an email" do
60
+ expect(Spree::PromotionCodeBatchMailer)
61
+ .to_not have_received(:promotion_code_batch_errored)
62
+ end
63
+ end
64
+ end
65
+ end
@@ -1,7 +1,111 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Spree::CalculatedAdjustments do
4
+ let(:calculator_class) { Spree::Calculator::FlatRate }
5
+
6
+ with_model :Calculable, scope: :all do
7
+ model do
8
+ include Spree::CalculatedAdjustments
9
+ end
10
+ end
11
+
4
12
  it "should add has_one :calculator relationship" do
5
- assert Spree::ShippingMethod.reflect_on_all_associations(:has_one).map(&:name).include?(:calculator)
13
+ expect(Calculable.reflect_on_all_associations(:has_one).map(&:name)).to include(:calculator)
14
+ end
15
+
16
+ describe 'initialization' do
17
+ context 'with no calculator' do
18
+ subject { Calculable.new }
19
+
20
+ it 'can be initialized' do
21
+ expect(subject.calculator).to be nil
22
+ end
23
+
24
+ it 'is not valid' do
25
+ expect(subject).not_to be_valid
26
+ expect(subject.errors[:calculator]).to eq ["can't be blank"]
27
+ end
28
+ end
29
+
30
+ context 'with calculator object' do
31
+ subject { Calculable.new(calculator: calculator_class.new) }
32
+
33
+ it 'can be initialized' do
34
+ expect(subject.calculator).to be_a(calculator_class)
35
+ expect(calculator_class.count).to eq 0 # not yet saved
36
+ end
37
+
38
+ it 'can be created' do
39
+ subject.save!
40
+ expect(subject.calculator).to be_a(calculator_class)
41
+ expect(calculator_class.count).to eq 1 # saved in database
42
+ end
43
+ end
44
+
45
+ context 'with calculator_type' do
46
+ subject { Calculable.new(calculator_type: calculator_class.to_s) }
47
+
48
+ it 'can be initialized' do
49
+ expect(subject.calculator).to be_a(calculator_class)
50
+ expect(calculator_class.count).to eq 0 # not yet saved
51
+ end
52
+
53
+ it 'can be created' do
54
+ subject.save!
55
+ expect(subject.calculator).to be_a(calculator_class)
56
+ expect(calculator_class.count).to eq 1 # saved in database
57
+ end
58
+ end
59
+
60
+ context 'with calculator_type and calculator_attributes' do
61
+ subject { Calculable.new(calculator_type: calculator_class.to_s, calculator_attributes: {preferred_amount: 123}) }
62
+
63
+ it 'can be initialized' do
64
+ expect(subject.calculator).to be_a(calculator_class)
65
+ expect(subject.calculator.preferred_amount).to eq 123
66
+ expect(calculator_class.count).to eq 0 # not yet saved
67
+ end
68
+
69
+ it 'can be created' do
70
+ subject.save!
71
+ expect(subject.calculator).to be_a(calculator_class)
72
+ expect(subject.calculator.preferred_amount).to eq 123
73
+ expect(calculator_class.count).to eq 1 # saved in database
74
+ end
75
+ end
76
+ end
77
+
78
+ describe 'update' do
79
+ subject { Calculable.create!(calculator_type: calculator_class.to_s) }
80
+
81
+ it "can update calculator attributes with id" do
82
+ subject.update!(calculator_attributes: {
83
+ id: subject.calculator.id,
84
+ preferred_amount: 123
85
+ })
86
+ expect(subject.calculator.preferred_amount).to eq(123)
87
+ subject.reload
88
+ expect(subject.calculator.preferred_amount).to eq(123)
89
+ end
90
+
91
+ it "can update calculator attributes without id" do
92
+ subject.update!(calculator_attributes: {
93
+ preferred_amount: 123
94
+ })
95
+ expect(subject.calculator.preferred_amount).to eq(123)
96
+ subject.reload
97
+ expect(subject.calculator.preferred_amount).to eq(123)
98
+ end
99
+
100
+ it "can update both calculator type and attributes" do
101
+ subject.update!(calculator_type: 'Spree::Calculator::FlexiRate', calculator_attributes: {
102
+ preferred_first_item: 123
103
+ })
104
+ expect(subject.calculator.class).to eq(Spree::Calculator::FlexiRate)
105
+ expect(subject.calculator.preferred_first_item).to eq(123)
106
+ subject.reload
107
+ expect(subject.calculator.class).to eq(Spree::Calculator::FlexiRate)
108
+ expect(subject.calculator.preferred_first_item).to eq(123)
109
+ end
6
110
  end
7
111
  end
@@ -122,6 +122,8 @@ RSpec.describe 'order factory' do
122
122
  total: 110,
123
123
  state: 'complete'
124
124
  )
125
+ expect(order.inventory_units.where(pending: true)).to be_empty
126
+ expect(order.inventory_units.where(pending: false)).to_not be_empty
125
127
  end
126
128
  end
127
129
  end
@@ -201,7 +203,8 @@ RSpec.describe 'order factory' do
201
203
  expect(order).to have_attributes(
202
204
  total: 110,
203
205
  payment_total: 110,
204
- payment_state: "paid"
206
+ payment_state: "paid",
207
+ shipment_state: "shipped"
205
208
  )
206
209
 
207
210
  expect(order.payments.count).to eq 1
@@ -14,6 +14,14 @@ RSpec.describe 'payment factory' do
14
14
  expect(payment.source.user).to be_present
15
15
  expect(payment.source.user).to eq payment.order.user
16
16
  end
17
+
18
+ it 'uses the orders bill address for the credit card' do
19
+ address = create(:address)
20
+ order = create(:order, bill_address: address)
21
+ payment = create(factory, order: order)
22
+
23
+ expect(payment.source.address).to eq address
24
+ end
17
25
  end
18
26
 
19
27
  describe 'check payment' do
@@ -268,4 +268,36 @@ describe Spree::Money do
268
268
  end
269
269
  end
270
270
  end
271
+
272
+ it "includes Comparable" do
273
+ expect(described_class).to include(Comparable)
274
+ end
275
+
276
+ describe "<=>" do
277
+ let(:usd_10) { Spree::Money.new(10, currency: "USD") }
278
+ let(:usd_20) { Spree::Money.new(20, currency: "USD") }
279
+ let(:usd_30) { Spree::Money.new(30, currency: "USD") }
280
+
281
+ it "compares the two amounts" do
282
+ expect(usd_20 <=> usd_20).to eq 0
283
+ expect(usd_20 <=> usd_10).to be > 0
284
+ expect(usd_20 <=> usd_30).to be < 0
285
+ end
286
+
287
+ context "with a non Spree::Money object" do
288
+ it "raises an error" do
289
+ expect { usd_10 <=> 20 }.to raise_error(TypeError)
290
+ end
291
+ end
292
+
293
+ context "with differing currencies" do
294
+ let(:cad) { Spree::Money.new(10, currency: "CAD") }
295
+
296
+ it "raises an error" do
297
+ expect { usd_10 <=> cad }.to raise_error(
298
+ Spree::Money::DifferentCurrencyError
299
+ )
300
+ end
301
+ end
302
+ end
271
303
  end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::PermissionSets::DefaultCustomer do
4
+ context 'as Guest User' do
5
+ context 'for Order' do
6
+ context 'guest_token is empty string' do
7
+ let(:ability) { Spree::Ability.new(nil) }
8
+ let(:resource) { build(:order) }
9
+ let(:token) { '' }
10
+
11
+ it 'should not be allowed to read or update the order' do
12
+ allow(resource).to receive_messages(guest_token: '')
13
+
14
+ expect(ability).to_not be_able_to(:read, resource, token)
15
+ expect(ability).to_not be_able_to(:update, resource, token)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+ describe Spree::PromotionCodeBatchMailer, type: :mailer do
3
+ let(:promotion) { create(:promotion, name: "Promotion Test") }
4
+ let(:promotion_code_batch) do
5
+ Spree::PromotionCodeBatch.create!(
6
+ promotion_id: promotion.id,
7
+ base_code: "test",
8
+ number_of_codes: 10,
9
+ email: "test@email.com"
10
+ )
11
+ end
12
+
13
+ describe "#promotion_code_batch_finished" do
14
+ subject { described_class.promotion_code_batch_finished(promotion_code_batch) }
15
+
16
+ it "sends the email to the email attached to the promotion code batch " do
17
+ expect(subject.to).to eq([promotion_code_batch.email])
18
+ end
19
+
20
+ it "contains the number of codes created" do
21
+ expect(subject.body).to include("All 10 codes have been created")
22
+ end
23
+
24
+ it "contains the name of the promotion" do
25
+ expect(subject.body).to include(promotion.name)
26
+ end
27
+ end
28
+
29
+ describe "#promotion_code_batch_errored" do
30
+ before { promotion_code_batch.update(error: "Test error") }
31
+ subject { described_class.promotion_code_batch_errored(promotion_code_batch) }
32
+
33
+ it "sends the email to the email attached to the promotion code batch " do
34
+ expect(subject.to).to eq([promotion_code_batch.email])
35
+ end
36
+
37
+ it "contains the error" do
38
+ expect(subject.body).to include("Test error")
39
+ end
40
+
41
+ it "contains the name of the promotion" do
42
+ expect(subject.body).to include(promotion.name)
43
+ end
44
+ end
45
+ end
@@ -16,6 +16,8 @@ describe Spree::CreditCard, type: :model do
16
16
 
17
17
  let(:credit_card) { Spree::CreditCard.new }
18
18
 
19
+ it_behaves_like 'a payment source'
20
+
19
21
  before(:each) do
20
22
  @order = create(:order)
21
23
  @payment = Spree::Payment.create(amount: 100, order: @order)
@@ -35,37 +37,6 @@ describe Spree::CreditCard, type: :model do
35
37
  allow(@payment).to receive_messages payment_method: @payment_gateway
36
38
  end
37
39
 
38
- describe "#can_capture?" do
39
- it "should be true if payment is pending" do
40
- payment = mock_model(Spree::Payment, pending?: true, created_at: Time.current)
41
- expect(credit_card.can_capture?(payment)).to be true
42
- end
43
-
44
- it "should be true if payment is checkout" do
45
- payment = mock_model(Spree::Payment, pending?: false, checkout?: true, created_at: Time.current)
46
- expect(credit_card.can_capture?(payment)).to be true
47
- end
48
- end
49
-
50
- describe "#can_void?" do
51
- it "should be true if payment is not void" do
52
- payment = mock_model(Spree::Payment, failed?: false, void?: false)
53
- expect(credit_card.can_void?(payment)).to be true
54
- end
55
- end
56
-
57
- describe "#can_credit?" do
58
- it "should be false if payment is not completed" do
59
- payment = mock_model(Spree::Payment, completed?: false)
60
- expect(credit_card.can_credit?(payment)).to be false
61
- end
62
-
63
- it "should be false when credit_allowed is zero" do
64
- payment = mock_model(Spree::Payment, completed?: true, credit_allowed: 0, order: mock_model(Spree::Order, payment_state: 'credit_owed'))
65
- expect(credit_card.can_credit?(payment)).to be false
66
- end
67
- end
68
-
69
40
  describe "#valid?" do
70
41
  it "should validate presence of number" do
71
42
  credit_card.attributes = valid_credit_card_attributes.except(:number)
@@ -283,32 +254,6 @@ describe Spree::CreditCard, type: :model do
283
254
  end
284
255
  end
285
256
 
286
- describe "#associations" do
287
- it "should be able to access its payments" do
288
- credit_card.payments.to_a
289
- end
290
- end
291
-
292
- describe "#first_name" do
293
- before do
294
- credit_card.name = "Ludwig van Beethoven"
295
- end
296
-
297
- it "extracts the first name" do
298
- expect(credit_card.first_name).to eq "Ludwig"
299
- end
300
- end
301
-
302
- describe "#last_name" do
303
- before do
304
- credit_card.name = "Ludwig van Beethoven"
305
- end
306
-
307
- it "extracts the last name" do
308
- expect(credit_card.last_name).to eq "van Beethoven"
309
- end
310
- end
311
-
312
257
  describe "#to_active_merchant" do
313
258
  before do
314
259
  credit_card.number = "4111111111111111"
@@ -329,44 +274,99 @@ describe Spree::CreditCard, type: :model do
329
274
  end
330
275
  end
331
276
 
332
- it 'ensures only one credit card per user is default at a time' do
333
- user = FactoryGirl.create(:user)
334
- first = FactoryGirl.create(:credit_card, user: user, default: true)
335
- second = FactoryGirl.create(:credit_card, user: user, default: true)
277
+ # TODO: Remove these specs once default is removed
278
+ describe 'default' do
279
+ def default_with_silence(card)
280
+ Spree::Deprecation.silence { card.default }
281
+ end
336
282
 
337
- expect(first.reload.default).to eq false
338
- expect(second.reload.default).to eq true
283
+ context 'with a user' do
284
+ let(:user) { create(:user) }
285
+ let(:credit_card) { create(:credit_card, user: user) }
339
286
 
340
- first.default = true
341
- first.save!
287
+ it 'uses the wallet information' do
288
+ wallet_payment_source = user.wallet.add(credit_card)
289
+ user.wallet.default_wallet_payment_source = wallet_payment_source
342
290
 
343
- expect(first.reload.default).to eq true
344
- expect(second.reload.default).to eq false
345
- end
291
+ expect(default_with_silence(credit_card)).to be_truthy
292
+ end
293
+ end
346
294
 
347
- it 'allows default credit cards for different users' do
348
- first = FactoryGirl.create(:credit_card, user: FactoryGirl.create(:user), default: true)
349
- second = FactoryGirl.create(:credit_card, user: FactoryGirl.create(:user), default: true)
295
+ context 'without a user' do
296
+ let(:credit_card) { create(:credit_card) }
350
297
 
351
- expect(first.reload.default).to eq true
352
- expect(second.reload.default).to eq true
298
+ it 'returns false' do
299
+ expect(default_with_silence(credit_card)).to eq(false)
300
+ end
301
+ end
353
302
  end
354
303
 
355
- it 'allows this card to save even if the previously default card has expired' do
356
- user = FactoryGirl.create(:user)
357
- first = FactoryGirl.create(:credit_card, user: user, default: true)
358
- second = FactoryGirl.create(:credit_card, user: user, default: false)
359
- first.update_columns(year: DateTime.current.year, month: 1.month.ago.month)
304
+ # TODO: Remove these specs once default= is removed
305
+ describe 'default=' do
306
+ def default_with_silence(card)
307
+ Spree::Deprecation.silence { card.default }
308
+ end
360
309
 
361
- second.update_attributes!(default: true)
362
- end
310
+ context 'with a user' do
311
+ let(:user) { create(:user) }
312
+ let(:credit_card) { create(:credit_card, user: user) }
313
+
314
+ it 'updates the wallet information' do
315
+ Spree::Deprecation.silence do
316
+ credit_card.default = true
317
+ end
318
+ expect(user.wallet.default_wallet_payment_source.payment_source).to eq(credit_card)
319
+ end
320
+ end
363
321
 
364
- it 'allows this card to save even if the previously default card has expired' do
365
- user = FactoryGirl.create(:user)
366
- first = FactoryGirl.create(:credit_card, user: user, default: true)
367
- second = FactoryGirl.create(:credit_card, user: user, default: false)
368
- first.update_columns(year: DateTime.current.year, month: 1.month.ago.month)
322
+ context 'with multiple cards for one user' do
323
+ let(:user) { create(:user) }
324
+ let(:first_card) { create(:credit_card, user: user) }
325
+ let(:second_card) { create(:credit_card, user: user) }
369
326
 
370
- second.update_attributes!(default: true)
327
+ it 'ensures only one default' do
328
+ Spree::Deprecation.silence do
329
+ first_card.default = true
330
+ second_card.default = true
331
+ end
332
+
333
+ expect(default_with_silence(first_card)).to be_falsey
334
+ expect(default_with_silence(second_card)).to be_truthy
335
+
336
+ Spree::Deprecation.silence do
337
+ first_card.default = true
338
+ end
339
+
340
+ expect(default_with_silence(first_card)).to be_truthy
341
+ expect(default_with_silence(second_card)).to be_falsey
342
+ end
343
+ end
344
+
345
+ context 'with multiple cards for different users' do
346
+ let(:first_card) { create(:credit_card, user: create(:user)) }
347
+ let(:second_card) { create(:credit_card, user: create(:user)) }
348
+
349
+ it 'allows multiple defaults' do
350
+ Spree::Deprecation.silence do
351
+ first_card.default = true
352
+ second_card.default = true
353
+ end
354
+
355
+ expect(default_with_silence(first_card)).to be_truthy
356
+ expect(default_with_silence(second_card)).to be_truthy
357
+ end
358
+ end
359
+
360
+ context 'without a user' do
361
+ let(:credit_card) { create(:credit_card) }
362
+
363
+ it 'raises' do
364
+ expect {
365
+ Spree::Deprecation.silence do
366
+ credit_card.default = true
367
+ end
368
+ }.to raise_error("Cannot set 'default' on a credit card without a user")
369
+ end
370
+ end
371
371
  end
372
372
  end
@@ -85,7 +85,9 @@ describe Spree::Gateway, type: :model do
85
85
  context 'order is not complete but credit card has user' do
86
86
  let(:cc_user) { user }
87
87
  let(:completed_at) { nil }
88
-
88
+ before do
89
+ cc_user.wallet.add(cc)
90
+ end
89
91
  it "finds credit cards associated to the user" do
90
92
  expect(payment_method.reusable_sources(payment.order)).to eq [cc]
91
93
  end
@@ -5,6 +5,15 @@ describe Spree::InventoryUnit, type: :model do
5
5
  let(:stock_item) { stock_location.stock_items.order(:id).first }
6
6
  let(:line_item) { create(:line_item, variant: stock_item.variant) }
7
7
 
8
+ describe ".cancelable" do
9
+ let!(:pending_unit) { create(:inventory_unit, pending: true) }
10
+ let!(:non_pending_unit) { create(:inventory_unit, pending: false) }
11
+
12
+ subject { described_class.cancelable }
13
+
14
+ it { is_expected.to contain_exactly(non_pending_unit) }
15
+ end
16
+
8
17
  context "#backordered_for_stock_item" do
9
18
  let(:order) do
10
19
  order = create(:order, state: 'complete', ship_address: create(:ship_address))
@@ -289,11 +298,10 @@ describe Spree::InventoryUnit, type: :model do
289
298
  expect { inventory_unit.reload }.not_to raise_error
290
299
  end
291
300
 
292
- it "cannot be destroyed if its shipment is ready" do
301
+ it "can be destroyed if its shipment is ready" do
293
302
  inventory_unit = create(:order_ready_to_ship).inventory_units.first
294
- expect(inventory_unit.destroy).to eq false
295
- expect(inventory_unit.errors.full_messages.join).to match /Cannot destroy/
296
- expect { inventory_unit.reload }.not_to raise_error
303
+ expect(inventory_unit.destroy).to be_truthy
304
+ expect { inventory_unit.reload }.to raise_error(ActiveRecord::RecordNotFound)
297
305
  end
298
306
 
299
307
  it "cannot be destroyed if its shipment is shipped" do
@@ -254,11 +254,6 @@ describe Spree::Order, type: :model do
254
254
  allow(order).to receive(:ensure_available_shipping_rates) { true }
255
255
  end
256
256
 
257
- it 'should invoke set_shipment_cost' do
258
- expect(order).to receive(:set_shipments_cost)
259
- order.next!
260
- end
261
-
262
257
  it 'should update shipment_total' do
263
258
  expect { order.next! }.to change{ order.shipment_total }.by(10.00)
264
259
  end
@@ -300,7 +295,6 @@ describe Spree::Order, type: :model do
300
295
  end
301
296
 
302
297
  it "transitions to payment" do
303
- expect(order).to receive(:set_shipments_cost)
304
298
  order.next!
305
299
  assert_state_changed(order, 'delivery', 'payment')
306
300
  expect(order.state).to eq('payment')
@@ -333,7 +327,7 @@ describe Spree::Order, type: :model do
333
327
  context "with a shipment that has a price" do
334
328
  before do
335
329
  shipment.shipping_rates.first.update_column(:cost, 10)
336
- order.set_shipments_cost
330
+ order.update!
337
331
  end
338
332
 
339
333
  it "transitions to payment" do
@@ -345,7 +339,6 @@ describe Spree::Order, type: :model do
345
339
  context "with a shipment that is free" do
346
340
  before do
347
341
  shipment.shipping_rates.first.update_column(:cost, 0)
348
- order.set_shipments_cost
349
342
  end
350
343
 
351
344
  it "skips payment, transitions to confirm" do
@@ -362,8 +355,9 @@ describe Spree::Order, type: :model do
362
355
  let(:default_credit_card) { create(:credit_card) }
363
356
 
364
357
  before do
365
- user = Spree::LegacyUser.new(email: 'spree@example.org', bill_address: user_bill_address)
366
- allow(user).to receive(:default_credit_card) { default_credit_card }
358
+ user = create(:user, email: 'spree@example.org', bill_address: user_bill_address)
359
+ wallet_payment_source = user.wallet.add(default_credit_card)
360
+ user.wallet.default_wallet_payment_source = wallet_payment_source
367
361
  order.user = user
368
362
 
369
363
  allow(order).to receive_messages(payment_required?: true)
@@ -533,24 +527,9 @@ describe Spree::Order, type: :model do
533
527
  order.save!
534
528
  end
535
529
 
536
- context 'when the exchange is for an unreturned item' do
537
- before do
538
- order.shipments.first.update_attributes!(created_at: order.created_at - 1.day)
539
- expect(order.unreturned_exchange?).to eq true
540
- end
541
-
542
- it 'allows the order to complete' do
543
- order.complete!
544
-
545
- expect(order).to be_complete
546
- end
547
- end
548
-
549
- context 'when the exchange is not for an unreturned item' do
550
- it 'does not allow the order to completed' do
551
- expect { order.complete! }.to raise_error Spree::Order::InsufficientStock
552
- expect(order.payments.first.state).to eq('checkout')
553
- end
530
+ it 'does not allow the order to completed' do
531
+ expect { order.complete! }.to raise_error Spree::Order::InsufficientStock
532
+ expect(order.payments.first.state).to eq('checkout')
554
533
  end
555
534
  end
556
535
  end
@@ -576,13 +555,13 @@ describe Spree::Order, type: :model do
576
555
  it "makes the current credit card a user's default credit card" do
577
556
  order.complete!
578
557
  expect(order.state).to eq 'complete'
579
- expect(order.user.reload.default_credit_card.try(:id)).to eq(order.credit_cards.first.id)
558
+ expect(order.user.reload.wallet.default_wallet_payment_source.payment_source).to eq(order.credit_cards.first)
580
559
  end
581
560
 
582
- it "does not assign a default credit card if temporary_credit_card is set" do
583
- order.temporary_credit_card = true
561
+ it "does not assign a default credit card if temporary_payment_source is set" do
562
+ order.temporary_payment_source = true
584
563
  order.complete!
585
- expect(order.user.reload.default_credit_card).to be_nil
564
+ expect(order.user.reload.wallet.default_wallet_payment_source).to be_nil
586
565
  end
587
566
  end
588
567
 
@@ -18,7 +18,7 @@ module Spree
18
18
  end
19
19
  end
20
20
 
21
- context "when :tax_using_ship_address => true" do
21
+ context "when tax_using_ship_address: true" do
22
22
  before { Spree::Config.set(tax_using_ship_address: true) }
23
23
 
24
24
  it "should calculate using ship_address" do
@@ -30,7 +30,7 @@ module Spree
30
30
  end
31
31
  end
32
32
 
33
- context "when :tax_using_ship_address => false" do
33
+ context "when tax_using_ship_address: false" do
34
34
  before { Spree::Config.set(tax_using_ship_address: false) }
35
35
 
36
36
  it "should calculate using bill_address" do