spree_core 3.0.5 → 3.0.6

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 (194) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/Gemfile +3 -0
  4. data/Rakefile +30 -0
  5. data/app/assets/javascripts/spree.js.coffee.erb +1 -1
  6. data/app/models/spree/ability.rb +1 -1
  7. data/app/models/spree/base.rb +3 -1
  8. data/app/models/spree/order_updater.rb +2 -1
  9. data/app/models/spree/price.rb +7 -12
  10. data/app/models/spree/product.rb +3 -2
  11. data/app/models/spree/reimbursement.rb +1 -1
  12. data/app/models/spree/state.rb +2 -0
  13. data/app/models/spree/zone.rb +1 -1
  14. data/lib/spree/core/version.rb +1 -1
  15. data/lib/spree/testing_support/shoulda_matcher_configuration.rb +6 -0
  16. data/script/rails +9 -0
  17. data/spec/fixtures/thinking-cat.jpg +0 -0
  18. data/spec/helpers/base_helper_spec.rb +137 -0
  19. data/spec/helpers/products_helper_spec.rb +224 -0
  20. data/spec/lib/calculated_adjustments_spec.rb +7 -0
  21. data/spec/lib/i18n_spec.rb +123 -0
  22. data/spec/lib/search/base_spec.rb +86 -0
  23. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +101 -0
  24. data/spec/lib/spree/core/controller_helpers/order_spec.rb +95 -0
  25. data/spec/lib/spree/core/controller_helpers/search_spec.rb +17 -0
  26. data/spec/lib/spree/core/controller_helpers/store_spec.rb +16 -0
  27. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +39 -0
  28. data/spec/lib/spree/core/delegate_belongs_to_spec.rb +22 -0
  29. data/spec/lib/spree/core/importer/order_spec.rb +502 -0
  30. data/spec/lib/spree/core/validators/email_spec.rb +53 -0
  31. data/spec/lib/spree/localized_number_spec.rb +38 -0
  32. data/spec/lib/spree/migrations_spec.rb +34 -0
  33. data/spec/lib/spree/money_spec.rb +122 -0
  34. data/spec/lib/tasks/exchanges_spec.rb +136 -0
  35. data/spec/mailers/order_mailer_spec.rb +124 -0
  36. data/spec/mailers/reimbursement_mailer_spec.rb +47 -0
  37. data/spec/mailers/shipment_mailer_spec.rb +63 -0
  38. data/spec/mailers/test_mailer_spec.rb +24 -0
  39. data/spec/models/spree/ability_spec.rb +246 -0
  40. data/spec/models/spree/address_spec.rb +291 -0
  41. data/spec/models/spree/adjustable/adjustments_updater_spec.rb +286 -0
  42. data/spec/models/spree/adjustment_spec.rb +163 -0
  43. data/spec/models/spree/app_configuration_spec.rb +23 -0
  44. data/spec/models/spree/asset_spec.rb +25 -0
  45. data/spec/models/spree/calculator/default_tax_spec.rb +127 -0
  46. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +25 -0
  47. data/spec/models/spree/calculator/flat_rate_spec.rb +47 -0
  48. data/spec/models/spree/calculator/flexi_rate_spec.rb +41 -0
  49. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +15 -0
  50. data/spec/models/spree/calculator/price_sack_spec.rb +30 -0
  51. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +51 -0
  52. data/spec/models/spree/calculator/shipping.rb +8 -0
  53. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +23 -0
  54. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +13 -0
  55. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +52 -0
  56. data/spec/models/spree/calculator/shipping/per_item_spec.rb +20 -0
  57. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +29 -0
  58. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +40 -0
  59. data/spec/models/spree/calculator/tiered_percent_spec.rb +51 -0
  60. data/spec/models/spree/calculator_spec.rb +69 -0
  61. data/spec/models/spree/classification_spec.rb +93 -0
  62. data/spec/models/spree/concerns/display_money_spec.rb +43 -0
  63. data/spec/models/spree/country_spec.rb +18 -0
  64. data/spec/models/spree/credit_card_spec.rb +324 -0
  65. data/spec/models/spree/customer_return_spec.rb +262 -0
  66. data/spec/models/spree/exchange_spec.rb +75 -0
  67. data/spec/models/spree/gateway/bogus_simple.rb +20 -0
  68. data/spec/models/spree/gateway/bogus_spec.rb +13 -0
  69. data/spec/models/spree/gateway_spec.rb +54 -0
  70. data/spec/models/spree/image_spec.rb +5 -0
  71. data/spec/models/spree/inventory_unit_spec.rb +242 -0
  72. data/spec/models/spree/line_item_spec.rb +267 -0
  73. data/spec/models/spree/option_type_spec.rb +14 -0
  74. data/spec/models/spree/option_value_spec.rb +13 -0
  75. data/spec/models/spree/order/address_spec.rb +50 -0
  76. data/spec/models/spree/order/adjustments_spec.rb +29 -0
  77. data/spec/models/spree/order/callbacks_spec.rb +42 -0
  78. data/spec/models/spree/order/checkout_spec.rb +764 -0
  79. data/spec/models/spree/order/currency_updater_spec.rb +32 -0
  80. data/spec/models/spree/order/finalizing_spec.rb +117 -0
  81. data/spec/models/spree/order/helpers_spec.rb +5 -0
  82. data/spec/models/spree/order/payment_spec.rb +214 -0
  83. data/spec/models/spree/order/risk_assessment_spec.rb +84 -0
  84. data/spec/models/spree/order/shipments_spec.rb +43 -0
  85. data/spec/models/spree/order/state_machine_spec.rb +216 -0
  86. data/spec/models/spree/order/tax_spec.rb +84 -0
  87. data/spec/models/spree/order/totals_spec.rb +24 -0
  88. data/spec/models/spree/order/updating_spec.rb +18 -0
  89. data/spec/models/spree/order/validations_spec.rb +15 -0
  90. data/spec/models/spree/order_contents_spec.rb +256 -0
  91. data/spec/models/spree/order_inventory_spec.rb +228 -0
  92. data/spec/models/spree/order_merger_spec.rb +133 -0
  93. data/spec/models/spree/order_spec.rb +954 -0
  94. data/spec/models/spree/order_updater_spec.rb +283 -0
  95. data/spec/models/spree/payment/gateway_options_spec.rb +119 -0
  96. data/spec/models/spree/payment_method_spec.rb +95 -0
  97. data/spec/models/spree/payment_spec.rb +926 -0
  98. data/spec/models/spree/preference_spec.rb +80 -0
  99. data/spec/models/spree/preferences/configuration_spec.rb +30 -0
  100. data/spec/models/spree/preferences/preferable_spec.rb +348 -0
  101. data/spec/models/spree/preferences/scoped_store_spec.rb +58 -0
  102. data/spec/models/spree/preferences/store_spec.rb +46 -0
  103. data/spec/models/spree/price_spec.rb +42 -0
  104. data/spec/models/spree/product/scopes_spec.rb +148 -0
  105. data/spec/models/spree/product_duplicator_spec.rb +103 -0
  106. data/spec/models/spree/product_filter_spec.rb +26 -0
  107. data/spec/models/spree/product_option_type_spec.rb +5 -0
  108. data/spec/models/spree/product_property_spec.rb +11 -0
  109. data/spec/models/spree/product_spec.rb +474 -0
  110. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +50 -0
  111. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +148 -0
  112. data/spec/models/spree/promotion/actions/create_line_items_spec.rb +86 -0
  113. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +36 -0
  114. data/spec/models/spree/promotion/rules/first_order_spec.rb +75 -0
  115. data/spec/models/spree/promotion/rules/item_total_spec.rb +282 -0
  116. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +42 -0
  117. data/spec/models/spree/promotion/rules/option_value_spec.rb +90 -0
  118. data/spec/models/spree/promotion/rules/product_spec.rb +143 -0
  119. data/spec/models/spree/promotion/rules/taxon_spec.rb +102 -0
  120. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +27 -0
  121. data/spec/models/spree/promotion/rules/user_spec.rb +37 -0
  122. data/spec/models/spree/promotion_action_spec.rb +10 -0
  123. data/spec/models/spree/promotion_category_spec.rb +17 -0
  124. data/spec/models/spree/promotion_handler/cart_spec.rb +102 -0
  125. data/spec/models/spree/promotion_handler/coupon_spec.rb +323 -0
  126. data/spec/models/spree/promotion_handler/free_shipping_spec.rb +48 -0
  127. data/spec/models/spree/promotion_handler/page_spec.rb +44 -0
  128. data/spec/models/spree/promotion_rule_spec.rb +29 -0
  129. data/spec/models/spree/promotion_spec.rb +603 -0
  130. data/spec/models/spree/property_spec.rb +5 -0
  131. data/spec/models/spree/prototype_spec.rb +5 -0
  132. data/spec/models/spree/refund_spec.rb +195 -0
  133. data/spec/models/spree/reimbursement/credit_spec.rb +36 -0
  134. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +140 -0
  135. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +83 -0
  136. data/spec/models/spree/reimbursement_performer_spec.rb +30 -0
  137. data/spec/models/spree/reimbursement_spec.rb +215 -0
  138. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +51 -0
  139. data/spec/models/spree/reimbursement_type/credit_spec.rb +53 -0
  140. data/spec/models/spree/reimbursement_type/exchange_spec.rb +46 -0
  141. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +55 -0
  142. data/spec/models/spree/return_authorization_spec.rb +250 -0
  143. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +77 -0
  144. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +58 -0
  145. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +61 -0
  146. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +32 -0
  147. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +29 -0
  148. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +35 -0
  149. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +65 -0
  150. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +43 -0
  151. data/spec/models/spree/return_item_spec.rb +682 -0
  152. data/spec/models/spree/returns_calculator_spec.rb +14 -0
  153. data/spec/models/spree/shipment_spec.rb +740 -0
  154. data/spec/models/spree/shipping_calculator_spec.rb +45 -0
  155. data/spec/models/spree/shipping_category_spec.rb +5 -0
  156. data/spec/models/spree/shipping_method_spec.rb +88 -0
  157. data/spec/models/spree/shipping_rate_spec.rb +141 -0
  158. data/spec/models/spree/state_spec.rb +18 -0
  159. data/spec/models/spree/stock/availability_validator_spec.rb +36 -0
  160. data/spec/models/spree/stock/content_item_spec.rb +22 -0
  161. data/spec/models/spree/stock/coordinator_spec.rb +51 -0
  162. data/spec/models/spree/stock/differentiator_spec.rb +39 -0
  163. data/spec/models/spree/stock/estimator_spec.rb +154 -0
  164. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +38 -0
  165. data/spec/models/spree/stock/package_spec.rb +194 -0
  166. data/spec/models/spree/stock/packer_spec.rb +70 -0
  167. data/spec/models/spree/stock/prioritizer_spec.rb +125 -0
  168. data/spec/models/spree/stock/quantifier_spec.rb +97 -0
  169. data/spec/models/spree/stock/splitter/backordered_spec.rb +29 -0
  170. data/spec/models/spree/stock/splitter/base_spec.rb +21 -0
  171. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +47 -0
  172. data/spec/models/spree/stock/splitter/weight_spec.rb +32 -0
  173. data/spec/models/spree/stock_item_spec.rb +410 -0
  174. data/spec/models/spree/stock_location_spec.rb +243 -0
  175. data/spec/models/spree/stock_movement_spec.rb +56 -0
  176. data/spec/models/spree/stock_transfer_spec.rb +50 -0
  177. data/spec/models/spree/store_spec.rb +50 -0
  178. data/spec/models/spree/tax_category_spec.rb +27 -0
  179. data/spec/models/spree/tax_rate_spec.rb +382 -0
  180. data/spec/models/spree/taxon_spec.rb +74 -0
  181. data/spec/models/spree/taxonomy_spec.rb +18 -0
  182. data/spec/models/spree/tracker_spec.rb +21 -0
  183. data/spec/models/spree/user_spec.rb +130 -0
  184. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +24 -0
  185. data/spec/models/spree/variant_spec.rb +523 -0
  186. data/spec/models/spree/zone_spec.rb +444 -0
  187. data/spec/spec_helper.rb +74 -0
  188. data/spec/support/big_decimal.rb +5 -0
  189. data/spec/support/concerns/adjustment_source_spec.rb +23 -0
  190. data/spec/support/concerns/default_price_spec.rb +28 -0
  191. data/spec/support/rake.rb +13 -0
  192. data/spec/support/test_gateway.rb +2 -0
  193. data/spree_core.gemspec +48 -0
  194. metadata +185 -4
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe EmailValidator do
4
+
5
+ class Tester
6
+ include ActiveModel::Validations
7
+ attr_accessor :email_address
8
+ validates :email_address, email: true
9
+ end
10
+
11
+ let(:valid_emails) {[
12
+ 'valid@email.com',
13
+ 'valid@email.com.uk',
14
+ 'e@email.com',
15
+ 'valid+email@email.com',
16
+ 'valid-email@email.com',
17
+ 'valid_email@email.com',
18
+ 'validemail_@email.com',
19
+ 'valid.email@email.com'
20
+ ]}
21
+ let(:invalid_emails) {[
22
+ '',
23
+ ' ',
24
+ 'invalid email@email.com',
25
+ 'invalidemail @email.com',
26
+ 'invalidemail@email..com',
27
+ '.invalid.email@email.com',
28
+ 'invalid.email.@email.com',
29
+ '@email.com',
30
+ '.@email.com',
31
+ 'invalidemailemail.com',
32
+ '@invalid.email@email.com',
33
+ 'invalid@email@email.com',
34
+ 'invalid.email@@email.com'
35
+ ]}
36
+
37
+ it 'validates valid email addresses' do
38
+ tester = Tester.new
39
+ valid_emails.each do |email|
40
+ tester.email_address = email
41
+ expect(tester.valid?).to be true
42
+ end
43
+ end
44
+
45
+ it 'validates invalid email addresses' do
46
+ tester = Tester.new
47
+ invalid_emails.each do |email|
48
+ tester.email_address = email
49
+ expect(tester.valid?).to be false
50
+ end
51
+ end
52
+
53
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::LocalizedNumber do
4
+
5
+ context ".parse" do
6
+ before do
7
+ I18n.enforce_available_locales = false
8
+ I18n.locale = I18n.default_locale
9
+ I18n.backend.store_translations(:de, { :number => { :currency => { :format => { :delimiter => '.', :separator => ',' } } } })
10
+ end
11
+
12
+ after do
13
+ I18n.locale = I18n.default_locale
14
+ I18n.enforce_available_locales = true
15
+ end
16
+
17
+ context "with decimal point" do
18
+ it "captures the proper amount for a formatted price" do
19
+ expect(subject.class.parse('1,599.99')).to eql 1599.99
20
+ end
21
+ end
22
+
23
+ context "with decimal comma" do
24
+ it "captures the proper amount for a formatted price" do
25
+ I18n.locale = :de
26
+ expect(subject.class.parse('1.599,99')).to eql 1599.99
27
+ end
28
+ end
29
+
30
+ context "with a numeric price" do
31
+ it "uses the price as is" do
32
+ I18n.locale = :de
33
+ expect(subject.class.parse(1599.99)).to eql 1599.99
34
+ end
35
+ end
36
+ end
37
+
38
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ describe Migrations do
5
+ let(:app_migrations) { [".", "34_add_title.rb", "52_add_text.rb"] }
6
+ let(:engine_migrations) { [".", "334_create_orders.spree.rb", "777_create_products.spree.rb"] }
7
+
8
+ let(:config) { double("Config", root: "dir") }
9
+
10
+ subject { described_class.new(config, "spree") }
11
+
12
+ before do
13
+ expect(File).to receive(:exists?).with("config/spree.yml").and_return true
14
+ expect(File).to receive(:directory?).with("db/migrate").and_return true
15
+ end
16
+
17
+ it "warns about missing migrations" do
18
+ expect(Dir).to receive(:entries).with("db/migrate").and_return app_migrations
19
+ expect(Dir).to receive(:entries).with("dir/db/migrate").and_return engine_migrations
20
+
21
+ silence_stream(STDOUT) {
22
+ expect(subject.check).to eq true
23
+ }
24
+ end
25
+
26
+ context "no missing migrations" do
27
+ it "says nothing" do
28
+ expect(Dir).to receive(:entries).with("dir/db/migrate").and_return engine_migrations
29
+ expect(Dir).to receive(:entries).with("db/migrate").and_return (app_migrations + engine_migrations)
30
+ expect(subject.check).to eq nil
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,122 @@
1
+ # coding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe Spree::Money do
5
+ before do
6
+ configure_spree_preferences do |config|
7
+ config.currency = "USD"
8
+ end
9
+ end
10
+
11
+ it "formats correctly" do
12
+ money = Spree::Money.new(10)
13
+ expect(money.to_s).to eq("$10.00")
14
+ end
15
+
16
+ it "can get cents" do
17
+ money = Spree::Money.new(10)
18
+ expect(money.cents).to eq(1000)
19
+ end
20
+
21
+ context "with currency" do
22
+ it "passed in option" do
23
+ money = Spree::Money.new(10, :with_currency => true, :html => false)
24
+ expect(money.to_s).to eq("$10.00 USD")
25
+ end
26
+ end
27
+
28
+ context "hide cents" do
29
+ it "hides cents suffix" do
30
+ money = Spree::Money.new(10, no_cents: true)
31
+ expect(money.to_s).to eq("$10")
32
+ end
33
+
34
+ it "shows cents suffix" do
35
+ money = Spree::Money.new(10)
36
+ expect(money.to_s).to eq("$10.00")
37
+ end
38
+ end
39
+
40
+ context "currency parameter" do
41
+ context "when currency is specified in Canadian Dollars" do
42
+ it "uses the currency param over the global configuration" do
43
+ money = Spree::Money.new(10, :currency => 'CAD', :with_currency => true, :html => false)
44
+ expect(money.to_s).to eq("$10.00 CAD")
45
+ end
46
+ end
47
+
48
+ context "when currency is specified in Japanese Yen" do
49
+ it "uses the currency param over the global configuration" do
50
+ money = Spree::Money.new(100, :currency => 'JPY', :html => false)
51
+ expect(money.to_s).to eq("¥100")
52
+ end
53
+ end
54
+ end
55
+
56
+ context "symbol positioning" do
57
+ it "passed in option" do
58
+ money = Spree::Money.new(10, :symbol_position => :after, :html => false)
59
+ expect(money.to_s).to eq("10.00 $")
60
+ end
61
+ end
62
+
63
+ context "sign before symbol" do
64
+ it "defaults to -$10.00" do
65
+ money = Spree::Money.new(-10)
66
+ expect(money.to_s).to eq("-$10.00")
67
+ end
68
+
69
+ it "passed in option" do
70
+ money = Spree::Money.new(-10, :sign_before_symbol => false)
71
+ expect(money.to_s).to eq("$-10.00")
72
+ end
73
+ end
74
+
75
+ context "JPY" do
76
+ before do
77
+ configure_spree_preferences do |config|
78
+ config.currency = "JPY"
79
+ end
80
+ end
81
+
82
+ it "formats correctly" do
83
+ money = Spree::Money.new(1000, :html => false)
84
+ expect(money.to_s).to eq("¥1,000")
85
+ end
86
+ end
87
+
88
+ context "EUR" do
89
+ before do
90
+ configure_spree_preferences do |config|
91
+ config.currency = "EUR"
92
+ end
93
+ end
94
+
95
+ # Regression test for #2634
96
+ it "formats as plain by default" do
97
+ money = Spree::Money.new(10, symbol_position: :after)
98
+ expect(money.to_s).to eq("10.00 €")
99
+ end
100
+
101
+ it "formats as HTML if asked (nicely) to" do
102
+ money = Spree::Money.new(10, symbol_position: :after)
103
+ # The HTML'ified version of "10.00 €"
104
+ expect(money.to_html).to eq("10.00 €")
105
+ end
106
+
107
+ it "formats as HTML with currency" do
108
+ money = Spree::Money.new(10, symbol_position: :after, with_currency: true)
109
+ # The HTML'ified version of "10.00 €"
110
+ expect(money.to_html).to eq("10.00&nbsp;&#x20AC; <span class=\"currency\">EUR</span>")
111
+ end
112
+ end
113
+
114
+ describe "#as_json" do
115
+ let(:options) { double('options') }
116
+
117
+ it "returns the expected string" do
118
+ money = Spree::Money.new(10)
119
+ expect(money.as_json(options)).to eq("$10.00")
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,136 @@
1
+ require 'spec_helper'
2
+
3
+ describe "exchanges:charge_unreturned_items" do
4
+ include_context "rake"
5
+
6
+ describe '#prerequisites' do
7
+ it { expect(subject.prerequisites).to include("environment") }
8
+ end
9
+
10
+ context "there are no unreturned items" do
11
+ it { expect { subject.invoke }.not_to change { Spree::Order.count } }
12
+ end
13
+
14
+ context "there are unreturned items" do
15
+ let!(:order) { create(:shipped_order, line_items_count: 2) }
16
+ let(:return_item_1) { create(:exchange_return_item, inventory_unit: order.inventory_units.first) }
17
+ let(:return_item_2) { create(:exchange_return_item, inventory_unit: order.inventory_units.last) }
18
+ let!(:rma) { create(:return_authorization, order: order, return_items: [return_item_1, return_item_2]) }
19
+ let!(:tax_rate) { create(:tax_rate, zone: order.tax_zone, tax_category: return_item_2.exchange_variant.tax_category) }
20
+
21
+ before do
22
+ @original_expedited_exchanges_pref = Spree::Config[:expedited_exchanges]
23
+ Spree::Config[:expedited_exchanges] = true
24
+ Spree::StockItem.update_all(count_on_hand: 10)
25
+ rma.save!
26
+ Spree::Shipment.last.ship!
27
+ return_item_1.receive!
28
+ Timecop.travel travel_time
29
+ end
30
+
31
+ after do
32
+ Timecop.return
33
+ Spree::Config[:expedited_exchanges] = @original_expedited_exchanges_pref
34
+ end
35
+
36
+ context "fewer than the config allowed days have passed" do
37
+ let(:travel_time) { (Spree::Config[:expedited_exchanges_days_window] - 1).days }
38
+
39
+ it "does not create a new order" do
40
+ expect { subject.invoke }.not_to change { Spree::Order.count }
41
+ end
42
+ end
43
+
44
+ context "more than the config allowed days have passed" do
45
+
46
+ let(:travel_time) { (Spree::Config[:expedited_exchanges_days_window] + 1).days }
47
+
48
+ it "creates a new completed order" do
49
+ expect { subject.invoke }.to change { Spree::Order.count }
50
+ expect(Spree::Order.last).to be_completed
51
+ end
52
+
53
+ it "moves the shipment for the unreturned items to the new order" do
54
+ subject.invoke
55
+ new_order = Spree::Order.last
56
+ expect(new_order.shipments.count).to eq 1
57
+ expect(return_item_2.reload.exchange_shipment.order).to eq Spree::Order.last
58
+ end
59
+
60
+ it "creates line items on the order for the unreturned items" do
61
+ subject.invoke
62
+ expect(Spree::Order.last.line_items.map(&:variant)).to eq [return_item_2.exchange_variant]
63
+ end
64
+
65
+ it "associates the exchanges inventory units with the new line items" do
66
+ subject.invoke
67
+ expect(return_item_2.reload.exchange_inventory_unit.try(:line_item).try(:order)).to eq Spree::Order.last
68
+ end
69
+
70
+ it "uses the credit card from the previous order" do
71
+ subject.invoke
72
+ new_order = Spree::Order.last
73
+ expect(new_order.credit_cards).to be_present
74
+ expect(new_order.credit_cards.first).to eq order.valid_credit_cards.first
75
+ end
76
+
77
+ it "authorizes the order for the full amount of the unreturned items including taxes" do
78
+ expect { subject.invoke }.to change { Spree::Payment.count }.by(1)
79
+ new_order = Spree::Order.last
80
+ expected_amount = return_item_2.reload.exchange_variant.price + new_order.additional_tax_total + new_order.included_tax_total
81
+ expect(new_order.total).to eq expected_amount
82
+ payment = new_order.payments.first
83
+ expect(payment.amount).to eq expected_amount
84
+ expect(payment).to be_pending
85
+ expect(new_order.item_total).to eq return_item_2.reload.exchange_variant.price
86
+ end
87
+
88
+ it "does not attempt to create a new order for the item more than once" do
89
+ subject.invoke
90
+ subject.reenable
91
+ expect { subject.invoke }.not_to change { Spree::Order.count }
92
+ end
93
+
94
+ it "associates the store of the original order with the exchange order" do
95
+ allow_any_instance_of(Spree::Order).to receive(:store_id).and_return(123)
96
+
97
+ expect(Spree::Order).to receive(:create!).once.with(hash_including({store_id: 123})) { |attrs| Spree::Order.new(attrs.except(:store_id)).tap(&:save!) }
98
+ subject.invoke
99
+ end
100
+
101
+ context "there is no card from the previous order" do
102
+ let!(:credit_card) { create(:credit_card, user: order.user, default: true, gateway_customer_profile_id: "BGS-123") }
103
+ before { allow_any_instance_of(Spree::Order).to receive(:valid_credit_cards) { [] } }
104
+
105
+ it "attempts to use the user's default card" do
106
+ expect { subject.invoke }.to change { Spree::Payment.count }.by(1)
107
+ new_order = Spree::Order.last
108
+ expect(new_order.credit_cards).to be_present
109
+ expect(new_order.credit_cards.first).to eq credit_card
110
+ end
111
+ end
112
+
113
+ context "it is unable to authorize the credit card" do
114
+ before { allow_any_instance_of(Spree::Payment).to receive(:authorize!).and_raise(RuntimeError) }
115
+
116
+ it "raises an error with the order" do
117
+ expect { subject.invoke }.to raise_error(UnableToChargeForUnreturnedItems)
118
+ end
119
+ end
120
+
121
+ context "the exchange inventory unit is not shipped" do
122
+ before { return_item_2.reload.exchange_inventory_unit.update_columns(state: "on hand") }
123
+ it "does not create a new order" do
124
+ expect { subject.invoke }.not_to change { Spree::Order.count }
125
+ end
126
+ end
127
+
128
+ context "the exchange inventory unit has been returned" do
129
+ before { return_item_2.reload.exchange_inventory_unit.update_columns(state: "returned") }
130
+ it "does not create a new order" do
131
+ expect { subject.invoke }.not_to change { Spree::Order.count }
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,124 @@
1
+ require 'spec_helper'
2
+ require 'email_spec'
3
+
4
+ describe Spree::OrderMailer, :type => :mailer do
5
+ include EmailSpec::Helpers
6
+ include EmailSpec::Matchers
7
+
8
+ before { create(:store) }
9
+
10
+ let(:order) do
11
+ order = stub_model(Spree::Order)
12
+ product = stub_model(Spree::Product, :name => %Q{The "BEST" product})
13
+ variant = stub_model(Spree::Variant, :product => product)
14
+ price = stub_model(Spree::Price, :variant => variant, :amount => 5.00)
15
+ line_item = stub_model(Spree::LineItem, :variant => variant, :order => order, :quantity => 1, :price => 4.99)
16
+ allow(variant).to receive_messages(:default_price => price)
17
+ allow(order).to receive_messages(:line_items => [line_item])
18
+ order
19
+ end
20
+
21
+ context ":from not set explicitly" do
22
+ it "falls back to spree config" do
23
+ message = Spree::OrderMailer.confirm_email(order)
24
+ expect(message.from).to eq([Spree::Store.current.mail_from_address])
25
+ end
26
+ end
27
+
28
+ it "doesn't aggressively escape double quotes in confirmation body" do
29
+ confirmation_email = Spree::OrderMailer.confirm_email(order)
30
+ expect(confirmation_email.body).not_to include("&quot;")
31
+ end
32
+
33
+ it "confirm_email accepts an order id as an alternative to an Order object" do
34
+ expect(Spree::Order).to receive(:find).with(order.id).and_return(order)
35
+ expect {
36
+ Spree::OrderMailer.confirm_email(order.id).body
37
+ }.not_to raise_error
38
+ end
39
+
40
+ it "cancel_email accepts an order id as an alternative to an Order object" do
41
+ expect(Spree::Order).to receive(:find).with(order.id).and_return(order)
42
+ expect {
43
+ cancel_email = Spree::OrderMailer.cancel_email(order.id).body
44
+ }.not_to raise_error
45
+ end
46
+
47
+ context "only shows eligible adjustments in emails" do
48
+ before do
49
+ create(:adjustment, :order => order, :eligible => true, :label => "Eligible Adjustment")
50
+ create(:adjustment, :order => order, :eligible => false, :label => "Ineligible Adjustment")
51
+ end
52
+
53
+ let!(:confirmation_email) { Spree::OrderMailer.confirm_email(order) }
54
+ let!(:cancel_email) { Spree::OrderMailer.cancel_email(order) }
55
+
56
+ specify do
57
+ expect(confirmation_email.body).not_to include("Ineligible Adjustment")
58
+ end
59
+
60
+ specify do
61
+ expect(cancel_email.body).not_to include("Ineligible Adjustment")
62
+ end
63
+ end
64
+
65
+ context "displays unit costs from line item" do
66
+ # Regression test for #2772
67
+
68
+ # Tests mailer view spree/order_mailer/confirm_email.text.erb
69
+ specify do
70
+ confirmation_email = Spree::OrderMailer.confirm_email(order)
71
+ expect(confirmation_email).to have_body_text("4.99")
72
+ expect(confirmation_email).to_not have_body_text("5.00")
73
+ end
74
+
75
+ # Tests mailer view spree/order_mailer/cancel_email.text.erb
76
+ specify do
77
+ cancel_email = Spree::OrderMailer.cancel_email(order)
78
+ expect(cancel_email).to have_body_text("4.99")
79
+ expect(cancel_email).to_not have_body_text("5.00")
80
+ end
81
+ end
82
+
83
+ context "emails must be translatable" do
84
+
85
+ context "pt-BR locale" do
86
+ before do
87
+ I18n.enforce_available_locales = false
88
+ pt_br_confirm_mail = { :spree => { :order_mailer => { :confirm_email => { :dear_customer => 'Caro Cliente,' } } } }
89
+ pt_br_cancel_mail = { :spree => { :order_mailer => { :cancel_email => { :order_summary_canceled => 'Resumo da Pedido [CANCELADA]' } } } }
90
+ I18n.backend.store_translations :'pt-BR', pt_br_confirm_mail
91
+ I18n.backend.store_translations :'pt-BR', pt_br_cancel_mail
92
+ I18n.locale = :'pt-BR'
93
+ end
94
+
95
+ after do
96
+ I18n.locale = I18n.default_locale
97
+ I18n.enforce_available_locales = true
98
+ end
99
+
100
+ context "confirm_email" do
101
+ specify do
102
+ confirmation_email = Spree::OrderMailer.confirm_email(order)
103
+ expect(confirmation_email).to have_body_text("Caro Cliente,")
104
+ end
105
+ end
106
+
107
+ context "cancel_email" do
108
+ specify do
109
+ cancel_email = Spree::OrderMailer.cancel_email(order)
110
+ expect(cancel_email).to have_body_text("Resumo da Pedido [CANCELADA]")
111
+ end
112
+ end
113
+ end
114
+ end
115
+
116
+ context "with preference :send_core_emails set to false" do
117
+ it "sends no email" do
118
+ Spree::Config.set(:send_core_emails, false)
119
+ message = Spree::OrderMailer.confirm_email(order)
120
+ expect(message.body).to be_blank
121
+ end
122
+ end
123
+
124
+ end