spree_core 3.0.10 → 3.1.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/spree.js.coffee.erb +12 -3
- data/app/helpers/spree/base_helper.rb +4 -1
- data/app/helpers/spree/products_helper.rb +37 -6
- data/app/mailers/spree/base_mailer.rb +11 -2
- data/app/models/concerns/spree/adjustment_source.rb +3 -10
- data/app/models/concerns/spree/default_price.rb +7 -1
- data/app/models/concerns/spree/named_type.rb +1 -1
- data/app/models/concerns/spree/user_api_authentication.rb +7 -1
- data/app/models/concerns/spree/user_methods.rb +47 -0
- data/app/models/concerns/spree/user_reporting.rb +2 -2
- data/app/models/concerns/spree/vat_price_calculation.rb +47 -0
- data/app/models/spree/address.rb +8 -7
- data/app/models/spree/adjustable/adjuster/base.rb +25 -0
- data/app/models/spree/adjustable/adjuster/promotion.rb +41 -0
- data/app/models/spree/adjustable/adjuster/tax.rb +26 -0
- data/app/models/spree/adjustable/adjustments_updater.rb +22 -45
- data/app/models/spree/adjustment.rb +8 -10
- data/app/models/spree/app_configuration.rb +5 -2
- data/app/models/spree/base.rb +4 -0
- data/app/models/spree/calculator.rb +0 -5
- data/app/models/spree/calculator/default_tax.rb +2 -10
- data/app/models/spree/classification.rb +7 -3
- data/app/models/spree/country.rb +14 -3
- data/app/models/spree/credit_card.rb +21 -31
- data/app/models/spree/customer_return.rb +7 -15
- data/app/models/spree/gateway.rb +7 -6
- data/app/models/spree/image.rb +1 -1
- data/app/models/spree/inventory_unit.rb +9 -6
- data/app/models/spree/legacy_user.rb +1 -6
- data/app/models/spree/line_item.rb +69 -68
- data/app/models/spree/log_entry.rb +1 -4
- data/app/models/spree/option_type.rb +15 -6
- data/app/models/spree/option_type_prototype.rb +9 -0
- data/app/models/spree/option_value.rb +11 -3
- data/app/models/spree/option_value_variant.rb +6 -0
- data/app/models/spree/order.rb +113 -64
- data/app/models/spree/order/checkout.rb +8 -11
- data/app/models/spree/order/currency_updater.rb +1 -1
- data/app/models/spree/order/store_credit.rb +96 -0
- data/app/models/spree/order_contents.rb +6 -1
- data/app/models/spree/order_inventory.rb +4 -8
- data/app/models/spree/order_promotion.rb +6 -0
- data/app/models/spree/order_updater.rb +2 -7
- data/app/models/spree/payment.rb +46 -19
- data/app/models/spree/payment/gateway_options.rb +8 -4
- data/app/models/spree/payment_method.rb +12 -13
- data/app/models/spree/payment_method/store_credit.rb +130 -0
- data/app/models/spree/preference.rb +1 -1
- data/app/models/spree/price.rb +16 -6
- data/app/models/spree/product.rb +52 -49
- data/app/models/spree/product/scopes.rb +7 -2
- data/app/models/spree/product_option_type.rb +7 -2
- data/app/models/spree/product_promotion_rule.rb +9 -0
- data/app/models/spree/product_property.rb +8 -10
- data/app/models/spree/promotion.rb +19 -19
- data/app/models/spree/promotion/rules/product.rb +3 -1
- data/app/models/spree/promotion/rules/taxon.rb +2 -1
- data/app/models/spree/promotion/rules/user.rb +4 -4
- data/app/models/spree/promotion_action.rb +3 -3
- data/app/models/spree/promotion_category.rb +1 -1
- data/app/models/spree/promotion_rule_taxon.rb +9 -0
- data/app/models/spree/promotion_rule_user.rb +9 -0
- data/app/models/spree/property.rb +2 -1
- data/app/models/spree/property_prototype.rb +9 -0
- data/app/models/spree/prototype.rb +8 -3
- data/app/models/spree/prototype_taxon.rb +9 -0
- data/app/models/spree/refund.rb +10 -7
- data/app/models/spree/refund_reason.rb +1 -1
- data/app/models/spree/reimbursement.rb +12 -16
- data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +23 -6
- data/app/models/spree/reimbursement_type/store_credit.rb +28 -0
- data/app/models/spree/return_authorization.rb +8 -13
- data/app/models/spree/return_authorization_reason.rb +1 -1
- data/app/models/spree/return_item.rb +13 -12
- data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +1 -1
- data/app/models/spree/role.rb +3 -2
- data/app/models/spree/role_user.rb +6 -0
- data/app/models/spree/shipment.rb +18 -23
- data/app/models/spree/shipment_handler.rb +2 -2
- data/app/models/spree/shipping_category.rb +6 -3
- data/app/models/spree/shipping_method.rb +11 -10
- data/app/models/spree/shipping_method_zone.rb +6 -0
- data/app/models/spree/shipping_rate.rb +16 -29
- data/app/models/spree/state.rb +3 -2
- data/app/models/spree/state_change.rb +1 -1
- data/app/models/spree/stock/content_item.rb +10 -12
- data/app/models/spree/stock/coordinator.rb +13 -14
- data/app/models/spree/stock/estimator.rb +28 -30
- data/app/models/spree/stock/inventory_unit_builder.rb +1 -9
- data/app/models/spree/stock/packer.rb +1 -1
- data/app/models/spree/stock/quantifier.rb +5 -5
- data/app/models/spree/stock/splitter/backordered.rb +2 -2
- data/app/models/spree/stock_item.rb +12 -18
- data/app/models/spree/stock_location.rb +4 -7
- data/app/models/spree/stock_movement.rb +11 -9
- data/app/models/spree/stock_transfer.rb +11 -12
- data/app/models/spree/store.rb +14 -6
- data/app/models/spree/store_credit.rb +252 -0
- data/app/models/spree/store_credit_category.rb +22 -0
- data/app/models/spree/store_credit_event.rb +38 -0
- data/app/models/spree/store_credit_type.rb +6 -0
- data/app/models/spree/tax_category.rb +3 -8
- data/app/models/spree/tax_rate.rb +56 -122
- data/app/models/spree/taxon.rb +11 -5
- data/app/models/spree/tracker.rb +12 -1
- data/app/models/spree/validations/db_maximum_length_validator.rb +2 -1
- data/app/models/spree/variant.rb +82 -50
- data/app/models/spree/zone.rb +21 -17
- data/app/models/spree/zone_member.rb +6 -0
- data/app/validators/db_maximum_length_validator.rb +11 -0
- data/app/views/layouts/spree/base_mailer.html.erb +38 -781
- data/app/views/spree/order_mailer/_adjustment.html.erb +8 -0
- data/app/views/spree/order_mailer/_subtotal.html.erb +8 -0
- data/app/views/spree/order_mailer/_total.html.erb +8 -0
- data/app/views/spree/order_mailer/cancel_email.html.erb +13 -28
- data/app/views/spree/order_mailer/cancel_email.text.erb +1 -1
- data/app/views/spree/order_mailer/confirm_email.html.erb +49 -63
- data/app/views/spree/order_mailer/confirm_email.text.erb +1 -1
- data/app/views/spree/shared/_base_mailer_header.html.erb +5 -7
- data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +777 -0
- data/app/views/spree/shared/_error_messages.html.erb +1 -1
- data/app/views/spree/shared/_mailer_line_item.html.erb +12 -0
- data/app/views/spree/shipment_mailer/shipped_email.html.erb +21 -14
- data/app/views/spree/shipment_mailer/shipped_email.text.erb +3 -3
- data/config/initializers/user_class_extensions.rb +7 -38
- data/config/locales/en.yml +113 -13
- data/config/routes.rb +7 -0
- data/db/default/spree/default_reimbursement_type.rb +1 -1
- data/db/default/spree/zones.rb +4 -5
- data/db/migrate/20150118210639_create_spree_store_credits.rb +24 -0
- data/db/migrate/20150118211500_create_spree_store_credit_categories.rb +8 -0
- data/db/migrate/20150118212051_create_spree_store_credit_events.rb +17 -0
- data/db/migrate/20150118212101_create_spree_store_credit_types.rb +10 -0
- data/db/migrate/20150314013438_add_missing_indexes.rb +25 -0
- data/db/migrate/20150317174308_remove_duplicated_indexes_from_multi_columns.rb +18 -0
- data/db/migrate/20150324104002_remove_user_index_from_spree_state_changes.rb +14 -0
- data/db/migrate/20150522071831_add_position_to_spree_payment_methods.rb +5 -0
- data/db/migrate/20150626181949_add_taxable_adjustment_total_to_line_item.rb +19 -0
- data/db/migrate/20150627090949_migrate_payment_methods_display.rb +12 -0
- data/db/migrate/20150714154102_spree_payment_method_store_credits.rb +12 -0
- data/db/migrate/20150726141425_rename_has_and_belongs_to_associations_to_model_names.rb +18 -0
- data/db/migrate/20150727191614_spree_store_credit_types.rb +11 -0
- data/db/migrate/20150819154308_add_discontinued_to_products_and_variants.rb +68 -0
- data/db/migrate/20151220072838_remove_shipping_method_id_from_spree_orders.rb +13 -0
- data/db/migrate/20160207191757_add_id_column_to_earlier_habtm_tables.rb +16 -0
- data/db/migrate/20160219165458_add_indexes.rb +14 -0
- data/lib/generators/spree/dummy/templates/rails/database.yml +31 -24
- data/lib/generators/spree/dummy/templates/rails/test.rb +2 -1
- data/lib/spree/core.rb +16 -0
- data/lib/spree/core/controller_helpers/auth.rb +1 -1
- data/lib/spree/core/controller_helpers/common.rb +3 -3
- data/lib/spree/core/controller_helpers/order.rb +6 -5
- data/lib/spree/core/controller_helpers/search.rb +1 -1
- data/lib/spree/core/controller_helpers/store.rb +29 -0
- data/lib/spree/core/delegate_belongs_to.rb +2 -2
- data/lib/spree/core/engine.rb +30 -25
- data/lib/spree/core/environment.rb +1 -1
- data/lib/spree/core/importer/order.rb +37 -40
- data/lib/spree/core/number_generator.rb +52 -0
- data/lib/spree/core/product_filters.rb +1 -1
- data/lib/spree/core/search/base.rb +4 -3
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/localized_number.rb +3 -1
- data/lib/spree/permitted_attributes.rb +5 -2
- data/lib/spree/testing_support/common_rake.rb +3 -3
- data/lib/spree/testing_support/factories.rb +3 -3
- data/lib/spree/testing_support/factories/address_factory.rb +1 -1
- data/lib/spree/testing_support/factories/country_factory.rb +2 -2
- data/lib/spree/testing_support/factories/order_factory.rb +2 -2
- data/lib/spree/testing_support/factories/payment_factory.rb +5 -0
- data/lib/spree/testing_support/factories/payment_method_factory.rb +8 -0
- data/lib/spree/testing_support/factories/promotion_rule_factory.rb +5 -0
- data/lib/spree/testing_support/factories/refund_factory.rb +9 -1
- data/lib/spree/testing_support/factories/return_authorization_factory.rb +2 -0
- data/lib/spree/testing_support/factories/state_factory.rb +2 -2
- data/lib/spree/testing_support/factories/store_credit_category_factory.rb +9 -0
- data/lib/spree/testing_support/factories/store_credit_event_factory.rb +8 -0
- data/lib/spree/testing_support/factories/store_credit_factory.rb +17 -0
- data/lib/spree/testing_support/factories/store_credit_type_factory.rb +11 -0
- data/lib/spree/testing_support/factories/user_factory.rb +1 -1
- data/lib/spree/testing_support/factories/zone_member_factory.rb +6 -0
- data/lib/spree/testing_support/microdata.rb +189 -0
- data/lib/tasks/core.rake +68 -0
- data/lib/tasks/exchanges.rake +2 -2
- data/spec/fixtures/microdata.html +22 -0
- data/spec/fixtures/microdata_itemref.html +15 -0
- data/spec/fixtures/microdata_no_itemscope.html +20 -0
- data/spec/helpers/base_helper_spec.rb +64 -1
- data/spec/helpers/products_helper_spec.rb +75 -3
- data/spec/lib/i18n_spec.rb +2 -2
- data/spec/lib/search/base_spec.rb +2 -2
- data/spec/lib/spree/core/controller_helpers/auth_spec.rb +4 -2
- data/spec/lib/spree/core/controller_helpers/store_spec.rb +56 -0
- data/spec/lib/spree/core/importer/order_spec.rb +226 -123
- data/spec/lib/spree/core/number_generator_spec.rb +175 -0
- data/spec/lib/spree/core_spec.rb +23 -0
- data/spec/lib/spree/localized_number_spec.rb +10 -0
- data/spec/mailers/order_mailer_spec.rb +11 -13
- data/spec/mailers/shipment_mailer_spec.rb +26 -8
- data/spec/mailers/test_mailer_spec.rb +15 -1
- data/spec/models/option_type_prototype_spec.rb +9 -0
- data/spec/models/spree/ability_spec.rb +6 -13
- data/spec/models/spree/address_spec.rb +1 -1
- data/spec/models/spree/adjustable/adjuster/base_spec.rb +10 -0
- data/spec/models/spree/adjustable/adjuster/promotion_spec.rb +211 -0
- data/spec/models/spree/adjustable/adjuster/tax_spec.rb +86 -0
- data/spec/models/spree/adjustable/adjustments_updater_spec.rb +2 -262
- data/spec/models/spree/adjustment_spec.rb +27 -1
- data/spec/models/spree/app_configuration_spec.rb +5 -2
- data/spec/models/spree/calculator/default_tax_spec.rb +39 -14
- data/spec/models/spree/concerns/user_methods_spec.rb +55 -0
- data/spec/models/spree/concerns/vat_price_calculation_spec.rb +66 -0
- data/spec/models/spree/country_spec.rb +45 -8
- data/spec/models/spree/credit_card_spec.rb +8 -8
- data/spec/models/spree/customer_return_spec.rb +4 -26
- data/spec/models/spree/gateway_spec.rb +7 -0
- data/spec/models/spree/image_spec.rb +3 -0
- data/spec/models/spree/inventory_unit_spec.rb +1 -18
- data/spec/models/spree/line_item_spec.rb +78 -18
- data/spec/models/spree/option_type_spec.rb +2 -2
- data/spec/models/spree/option_value_spec.rb +8 -3
- data/spec/models/spree/order/checkout_spec.rb +49 -39
- data/spec/models/spree/order/currency_updater_spec.rb +3 -3
- data/spec/models/spree/order/finalizing_spec.rb +0 -3
- data/spec/models/spree/order/payment_spec.rb +1 -1
- data/spec/models/spree/order/state_machine_spec.rb +1 -6
- data/spec/models/spree/order/store_credit_spec.rb +423 -0
- data/spec/models/spree/order/updating_spec.rb +2 -2
- data/spec/models/spree/order_contents_spec.rb +42 -1
- data/spec/models/spree/order_inventory_spec.rb +27 -17
- data/spec/models/spree/order_spec.rb +65 -52
- data/spec/models/spree/payment/gateway_options_spec.rb +10 -2
- data/spec/models/spree/payment/store_credit_spec.rb +60 -0
- data/spec/models/spree/payment_method/store_credit_spec.rb +291 -0
- data/spec/models/spree/payment_method_spec.rb +22 -14
- data/spec/models/spree/payment_spec.rb +37 -44
- data/spec/models/spree/price_spec.rb +86 -0
- data/spec/models/spree/product/scopes_spec.rb +35 -0
- data/spec/models/spree/product_option_type_spec.rb +6 -2
- data/spec/models/spree/product_promotion_rule_spec.rb +9 -0
- data/spec/models/spree/product_property_spec.rb +11 -0
- data/spec/models/spree/product_spec.rb +82 -15
- data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +1 -1
- data/spec/models/spree/promotion/rules/user_spec.rb +8 -0
- data/spec/models/spree/promotion_action_spec.rb +1 -1
- data/spec/models/spree/promotion_rule_spec.rb +1 -1
- data/spec/models/spree/promotion_rule_taxon_spec.rb +9 -0
- data/spec/models/spree/promotion_rule_user_spec.rb +9 -0
- data/spec/models/spree/promotion_spec.rb +57 -36
- data/spec/models/spree/property_prototype_spec.rb +9 -0
- data/spec/models/spree/prototype_taxon_spec.rb +9 -0
- data/spec/models/spree/refund_reason_spec.rb +7 -0
- data/spec/models/spree/reimbursement_spec.rb +3 -30
- data/spec/models/spree/reimbursement_tax_calculator_spec.rb +17 -5
- data/spec/models/spree/reimbursement_type/store_credit_spec.rb +101 -0
- data/spec/models/spree/return_authorization_reason_spec.rb +7 -0
- data/spec/models/spree/return_authorization_spec.rb +2 -22
- data/spec/models/spree/return_item_spec.rb +50 -1
- data/spec/models/spree/returns_calculator_spec.rb +1 -1
- data/spec/models/spree/role_spec.rb +7 -0
- data/spec/models/spree/shipment_spec.rb +17 -17
- data/spec/models/spree/shipping_calculator_spec.rb +2 -2
- data/spec/models/spree/shipping_category_spec.rb +14 -0
- data/spec/models/spree/shipping_method_spec.rb +9 -2
- data/spec/models/spree/shipping_rate_spec.rb +40 -41
- data/spec/models/spree/state_spec.rb +12 -1
- data/spec/models/spree/stock/content_item_spec.rb +9 -0
- data/spec/models/spree/stock/estimator_spec.rb +56 -8
- data/spec/models/spree/stock/quantifier_spec.rb +61 -32
- data/spec/models/spree/stock_item_spec.rb +19 -1
- data/spec/models/spree/store_credit_event_spec.rb +101 -0
- data/spec/models/spree/store_credit_spec.rb +786 -0
- data/spec/models/spree/store_spec.rb +39 -11
- data/spec/models/spree/tax_category_spec.rb +6 -1
- data/spec/models/spree/tax_rate_spec.rb +204 -44
- data/spec/models/spree/user_spec.rb +105 -38
- data/spec/models/spree/variant_spec.rb +281 -9
- data/spec/models/spree/zone_member_spec.rb +38 -0
- data/spec/models/spree/zone_spec.rb +32 -8
- data/spec/spec_helper.rb +3 -0
- data/spec/support/concerns/{adjustment_source_spec.rb → adjustment_source.rb} +0 -0
- data/spec/support/concerns/{default_price_spec.rb → default_price.rb} +9 -0
- data/spec/validators/db_maximum_length_validator_spec.rb +22 -0
- data/spree_core.gemspec +5 -6
- metadata +99 -36
- data/CHANGELOG.md +0 -4
- data/app/models/concerns/spree/number_generator.rb +0 -39
- data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +0 -24
@@ -0,0 +1,175 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::Core::NumberGenerator do
|
4
|
+
let(:number_generator) { described_class.new(options) }
|
5
|
+
let(:random) { instance_double(Random) }
|
6
|
+
|
7
|
+
let(:model) do
|
8
|
+
mod = number_generator
|
9
|
+
|
10
|
+
Class.new(ActiveRecord::Base) do
|
11
|
+
self.table_name = 'spree_orders'
|
12
|
+
include mod
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
before do
|
17
|
+
expect(Random).to receive(:new).and_return(random)
|
18
|
+
end
|
19
|
+
|
20
|
+
let(:options) { { prefix: 'R' } }
|
21
|
+
|
22
|
+
%i[prefix length].each do |name|
|
23
|
+
describe "##{name}" do
|
24
|
+
let(:value) { double('Generic Value') }
|
25
|
+
|
26
|
+
it 'returns attribute value from options' do
|
27
|
+
expect(described_class.new(options.merge(name => value)).public_send(name)).to be(value)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "##{name}=" do
|
32
|
+
let(:value_a) { double('Generic Value A') }
|
33
|
+
let(:value_b) { double('Generic Value B') }
|
34
|
+
|
35
|
+
it 'writes attribute value' do
|
36
|
+
object = described_class.new(options.merge(name => value_a))
|
37
|
+
expect { object.public_send(:"#{name}=", value_b) }
|
38
|
+
.to change { object.public_send(name) }
|
39
|
+
.from(value_a)
|
40
|
+
.to(value_b)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
shared_examples_for 'duplicate without length increment' do
|
46
|
+
before do
|
47
|
+
expect(random).to receive(:rand).
|
48
|
+
with(expected_rand_limit).
|
49
|
+
and_return(next_candidate_index).
|
50
|
+
exactly(expected_length).times
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'sets permalink field' do
|
54
|
+
expect { subject }.to change(resource, :number).from(nil).to(next_candidate)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
shared_examples_for 'generating permalink'do
|
59
|
+
let(:resource) { model.new }
|
60
|
+
|
61
|
+
before do
|
62
|
+
expect(random).to receive(:rand).
|
63
|
+
with(expected_rand_limit).
|
64
|
+
and_return(first_candidate_index).
|
65
|
+
exactly(expected_length).times
|
66
|
+
end
|
67
|
+
|
68
|
+
context 'and generated candidate is unique' do
|
69
|
+
before do
|
70
|
+
expect(model).to receive(:exists?).with(number: first_candidate).and_return(false)
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'sets permalink field' do
|
74
|
+
expect { subject }.to change(resource, :number).from(nil).to(first_candidate)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'and generated candidate is NOT unique' do
|
79
|
+
before do
|
80
|
+
expect(model).to receive(:exists?).with(number: first_candidate).and_return(true).ordered
|
81
|
+
expect(model).to receive(:count).and_return(record_count).ordered
|
82
|
+
expect(model).to receive(:exists?).with(number: next_candidate).and_return(false)
|
83
|
+
end
|
84
|
+
|
85
|
+
context 'and less than half of the value space taken' do
|
86
|
+
let(:next_candidate) { next_candidate_low }
|
87
|
+
let(:record_count) { 10 ** expected_length / 2 - 1 }
|
88
|
+
|
89
|
+
include_examples 'duplicate without length increment'
|
90
|
+
end
|
91
|
+
|
92
|
+
context 'and exactly half of the value space taken' do
|
93
|
+
let(:next_candidate) { next_candidate_low }
|
94
|
+
let(:record_count) { 10 ** expected_length / 2 }
|
95
|
+
|
96
|
+
include_examples 'duplicate without length increment'
|
97
|
+
end
|
98
|
+
|
99
|
+
context 'and more than half of the value space is taken' do
|
100
|
+
let(:record_count) { 10 ** expected_length / 2 + 1 }
|
101
|
+
let(:next_candidate) { next_candidate_high }
|
102
|
+
|
103
|
+
before do
|
104
|
+
expect(random).to receive(:rand).
|
105
|
+
with(expected_rand_limit).
|
106
|
+
and_return(next_candidate_index).
|
107
|
+
exactly(expected_length.succ).times
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'sets permalink field' do
|
111
|
+
expect { subject }.to change(resource, :number).from(nil).to(next_candidate)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
describe '#included' do
|
118
|
+
context 'generates .number_generator on host' do
|
119
|
+
it 'returns number generator' do
|
120
|
+
expect(model.number_generator).to be(number_generator)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
context 'generates validation hooks on host' do
|
125
|
+
subject { resource.valid? }
|
126
|
+
|
127
|
+
let(:first_candidate_index) { 0 }
|
128
|
+
let(:next_candidate_index) { 1 }
|
129
|
+
let(:expected_rand_limit) { 10 }
|
130
|
+
let(:expected_length) { 9 }
|
131
|
+
|
132
|
+
context 'when permalink field value is nil' do
|
133
|
+
context 'on defaults' do
|
134
|
+
let(:first_candidate) { 'R000000000' }
|
135
|
+
let(:next_candidate_low) { 'R111111111' }
|
136
|
+
let(:next_candidate_high) { 'R1111111111' }
|
137
|
+
|
138
|
+
include_examples 'generating permalink'
|
139
|
+
end
|
140
|
+
|
141
|
+
context 'with length: option' do
|
142
|
+
let(:options) { super().merge(length: 10) }
|
143
|
+
let(:expected_length) { 10 }
|
144
|
+
|
145
|
+
let(:first_candidate) { 'R0000000000' }
|
146
|
+
let(:next_candidate_low) { 'R1111111111' }
|
147
|
+
let(:next_candidate_high) { 'R11111111111' }
|
148
|
+
|
149
|
+
include_examples 'generating permalink'
|
150
|
+
end
|
151
|
+
|
152
|
+
context 'with letters option' do
|
153
|
+
let(:options) { super().merge(letters: true) }
|
154
|
+
let(:expected_rand_limit) { 36 }
|
155
|
+
|
156
|
+
let(:first_candidate) { 'RAAAAAAAAA' }
|
157
|
+
let(:first_candidate_index) { 10 }
|
158
|
+
let(:next_candidate_index) { 11 }
|
159
|
+
let(:next_candidate_low) { 'RBBBBBBBBB' }
|
160
|
+
let(:next_candidate_high) { 'RBBBBBBBBBB' }
|
161
|
+
|
162
|
+
include_examples 'generating permalink'
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
context 'when permalink field value is present' do
|
167
|
+
let(:resource) { model.new(number: 'Test') }
|
168
|
+
|
169
|
+
it 'does not touch field' do
|
170
|
+
expect { subject }.not_to change(resource, :number)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree do
|
4
|
+
describe '.admin_path' do
|
5
|
+
it { expect(Spree.admin_path).to eq(Spree::Config[:admin_path]) }
|
6
|
+
end
|
7
|
+
|
8
|
+
describe '.admin_path=' do
|
9
|
+
let!(:original_admin_path) { Spree.admin_path }
|
10
|
+
let(:new_admin_path) { '/admin-secret-path' }
|
11
|
+
|
12
|
+
before do
|
13
|
+
Spree.admin_path = new_admin_path
|
14
|
+
end
|
15
|
+
|
16
|
+
it { expect(Spree.admin_path).to eq(new_admin_path) }
|
17
|
+
it { expect(Spree::Config[:admin_path]).to eq(new_admin_path) }
|
18
|
+
|
19
|
+
after do
|
20
|
+
Spree.admin_path = original_admin_path
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -33,6 +33,16 @@ describe Spree::LocalizedNumber do
|
|
33
33
|
expect(subject.class.parse(1599.99)).to eql 1599.99
|
34
34
|
end
|
35
35
|
end
|
36
|
+
|
37
|
+
context "string argument" do
|
38
|
+
it "should not be modified" do
|
39
|
+
I18n.locale = :de
|
40
|
+
number = '1.599,99'
|
41
|
+
number_bak = number.dup
|
42
|
+
subject.class.parse(number)
|
43
|
+
expect(number).to eql(number_bak)
|
44
|
+
end
|
45
|
+
end
|
36
46
|
end
|
37
47
|
|
38
48
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'email_spec'
|
3
3
|
|
4
|
-
describe Spree::OrderMailer, :
|
4
|
+
describe Spree::OrderMailer, type: :mailer do
|
5
5
|
include EmailSpec::Helpers
|
6
6
|
include EmailSpec::Matchers
|
7
7
|
|
@@ -9,12 +9,12 @@ describe Spree::OrderMailer, :type => :mailer do
|
|
9
9
|
|
10
10
|
let(:order) do
|
11
11
|
order = stub_model(Spree::Order)
|
12
|
-
product = stub_model(Spree::Product, :
|
13
|
-
variant = stub_model(Spree::Variant, :
|
14
|
-
price = stub_model(Spree::Price, :
|
15
|
-
line_item = stub_model(Spree::LineItem, :
|
16
|
-
allow(variant).to receive_messages(:
|
17
|
-
allow(order).to receive_messages(:
|
12
|
+
product = stub_model(Spree::Product, name: %{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
18
|
order
|
19
19
|
end
|
20
20
|
|
@@ -46,8 +46,8 @@ describe Spree::OrderMailer, :type => :mailer do
|
|
46
46
|
|
47
47
|
context "only shows eligible adjustments in emails" do
|
48
48
|
before do
|
49
|
-
create(:adjustment, :
|
50
|
-
create(:adjustment, :
|
49
|
+
create(:adjustment, order: order, eligible: true, label: "Eligible Adjustment")
|
50
|
+
create(:adjustment, order: order, eligible: false, label: "Ineligible Adjustment")
|
51
51
|
end
|
52
52
|
|
53
53
|
let!(:confirmation_email) { Spree::OrderMailer.confirm_email(order) }
|
@@ -81,12 +81,11 @@ describe Spree::OrderMailer, :type => :mailer do
|
|
81
81
|
end
|
82
82
|
|
83
83
|
context "emails must be translatable" do
|
84
|
-
|
85
84
|
context "pt-BR locale" do
|
86
85
|
before do
|
87
86
|
I18n.enforce_available_locales = false
|
88
|
-
pt_br_confirm_mail = { :
|
89
|
-
pt_br_cancel_mail = { :
|
87
|
+
pt_br_confirm_mail = { spree: { order_mailer: { confirm_email: { dear_customer: 'Caro Cliente,' } } } }
|
88
|
+
pt_br_cancel_mail = { spree: { order_mailer: { cancel_email: { order_summary_canceled: 'Resumo da Pedido [CANCELADA]' } } } }
|
90
89
|
I18n.backend.store_translations :'pt-BR', pt_br_confirm_mail
|
91
90
|
I18n.backend.store_translations :'pt-BR', pt_br_cancel_mail
|
92
91
|
I18n.locale = :'pt-BR'
|
@@ -120,5 +119,4 @@ describe Spree::OrderMailer, :type => :mailer do
|
|
120
119
|
expect(message.body).to be_blank
|
121
120
|
end
|
122
121
|
end
|
123
|
-
|
124
122
|
end
|
@@ -1,20 +1,22 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'email_spec'
|
3
3
|
|
4
|
-
describe Spree::ShipmentMailer, :
|
4
|
+
describe Spree::ShipmentMailer, type: :mailer do
|
5
5
|
include EmailSpec::Helpers
|
6
6
|
include EmailSpec::Matchers
|
7
7
|
|
8
8
|
before { create(:store) }
|
9
9
|
|
10
|
+
let(:order) { stub_model(Spree::Order, number: 'R12345') }
|
11
|
+
let(:shipping_method) { stub_model(Spree::ShippingMethod, name: 'USPS') }
|
12
|
+
let(:product) { stub_model(Spree::Product, name: %{The "BEST" product}, sku: 'SKU0001') }
|
13
|
+
let(:variant) { stub_model(Spree::Variant, product: product) }
|
14
|
+
let(:line_item) { stub_model(Spree::LineItem, variant: variant, order: order, quantity: 1, price: 5) }
|
10
15
|
let(:shipment) 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
|
-
line_item = stub_model(Spree::LineItem, :variant => variant, :order => order, :quantity => 1, :price => 5)
|
15
16
|
shipment = stub_model(Spree::Shipment)
|
16
|
-
allow(shipment).to receive_messages(:
|
17
|
-
allow(shipment).to receive_messages(:
|
17
|
+
allow(shipment).to receive_messages(line_items: [line_item], order: order)
|
18
|
+
allow(shipment).to receive_messages(tracking_url: "http://track.com/me")
|
19
|
+
allow(shipment).to receive_messages(shipping_method: shipping_method)
|
18
20
|
shipment
|
19
21
|
end
|
20
22
|
|
@@ -43,7 +45,7 @@ describe Spree::ShipmentMailer, :type => :mailer do
|
|
43
45
|
context "pt-BR locale" do
|
44
46
|
before do
|
45
47
|
I18n.enforce_available_locales = false
|
46
|
-
pt_br_shipped_email = { :
|
48
|
+
pt_br_shipped_email = { spree: { shipment_mailer: { shipped_email: { dear_customer: 'Caro Cliente,' } } } }
|
47
49
|
I18n.backend.store_translations :'pt-BR', pt_br_shipped_email
|
48
50
|
I18n.locale = :'pt-BR'
|
49
51
|
end
|
@@ -60,4 +62,20 @@ describe Spree::ShipmentMailer, :type => :mailer do
|
|
60
62
|
end
|
61
63
|
end
|
62
64
|
end
|
65
|
+
|
66
|
+
context "shipped_email" do
|
67
|
+
let(:shipped_email) { Spree::ShipmentMailer.shipped_email(shipment) }
|
68
|
+
|
69
|
+
specify do
|
70
|
+
expect(shipped_email).to have_body_text(order.number)
|
71
|
+
end
|
72
|
+
|
73
|
+
specify do
|
74
|
+
expect(shipped_email).to have_body_text(shipping_method.name)
|
75
|
+
end
|
76
|
+
|
77
|
+
specify do
|
78
|
+
expect(shipped_email).to have_body_text("href=\"#{shipment.tracking_url}\"")
|
79
|
+
end
|
80
|
+
end
|
63
81
|
end
|
@@ -18,7 +18,21 @@ describe Spree::TestMailer, :type => :mailer do
|
|
18
18
|
|
19
19
|
it "confirm_email accepts a user id as an alternative to a User object" do
|
20
20
|
expect {
|
21
|
-
|
21
|
+
Spree::TestMailer.test_email('test@example.com')
|
22
22
|
}.not_to raise_error
|
23
23
|
end
|
24
|
+
|
25
|
+
context "action mailer host" do
|
26
|
+
it "falls back to spree store url" do
|
27
|
+
ActionMailer::Base.default_url_options = {}
|
28
|
+
Spree::TestMailer.test_email('test@example.com').deliver_now
|
29
|
+
expect(ActionMailer::Base.default_url_options[:host]).to eq(Spree::Store.current.url)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "uses developer set host" do
|
33
|
+
ActionMailer::Base.default_url_options[:host] = 'test.test'
|
34
|
+
Spree::TestMailer.test_email('test@example.com').deliver_now
|
35
|
+
expect(ActionMailer::Base.default_url_options[:host]).to eq('test.test')
|
36
|
+
end
|
37
|
+
end
|
24
38
|
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::OptionTypePrototype do
|
4
|
+
describe 'Validations' do
|
5
|
+
it { is_expected.to validate_presence_of(:prototype) }
|
6
|
+
it { is_expected.to validate_presence_of(:option_type) }
|
7
|
+
it { is_expected.to validate_uniqueness_of(:prototype_id).scoped_to(:option_type_id).allow_nil }
|
8
|
+
end
|
9
|
+
end
|
@@ -18,19 +18,12 @@ class FooAbility
|
|
18
18
|
end
|
19
19
|
|
20
20
|
describe Spree::Ability, :type => :model do
|
21
|
-
let(:user) {
|
21
|
+
let(:user) { build(:user) }
|
22
22
|
let(:ability) { Spree::Ability.new(user) }
|
23
23
|
let(:token) { nil }
|
24
24
|
|
25
|
-
before do
|
26
|
-
user.spree_roles.clear
|
27
|
-
end
|
28
|
-
|
29
|
-
TOKEN = 'token123'
|
30
|
-
|
31
25
|
after(:each) {
|
32
26
|
Spree::Ability.abilities = Set.new
|
33
|
-
user.spree_roles = []
|
34
27
|
}
|
35
28
|
|
36
29
|
context 'register_ability' do
|
@@ -64,9 +57,9 @@ describe Spree::Ability, :type => :model do
|
|
64
57
|
let(:resource) { Object.new }
|
65
58
|
let(:resource_shipment) { Spree::Shipment.new }
|
66
59
|
let(:resource_product) { Spree::Product.new }
|
67
|
-
let(:resource_user) {
|
60
|
+
let(:resource_user) { create :user }
|
68
61
|
let(:resource_order) { Spree::Order.new }
|
69
|
-
let(:fakedispatch_user) { Spree.user_class.
|
62
|
+
let(:fakedispatch_user) { Spree.user_class.create }
|
70
63
|
let(:fakedispatch_ability) { Spree::Ability.new(fakedispatch_user) }
|
71
64
|
|
72
65
|
context 'with admin user' do
|
@@ -161,14 +154,14 @@ describe Spree::Ability, :type => :model do
|
|
161
154
|
|
162
155
|
context 'requested with proper token' do
|
163
156
|
let(:token) { 'TOKEN123' }
|
164
|
-
before(:each) { allow(resource).to receive_messages guest_token:
|
157
|
+
before(:each) { allow(resource).to receive_messages guest_token: token }
|
165
158
|
it_should_behave_like 'access granted'
|
166
159
|
it_should_behave_like 'no index allowed'
|
167
160
|
end
|
168
161
|
|
169
162
|
context 'requested with inproper token' do
|
170
163
|
let(:token) { 'FAIL' }
|
171
|
-
before(:each) { allow(resource).to receive_messages guest_token:
|
164
|
+
before(:each) { allow(resource).to receive_messages guest_token: token }
|
172
165
|
it_should_behave_like 'create only'
|
173
166
|
end
|
174
167
|
end
|
@@ -222,7 +215,7 @@ describe Spree::Ability, :type => :model do
|
|
222
215
|
it_should_behave_like 'no index allowed'
|
223
216
|
end
|
224
217
|
context 'requested by other user' do
|
225
|
-
let(:resource) {
|
218
|
+
let(:resource) { create(:user) }
|
226
219
|
it_should_behave_like 'create only'
|
227
220
|
end
|
228
221
|
end
|
@@ -227,7 +227,7 @@ describe Spree::Address, :type => :model do
|
|
227
227
|
end
|
228
228
|
|
229
229
|
context "user given" do
|
230
|
-
let(:bill_address) { Spree::Address.new(phone: Time.
|
230
|
+
let(:bill_address) { Spree::Address.new(phone: Time.current.to_i) }
|
231
231
|
let(:ship_address) { double("ShipAddress") }
|
232
232
|
let(:user) { double("User", bill_address: bill_address, ship_address: ship_address) }
|
233
233
|
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::Adjustable::Adjuster::Base, type: :model do
|
4
|
+
let(:line_item) { create(:line_item) }
|
5
|
+
let(:subject) { Spree::Adjustable::Adjuster::Base }
|
6
|
+
|
7
|
+
it "raises missing update method" do
|
8
|
+
expect { subject.adjust(line_item, {}) }.to raise_error(NotImplementedError)
|
9
|
+
end
|
10
|
+
end
|