solidus_core 2.7.4 → 2.8.0

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.

Files changed (136) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +19 -17
  3. data/app/assets/images/logo/solidus.svg +18 -0
  4. data/app/assets/javascripts/spree.js.erb +2 -2
  5. data/app/helpers/spree/base_helper.rb +1 -7
  6. data/app/helpers/spree/taxons_helper.rb +2 -2
  7. data/app/mailers/spree/carton_mailer.rb +4 -4
  8. data/app/models/spree/calculator/flat_percent_item_total.rb +4 -1
  9. data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +5 -3
  10. data/app/models/spree/calculator/tiered_percent.rb +2 -1
  11. data/app/models/spree/country.rb +8 -0
  12. data/app/models/spree/fulfilment_changer.rb +9 -1
  13. data/app/models/spree/gallery/product_gallery.rb +18 -0
  14. data/app/models/spree/gallery/variant_gallery.rb +21 -0
  15. data/app/models/spree/image.rb +11 -1
  16. data/app/models/spree/inventory_unit.rb +8 -0
  17. data/app/models/spree/line_item.rb +1 -1
  18. data/app/models/spree/order.rb +0 -4
  19. data/app/models/spree/order_cancellations.rb +31 -10
  20. data/app/models/spree/order_contents.rb +1 -5
  21. data/app/models/spree/order_inventory.rb +5 -4
  22. data/app/models/spree/product.rb +9 -0
  23. data/app/models/spree/product/scopes.rb +3 -4
  24. data/app/models/spree/promotion.rb +1 -6
  25. data/app/models/spree/promotion_handler/coupon.rb +15 -0
  26. data/app/models/spree/reimbursement.rb +21 -6
  27. data/app/models/spree/reimbursement_performer.rb +12 -6
  28. data/app/models/spree/reimbursement_type.rb +1 -1
  29. data/app/models/spree/reimbursement_type/credit.rb +5 -2
  30. data/app/models/spree/reimbursement_type/exchange.rb +1 -1
  31. data/app/models/spree/reimbursement_type/original_payment.rb +1 -1
  32. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +6 -6
  33. data/app/models/spree/reimbursement_type/store_credit.rb +18 -3
  34. data/app/models/spree/shipment.rb +11 -11
  35. data/app/models/spree/stock/allocator/base.rb +19 -0
  36. data/app/models/spree/stock/allocator/on_hand_first.rb +42 -0
  37. data/app/models/spree/stock/content_item.rb +1 -1
  38. data/app/models/spree/stock/inventory_units_finalizer.rb +47 -0
  39. data/app/models/spree/stock/location_sorter/base.rb +38 -0
  40. data/app/models/spree/stock/location_sorter/default_first.rb +15 -0
  41. data/app/models/spree/stock/location_sorter/unsorted.rb +14 -0
  42. data/app/models/spree/stock/simple_coordinator.rb +24 -10
  43. data/app/models/spree/stock_location.rb +2 -0
  44. data/app/models/spree/store_credit.rb +4 -12
  45. data/app/models/spree/store_credit_event.rb +2 -2
  46. data/app/models/spree/store_credit_reason.rb +11 -0
  47. data/app/models/spree/taxon.rb +8 -3
  48. data/app/models/spree/unit_cancel.rb +3 -0
  49. data/app/models/spree/variant.rb +18 -7
  50. data/config/initializers/money.rb +5 -0
  51. data/config/locales/en.yml +661 -527
  52. data/db/default/spree/store_credit.rb +1 -1
  53. data/db/default/spree/zones.rb +2 -2
  54. data/db/migrate/20180710170104_create_spree_store_credit_reasons_table.rb +42 -0
  55. data/db/migrate/20190106184413_remove_code_from_spree_promotions.rb +41 -0
  56. data/lib/generators/spree/dummy/templates/rails/test.rb +0 -3
  57. data/lib/generators/spree/install/install_generator.rb +2 -2
  58. data/lib/generators/spree/install/templates/config/initializers/spree.rb.tt +2 -2
  59. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/backend/all.js +1 -1
  60. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/frontend/all.js +1 -1
  61. data/lib/solidus/migrations/promotions_with_code_handlers.rb +66 -0
  62. data/lib/spree/app_configuration.rb +20 -4
  63. data/lib/spree/core/controller_helpers/common.rb +1 -1
  64. data/lib/spree/core/stock_configuration.rb +12 -0
  65. data/lib/spree/core/version.rb +1 -1
  66. data/lib/spree/i18n.rb +4 -0
  67. data/lib/spree/money.rb +13 -11
  68. data/lib/spree/permission_sets.rb +0 -1
  69. data/lib/spree/permission_sets/promotion_management.rb +1 -0
  70. data/lib/spree/testing_support/dummy_app.rb +13 -2
  71. data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/backend/all.js +1 -1
  72. data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/frontend/all.js +1 -1
  73. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +5 -5
  74. data/lib/spree/testing_support/factories/{store_credit_update_reason_factory.rb → store_credit_reason_factory.rb} +1 -1
  75. data/lib/spree/testing_support/partial_double_verification.rb +13 -0
  76. data/lib/spree/testing_support/shared_examples/gallery.rb +18 -0
  77. data/spec/helpers/products_helper_spec.rb +10 -8
  78. data/spec/helpers/taxons_helper_spec.rb +3 -1
  79. data/spec/lib/i18n_spec.rb +5 -0
  80. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +6 -2
  81. data/spec/lib/spree/core/stock_configuration_spec.rb +19 -0
  82. data/spec/lib/spree/core/testing_support/factories/store_credit_reason_factory_spec.rb +14 -0
  83. data/spec/lib/spree/money_spec.rb +12 -13
  84. data/spec/migrate/20190106184413_remove_code_from_spree_promotions_spec.rb +136 -0
  85. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +10 -1
  86. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +18 -6
  87. data/spec/models/spree/calculator/tiered_percent_spec.rb +7 -1
  88. data/spec/models/spree/country_spec.rb +76 -0
  89. data/spec/models/spree/customer_return_spec.rb +2 -1
  90. data/spec/models/spree/fulfilment_changer_spec.rb +33 -0
  91. data/spec/models/spree/gallery/product_gallery_spec.rb +21 -0
  92. data/spec/models/spree/gallery/variant_gallery_spec.rb +21 -0
  93. data/spec/models/spree/inventory_unit_spec.rb +1 -4
  94. data/spec/models/spree/order/checkout_spec.rb +6 -6
  95. data/spec/models/spree/order/finalizing_spec.rb +1 -20
  96. data/spec/models/spree/order/outstanding_balance_integration_spec.rb +2 -1
  97. data/spec/models/spree/order/updating_spec.rb +1 -1
  98. data/spec/models/spree/order_cancellations_spec.rb +55 -14
  99. data/spec/models/spree/order_inventory_spec.rb +12 -5
  100. data/spec/models/spree/order_merger_spec.rb +6 -3
  101. data/spec/models/spree/order_spec.rb +3 -7
  102. data/spec/models/spree/order_updater_spec.rb +3 -8
  103. data/spec/models/spree/payment/cancellation_spec.rb +4 -3
  104. data/spec/models/spree/payment_spec.rb +1 -17
  105. data/spec/models/spree/permission_sets/promotion_management_spec.rb +2 -0
  106. data/spec/models/spree/product_spec.rb +10 -1
  107. data/spec/models/spree/promotion_handler/coupon_spec.rb +62 -8
  108. data/spec/models/spree/promotion_spec.rb +24 -10
  109. data/spec/models/spree/refund_spec.rb +2 -1
  110. data/spec/models/spree/reimbursement_performer_spec.rb +5 -4
  111. data/spec/models/spree/reimbursement_spec.rb +26 -2
  112. data/spec/models/spree/reimbursement_type/credit_spec.rb +2 -1
  113. data/spec/models/spree/reimbursement_type/exchange_spec.rb +2 -1
  114. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +2 -1
  115. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +14 -2
  116. data/spec/models/spree/return_item_spec.rb +1 -1
  117. data/spec/models/spree/shipment_spec.rb +20 -13
  118. data/spec/models/spree/shipping_calculator_spec.rb +13 -3
  119. data/spec/models/spree/stock/allocator/on_hand_first_spec.rb +146 -0
  120. data/spec/models/spree/stock/content_item_spec.rb +70 -0
  121. data/spec/models/spree/stock/estimator_spec.rb +5 -2
  122. data/spec/models/spree/stock/inventory_units_finalizer_spec.rb +34 -0
  123. data/spec/models/spree/stock/location_sorter/default_first_spec.rb +20 -0
  124. data/spec/models/spree/stock/location_sorter/unsorted_spec.rb +19 -0
  125. data/spec/models/spree/stock/simple_coordinator_spec.rb +17 -0
  126. data/spec/models/spree/store_credit_event_spec.rb +12 -12
  127. data/spec/models/spree/store_credit_spec.rb +2 -2
  128. data/spec/models/spree/unit_cancel_spec.rb +20 -1
  129. data/spec/models/spree/variant_spec.rb +46 -24
  130. data/spec/spec_helper.rb +1 -0
  131. metadata +30 -9
  132. data/.yardopts +0 -1
  133. data/app/models/spree/store_credit_update_reason.rb +0 -4
  134. data/lib/spree/permission_sets/report_display.rb +0 -11
  135. data/spec/lib/spree/core/testing_support/factories/store_credit_update_reason_factory_spec.rb +0 -14
  136. data/spec/models/spree/permission_sets/report_display_spec.rb +0 -25
@@ -5,6 +5,6 @@
5
5
  // the compiled file.
6
6
  //
7
7
  //= require jquery
8
- //= require jquery_ujs
8
+ //= require rails-ujs
9
9
  //= require spree/frontend
10
10
  //= require_tree .
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'spree/testing_support/factories/store_credit_factory'
4
- require 'spree/testing_support/factories/store_credit_update_reason_factory'
4
+ require 'spree/testing_support/factories/store_credit_reason_factory'
5
5
 
6
6
  FactoryBot.define do
7
7
  factory :store_credit_event, class: 'Spree::StoreCreditEvent' do
@@ -18,13 +18,13 @@ FactoryBot.define do
18
18
  end
19
19
 
20
20
  factory :store_credit_adjustment_event do
21
- action { Spree::StoreCredit::ADJUSTMENT_ACTION }
22
- update_reason { create(:store_credit_update_reason) }
21
+ action { Spree::StoreCredit::ADJUSTMENT_ACTION }
22
+ store_credit_reason { create(:store_credit_reason) }
23
23
  end
24
24
 
25
25
  factory :store_credit_invalidate_event do
26
- action { Spree::StoreCredit::INVALIDATE_ACTION }
27
- update_reason { create(:store_credit_update_reason) }
26
+ action { Spree::StoreCredit::INVALIDATE_ACTION }
27
+ store_credit_reason { create(:store_credit_reason) }
28
28
  end
29
29
  end
30
30
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  FactoryBot.define do
4
- factory :store_credit_update_reason, class: 'Spree::StoreCreditUpdateReason' do
4
+ factory :store_credit_reason, class: 'Spree::StoreCreditReason' do
5
5
  name { "Input error" }
6
6
  end
7
7
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.configure do |config|
4
+ config.mock_with :rspec do |c|
5
+ c.verify_partial_doubles = true
6
+ end
7
+
8
+ config.around(:each, partial_double_verification: false) do |example|
9
+ without_partial_double_verification do
10
+ example.run
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.shared_examples 'a gallery' do
4
+ describe '#images' do
5
+ subject { gallery.images }
6
+
7
+ it { is_expected.to be_empty }
8
+
9
+ context 'there are images' do
10
+ include_context 'has multiple images'
11
+
12
+ it 'has the associated images' do
13
+ expect(subject.map { |picture| picture.id }).
14
+ to match_array([first_image.id, second_image.id])
15
+ end
16
+ end
17
+ end
18
+ end
@@ -15,7 +15,9 @@ module Spree
15
15
  end
16
16
 
17
17
  before do
18
- allow(helper).to receive(:current_pricing_options) { pricing_options }
18
+ without_partial_double_verification do
19
+ allow(helper).to receive(:current_pricing_options) { pricing_options }
20
+ end
19
21
  end
20
22
 
21
23
  context "#variant_price_diff" do
@@ -31,7 +33,7 @@ module Spree
31
33
  context "when variant is more than master" do
32
34
  let(:variant_price) { 15 }
33
35
 
34
- it { is_expected.to eq("(Add: $5.00)") }
36
+ it { is_expected.to eq("(Add: <span class=\"money-currency-symbol\">$</span><span class=\"money-whole\">5</span><span class=\"money-decimal-mark\">.</span><span class=\"money-decimal\">00</span>)") }
35
37
  # Regression test for https://github.com/spree/spree/issues/2737
36
38
  it { is_expected.to be_html_safe }
37
39
  end
@@ -39,7 +41,7 @@ module Spree
39
41
  context "when variant is less than master" do
40
42
  let(:product_price) { 15 }
41
43
 
42
- it { is_expected.to eq("(Subtract: $5.00)") }
44
+ it { is_expected.to eq("(Subtract: <span class=\"money-currency-symbol\">$</span><span class=\"money-whole\">5</span><span class=\"money-decimal-mark\">.</span><span class=\"money-decimal\">00</span>)") }
43
45
  end
44
46
  end
45
47
 
@@ -56,13 +58,13 @@ module Spree
56
58
  context "when variant is more than master" do
57
59
  let(:variant_price) { 150 }
58
60
 
59
- it { is_expected.to eq("(Add: &#x00A5;50)") }
61
+ it { is_expected.to eq("(Add: <span class=\"money-currency-symbol\">&#x00A5;</span><span class=\"money-whole\">50</span>)") }
60
62
  end
61
63
 
62
64
  context "when variant is less than master" do
63
65
  let(:product_price) { 150 }
64
66
 
65
- it { is_expected.to eq("(Subtract: &#x00A5;50)") }
67
+ it { is_expected.to eq("(Subtract: <span class=\"money-currency-symbol\">&#x00A5;</span><span class=\"money-whole\">50</span>)") }
66
68
  end
67
69
  end
68
70
  end
@@ -79,8 +81,8 @@ module Spree
79
81
 
80
82
  context "when currency is default" do
81
83
  it "should return the variant price if the price is different than master" do
82
- expect(helper.variant_price(variant)).to eq("$15.00")
83
- expect(helper.variant_price(variant_2)).to eq("$20.00")
84
+ expect(helper.variant_price(variant)).to eq("<span class=\"money-currency-symbol\">$</span><span class=\"money-whole\">15</span><span class=\"money-decimal-mark\">.</span><span class=\"money-decimal\">00</span>")
85
+ expect(helper.variant_price(variant_2)).to eq("<span class=\"money-currency-symbol\">$</span><span class=\"money-whole\">20</span><span class=\"money-decimal-mark\">.</span><span class=\"money-decimal\">00</span>")
84
86
  end
85
87
  end
86
88
 
@@ -95,7 +97,7 @@ module Spree
95
97
  end
96
98
 
97
99
  it "should return the variant price if the price is different than master" do
98
- expect(helper.variant_price(variant)).to eq("&#x00A5;150")
100
+ expect(helper.variant_price(variant)).to eq("<span class=\"money-currency-symbol\">&#x00A5;</span><span class=\"money-whole\">150</span>")
99
101
  end
100
102
  end
101
103
 
@@ -8,7 +8,9 @@ RSpec.describe Spree::TaxonsHelper, type: :helper do
8
8
  Spree::Config.pricing_options_class.new(currency: currency)
9
9
  end
10
10
  before do
11
- allow(helper).to receive(:current_pricing_options) { pricing_options }
11
+ without_partial_double_verification do
12
+ allow(helper).to receive(:current_pricing_options) { pricing_options }
13
+ end
12
14
  end
13
15
 
14
16
  describe "#taxon_preview" do
@@ -30,23 +30,28 @@ RSpec.describe "i18n" do
30
30
  end
31
31
 
32
32
  it "translates within the spree scope" do
33
+ expect(Spree::Deprecation).to receive(:warn).twice
33
34
  expect(Spree.t(:foo)).to eql("bar")
34
35
  expect(Spree.translate(:foo)).to eql("bar")
35
36
  end
36
37
 
37
38
  it "prepends a string scope" do
39
+ expect(Spree::Deprecation).to receive(:warn)
38
40
  expect(Spree.t(:foo, scope: "bar")).to eql("bar within bar scope")
39
41
  end
40
42
 
41
43
  it "prepends to an array scope" do
44
+ expect(Spree::Deprecation).to receive(:warn)
42
45
  expect(Spree.t(:foo, scope: ["bar"])).to eql("bar within bar scope")
43
46
  end
44
47
 
45
48
  it "returns two translations" do
49
+ expect(Spree::Deprecation).to receive(:warn)
46
50
  expect(Spree.t([:foo, 'bar.foo'])).to eql(["bar", "bar within bar scope"])
47
51
  end
48
52
 
49
53
  it "returns reasonable string for missing translations" do
54
+ expect(Spree::Deprecation).to receive(:warn)
50
55
  expect(Spree.t(:missing_entry)).to include("<span")
51
56
  end
52
57
 
@@ -55,11 +55,15 @@ RSpec.describe Spree::Core::ControllerHelpers::Auth, type: :controller do
55
55
 
56
56
  describe '#try_spree_current_user' do
57
57
  it 'calls spree_current_user when define spree_current_user method' do
58
- expect(controller).to receive(:spree_current_user)
58
+ without_partial_double_verification do
59
+ expect(controller).to receive(:spree_current_user)
60
+ end
59
61
  controller.try_spree_current_user
60
62
  end
61
63
  it 'calls current_spree_user when define current_spree_user method' do
62
- expect(controller).to receive(:current_spree_user)
64
+ without_partial_double_verification do
65
+ expect(controller).to receive(:current_spree_user)
66
+ end
63
67
  controller.try_spree_current_user
64
68
  end
65
69
  it 'returns nil' do
@@ -20,6 +20,7 @@ RSpec.describe Spree::Core::StockConfiguration do
20
20
  end
21
21
  end
22
22
  end
23
+
23
24
  describe '#estimator_class' do
24
25
  let(:stock_configuration) { described_class.new }
25
26
  subject { stock_configuration.estimator_class }
@@ -37,4 +38,22 @@ RSpec.describe Spree::Core::StockConfiguration do
37
38
  end
38
39
  end
39
40
  end
41
+
42
+ describe '#location_sorter_class' do
43
+ let(:stock_configuration) { described_class.new }
44
+ subject { stock_configuration.location_sorter_class }
45
+
46
+ it "returns Spree::Stock::LocationSorter::Unsorted" do
47
+ is_expected.to be ::Spree::Stock::LocationSorter::Unsorted
48
+ end
49
+
50
+ context "with another constant name assiged" do
51
+ MySorter = Class.new
52
+ before { stock_configuration.location_sorter_class = MySorter.to_s }
53
+
54
+ it "returns the constant" do
55
+ is_expected.to be MySorter
56
+ end
57
+ end
58
+ end
40
59
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+ require 'spree/testing_support/factories/store_credit_reason_factory'
5
+
6
+ RSpec.describe 'store credit reason factory' do
7
+ let(:factory_class) { Spree::StoreCreditReason }
8
+
9
+ describe 'store credit reason' do
10
+ let(:factory) { :store_credit_reason }
11
+
12
+ it_behaves_like 'a working factory'
13
+ end
14
+ end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
4
- require 'spree/money'
3
+ require 'rails_helper'
5
4
 
6
5
  RSpec.describe Spree::Money do
7
6
  before do
@@ -97,7 +96,7 @@ RSpec.describe Spree::Money do
97
96
 
98
97
  context "with currency" do
99
98
  it "passed in option" do
100
- money = Spree::Money.new(10, with_currency: true, html: false)
99
+ money = Spree::Money.new(10, with_currency: true, html_wrap: false)
101
100
  expect(money.to_s).to eq("$10.00 USD")
102
101
  end
103
102
  end
@@ -117,14 +116,14 @@ RSpec.describe Spree::Money do
117
116
  context "currency parameter" do
118
117
  context "when currency is specified in Canadian Dollars" do
119
118
  it "uses the currency param over the global configuration" do
120
- money = Spree::Money.new(10, currency: 'CAD', with_currency: true, html: false)
119
+ money = Spree::Money.new(10, currency: 'CAD', with_currency: true, html_wrap: false)
121
120
  expect(money.to_s).to eq("$10.00 CAD")
122
121
  end
123
122
  end
124
123
 
125
124
  context "when currency is specified in Japanese Yen" do
126
125
  it "uses the currency param over the global configuration" do
127
- money = Spree::Money.new(100, currency: 'JPY', html: false)
126
+ money = Spree::Money.new(100, currency: 'JPY', html_wrap: false)
128
127
  expect(money.to_s).to eq("¥100")
129
128
  end
130
129
  end
@@ -132,12 +131,12 @@ RSpec.describe Spree::Money do
132
131
 
133
132
  context "symbol positioning" do
134
133
  it "passed in option" do
135
- money = Spree::Money.new(10, symbol_position: :after, html: false)
134
+ money = Spree::Money.new(10, format: '%n %u', html_wrap: false)
136
135
  expect(money.to_s).to eq("10.00 $")
137
136
  end
138
137
 
139
138
  it "config option" do
140
- money = Spree::Money.new(10, symbol_position: :after, html: false)
139
+ money = Spree::Money.new(10, format: '%n %u', html_wrap: false)
141
140
  expect(money.to_s).to eq("10.00 $")
142
141
  end
143
142
  end
@@ -162,7 +161,7 @@ RSpec.describe Spree::Money do
162
161
  end
163
162
 
164
163
  it "formats correctly" do
165
- money = Spree::Money.new(1000, html: false)
164
+ money = Spree::Money.new(1000, html_wrap: false)
166
165
  expect(money.to_s).to eq("¥1,000")
167
166
  end
168
167
  end
@@ -176,20 +175,20 @@ RSpec.describe Spree::Money do
176
175
 
177
176
  # Regression test for https://github.com/spree/spree/issues/2634
178
177
  it "formats as plain by default" do
179
- money = Spree::Money.new(10, symbol_position: :after)
178
+ money = Spree::Money.new(10, format: '%n %u')
180
179
  expect(money.to_s).to eq("10.00 €")
181
180
  end
182
181
 
183
182
  it "formats as HTML if asked (nicely) to" do
184
- money = Spree::Money.new(10, symbol_position: :after)
183
+ money = Spree::Money.new(10, format: '%n %u')
185
184
  # The HTML'ified version of "10.00 €"
186
- expect(money.to_html).to eq("10.00&nbsp;&#x20AC;")
185
+ expect(money.to_html).to eq("<span class=\"money-whole\">10</span><span class=\"money-decimal-mark\">.</span><span class=\"money-decimal\">00</span> <span class=\"money-currency-symbol\">&#x20AC;</span>")
187
186
  end
188
187
 
189
188
  it "formats as HTML with currency" do
190
- money = Spree::Money.new(10, symbol_position: :after, with_currency: true)
189
+ money = Spree::Money.new(10, format: '%n %u', with_currency: true)
191
190
  # The HTML'ified version of "10.00 €"
192
- expect(money.to_html).to eq("10.00&nbsp;&#x20AC; <span class=\"currency\">EUR</span>")
191
+ expect(money.to_html).to eq("<span class=\"money-whole\">10</span><span class=\"money-decimal-mark\">.</span><span class=\"money-decimal\">00</span> <span class=\"money-currency-symbol\">&#x20AC;</span> <span class=\"money-currency\">EUR</span>")
193
192
  end
194
193
  end
195
194
 
@@ -0,0 +1,136 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+ require Spree::Core::Engine.root.join('db/migrate/20190106184413_remove_code_from_spree_promotions.rb')
5
+
6
+ RSpec.describe RemoveCodeFromSpreePromotions do
7
+ let(:migrations_paths) { ActiveRecord::Migrator.migrations_paths }
8
+ let(:migrations) do
9
+ if ActiveRecord::Base.connection.respond_to?(:migration_context)
10
+ # Rails >= 5.2
11
+ ActiveRecord::MigrationContext.new(migrations_paths).migrations
12
+ else
13
+ ActiveRecord::Migrator.migrations(migrations_paths)
14
+ end
15
+ end
16
+ let(:previous_version) { 20180710170104 }
17
+ let(:current_version) { 20190106184413 }
18
+
19
+ subject { ActiveRecord::Migrator.new(:up, migrations, current_version).migrate }
20
+
21
+ # This is needed for MySQL since it is not able to rollback to the previous
22
+ # state when database schema changes within that transaction.
23
+ before(:all) { self.use_transactional_tests = false }
24
+ after(:all) { self.use_transactional_tests = true }
25
+
26
+ around do |example|
27
+ DatabaseCleaner.clean_with(:truncation)
28
+ # Silence migrations output in specs report.
29
+ ActiveRecord::Migration.suppress_messages do
30
+ # Migrate back to the previous version
31
+ ActiveRecord::Migrator.new(:down, migrations, previous_version).migrate
32
+ # If other tests using Spree::Promotion ran before this one, Rails has
33
+ # stored information about table's columns and we need to reset those
34
+ # since the migration changed the database structure.
35
+ Spree::Promotion.reset_column_information
36
+
37
+ example.run
38
+
39
+ # Re-update column information after the migration has been executed
40
+ # again in the example. This will make the promotion attributes cache
41
+ # ready for other tests.
42
+ Spree::Promotion.reset_column_information
43
+ end
44
+ DatabaseCleaner.clean_with(:truncation)
45
+ end
46
+
47
+ context 'when there are no promotions with code' do
48
+ it 'does not call any promotion with code handler' do
49
+ expect(described_class).not_to receive(:promotions_with_code_handler)
50
+
51
+ subject
52
+ end
53
+ end
54
+
55
+ context 'when there are promotions with code' do
56
+ let(:promotion_with_code) { create(:promotion) }
57
+
58
+ before do
59
+ # We can't set code via factory since `code=` is currently raising
60
+ # an error, see more at:
61
+ # https://github.com/solidusio/solidus/blob/cf96b03eb9e80002b69736e082fd485c870ab5d9/core/app/models/spree/promotion.rb#L65
62
+ promotion_with_code.update_column(:code, 'Just An Old Promo Code')
63
+ end
64
+
65
+ context 'with the deafult handler (Solidus::Migrations::PromotionWithCodeHandlers::RaiseException)' do
66
+ it 'raise a StandardError exception' do
67
+ expect { subject }.to raise_error(StandardError)
68
+ end
69
+ end
70
+
71
+ context 'changing the default handler' do
72
+ before do
73
+ allow(described_class)
74
+ .to receive(:promotions_with_code_handler)
75
+ .and_return(promotions_with_code_handler)
76
+ end
77
+
78
+ context 'to Solidus::Migrations::PromotionWithCodeHandlers::MoveToSpreePromotionCode' do
79
+ let(:promotions_with_code_handler) { Solidus::Migrations::PromotionWithCodeHandlers::MoveToSpreePromotionCode }
80
+
81
+ context 'when there are no Spree::PromotionCode with the same value' do
82
+ it 'moves the code into a Spree::PromotionCode' do
83
+ migration_context = double('a migration context')
84
+ allow_any_instance_of(promotions_with_code_handler)
85
+ .to receive(:migration_context)
86
+ .and_return(migration_context)
87
+
88
+ expect(migration_context)
89
+ .to receive(:say)
90
+ .with("Creating Spree::PromotionCode with value 'just an old promo code' for Spree::Promotion with id '#{promotion_with_code.id}'")
91
+
92
+ expect { subject }
93
+ .to change { Spree::PromotionCode.all.size }
94
+ .from(0)
95
+ .to(1)
96
+ end
97
+ end
98
+
99
+ context 'when there is a Spree::PromotionCode with the same value' do
100
+ context 'associated with the same promotion' do
101
+ let!(:existing_promotion_code) { create(:promotion_code, value: 'just an old promo code', promotion: promotion_with_code) }
102
+
103
+ it 'does not create a new Spree::PromotionCode' do
104
+ expect { subject }.not_to change { Spree::PromotionCode.all.size }
105
+ end
106
+ end
107
+
108
+ context 'associated with another promotion' do
109
+ let!(:existing_promotion_code) { create(:promotion_code, value: 'just an old promo code') }
110
+
111
+ it 'raises an exception' do
112
+ expect { subject }.to raise_error(StandardError)
113
+ end
114
+ end
115
+ end
116
+ end
117
+
118
+ context 'to Solidus::Migrations::PromotionWithCodeHandlers::DoNothing' do
119
+ let(:promotions_with_code_handler) { Solidus::Migrations::PromotionWithCodeHandlers::DoNothing }
120
+
121
+ it 'just prints a message' do
122
+ migration_context = double('a migration context')
123
+ allow_any_instance_of(promotions_with_code_handler)
124
+ .to receive(:migration_context)
125
+ .and_return(migration_context)
126
+
127
+ expect(migration_context)
128
+ .to receive(:say)
129
+ .with("Code 'Just An Old Promo Code' is going to be removed from Spree::Promotion with id '#{promotion_with_code.id}'")
130
+
131
+ subject
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end