spree_core 3.0.5 → 3.0.6

Sign up to get free protection for your applications and to get access to all the features.
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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e9e78e82569d33a57fc77a288f4bb6478a0fdf25
4
- data.tar.gz: ec9e23165c2db5df7e0d0c58aa11d243fed18bb7
3
+ metadata.gz: 3c0bd588d1db4f3c55793fddb2e91a17e560626a
4
+ data.tar.gz: 2dd3ba214df58ad7de4d0a6743e5faf2dad7b592
5
5
  SHA512:
6
- metadata.gz: ff1a688974b9cc46f3f4baecdc5212e3b6eb4ec6324cf47aeb29e1d8c50a2b1872635f9b3817b27a28f7cd5368fb7c10299e35e077ff7e9c9faadf6b6e8a2a34
7
- data.tar.gz: 6cec5411da47ddfaf0504c2724dc866160d1443a021c3394e7b229745a469298396992d77a2b3cbfd98987efa1397d4999f53d09f7b742ee73676099d2feb222
6
+ metadata.gz: 5688d90282d9ff0c1b41f64dae318c7f028bd6148aae51a26568e5f397d0031015fc4fd249c959cd335748859231d8ecac3f11f6fa9052d2ee0b0ed04f6ba500
7
+ data.tar.gz: ff5cf6508e0d92fcfa5855fca4e9099b18be2b94bb8ac7c4441e74e37a6c622db6fae58591032431b69d3cd62b31a56eea9bc68b7b7d5dd1ddc4faf74db63108
@@ -0,0 +1,4 @@
1
+ ## Spree 3.0.0 (unreleased) ##
2
+
3
+ * Renamed ItemAdjustments to Adjustable::AdjustmentsUpdater.
4
+ * Removed allow_ssl_in_* preferences from spree
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ eval(File.read(File.dirname(__FILE__) + '/../common_spree_dependencies.rb'))
2
+
3
+ gemspec
@@ -0,0 +1,30 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/testtask'
4
+ require 'rake/packagetask'
5
+ require 'rubygems/package_task'
6
+ require 'rspec/core/rake_task'
7
+ require 'spree/testing_support/common_rake'
8
+ load 'lib/tasks/exchanges.rake'
9
+
10
+ Bundler::GemHelper.install_tasks
11
+ RSpec::Core::RakeTask.new
12
+
13
+ spec = eval(File.read('spree_core.gemspec'))
14
+ Gem::PackageTask.new(spec) do |p|
15
+ p.gem_spec = spec
16
+ end
17
+
18
+ desc "Release to gemcutter"
19
+ task :release do
20
+ version = File.read(File.expand_path("../../SPREE_VERSION", __FILE__)).strip
21
+ cmd = "cd pkg && gem push spree_core-#{version}.gem"; puts cmd; system cmd
22
+ end
23
+
24
+ task :default => :spec
25
+
26
+ desc "Generates a dummy app for testing"
27
+ task :test_app do
28
+ ENV['LIB_NAME'] = 'spree/core'
29
+ Rake::Task['common:test_app'].invoke
30
+ end
@@ -8,7 +8,7 @@ class window.Spree
8
8
  callback(jQuery)
9
9
 
10
10
  @mountedAt: ->
11
- "<%= Rails.application.routes.url_helpers.spree_path %>"
11
+ "<%= Rails.application.routes.url_helpers.spree_path(trailing_slash: true) %>"
12
12
 
13
13
  @pathFor: (path) ->
14
14
  locationOrigin = "#{window.location.protocol}//#{window.location.hostname}" + (if window.location.port then ":#{window.location.port}" else "")
@@ -65,7 +65,7 @@ module Spree
65
65
  @rules = rules + ability.send(:rules)
66
66
  end
67
67
 
68
- # Protect admin and user roles
68
+ # Protect admin role
69
69
  cannot [:update, :destroy], Role, name: ['admin']
70
70
  end
71
71
  end
@@ -5,7 +5,9 @@ class Spree::Base < ActiveRecord::Base
5
5
  include Spree::RansackableAttributes
6
6
 
7
7
  after_initialize do
8
- self.preferences = default_preferences.merge(preferences) if has_attribute?(:preferences)
8
+ if has_attribute?(:preferences) && !preferences.nil?
9
+ self.preferences = default_preferences.merge(preferences)
10
+ end
9
11
  end
10
12
 
11
13
  if Kaminari.config.page_method_name != :page
@@ -41,7 +41,7 @@ module Spree
41
41
  # +item_total+ The total value of all LineItems
42
42
  # +adjustment_total+ The total value of all adjustments (promotions, credits, etc.)
43
43
  # +promo_total+ The total value of all promotion adjustments
44
- # +total+ The so-called "order total." This is equivalent to +item_total+ plus +adjustment_total+.
44
+ # +total+ The so-called "order total." This is equivalent to +item_total+ plus +shipment_total+ plus +adjustment_total+.
45
45
  def update_totals
46
46
  update_payment_total
47
47
  update_item_total
@@ -154,6 +154,7 @@ module Spree
154
154
  # balance_due when +payment_total+ is less than +total+
155
155
  # credit_owed when +payment_total+ is greater than +total+
156
156
  # failed when most recent payment is in the failed state
157
+ # void when order is canceled and +payment_total+ is equal to zero
157
158
  #
158
159
  # The +payment_state+ value helps with reporting, etc. since it provides a quick and easy way to locate Orders needing attention.
159
160
  def update_payment_state
@@ -1,11 +1,16 @@
1
1
  module Spree
2
2
  class Price < Spree::Base
3
3
  acts_as_paranoid
4
+
5
+ MAXIMUM_AMOUNT = BigDecimal('99_999_999.99')
6
+
4
7
  belongs_to :variant, class_name: 'Spree::Variant', inverse_of: :prices, touch: true
5
8
 
6
9
  validate :check_price
7
- validates :amount, numericality: { greater_than_or_equal_to: 0 }, allow_nil: true
8
- validate :validate_amount_maximum
10
+ validates :amount, allow_nil: true, numericality: {
11
+ greater_than_or_equal_to: 0,
12
+ less_than_or_equal_to: MAXIMUM_AMOUNT
13
+ }
9
14
 
10
15
  extend DisplayMoney
11
16
  money_methods :amount, :price
@@ -34,15 +39,5 @@ module Spree
34
39
  def check_price
35
40
  self.currency ||= Spree::Config[:currency]
36
41
  end
37
-
38
- def maximum_amount
39
- BigDecimal '999999.99'
40
- end
41
-
42
- def validate_amount_maximum
43
- if amount && amount > maximum_amount
44
- errors.add :amount, I18n.t('errors.messages.less_than_or_equal_to', count: maximum_amount)
45
- end
46
- end
47
42
  end
48
43
  end
@@ -235,10 +235,11 @@ module Spree
235
235
  end
236
236
 
237
237
  def any_variants_not_track_inventory?
238
+ return true unless Spree::Config.track_inventory_levels
238
239
  if variants_including_master.loaded?
239
- variants_including_master.any? { |v| !v.should_track_inventory? }
240
+ variants_including_master.any? { |v| !v.track_inventory? }
240
241
  else
241
- !Spree::Config.track_inventory_levels || variants_including_master.where(track_inventory: false).any?
242
+ variants_including_master.where(track_inventory: false).exists?
242
243
  end
243
244
  end
244
245
 
@@ -26,7 +26,7 @@ module Spree
26
26
  class_attribute :reimbursement_tax_calculator
27
27
  self.reimbursement_tax_calculator = ReimbursementTaxCalculator
28
28
  # A separate attribute here allows you to use a more performant calculator for estimates
29
- # and a different one (e.g. one that hits a 3rd party API) for the final caluclations.
29
+ # and a different one (e.g. one that hits a 3rd party API) for the final calculations.
30
30
  class_attribute :reimbursement_simulator_tax_calculator
31
31
  self.reimbursement_simulator_tax_calculator = ReimbursementTaxCalculator
32
32
 
@@ -13,6 +13,8 @@ module Spree
13
13
 
14
14
  validates :country, :name, presence: true
15
15
 
16
+ self.whitelisted_ransackable_attributes = %w(abbr)
17
+
16
18
  def self.find_all_by_name_or_abbr(name_or_abbr)
17
19
  where('name = ? OR abbr = ?', name_or_abbr, name_or_abbr)
18
20
  end
@@ -23,7 +23,7 @@ module Spree
23
23
 
24
24
  def self.potential_matching_zones(zone)
25
25
  if zone.country?
26
- # Match zones of the same kind with simialr countries
26
+ # Match zones of the same kind with similar countries
27
27
  joins(countries: :zones).
28
28
  where('zone_members_spree_countries_join.zone_id = ? OR ' +
29
29
  'spree_zones.default_tax = ?', zone.id, true).
@@ -1,5 +1,5 @@
1
1
  module Spree
2
2
  def self.version
3
- '3.0.5'
3
+ '3.0.6'
4
4
  end
5
5
  end
@@ -0,0 +1,6 @@
1
+ Shoulda::Matchers.configure do |config|
2
+ config.integrate do |with|
3
+ with.test_framework :rspec
4
+ with.library :rails
5
+ end
6
+ end
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ ENGINE_ROOT = File.expand_path('../..', __FILE__)
5
+ ENGINE_PATH = File.expand_path('../../lib/spree/core/engine', __FILE__)
6
+
7
+ require 'rails/all'
8
+ require 'rails/engine/commands'
9
+
@@ -0,0 +1,137 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::BaseHelper, type: :helper do
4
+ include Spree::BaseHelper
5
+
6
+ let(:current_store){ create :store }
7
+
8
+ context "available_countries" do
9
+ let(:country) { create(:country) }
10
+
11
+ before do
12
+ 3.times { create(:country) }
13
+ end
14
+
15
+ context "with no checkout zone defined" do
16
+ before do
17
+ Spree::Config[:checkout_zone] = nil
18
+ end
19
+
20
+ it "return complete list of countries" do
21
+ expect(available_countries.count).to eq(Spree::Country.count)
22
+ end
23
+ end
24
+
25
+ context "with a checkout zone defined" do
26
+ context "checkout zone is of type country" do
27
+ before do
28
+ @country_zone = create(:zone, :name => "CountryZone")
29
+ @country_zone.members.create(:zoneable => country)
30
+ Spree::Config[:checkout_zone] = @country_zone.name
31
+ end
32
+
33
+ it "return only the countries defined by the checkout zone" do
34
+ expect(available_countries).to eq([country])
35
+ end
36
+ end
37
+
38
+ context "checkout zone is of type state" do
39
+ before do
40
+ state_zone = create(:zone, :name => "StateZone")
41
+ state = create(:state, :country => country)
42
+ state_zone.members.create(:zoneable => state)
43
+ Spree::Config[:checkout_zone] = state_zone.name
44
+ end
45
+
46
+ it "return complete list of countries" do
47
+ expect(available_countries.count).to eq(Spree::Country.count)
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ # Regression test for #1436
54
+ context "defining custom image helpers" do
55
+ let(:product) { mock_model(Spree::Product, :images => [], :variant_images => []) }
56
+ before do
57
+ Spree::Image.class_eval do
58
+ attachment_definitions[:attachment][:styles].merge!({:very_strange => '1x1'})
59
+ end
60
+ end
61
+
62
+ it "should not raise errors when style exists" do
63
+ expect { very_strange_image(product) }.not_to raise_error
64
+ end
65
+
66
+ it "should raise NoMethodError when style is not exists" do
67
+ expect { another_strange_image(product) }.to raise_error(NoMethodError)
68
+ end
69
+ end
70
+
71
+ context "link_to_tracking" do
72
+ it "returns tracking link if available" do
73
+ a = link_to_tracking_html(shipping_method: true, tracking: '123', tracking_url: 'http://g.c/?t=123').css('a')
74
+
75
+ expect(a.text).to eq '123'
76
+ expect(a.attr('href').value).to eq 'http://g.c/?t=123'
77
+ end
78
+
79
+ it "returns tracking without link if link unavailable" do
80
+ html = link_to_tracking_html(shipping_method: true, tracking: '123', tracking_url: nil)
81
+ expect(html.css('span').text).to eq '123'
82
+ end
83
+
84
+ it "returns nothing when no shipping method" do
85
+ html = link_to_tracking_html(shipping_method: nil, tracking: '123')
86
+ expect(html.css('span').text).to eq ''
87
+ end
88
+
89
+ it "returns nothing when no tracking" do
90
+ html = link_to_tracking_html(tracking: nil)
91
+ expect(html.css('span').text).to eq ''
92
+ end
93
+
94
+ def link_to_tracking_html(options = {})
95
+ node = link_to_tracking(double(:shipment, options))
96
+ Nokogiri::HTML(node.to_s)
97
+ end
98
+ end
99
+
100
+ # Regression test for #2396
101
+ context "meta_data_tags" do
102
+ it "truncates a product description to 160 characters" do
103
+ # Because the controller_name method returns "test"
104
+ # controller_name is used by this method to infer what it is supposed
105
+ # to be generating meta_data_tags for
106
+ text = Faker::Lorem.paragraphs(2).join(" ")
107
+ @test = Spree::Product.new(:description => text)
108
+ tags = Nokogiri::HTML.parse(meta_data_tags)
109
+ content = tags.css("meta[name=description]").first["content"]
110
+ assert content.length <= 160, "content length is not truncated to 160 characters"
111
+ end
112
+ end
113
+
114
+ # Regression test for #5384
115
+ context "custom image helpers conflict with inproper statements" do
116
+ let(:product) { mock_model(Spree::Product, :images => [], :variant_images => []) }
117
+ before do
118
+ Spree::Image.class_eval do
119
+ attachment_definitions[:attachment][:styles].merge!({:foobar => '1x1'})
120
+ end
121
+ end
122
+
123
+ it "should not raise errors when helper method called" do
124
+ expect { foobar_image(product) }.not_to raise_error
125
+ end
126
+
127
+ it "should raise NoMethodError when statement with name equal to style name called" do
128
+ expect { foobar(product) }.to raise_error(NoMethodError)
129
+ end
130
+ end
131
+
132
+ context "pretty_time" do
133
+ it "prints in a format" do
134
+ expect(pretty_time(DateTime.new(2012, 5, 6, 13, 33))).to eq "May 06, 2012 1:33 PM"
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,224 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module Spree
6
+ describe ProductsHelper, :type => :helper do
7
+ include ProductsHelper
8
+
9
+ let(:product) { create(:product) }
10
+ let(:currency) { 'USD' }
11
+
12
+ before do
13
+ allow(helper).to receive(:current_currency) { currency }
14
+ end
15
+
16
+ context "#variant_price_diff" do
17
+ let(:product_price) { 10 }
18
+ let(:variant_price) { 10 }
19
+
20
+ before do
21
+ @variant = create(:variant, :product => product)
22
+ product.price = 15
23
+ @variant.price = 10
24
+ allow(product).to receive(:amount_in) { product_price }
25
+ allow(@variant).to receive(:amount_in) { variant_price }
26
+ end
27
+
28
+ subject { helper.variant_price(@variant) }
29
+
30
+ context "when variant is same as master" do
31
+ it { is_expected.to be_nil }
32
+ end
33
+
34
+ context "when the master has no price" do
35
+ let(:product_price) { nil }
36
+
37
+ it { is_expected.to be_nil }
38
+ end
39
+
40
+ context "when currency is default" do
41
+ context "when variant is more than master" do
42
+ let(:variant_price) { 15 }
43
+
44
+ it { is_expected.to eq("(Add: $5.00)") }
45
+ # Regression test for #2737
46
+ it { is_expected.to be_html_safe }
47
+ end
48
+
49
+ context "when variant is less than master" do
50
+ let(:product_price) { 15 }
51
+
52
+ it { is_expected.to eq("(Subtract: $5.00)") }
53
+ end
54
+ end
55
+
56
+ context "when currency is JPY" do
57
+ let(:variant_price) { 100 }
58
+ let(:product_price) { 100 }
59
+ let(:currency) { 'JPY' }
60
+
61
+ context "when variant is more than master" do
62
+ let(:variant_price) { 150 }
63
+
64
+ it { is_expected.to eq("(Add: &#x00A5;50)") }
65
+ end
66
+
67
+ context "when variant is less than master" do
68
+ let(:product_price) { 150 }
69
+
70
+ it { is_expected.to eq("(Subtract: &#x00A5;50)") }
71
+ end
72
+ end
73
+ end
74
+
75
+ context "#variant_price_full" do
76
+ before do
77
+ Spree::Config[:show_variant_full_price] = true
78
+ @variant1 = create(:variant, :product => product)
79
+ @variant2 = create(:variant, :product => product)
80
+ end
81
+
82
+ context "when currency is default" do
83
+ it "should return the variant price if the price is different than master" do
84
+ product.price = 10
85
+ @variant1.price = 15
86
+ @variant2.price = 20
87
+ expect(helper.variant_price(@variant1)).to eq("$15.00")
88
+ expect(helper.variant_price(@variant2)).to eq("$20.00")
89
+ end
90
+ end
91
+
92
+ context "when currency is JPY" do
93
+ let(:currency) { 'JPY' }
94
+
95
+ before do
96
+ product.variants.active.each do |variant|
97
+ variant.prices.each do |price|
98
+ price.currency = currency
99
+ price.save!
100
+ end
101
+ end
102
+ end
103
+
104
+ it "should return the variant price if the price is different than master" do
105
+ product.price = 100
106
+ @variant1.price = 150
107
+ expect(helper.variant_price(@variant1)).to eq("&#x00A5;150")
108
+ end
109
+ end
110
+
111
+ it "should be nil when all variant prices are equal" do
112
+ product.price = 10
113
+ @variant1.default_price.update_column(:amount, 10)
114
+ @variant2.default_price.update_column(:amount, 10)
115
+ expect(helper.variant_price(@variant1)).to be_nil
116
+ expect(helper.variant_price(@variant2)).to be_nil
117
+ end
118
+ end
119
+
120
+
121
+ context "#product_description" do
122
+ # Regression test for #1607
123
+ it "renders a product description without excessive paragraph breaks" do
124
+ product.description = %Q{
125
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus a ligula leo. Proin eu arcu at ipsum dapibus ullamcorper. Pellentesque egestas orci nec magna condimentum luctus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut ac ante et mauris bibendum ultricies non sed massa. Fusce facilisis dui eget lacus scelerisque eget aliquam urna ultricies. Duis et rhoncus quam. Praesent tellus nisi, ultrices sed iaculis quis, euismod interdum ipsum.</p>
126
+ <ul>
127
+ <li>Lorem ipsum dolor sit amet</li>
128
+ <li>Lorem ipsum dolor sit amet</li>
129
+ </ul>
130
+ }
131
+ description = product_description(product)
132
+ expect(description.strip).to eq(product.description.strip)
133
+ end
134
+
135
+ it "renders a product description with automatic paragraph breaks" do
136
+ product.description = %Q{
137
+ THIS IS THE BEST PRODUCT EVER!
138
+
139
+ "IT CHANGED MY LIFE" - Sue, MD}
140
+
141
+ description = product_description(product)
142
+ expect(description.strip).to eq(%Q{<p>\nTHIS IS THE BEST PRODUCT EVER!</p>"IT CHANGED MY LIFE" - Sue, MD})
143
+ end
144
+
145
+ it "renders a product description without any formatting based on configuration" do
146
+ initialDescription = %Q{
147
+ <p>hello world</p>
148
+
149
+ <p>tihs is completely awesome and it works</p>
150
+
151
+ <p>why so many spaces in the code. and why some more formatting afterwards?</p>
152
+ }
153
+
154
+ product.description = initialDescription
155
+
156
+ Spree::Config[:show_raw_product_description] = true
157
+ description = product_description(product)
158
+ expect(description).to eq(initialDescription)
159
+ end
160
+
161
+ end
162
+
163
+ shared_examples_for "line item descriptions" do
164
+ context 'variant has a blank description' do
165
+ let(:description) { nil }
166
+ it { is_expected.to eq(Spree.t(:product_has_no_description)) }
167
+ end
168
+ context 'variant has a description' do
169
+ let(:description) { 'test_desc' }
170
+ it { is_expected.to eq(description) }
171
+ end
172
+ context 'description has nonbreaking spaces' do
173
+ let(:description) { 'test&nbsp;desc' }
174
+ it { is_expected.to eq('test desc') }
175
+ end
176
+ context 'description has line endings' do
177
+ let(:description) { "test\n\r\ndesc" }
178
+ it { is_expected.to eq('test desc') }
179
+ end
180
+ end
181
+
182
+ context "#line_item_description" do
183
+ let(:variant) { create(:variant, :product => product, description: description) }
184
+ subject { line_item_description_text(variant.product.description) }
185
+
186
+ it_should_behave_like "line item descriptions"
187
+ end
188
+
189
+ context '#line_item_description_text' do
190
+ subject { line_item_description_text description }
191
+
192
+ it_should_behave_like "line item descriptions"
193
+ end
194
+
195
+ context '#cache_key_for_products' do
196
+ subject { helper.cache_key_for_products }
197
+ before(:each) do
198
+ @products = double('products collection')
199
+ allow(helper).to receive(:params) { {:page => 10} }
200
+ end
201
+
202
+ context 'when there is a maximum updated date' do
203
+ let(:updated_at) { Date.new(2011, 12, 13) }
204
+ before :each do
205
+ allow(@products).to receive(:count) { 5 }
206
+ allow(@products).to receive(:maximum).with(:updated_at) { updated_at }
207
+ end
208
+
209
+ it { is_expected.to eq('en/USD/spree/products/all-10-20111213-5') }
210
+ end
211
+
212
+ context 'when there is no considered maximum updated date' do
213
+ let(:today) { Date.new(2013, 12, 11) }
214
+ before :each do
215
+ allow(@products).to receive(:count) { 1234567 }
216
+ allow(@products).to receive(:maximum).with(:updated_at) { nil }
217
+ allow(Date).to receive(:today) { today }
218
+ end
219
+
220
+ it { is_expected.to eq('en/USD/spree/products/all-10-20131211-1234567') }
221
+ end
222
+ end
223
+ end
224
+ end