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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/Gemfile +3 -0
- data/Rakefile +30 -0
- data/app/assets/javascripts/spree.js.coffee.erb +1 -1
- data/app/models/spree/ability.rb +1 -1
- data/app/models/spree/base.rb +3 -1
- data/app/models/spree/order_updater.rb +2 -1
- data/app/models/spree/price.rb +7 -12
- data/app/models/spree/product.rb +3 -2
- data/app/models/spree/reimbursement.rb +1 -1
- data/app/models/spree/state.rb +2 -0
- data/app/models/spree/zone.rb +1 -1
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/testing_support/shoulda_matcher_configuration.rb +6 -0
- data/script/rails +9 -0
- data/spec/fixtures/thinking-cat.jpg +0 -0
- data/spec/helpers/base_helper_spec.rb +137 -0
- data/spec/helpers/products_helper_spec.rb +224 -0
- data/spec/lib/calculated_adjustments_spec.rb +7 -0
- data/spec/lib/i18n_spec.rb +123 -0
- data/spec/lib/search/base_spec.rb +86 -0
- data/spec/lib/spree/core/controller_helpers/auth_spec.rb +101 -0
- data/spec/lib/spree/core/controller_helpers/order_spec.rb +95 -0
- data/spec/lib/spree/core/controller_helpers/search_spec.rb +17 -0
- data/spec/lib/spree/core/controller_helpers/store_spec.rb +16 -0
- data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +39 -0
- data/spec/lib/spree/core/delegate_belongs_to_spec.rb +22 -0
- data/spec/lib/spree/core/importer/order_spec.rb +502 -0
- data/spec/lib/spree/core/validators/email_spec.rb +53 -0
- data/spec/lib/spree/localized_number_spec.rb +38 -0
- data/spec/lib/spree/migrations_spec.rb +34 -0
- data/spec/lib/spree/money_spec.rb +122 -0
- data/spec/lib/tasks/exchanges_spec.rb +136 -0
- data/spec/mailers/order_mailer_spec.rb +124 -0
- data/spec/mailers/reimbursement_mailer_spec.rb +47 -0
- data/spec/mailers/shipment_mailer_spec.rb +63 -0
- data/spec/mailers/test_mailer_spec.rb +24 -0
- data/spec/models/spree/ability_spec.rb +246 -0
- data/spec/models/spree/address_spec.rb +291 -0
- data/spec/models/spree/adjustable/adjustments_updater_spec.rb +286 -0
- data/spec/models/spree/adjustment_spec.rb +163 -0
- data/spec/models/spree/app_configuration_spec.rb +23 -0
- data/spec/models/spree/asset_spec.rb +25 -0
- data/spec/models/spree/calculator/default_tax_spec.rb +127 -0
- data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +25 -0
- data/spec/models/spree/calculator/flat_rate_spec.rb +47 -0
- data/spec/models/spree/calculator/flexi_rate_spec.rb +41 -0
- data/spec/models/spree/calculator/percent_on_line_item_spec.rb +15 -0
- data/spec/models/spree/calculator/price_sack_spec.rb +30 -0
- data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +51 -0
- data/spec/models/spree/calculator/shipping.rb +8 -0
- data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +23 -0
- data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +13 -0
- data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +52 -0
- data/spec/models/spree/calculator/shipping/per_item_spec.rb +20 -0
- data/spec/models/spree/calculator/shipping/price_sack_spec.rb +29 -0
- data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +40 -0
- data/spec/models/spree/calculator/tiered_percent_spec.rb +51 -0
- data/spec/models/spree/calculator_spec.rb +69 -0
- data/spec/models/spree/classification_spec.rb +93 -0
- data/spec/models/spree/concerns/display_money_spec.rb +43 -0
- data/spec/models/spree/country_spec.rb +18 -0
- data/spec/models/spree/credit_card_spec.rb +324 -0
- data/spec/models/spree/customer_return_spec.rb +262 -0
- data/spec/models/spree/exchange_spec.rb +75 -0
- data/spec/models/spree/gateway/bogus_simple.rb +20 -0
- data/spec/models/spree/gateway/bogus_spec.rb +13 -0
- data/spec/models/spree/gateway_spec.rb +54 -0
- data/spec/models/spree/image_spec.rb +5 -0
- data/spec/models/spree/inventory_unit_spec.rb +242 -0
- data/spec/models/spree/line_item_spec.rb +267 -0
- data/spec/models/spree/option_type_spec.rb +14 -0
- data/spec/models/spree/option_value_spec.rb +13 -0
- data/spec/models/spree/order/address_spec.rb +50 -0
- data/spec/models/spree/order/adjustments_spec.rb +29 -0
- data/spec/models/spree/order/callbacks_spec.rb +42 -0
- data/spec/models/spree/order/checkout_spec.rb +764 -0
- data/spec/models/spree/order/currency_updater_spec.rb +32 -0
- data/spec/models/spree/order/finalizing_spec.rb +117 -0
- data/spec/models/spree/order/helpers_spec.rb +5 -0
- data/spec/models/spree/order/payment_spec.rb +214 -0
- data/spec/models/spree/order/risk_assessment_spec.rb +84 -0
- data/spec/models/spree/order/shipments_spec.rb +43 -0
- data/spec/models/spree/order/state_machine_spec.rb +216 -0
- data/spec/models/spree/order/tax_spec.rb +84 -0
- data/spec/models/spree/order/totals_spec.rb +24 -0
- data/spec/models/spree/order/updating_spec.rb +18 -0
- data/spec/models/spree/order/validations_spec.rb +15 -0
- data/spec/models/spree/order_contents_spec.rb +256 -0
- data/spec/models/spree/order_inventory_spec.rb +228 -0
- data/spec/models/spree/order_merger_spec.rb +133 -0
- data/spec/models/spree/order_spec.rb +954 -0
- data/spec/models/spree/order_updater_spec.rb +283 -0
- data/spec/models/spree/payment/gateway_options_spec.rb +119 -0
- data/spec/models/spree/payment_method_spec.rb +95 -0
- data/spec/models/spree/payment_spec.rb +926 -0
- data/spec/models/spree/preference_spec.rb +80 -0
- data/spec/models/spree/preferences/configuration_spec.rb +30 -0
- data/spec/models/spree/preferences/preferable_spec.rb +348 -0
- data/spec/models/spree/preferences/scoped_store_spec.rb +58 -0
- data/spec/models/spree/preferences/store_spec.rb +46 -0
- data/spec/models/spree/price_spec.rb +42 -0
- data/spec/models/spree/product/scopes_spec.rb +148 -0
- data/spec/models/spree/product_duplicator_spec.rb +103 -0
- data/spec/models/spree/product_filter_spec.rb +26 -0
- data/spec/models/spree/product_option_type_spec.rb +5 -0
- data/spec/models/spree/product_property_spec.rb +11 -0
- data/spec/models/spree/product_spec.rb +474 -0
- data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +50 -0
- data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +148 -0
- data/spec/models/spree/promotion/actions/create_line_items_spec.rb +86 -0
- data/spec/models/spree/promotion/actions/free_shipping_spec.rb +36 -0
- data/spec/models/spree/promotion/rules/first_order_spec.rb +75 -0
- data/spec/models/spree/promotion/rules/item_total_spec.rb +282 -0
- data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +42 -0
- data/spec/models/spree/promotion/rules/option_value_spec.rb +90 -0
- data/spec/models/spree/promotion/rules/product_spec.rb +143 -0
- data/spec/models/spree/promotion/rules/taxon_spec.rb +102 -0
- data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +27 -0
- data/spec/models/spree/promotion/rules/user_spec.rb +37 -0
- data/spec/models/spree/promotion_action_spec.rb +10 -0
- data/spec/models/spree/promotion_category_spec.rb +17 -0
- data/spec/models/spree/promotion_handler/cart_spec.rb +102 -0
- data/spec/models/spree/promotion_handler/coupon_spec.rb +323 -0
- data/spec/models/spree/promotion_handler/free_shipping_spec.rb +48 -0
- data/spec/models/spree/promotion_handler/page_spec.rb +44 -0
- data/spec/models/spree/promotion_rule_spec.rb +29 -0
- data/spec/models/spree/promotion_spec.rb +603 -0
- data/spec/models/spree/property_spec.rb +5 -0
- data/spec/models/spree/prototype_spec.rb +5 -0
- data/spec/models/spree/refund_spec.rb +195 -0
- data/spec/models/spree/reimbursement/credit_spec.rb +36 -0
- data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +140 -0
- data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +83 -0
- data/spec/models/spree/reimbursement_performer_spec.rb +30 -0
- data/spec/models/spree/reimbursement_spec.rb +215 -0
- data/spec/models/spree/reimbursement_tax_calculator_spec.rb +51 -0
- data/spec/models/spree/reimbursement_type/credit_spec.rb +53 -0
- data/spec/models/spree/reimbursement_type/exchange_spec.rb +46 -0
- data/spec/models/spree/reimbursement_type/original_payment_spec.rb +55 -0
- data/spec/models/spree/return_authorization_spec.rb +250 -0
- data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +77 -0
- data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +58 -0
- data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +61 -0
- data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +32 -0
- data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +29 -0
- data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +35 -0
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +65 -0
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +43 -0
- data/spec/models/spree/return_item_spec.rb +682 -0
- data/spec/models/spree/returns_calculator_spec.rb +14 -0
- data/spec/models/spree/shipment_spec.rb +740 -0
- data/spec/models/spree/shipping_calculator_spec.rb +45 -0
- data/spec/models/spree/shipping_category_spec.rb +5 -0
- data/spec/models/spree/shipping_method_spec.rb +88 -0
- data/spec/models/spree/shipping_rate_spec.rb +141 -0
- data/spec/models/spree/state_spec.rb +18 -0
- data/spec/models/spree/stock/availability_validator_spec.rb +36 -0
- data/spec/models/spree/stock/content_item_spec.rb +22 -0
- data/spec/models/spree/stock/coordinator_spec.rb +51 -0
- data/spec/models/spree/stock/differentiator_spec.rb +39 -0
- data/spec/models/spree/stock/estimator_spec.rb +154 -0
- data/spec/models/spree/stock/inventory_unit_builder_spec.rb +38 -0
- data/spec/models/spree/stock/package_spec.rb +194 -0
- data/spec/models/spree/stock/packer_spec.rb +70 -0
- data/spec/models/spree/stock/prioritizer_spec.rb +125 -0
- data/spec/models/spree/stock/quantifier_spec.rb +97 -0
- data/spec/models/spree/stock/splitter/backordered_spec.rb +29 -0
- data/spec/models/spree/stock/splitter/base_spec.rb +21 -0
- data/spec/models/spree/stock/splitter/shipping_category_spec.rb +47 -0
- data/spec/models/spree/stock/splitter/weight_spec.rb +32 -0
- data/spec/models/spree/stock_item_spec.rb +410 -0
- data/spec/models/spree/stock_location_spec.rb +243 -0
- data/spec/models/spree/stock_movement_spec.rb +56 -0
- data/spec/models/spree/stock_transfer_spec.rb +50 -0
- data/spec/models/spree/store_spec.rb +50 -0
- data/spec/models/spree/tax_category_spec.rb +27 -0
- data/spec/models/spree/tax_rate_spec.rb +382 -0
- data/spec/models/spree/taxon_spec.rb +74 -0
- data/spec/models/spree/taxonomy_spec.rb +18 -0
- data/spec/models/spree/tracker_spec.rb +21 -0
- data/spec/models/spree/user_spec.rb +130 -0
- data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +24 -0
- data/spec/models/spree/variant_spec.rb +523 -0
- data/spec/models/spree/zone_spec.rb +444 -0
- data/spec/spec_helper.rb +74 -0
- data/spec/support/big_decimal.rb +5 -0
- data/spec/support/concerns/adjustment_source_spec.rb +23 -0
- data/spec/support/concerns/default_price_spec.rb +28 -0
- data/spec/support/rake.rb +13 -0
- data/spec/support/test_gateway.rb +2 -0
- data/spree_core.gemspec +48 -0
- metadata +185 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3c0bd588d1db4f3c55793fddb2e91a17e560626a
|
4
|
+
data.tar.gz: 2dd3ba214df58ad7de4d0a6743e5faf2dad7b592
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5688d90282d9ff0c1b41f64dae318c7f028bd6148aae51a26568e5f397d0031015fc4fd249c959cd335748859231d8ecac3f11f6fa9052d2ee0b0ed04f6ba500
|
7
|
+
data.tar.gz: ff5cf6508e0d92fcfa5855fca4e9099b18be2b94bb8ac7c4441e74e37a6c622db6fae58591032431b69d3cd62b31a56eea9bc68b7b7d5dd1ddc4faf74db63108
|
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -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 "")
|
data/app/models/spree/ability.rb
CHANGED
data/app/models/spree/base.rb
CHANGED
@@ -5,7 +5,9 @@ class Spree::Base < ActiveRecord::Base
|
|
5
5
|
include Spree::RansackableAttributes
|
6
6
|
|
7
7
|
after_initialize do
|
8
|
-
|
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
|
data/app/models/spree/price.rb
CHANGED
@@ -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,
|
8
|
-
|
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
|
data/app/models/spree/product.rb
CHANGED
@@ -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.
|
240
|
+
variants_including_master.any? { |v| !v.track_inventory? }
|
240
241
|
else
|
241
|
-
|
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
|
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
|
|
data/app/models/spree/state.rb
CHANGED
data/app/models/spree/zone.rb
CHANGED
@@ -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
|
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).
|
data/lib/spree/core/version.rb
CHANGED
data/script/rails
ADDED
@@ -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
|
+
|
Binary file
|
@@ -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: ¥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: ¥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("¥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 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
|