spree_core 3.2.1 → 3.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/spree/core/version.rb +1 -1
- data/spree_core.gemspec +1 -1
- metadata +3 -206
- data/spec/fixtures/microdata.html +0 -22
- data/spec/fixtures/microdata_itemref.html +0 -15
- data/spec/fixtures/microdata_no_itemscope.html +0 -20
- data/spec/fixtures/thinking-cat.jpg +0 -0
- data/spec/helpers/base_helper_spec.rb +0 -200
- data/spec/helpers/products_helper_spec.rb +0 -289
- data/spec/lib/calculated_adjustments_spec.rb +0 -7
- data/spec/lib/i18n_spec.rb +0 -123
- data/spec/lib/search/base_spec.rb +0 -86
- data/spec/lib/spree/core/controller_helpers/auth_spec.rb +0 -103
- data/spec/lib/spree/core/controller_helpers/order_spec.rb +0 -110
- data/spec/lib/spree/core/controller_helpers/search_spec.rb +0 -17
- data/spec/lib/spree/core/controller_helpers/store_spec.rb +0 -72
- data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +0 -39
- data/spec/lib/spree/core/delegate_belongs_to_spec.rb +0 -22
- data/spec/lib/spree/core/importer/order_spec.rb +0 -605
- data/spec/lib/spree/core/number_generator_spec.rb +0 -175
- data/spec/lib/spree/core/token_generator_spec.rb +0 -24
- data/spec/lib/spree/core/validators/email_spec.rb +0 -53
- data/spec/lib/spree/core_spec.rb +0 -23
- data/spec/lib/spree/localized_number_spec.rb +0 -48
- data/spec/lib/spree/migrations_spec.rb +0 -36
- data/spec/lib/spree/money_spec.rb +0 -122
- data/spec/lib/tasks/exchanges_spec.rb +0 -136
- data/spec/mailers/order_mailer_spec.rb +0 -122
- data/spec/mailers/reimbursement_mailer_spec.rb +0 -47
- data/spec/mailers/shipment_mailer_spec.rb +0 -81
- data/spec/mailers/test_mailer_spec.rb +0 -38
- data/spec/models/option_type_prototype_spec.rb +0 -9
- data/spec/models/spree/ability_spec.rb +0 -251
- data/spec/models/spree/address_spec.rb +0 -402
- data/spec/models/spree/adjustable/adjuster/base_spec.rb +0 -10
- data/spec/models/spree/adjustable/adjuster/promotion_spec.rb +0 -211
- data/spec/models/spree/adjustable/adjuster/tax_spec.rb +0 -86
- data/spec/models/spree/adjustable/adjustments_updater_spec.rb +0 -26
- data/spec/models/spree/adjustment_spec.rb +0 -189
- data/spec/models/spree/app_configuration_spec.rb +0 -26
- data/spec/models/spree/asset_spec.rb +0 -28
- data/spec/models/spree/calculator/default_tax_spec.rb +0 -152
- data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +0 -25
- data/spec/models/spree/calculator/flat_rate_spec.rb +0 -47
- data/spec/models/spree/calculator/flexi_rate_spec.rb +0 -41
- data/spec/models/spree/calculator/percent_on_line_item_spec.rb +0 -15
- data/spec/models/spree/calculator/price_sack_spec.rb +0 -30
- data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +0 -47
- data/spec/models/spree/calculator/shipping.rb +0 -8
- data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +0 -23
- data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +0 -13
- data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +0 -52
- data/spec/models/spree/calculator/shipping/per_item_spec.rb +0 -20
- data/spec/models/spree/calculator/shipping/price_sack_spec.rb +0 -29
- data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +0 -40
- data/spec/models/spree/calculator/tiered_percent_spec.rb +0 -51
- data/spec/models/spree/calculator_spec.rb +0 -69
- data/spec/models/spree/classification_spec.rb +0 -93
- data/spec/models/spree/concerns/display_money_spec.rb +0 -43
- data/spec/models/spree/concerns/user_methods_spec.rb +0 -82
- data/spec/models/spree/concerns/vat_price_calculation_spec.rb +0 -66
- data/spec/models/spree/country_spec.rb +0 -55
- data/spec/models/spree/credit_card_spec.rb +0 -328
- data/spec/models/spree/customer_return_spec.rb +0 -240
- data/spec/models/spree/exchange_spec.rb +0 -75
- data/spec/models/spree/gateway/bogus_simple.rb +0 -20
- data/spec/models/spree/gateway/bogus_spec.rb +0 -13
- data/spec/models/spree/gateway_spec.rb +0 -61
- data/spec/models/spree/image_spec.rb +0 -8
- data/spec/models/spree/inventory_unit_spec.rb +0 -256
- data/spec/models/spree/line_item_spec.rb +0 -346
- data/spec/models/spree/option_type_spec.rb +0 -14
- data/spec/models/spree/option_value_spec.rb +0 -18
- data/spec/models/spree/order/address_spec.rb +0 -50
- data/spec/models/spree/order/adjustments_spec.rb +0 -29
- data/spec/models/spree/order/callbacks_spec.rb +0 -42
- data/spec/models/spree/order/checkout_spec.rb +0 -770
- data/spec/models/spree/order/currency_updater_spec.rb +0 -32
- data/spec/models/spree/order/finalizing_spec.rb +0 -114
- data/spec/models/spree/order/helpers_spec.rb +0 -5
- data/spec/models/spree/order/payment_spec.rb +0 -214
- data/spec/models/spree/order/risk_assessment_spec.rb +0 -84
- data/spec/models/spree/order/shipments_spec.rb +0 -43
- data/spec/models/spree/order/state_machine_spec.rb +0 -212
- data/spec/models/spree/order/store_credit_spec.rb +0 -426
- data/spec/models/spree/order/tax_spec.rb +0 -84
- data/spec/models/spree/order/totals_spec.rb +0 -24
- data/spec/models/spree/order/updating_spec.rb +0 -18
- data/spec/models/spree/order/validations_spec.rb +0 -15
- data/spec/models/spree/order_contents_spec.rb +0 -297
- data/spec/models/spree/order_inventory_spec.rb +0 -239
- data/spec/models/spree/order_merger_spec.rb +0 -135
- data/spec/models/spree/order_spec.rb +0 -1046
- data/spec/models/spree/order_updater_spec.rb +0 -305
- data/spec/models/spree/payment/gateway_options_spec.rb +0 -127
- data/spec/models/spree/payment/store_credit_spec.rb +0 -60
- data/spec/models/spree/payment_method/store_credit_spec.rb +0 -291
- data/spec/models/spree/payment_method_spec.rb +0 -103
- data/spec/models/spree/payment_spec.rb +0 -919
- data/spec/models/spree/preference_spec.rb +0 -80
- data/spec/models/spree/preferences/configuration_spec.rb +0 -30
- data/spec/models/spree/preferences/preferable_spec.rb +0 -344
- data/spec/models/spree/preferences/scoped_store_spec.rb +0 -58
- data/spec/models/spree/preferences/store_spec.rb +0 -46
- data/spec/models/spree/price_spec.rb +0 -128
- data/spec/models/spree/product/scopes_spec.rb +0 -183
- data/spec/models/spree/product_duplicator_spec.rb +0 -103
- data/spec/models/spree/product_filter_spec.rb +0 -26
- data/spec/models/spree/product_option_type_spec.rb +0 -9
- data/spec/models/spree/product_promotion_rule_spec.rb +0 -9
- data/spec/models/spree/product_property_spec.rb +0 -26
- data/spec/models/spree/product_spec.rb +0 -629
- data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +0 -113
- data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +0 -148
- data/spec/models/spree/promotion/actions/create_line_items_spec.rb +0 -86
- data/spec/models/spree/promotion/actions/free_shipping_spec.rb +0 -36
- data/spec/models/spree/promotion/rules/country_spec.rb +0 -36
- data/spec/models/spree/promotion/rules/first_order_spec.rb +0 -75
- data/spec/models/spree/promotion/rules/item_total_spec.rb +0 -282
- data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +0 -42
- data/spec/models/spree/promotion/rules/option_value_spec.rb +0 -90
- data/spec/models/spree/promotion/rules/product_spec.rb +0 -143
- data/spec/models/spree/promotion/rules/taxon_spec.rb +0 -102
- data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +0 -27
- data/spec/models/spree/promotion/rules/user_spec.rb +0 -45
- data/spec/models/spree/promotion_action_spec.rb +0 -10
- data/spec/models/spree/promotion_category_spec.rb +0 -17
- data/spec/models/spree/promotion_handler/cart_spec.rb +0 -102
- data/spec/models/spree/promotion_handler/coupon_spec.rb +0 -323
- data/spec/models/spree/promotion_handler/free_shipping_spec.rb +0 -48
- data/spec/models/spree/promotion_handler/page_spec.rb +0 -44
- data/spec/models/spree/promotion_rule_spec.rb +0 -29
- data/spec/models/spree/promotion_rule_taxon_spec.rb +0 -9
- data/spec/models/spree/promotion_rule_user_spec.rb +0 -9
- data/spec/models/spree/promotion_spec.rb +0 -679
- data/spec/models/spree/property_prototype_spec.rb +0 -9
- data/spec/models/spree/property_spec.rb +0 -5
- data/spec/models/spree/prototype_spec.rb +0 -5
- data/spec/models/spree/prototype_taxon_spec.rb +0 -9
- data/spec/models/spree/refund_reason_spec.rb +0 -20
- data/spec/models/spree/refund_spec.rb +0 -195
- data/spec/models/spree/reimbursement/credit_spec.rb +0 -36
- data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +0 -140
- data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +0 -83
- data/spec/models/spree/reimbursement_performer_spec.rb +0 -30
- data/spec/models/spree/reimbursement_spec.rb +0 -188
- data/spec/models/spree/reimbursement_tax_calculator_spec.rb +0 -63
- data/spec/models/spree/reimbursement_type/credit_spec.rb +0 -53
- data/spec/models/spree/reimbursement_type/exchange_spec.rb +0 -46
- data/spec/models/spree/reimbursement_type/original_payment_spec.rb +0 -55
- data/spec/models/spree/reimbursement_type/store_credit_spec.rb +0 -101
- data/spec/models/spree/return_authorization_reason_spec.rb +0 -7
- data/spec/models/spree/return_authorization_spec.rb +0 -230
- data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +0 -77
- data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +0 -58
- data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +0 -61
- data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +0 -32
- data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +0 -29
- data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +0 -35
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +0 -65
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +0 -43
- data/spec/models/spree/return_item_spec.rb +0 -731
- data/spec/models/spree/returns_calculator_spec.rb +0 -14
- data/spec/models/spree/role_spec.rb +0 -7
- data/spec/models/spree/shipment_spec.rb +0 -742
- data/spec/models/spree/shipping_calculator_spec.rb +0 -45
- data/spec/models/spree/shipping_category_spec.rb +0 -19
- data/spec/models/spree/shipping_method_spec.rb +0 -95
- data/spec/models/spree/shipping_rate_spec.rb +0 -140
- data/spec/models/spree/state_spec.rb +0 -29
- data/spec/models/spree/stock/availability_validator_spec.rb +0 -36
- data/spec/models/spree/stock/content_item_spec.rb +0 -31
- data/spec/models/spree/stock/coordinator_spec.rb +0 -61
- data/spec/models/spree/stock/differentiator_spec.rb +0 -39
- data/spec/models/spree/stock/estimator_spec.rb +0 -202
- data/spec/models/spree/stock/inventory_unit_builder_spec.rb +0 -38
- data/spec/models/spree/stock/package_spec.rb +0 -182
- data/spec/models/spree/stock/packer_spec.rb +0 -70
- data/spec/models/spree/stock/prioritizer_spec.rb +0 -125
- data/spec/models/spree/stock/quantifier_spec.rb +0 -126
- data/spec/models/spree/stock/splitter/backordered_spec.rb +0 -29
- data/spec/models/spree/stock/splitter/base_spec.rb +0 -21
- data/spec/models/spree/stock/splitter/shipping_category_spec.rb +0 -47
- data/spec/models/spree/stock/splitter/weight_spec.rb +0 -32
- data/spec/models/spree/stock_item_spec.rb +0 -432
- data/spec/models/spree/stock_location_spec.rb +0 -243
- data/spec/models/spree/stock_movement_spec.rb +0 -120
- data/spec/models/spree/stock_transfer_spec.rb +0 -50
- data/spec/models/spree/store_credit_event_spec.rb +0 -101
- data/spec/models/spree/store_credit_spec.rb +0 -786
- data/spec/models/spree/store_spec.rb +0 -78
- data/spec/models/spree/tax_category_spec.rb +0 -32
- data/spec/models/spree/tax_rate_spec.rb +0 -561
- data/spec/models/spree/taxon_spec.rb +0 -85
- data/spec/models/spree/taxonomy_spec.rb +0 -18
- data/spec/models/spree/tracker_spec.rb +0 -21
- data/spec/models/spree/user_spec.rb +0 -203
- data/spec/models/spree/variant_spec.rb +0 -818
- data/spec/models/spree/zone_member_spec.rb +0 -38
- data/spec/models/spree/zone_spec.rb +0 -472
- data/spec/spec_helper.rb +0 -79
- data/spec/support/big_decimal.rb +0 -5
- data/spec/support/concerns/adjustment_source.rb +0 -23
- data/spec/support/concerns/default_price.rb +0 -37
- data/spec/support/rake.rb +0 -13
- data/spec/support/test_gateway.rb +0 -2
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Spree::StockMovement, type: :model do
|
|
4
|
-
|
|
5
|
-
describe 'Constants' do
|
|
6
|
-
describe 'QUANTITY_LIMITS[:max]' do
|
|
7
|
-
it 'return 2**31 - 1' do
|
|
8
|
-
expect(Spree::StockMovement::QUANTITY_LIMITS[:max]).to eq(2**31 - 1)
|
|
9
|
-
end
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
describe 'QUANTITY_LIMITS[:min]' do
|
|
13
|
-
it 'return -2**31' do
|
|
14
|
-
expect(Spree::StockMovement::QUANTITY_LIMITS[:min]).to eq(-2**31)
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
describe 'Associations' do
|
|
20
|
-
it { is_expected.to belong_to(:stock_item).class_name('Spree::StockItem').inverse_of(:stock_movements) }
|
|
21
|
-
it { is_expected.to belong_to(:originator) }
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
describe 'Validations' do
|
|
25
|
-
it do
|
|
26
|
-
is_expected.to validate_presence_of(:stock_item)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
it do
|
|
30
|
-
is_expected.to validate_presence_of(:quantity)
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
it do
|
|
34
|
-
is_expected.to validate_numericality_of(:quantity).
|
|
35
|
-
is_greater_than_or_equal_to(Spree::StockMovement::QUANTITY_LIMITS[:min]).
|
|
36
|
-
is_less_than_or_equal_to(Spree::StockMovement::QUANTITY_LIMITS[:max]).only_integer.allow_nil
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
describe 'Callbacks' do
|
|
41
|
-
it { is_expected.to callback(:update_stock_item_quantity).after(:create) }
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
describe 'Scope' do
|
|
45
|
-
describe '.recent' do
|
|
46
|
-
it 'should order chronologically by created at' do
|
|
47
|
-
expect(Spree::StockMovement.recent.to_sql).
|
|
48
|
-
to eq Spree::StockMovement.unscoped.order(created_at: :desc).to_sql
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
describe 'whitelisted ransackable attributes' do
|
|
54
|
-
it 'returns amount attribute' do
|
|
55
|
-
expect(Spree::StockMovement.whitelisted_ransackable_attributes).to eq(['quantity'])
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
describe 'Insatance Methods' do
|
|
60
|
-
let(:stock_location) { create(:stock_location_with_items) }
|
|
61
|
-
let(:stock_item) { stock_location.stock_items.order(:id).first }
|
|
62
|
-
|
|
63
|
-
describe '#readonly?' do
|
|
64
|
-
let(:stock_movement) { create(:stock_movement, stock_item: stock_item) }
|
|
65
|
-
it 'should not update a persisted record' do
|
|
66
|
-
expect { stock_movement.save }.to raise_error(ActiveRecord::ReadOnlyRecord)
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
describe '#update_stock_item_quantity' do
|
|
71
|
-
let(:stock_movement) { build(:stock_movement, stock_item: stock_item) }
|
|
72
|
-
|
|
73
|
-
context 'when track inventory levels is false' do
|
|
74
|
-
before do
|
|
75
|
-
Spree::Config[:track_inventory_levels] = false
|
|
76
|
-
stock_movement.quantity = 1
|
|
77
|
-
stock_movement.save
|
|
78
|
-
stock_item.reload
|
|
79
|
-
end
|
|
80
|
-
it 'does not update count on hand' do
|
|
81
|
-
expect(stock_item.count_on_hand).to eq(10)
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
context 'when track inventory tracking is off' do
|
|
86
|
-
before do
|
|
87
|
-
stock_item.variant.track_inventory = false
|
|
88
|
-
stock_movement.quantity = 1
|
|
89
|
-
stock_movement.save
|
|
90
|
-
stock_item.reload
|
|
91
|
-
end
|
|
92
|
-
it 'does not update count on hand' do
|
|
93
|
-
expect(stock_item.count_on_hand).to eq(10)
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
context 'when quantity is negative' do
|
|
98
|
-
before do
|
|
99
|
-
stock_movement.quantity = -1
|
|
100
|
-
stock_movement.save
|
|
101
|
-
stock_item.reload
|
|
102
|
-
end
|
|
103
|
-
it 'should decrement the stock item count on hand' do
|
|
104
|
-
expect(stock_item.count_on_hand).to eq(9)
|
|
105
|
-
end
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
context "when quantity is positive" do
|
|
109
|
-
before do
|
|
110
|
-
stock_movement.quantity = 1
|
|
111
|
-
stock_movement.save
|
|
112
|
-
stock_item.reload
|
|
113
|
-
end
|
|
114
|
-
it "should increment the stock item count on hand" do
|
|
115
|
-
expect(stock_item.count_on_hand).to eq(11)
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
end
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
module Spree
|
|
4
|
-
describe StockTransfer, type: :model do
|
|
5
|
-
let(:destination_location) { create(:stock_location_with_items) }
|
|
6
|
-
let(:source_location) { create(:stock_location_with_items) }
|
|
7
|
-
let(:stock_item) { source_location.stock_items.order(:id).first }
|
|
8
|
-
let(:variant) { stock_item.variant }
|
|
9
|
-
|
|
10
|
-
subject { StockTransfer.create(reference: 'PO123') }
|
|
11
|
-
|
|
12
|
-
describe '#reference' do
|
|
13
|
-
subject { super().reference }
|
|
14
|
-
it { is_expected.to eq 'PO123' }
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
describe '#to_param' do
|
|
18
|
-
subject { super().to_param }
|
|
19
|
-
it { is_expected.to match /T\d+/ }
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
it 'transfers variants between 2 locations' do
|
|
23
|
-
variants = { variant => 5 }
|
|
24
|
-
|
|
25
|
-
subject.transfer(source_location,
|
|
26
|
-
destination_location,
|
|
27
|
-
variants)
|
|
28
|
-
|
|
29
|
-
expect(source_location.count_on_hand(variant)).to eq 5
|
|
30
|
-
expect(destination_location.count_on_hand(variant)).to eq 5
|
|
31
|
-
|
|
32
|
-
expect(subject.source_location).to eq source_location
|
|
33
|
-
expect(subject.destination_location).to eq destination_location
|
|
34
|
-
|
|
35
|
-
expect(subject.source_movements.first.quantity).to eq -5
|
|
36
|
-
expect(subject.destination_movements.first.quantity).to eq 5
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
it 'receive new inventory (from a vendor)' do
|
|
40
|
-
variants = { variant => 5 }
|
|
41
|
-
|
|
42
|
-
subject.receive(destination_location, variants)
|
|
43
|
-
|
|
44
|
-
expect(destination_location.count_on_hand(variant)).to eq 5
|
|
45
|
-
|
|
46
|
-
expect(subject.source_location).to be_nil
|
|
47
|
-
expect(subject.destination_location).to eq destination_location
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
end
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe 'StoreCreditEvent' do
|
|
4
|
-
describe '#display_amount' do
|
|
5
|
-
let(:event_amount) { 120.0 }
|
|
6
|
-
|
|
7
|
-
subject { create(:store_credit_auth_event, amount: event_amount) }
|
|
8
|
-
|
|
9
|
-
it 'returns a Spree::Money instance' do
|
|
10
|
-
expect(subject.display_amount).to be_instance_of(Spree::Money)
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
it 'uses the events amount attribute' do
|
|
14
|
-
expect(subject.display_amount).to eq Spree::Money.new(event_amount, currency: subject.currency)
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
describe '#display_user_total_amount' do
|
|
19
|
-
let(:user_total_amount) { 300.0 }
|
|
20
|
-
|
|
21
|
-
subject { create(:store_credit_auth_event, user_total_amount: user_total_amount) }
|
|
22
|
-
|
|
23
|
-
it 'returns a Spree::Money instance' do
|
|
24
|
-
expect(subject.display_user_total_amount).to be_instance_of(Spree::Money)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
it 'uses the events user_total_amount attribute' do
|
|
28
|
-
amount = Spree::Money.new(user_total_amount, currency: subject.currency)
|
|
29
|
-
expect(subject.display_user_total_amount).to eq amount
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
describe '#display_action' do
|
|
34
|
-
subject { create(:store_credit_auth_event, action: action) }
|
|
35
|
-
|
|
36
|
-
context 'capture event' do
|
|
37
|
-
let(:action) { Spree::StoreCredit::CAPTURE_ACTION }
|
|
38
|
-
|
|
39
|
-
it 'returns used' do
|
|
40
|
-
expect(subject.display_action).to eq Spree.t('store_credit.captured')
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
context 'authorize event' do
|
|
45
|
-
let(:action) { Spree::StoreCredit::AUTHORIZE_ACTION }
|
|
46
|
-
|
|
47
|
-
it 'returns authorized' do
|
|
48
|
-
expect(subject.display_action).to eq Spree.t('store_credit.authorized')
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
context 'allocation event' do
|
|
53
|
-
let(:action) { Spree::StoreCredit::ALLOCATION_ACTION }
|
|
54
|
-
|
|
55
|
-
it 'returns added' do
|
|
56
|
-
expect(subject.display_action).to eq Spree.t('store_credit.allocated')
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
context 'void event' do
|
|
61
|
-
let(:action) { Spree::StoreCredit::VOID_ACTION }
|
|
62
|
-
|
|
63
|
-
it 'returns credit' do
|
|
64
|
-
expect(subject.display_action).to eq Spree.t('store_credit.credit')
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
context 'credit event' do
|
|
69
|
-
let(:action) { Spree::StoreCredit::CREDIT_ACTION }
|
|
70
|
-
|
|
71
|
-
it 'returns credit' do
|
|
72
|
-
expect(subject.display_action).to eq Spree.t('store_credit.credit')
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
describe '#order' do
|
|
78
|
-
context 'there is no associated payment with the event' do
|
|
79
|
-
subject { create(:store_credit_auth_event) }
|
|
80
|
-
|
|
81
|
-
it 'returns nil' do
|
|
82
|
-
expect(subject.order).to be_nil
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
context 'there is an associated payment with the event' do
|
|
87
|
-
let(:authorization_code) { '1-SC-TEST' }
|
|
88
|
-
let(:order) { create(:order) }
|
|
89
|
-
let!(:payment) { create(:store_credit_payment, order: order, response_code: authorization_code) }
|
|
90
|
-
|
|
91
|
-
subject do
|
|
92
|
-
create(:store_credit_auth_event, action: Spree::StoreCredit::CAPTURE_ACTION,
|
|
93
|
-
authorization_code: authorization_code)
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
it 'returns the order associated with the payment' do
|
|
97
|
-
expect(subject.order).to eq order
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
end
|
|
@@ -1,786 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe 'StoreCredit' do
|
|
4
|
-
let(:currency) { 'TEST' }
|
|
5
|
-
let(:store_credit) { build(:store_credit, store_credit_attrs) }
|
|
6
|
-
let(:store_credit_attrs) { {} }
|
|
7
|
-
|
|
8
|
-
describe 'callbacks' do
|
|
9
|
-
subject { store_credit.save }
|
|
10
|
-
|
|
11
|
-
context 'amount used is greater than zero' do
|
|
12
|
-
let(:store_credit) { create(:store_credit, amount: 100, amount_used: 1) }
|
|
13
|
-
let(:validation_message) { I18n.t('activerecord.errors.models.spree/store_credit.attributes.amount_used.greater_than_zero_restrict_delete') }
|
|
14
|
-
subject { store_credit.destroy }
|
|
15
|
-
|
|
16
|
-
it 'can not delete the store credit' do
|
|
17
|
-
subject
|
|
18
|
-
expect(store_credit.reload).to eq store_credit
|
|
19
|
-
expect(store_credit.errors[:amount_used]).to include(validation_message)
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
context 'category is a non-expiring type' do
|
|
24
|
-
let!(:secondary_credit_type) { create(:secondary_credit_type) }
|
|
25
|
-
let(:store_credit) { build(:store_credit, credit_type: nil) }
|
|
26
|
-
before { allow(store_credit.category).to receive_message_chain(:non_expiring?).and_return(true) }
|
|
27
|
-
|
|
28
|
-
it 'sets the credit type to non-expiring' do
|
|
29
|
-
subject
|
|
30
|
-
expect(store_credit.credit_type.name).to eq secondary_credit_type.name
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
context 'category is an expiring type' do
|
|
35
|
-
before { allow(store_credit.category).to receive_message_chain(:non_expiring?).and_return(false) }
|
|
36
|
-
|
|
37
|
-
it 'sets the credit type to non-expiring' do
|
|
38
|
-
subject
|
|
39
|
-
expect(store_credit.credit_type.name).to eq 'Expiring'
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
context 'the type is set' do
|
|
44
|
-
let!(:secondary_credit_type) { create(:secondary_credit_type) }
|
|
45
|
-
let(:store_credit) { build(:store_credit, credit_type: secondary_credit_type) }
|
|
46
|
-
before { allow(store_credit.category).to receive_message_chain(:non_expiring?).and_return(false) }
|
|
47
|
-
|
|
48
|
-
it "doesn't overwrite the type" do
|
|
49
|
-
expect { subject }.to_not change { store_credit.credit_type }
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
describe 'validations' do
|
|
55
|
-
describe 'used amount should not be greater than the credited amount' do
|
|
56
|
-
context 'the used amount is defined' do
|
|
57
|
-
let(:invalid_store_credit) { build(:store_credit, amount: 100, amount_used: 150) }
|
|
58
|
-
|
|
59
|
-
it 'should not be valid' do
|
|
60
|
-
expect(invalid_store_credit).to_not be_valid
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
it 'should set the correct error message' do
|
|
64
|
-
invalid_store_credit.valid?
|
|
65
|
-
attribute_name = I18n.t('activerecord.attributes.spree/store_credit.amount_used')
|
|
66
|
-
validation_message = I18n.t('activerecord.errors.models.spree/store_credit.attributes.amount_used.cannot_be_greater_than_amount')
|
|
67
|
-
expected_error_message = "#{attribute_name} #{validation_message}"
|
|
68
|
-
expect(invalid_store_credit.errors.full_messages).to include(expected_error_message)
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
context 'the used amount is not defined yet' do
|
|
73
|
-
let(:store_credit) { build(:store_credit, amount: 100) }
|
|
74
|
-
|
|
75
|
-
it 'should be valid' do
|
|
76
|
-
expect(store_credit).to be_valid
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
describe 'amount used less than or equal to amount' do
|
|
82
|
-
subject { build(:store_credit, amount_used: 101.0, amount: 100.0) }
|
|
83
|
-
|
|
84
|
-
it 'is not valid' do
|
|
85
|
-
expect(subject).to_not be_valid
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
it 'adds an error message about the invalid amount used' do
|
|
89
|
-
subject.valid?
|
|
90
|
-
text = I18n.t('activerecord.errors.models.spree/store_credit.attributes.amount_used.cannot_be_greater_than_amount')
|
|
91
|
-
expect(subject.errors[:amount_used]).to include(text)
|
|
92
|
-
end
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
describe 'amount authorized less than or equal to amount' do
|
|
96
|
-
subject { build(:store_credit, amount_authorized: 101.0, amount: 100.0) }
|
|
97
|
-
|
|
98
|
-
it 'is not valid' do
|
|
99
|
-
expect(subject).to_not be_valid
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
it 'adds an error message about the invalid authorized amount' do
|
|
103
|
-
subject.valid?
|
|
104
|
-
text = I18n.t('activerecord.errors.models.spree/store_credit.attributes.amount_authorized.exceeds_total_credits')
|
|
105
|
-
expect(subject.errors[:amount_authorized]).to include(text)
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
describe '#display_amount' do
|
|
111
|
-
it 'returns a Spree::Money instance' do
|
|
112
|
-
expect(store_credit.display_amount).to be_instance_of(Spree::Money)
|
|
113
|
-
end
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
describe '#display_amount_used' do
|
|
117
|
-
it 'returns a Spree::Money instance' do
|
|
118
|
-
expect(store_credit.display_amount_used).to be_instance_of(Spree::Money)
|
|
119
|
-
end
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
describe '#amount_remaining' do
|
|
123
|
-
context 'the amount_used is not defined' do
|
|
124
|
-
context 'the authorized amount is not defined' do
|
|
125
|
-
it 'returns the credited amount' do
|
|
126
|
-
expect(store_credit.amount_remaining).to eq store_credit.amount
|
|
127
|
-
end
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
context 'the authorized amount is defined' do
|
|
131
|
-
let(:authorized_amount) { 15.00 }
|
|
132
|
-
|
|
133
|
-
before { store_credit.update_attributes(amount_authorized: authorized_amount) }
|
|
134
|
-
|
|
135
|
-
it 'subtracts the authorized amount from the credited amount' do
|
|
136
|
-
expect(store_credit.amount_remaining).to eq (store_credit.amount - authorized_amount)
|
|
137
|
-
end
|
|
138
|
-
end
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
context 'the amount_used is defined' do
|
|
142
|
-
let(:amount_used) { 10.0 }
|
|
143
|
-
|
|
144
|
-
before { store_credit.update_attributes(amount_used: amount_used) }
|
|
145
|
-
|
|
146
|
-
context 'the authorized amount is not defined' do
|
|
147
|
-
it 'subtracts the amount used from the credited amount' do
|
|
148
|
-
expect(store_credit.amount_remaining).to eq (store_credit.amount - amount_used)
|
|
149
|
-
end
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
context 'the authorized amount is defined' do
|
|
153
|
-
let(:authorized_amount) { 15.00 }
|
|
154
|
-
|
|
155
|
-
before { store_credit.update_attributes(amount_authorized: authorized_amount) }
|
|
156
|
-
|
|
157
|
-
it 'subtracts the amount used and the authorized amount from the credited amount' do
|
|
158
|
-
expect(store_credit.amount_remaining).to eq (store_credit.amount - amount_used - authorized_amount)
|
|
159
|
-
end
|
|
160
|
-
end
|
|
161
|
-
end
|
|
162
|
-
end
|
|
163
|
-
|
|
164
|
-
describe '#authorize' do
|
|
165
|
-
context 'amount is valid' do
|
|
166
|
-
let(:authorization_amount) { 1.0 }
|
|
167
|
-
let(:added_authorization_amount) { 3.0 }
|
|
168
|
-
let(:originator) { nil }
|
|
169
|
-
|
|
170
|
-
context 'amount has not been authorized yet' do
|
|
171
|
-
before { store_credit.update_attributes(amount_authorized: authorization_amount) }
|
|
172
|
-
|
|
173
|
-
it 'returns true' do
|
|
174
|
-
expect(store_credit.authorize(store_credit.amount - authorization_amount, store_credit.currency)).to be_truthy
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
it 'adds the new amount to authorized amount' do
|
|
178
|
-
store_credit.authorize(added_authorization_amount, store_credit.currency)
|
|
179
|
-
expect(store_credit.reload.amount_authorized).to eq (authorization_amount + added_authorization_amount)
|
|
180
|
-
end
|
|
181
|
-
|
|
182
|
-
context 'originator is present' do
|
|
183
|
-
with_model 'OriginatorThing', scope: :all
|
|
184
|
-
|
|
185
|
-
let(:originator) { OriginatorThing.create! } # won't actually be a user. just giving it a valid model here
|
|
186
|
-
|
|
187
|
-
subject do
|
|
188
|
-
store_credit.authorize(added_authorization_amount, store_credit.currency,
|
|
189
|
-
action_originator: originator)
|
|
190
|
-
end
|
|
191
|
-
|
|
192
|
-
it 'records the originator' do
|
|
193
|
-
expect { subject }.to change { Spree::StoreCreditEvent.count }.by(1)
|
|
194
|
-
expect(Spree::StoreCreditEvent.last.originator).to eq originator
|
|
195
|
-
end
|
|
196
|
-
end
|
|
197
|
-
end
|
|
198
|
-
|
|
199
|
-
context 'authorization has already happened' do
|
|
200
|
-
let!(:auth_event) { create(:store_credit_auth_event, store_credit: store_credit) }
|
|
201
|
-
|
|
202
|
-
before { store_credit.update_attributes(amount_authorized: store_credit.amount) }
|
|
203
|
-
|
|
204
|
-
it 'returns true' do
|
|
205
|
-
expect(store_credit.authorize(store_credit.amount, store_credit.currency,
|
|
206
|
-
action_authorization_code: auth_event.authorization_code)
|
|
207
|
-
).to be true
|
|
208
|
-
end
|
|
209
|
-
end
|
|
210
|
-
end
|
|
211
|
-
|
|
212
|
-
context 'amount is invalid' do
|
|
213
|
-
it 'returns false' do
|
|
214
|
-
expect(store_credit.authorize(store_credit.amount * 2, store_credit.currency)).to be false
|
|
215
|
-
end
|
|
216
|
-
end
|
|
217
|
-
end
|
|
218
|
-
|
|
219
|
-
describe '#validate_authorization' do
|
|
220
|
-
context 'insufficient funds' do
|
|
221
|
-
subject { store_credit.validate_authorization(store_credit.amount * 2, store_credit.currency) }
|
|
222
|
-
|
|
223
|
-
it 'returns false' do
|
|
224
|
-
expect(subject).to be false
|
|
225
|
-
end
|
|
226
|
-
|
|
227
|
-
it 'adds an error to the model' do
|
|
228
|
-
subject
|
|
229
|
-
text = Spree.t('store_credit_payment_method.insufficient_funds')
|
|
230
|
-
expect(store_credit.errors.full_messages).to include(text)
|
|
231
|
-
end
|
|
232
|
-
end
|
|
233
|
-
|
|
234
|
-
context 'currency mismatch' do
|
|
235
|
-
subject { store_credit.validate_authorization(store_credit.amount, "EUR") }
|
|
236
|
-
|
|
237
|
-
it 'returns false' do
|
|
238
|
-
expect(subject).to be false
|
|
239
|
-
end
|
|
240
|
-
|
|
241
|
-
it 'adds an error to the model' do
|
|
242
|
-
subject
|
|
243
|
-
text = Spree.t('store_credit_payment_method.currency_mismatch')
|
|
244
|
-
expect(store_credit.errors.full_messages).to include(text)
|
|
245
|
-
end
|
|
246
|
-
end
|
|
247
|
-
|
|
248
|
-
context 'valid authorization' do
|
|
249
|
-
subject { store_credit.validate_authorization(store_credit.amount, store_credit.currency) }
|
|
250
|
-
|
|
251
|
-
it 'returns true' do
|
|
252
|
-
expect(subject).to be true
|
|
253
|
-
end
|
|
254
|
-
end
|
|
255
|
-
|
|
256
|
-
context 'troublesome floats' do
|
|
257
|
-
# 8.21.to_d < 8.21 => true
|
|
258
|
-
let(:store_credit_attrs) { { amount: 8.21 } }
|
|
259
|
-
|
|
260
|
-
subject { store_credit.validate_authorization(store_credit_attrs[:amount], store_credit.currency) }
|
|
261
|
-
|
|
262
|
-
it 'returns true' do
|
|
263
|
-
expect(subject).to be_truthy
|
|
264
|
-
end
|
|
265
|
-
end
|
|
266
|
-
end
|
|
267
|
-
|
|
268
|
-
describe '#capture' do
|
|
269
|
-
let(:authorized_amount) { 10.00 }
|
|
270
|
-
let(:auth_code) { '23-SC-20140602164814476128' }
|
|
271
|
-
|
|
272
|
-
before do
|
|
273
|
-
store_credit.update_attributes(amount_authorized: authorized_amount, amount_used: 0.0)
|
|
274
|
-
allow(store_credit).to receive_messages(authorize: true)
|
|
275
|
-
end
|
|
276
|
-
|
|
277
|
-
context 'insufficient funds' do
|
|
278
|
-
subject { store_credit.capture(authorized_amount * 2, auth_code, store_credit.currency) }
|
|
279
|
-
|
|
280
|
-
it 'returns false' do
|
|
281
|
-
expect(subject).to be false
|
|
282
|
-
end
|
|
283
|
-
|
|
284
|
-
it 'adds an error to the model' do
|
|
285
|
-
subject
|
|
286
|
-
text = Spree.t('store_credit_payment_method.insufficient_authorized_amount')
|
|
287
|
-
expect(store_credit.errors.full_messages).to include(text)
|
|
288
|
-
end
|
|
289
|
-
|
|
290
|
-
it 'does not update the store credit model' do
|
|
291
|
-
expect { subject }.to_not change { store_credit }
|
|
292
|
-
end
|
|
293
|
-
end
|
|
294
|
-
|
|
295
|
-
context 'currency mismatch' do
|
|
296
|
-
subject { store_credit.capture(authorized_amount, auth_code, "EUR") }
|
|
297
|
-
|
|
298
|
-
it 'returns false' do
|
|
299
|
-
expect(subject).to be false
|
|
300
|
-
end
|
|
301
|
-
|
|
302
|
-
it 'adds an error to the model' do
|
|
303
|
-
subject
|
|
304
|
-
text = Spree.t('store_credit_payment_method.currency_mismatch')
|
|
305
|
-
expect(store_credit.errors.full_messages).to include(text)
|
|
306
|
-
end
|
|
307
|
-
|
|
308
|
-
it 'does not update the store credit model' do
|
|
309
|
-
expect { subject }.to_not change { store_credit }
|
|
310
|
-
end
|
|
311
|
-
end
|
|
312
|
-
|
|
313
|
-
context 'valid capture' do
|
|
314
|
-
let(:remaining_authorized_amount) { 1 }
|
|
315
|
-
let(:originator) { nil }
|
|
316
|
-
|
|
317
|
-
subject do
|
|
318
|
-
amount = authorized_amount - remaining_authorized_amount
|
|
319
|
-
store_credit.capture(amount, auth_code, store_credit.currency,
|
|
320
|
-
action_originator: originator)
|
|
321
|
-
end
|
|
322
|
-
|
|
323
|
-
it 'returns true' do
|
|
324
|
-
expect(subject).to be_truthy
|
|
325
|
-
end
|
|
326
|
-
|
|
327
|
-
it 'updates the authorized amount to the difference between the captured amount and the authorized amount' do
|
|
328
|
-
subject
|
|
329
|
-
expect(store_credit.reload.amount_authorized).to eq remaining_authorized_amount
|
|
330
|
-
end
|
|
331
|
-
|
|
332
|
-
it 'updates the used amount to the current used amount plus the captured amount' do
|
|
333
|
-
subject
|
|
334
|
-
expect(store_credit.reload.amount_used).to eq authorized_amount - remaining_authorized_amount
|
|
335
|
-
end
|
|
336
|
-
|
|
337
|
-
context 'originator is present' do
|
|
338
|
-
with_model 'OriginatorThing', scope: :all
|
|
339
|
-
|
|
340
|
-
let(:originator) { OriginatorThing.create! } # won't actually be a user. just giving it a valid model here
|
|
341
|
-
|
|
342
|
-
it 'records the originator' do
|
|
343
|
-
expect { subject }.to change { Spree::StoreCreditEvent.count }.by(1)
|
|
344
|
-
expect(Spree::StoreCreditEvent.last.originator).to eq originator
|
|
345
|
-
end
|
|
346
|
-
end
|
|
347
|
-
end
|
|
348
|
-
end
|
|
349
|
-
|
|
350
|
-
describe '#void' do
|
|
351
|
-
let(:auth_code) { '1-SC-20141111111111' }
|
|
352
|
-
let(:store_credit) { create(:store_credit, amount_used: 150.0) }
|
|
353
|
-
let(:originator) { nil }
|
|
354
|
-
|
|
355
|
-
subject do
|
|
356
|
-
store_credit.void(auth_code, action_originator: originator)
|
|
357
|
-
end
|
|
358
|
-
|
|
359
|
-
context 'no event found for auth_code' do
|
|
360
|
-
it 'returns false' do
|
|
361
|
-
expect(subject).to be false
|
|
362
|
-
end
|
|
363
|
-
|
|
364
|
-
it 'adds an error to the model' do
|
|
365
|
-
subject
|
|
366
|
-
text = Spree.t('store_credit_payment_method.unable_to_void', auth_code: auth_code)
|
|
367
|
-
expect(store_credit.errors.full_messages).to include(text)
|
|
368
|
-
end
|
|
369
|
-
end
|
|
370
|
-
|
|
371
|
-
context 'capture event found for auth_code' do
|
|
372
|
-
let(:captured_amount) { 10.0 }
|
|
373
|
-
let!(:capture_event) do
|
|
374
|
-
create(:store_credit_auth_event,
|
|
375
|
-
action: Spree::StoreCredit::CAPTURE_ACTION,
|
|
376
|
-
authorization_code: auth_code,
|
|
377
|
-
amount: captured_amount,
|
|
378
|
-
store_credit: store_credit)
|
|
379
|
-
end
|
|
380
|
-
|
|
381
|
-
it 'returns false' do
|
|
382
|
-
expect(subject).to be false
|
|
383
|
-
end
|
|
384
|
-
|
|
385
|
-
it 'does not change the amount used on the store credit' do
|
|
386
|
-
expect { subject }.to_not change { store_credit.amount_used.to_f }
|
|
387
|
-
end
|
|
388
|
-
end
|
|
389
|
-
|
|
390
|
-
context 'auth event found for auth_code' do
|
|
391
|
-
let(:auth_event) { create(:store_credit_auth_event) }
|
|
392
|
-
|
|
393
|
-
let(:authorized_amount) { 10.0 }
|
|
394
|
-
let!(:auth_event) do
|
|
395
|
-
create(:store_credit_auth_event,
|
|
396
|
-
authorization_code: auth_code,
|
|
397
|
-
amount: authorized_amount,
|
|
398
|
-
store_credit: store_credit)
|
|
399
|
-
end
|
|
400
|
-
|
|
401
|
-
it 'returns true' do
|
|
402
|
-
expect(subject).to be true
|
|
403
|
-
end
|
|
404
|
-
|
|
405
|
-
it 'returns the capture amount to the store credit' do
|
|
406
|
-
expect { subject }.to change { store_credit.amount_authorized.to_f }.by(-authorized_amount)
|
|
407
|
-
end
|
|
408
|
-
|
|
409
|
-
context 'originator is present' do
|
|
410
|
-
with_model 'OriginatorThing', scope: :all
|
|
411
|
-
|
|
412
|
-
let(:originator) { OriginatorThing.create! } # won't actually be a user. just giving it a valid model here
|
|
413
|
-
|
|
414
|
-
it 'records the originator' do
|
|
415
|
-
expect { subject }.to change { Spree::StoreCreditEvent.count }.by(1)
|
|
416
|
-
expect(Spree::StoreCreditEvent.last.originator).to eq originator
|
|
417
|
-
end
|
|
418
|
-
end
|
|
419
|
-
end
|
|
420
|
-
end
|
|
421
|
-
|
|
422
|
-
describe '#credit' do
|
|
423
|
-
let(:event_auth_code) { '1-SC-20141111111111' }
|
|
424
|
-
let(:amount_used) { 10.0 }
|
|
425
|
-
let(:store_credit) { create(:store_credit, amount_used: amount_used) }
|
|
426
|
-
let!(:capture_event) do
|
|
427
|
-
create(:store_credit_auth_event,
|
|
428
|
-
action: Spree::StoreCredit::CAPTURE_ACTION,
|
|
429
|
-
authorization_code: event_auth_code,
|
|
430
|
-
amount: captured_amount,
|
|
431
|
-
store_credit: store_credit)
|
|
432
|
-
end
|
|
433
|
-
let(:originator) { nil }
|
|
434
|
-
|
|
435
|
-
subject do
|
|
436
|
-
store_credit.credit(credit_amount, auth_code, currency, action_originator: originator)
|
|
437
|
-
end
|
|
438
|
-
|
|
439
|
-
context 'currency does not match' do
|
|
440
|
-
let(:currency) { 'AUD' }
|
|
441
|
-
let(:credit_amount) { 5.0 }
|
|
442
|
-
let(:captured_amount) { 100.0 }
|
|
443
|
-
let(:auth_code) { event_auth_code }
|
|
444
|
-
|
|
445
|
-
it 'returns false' do
|
|
446
|
-
expect(subject).to be false
|
|
447
|
-
end
|
|
448
|
-
|
|
449
|
-
it 'adds an error message about the currency mismatch' do
|
|
450
|
-
subject
|
|
451
|
-
text = Spree.t('store_credit_payment_method.currency_mismatch')
|
|
452
|
-
expect(store_credit.errors.full_messages).to include(text)
|
|
453
|
-
end
|
|
454
|
-
end
|
|
455
|
-
|
|
456
|
-
context 'unable to find capture event' do
|
|
457
|
-
let(:currency) { 'USD' }
|
|
458
|
-
let(:credit_amount) { 5.0 }
|
|
459
|
-
let(:captured_amount) { 100.0 }
|
|
460
|
-
let(:auth_code) { 'UNKNOWN_CODE' }
|
|
461
|
-
|
|
462
|
-
it 'returns false' do
|
|
463
|
-
expect(subject).to be false
|
|
464
|
-
end
|
|
465
|
-
|
|
466
|
-
it 'adds an error message about the currency mismatch' do
|
|
467
|
-
subject
|
|
468
|
-
text = Spree.t('store_credit_payment_method.unable_to_credit', auth_code: auth_code)
|
|
469
|
-
expect(store_credit.errors.full_messages).to include(text)
|
|
470
|
-
end
|
|
471
|
-
end
|
|
472
|
-
|
|
473
|
-
context 'amount is more than what is captured' do
|
|
474
|
-
let(:currency) { 'USD' }
|
|
475
|
-
let(:credit_amount) { 100.0 }
|
|
476
|
-
let(:captured_amount) { 5.0 }
|
|
477
|
-
let(:auth_code) { event_auth_code }
|
|
478
|
-
|
|
479
|
-
it 'returns false' do
|
|
480
|
-
expect(subject).to be false
|
|
481
|
-
end
|
|
482
|
-
|
|
483
|
-
it 'adds an error message about the currency mismatch' do
|
|
484
|
-
subject
|
|
485
|
-
text = Spree.t('store_credit_payment_method.unable_to_credit', auth_code: auth_code)
|
|
486
|
-
expect(store_credit.errors.full_messages).to include(text)
|
|
487
|
-
end
|
|
488
|
-
end
|
|
489
|
-
|
|
490
|
-
context 'amount is successfully credited' do
|
|
491
|
-
let(:currency) { 'USD' }
|
|
492
|
-
let(:credit_amount) { 5.0 }
|
|
493
|
-
let(:captured_amount) { 100.0 }
|
|
494
|
-
let(:auth_code) { event_auth_code }
|
|
495
|
-
|
|
496
|
-
context 'credit_to_new_allocation is set' do
|
|
497
|
-
before { Spree::Config[:credit_to_new_allocation] = true }
|
|
498
|
-
|
|
499
|
-
it 'returns true' do
|
|
500
|
-
expect(subject).to be true
|
|
501
|
-
end
|
|
502
|
-
|
|
503
|
-
it 'creates a new store credit record' do
|
|
504
|
-
expect { subject }.to change { Spree::StoreCredit.count }.by(1)
|
|
505
|
-
end
|
|
506
|
-
|
|
507
|
-
it 'does not create a new store credit event on the parent store credit' do
|
|
508
|
-
expect { subject }.to_not change { store_credit.store_credit_events.count }
|
|
509
|
-
end
|
|
510
|
-
|
|
511
|
-
context 'credits the passed amount to a new store credit record' do
|
|
512
|
-
before do
|
|
513
|
-
subject
|
|
514
|
-
@new_store_credit = Spree::StoreCredit.last
|
|
515
|
-
end
|
|
516
|
-
|
|
517
|
-
it 'does not set the amount used on hte originating store credit' do
|
|
518
|
-
expect(store_credit.reload.amount_used).to eq amount_used
|
|
519
|
-
end
|
|
520
|
-
|
|
521
|
-
it 'sets the correct amount on the new store credit' do
|
|
522
|
-
expect(@new_store_credit.amount).to eq credit_amount
|
|
523
|
-
end
|
|
524
|
-
|
|
525
|
-
[:user_id, :category_id, :created_by_id, :currency, :type_id].each do |attr|
|
|
526
|
-
it "sets attribute #{attr} inherited from the originating store credit" do
|
|
527
|
-
expect(@new_store_credit.send(attr)).to eq store_credit.send(attr)
|
|
528
|
-
end
|
|
529
|
-
end
|
|
530
|
-
|
|
531
|
-
it 'sets a memo' do
|
|
532
|
-
expect(@new_store_credit.memo).to eq "This is a credit from store credit ID #{store_credit.id}"
|
|
533
|
-
end
|
|
534
|
-
end
|
|
535
|
-
|
|
536
|
-
context 'originator is present' do
|
|
537
|
-
with_model 'OriginatorThing', scope: :all
|
|
538
|
-
|
|
539
|
-
let(:originator) { OriginatorThing.create! } # won't actually be a user. just giving it a valid model here
|
|
540
|
-
|
|
541
|
-
it 'records the originator' do
|
|
542
|
-
expect { subject }.to change { Spree::StoreCreditEvent.count }.by(1)
|
|
543
|
-
expect(Spree::StoreCreditEvent.last.originator).to eq originator
|
|
544
|
-
end
|
|
545
|
-
end
|
|
546
|
-
end
|
|
547
|
-
|
|
548
|
-
context 'credit_to_new_allocation is not set' do
|
|
549
|
-
it 'returns true' do
|
|
550
|
-
expect(subject).to be true
|
|
551
|
-
end
|
|
552
|
-
|
|
553
|
-
it 'credits the passed amount to the store credit amount used' do
|
|
554
|
-
subject
|
|
555
|
-
expect(store_credit.reload.amount_used).to eq (amount_used - credit_amount)
|
|
556
|
-
end
|
|
557
|
-
|
|
558
|
-
it 'creates a new store credit event' do
|
|
559
|
-
expect { subject }.to change { store_credit.store_credit_events.count }.by(1)
|
|
560
|
-
end
|
|
561
|
-
end
|
|
562
|
-
end
|
|
563
|
-
end
|
|
564
|
-
|
|
565
|
-
describe '#amount_used' do
|
|
566
|
-
context 'amount used is not defined' do
|
|
567
|
-
subject { Spree::StoreCredit.new }
|
|
568
|
-
|
|
569
|
-
it 'returns zero' do
|
|
570
|
-
expect(subject.amount_used).to be_zero
|
|
571
|
-
end
|
|
572
|
-
end
|
|
573
|
-
|
|
574
|
-
context 'amount used is defined' do
|
|
575
|
-
let(:amount_used) { 100.0 }
|
|
576
|
-
|
|
577
|
-
subject { create(:store_credit, amount_used: amount_used) }
|
|
578
|
-
|
|
579
|
-
it 'returns the attribute value' do
|
|
580
|
-
expect(subject.amount_used).to eq amount_used
|
|
581
|
-
end
|
|
582
|
-
end
|
|
583
|
-
end
|
|
584
|
-
|
|
585
|
-
describe '#amount_authorized' do
|
|
586
|
-
context 'amount authorized is not defined' do
|
|
587
|
-
subject { Spree::StoreCredit.new }
|
|
588
|
-
|
|
589
|
-
it 'returns zero' do
|
|
590
|
-
expect(subject.amount_authorized).to be_zero
|
|
591
|
-
end
|
|
592
|
-
end
|
|
593
|
-
|
|
594
|
-
context 'amount authorized is defined' do
|
|
595
|
-
let(:amount_authorized) { 100.0 }
|
|
596
|
-
|
|
597
|
-
subject { create(:store_credit, amount_authorized: amount_authorized) }
|
|
598
|
-
|
|
599
|
-
it 'returns the attribute value' do
|
|
600
|
-
expect(subject.amount_authorized).to eq amount_authorized
|
|
601
|
-
end
|
|
602
|
-
end
|
|
603
|
-
end
|
|
604
|
-
|
|
605
|
-
describe '#can_capture?' do
|
|
606
|
-
let(:store_credit) { create(:store_credit) }
|
|
607
|
-
let(:payment) { create(:payment, state: payment_state) }
|
|
608
|
-
|
|
609
|
-
subject { store_credit.can_capture?(payment) }
|
|
610
|
-
|
|
611
|
-
context 'pending payment' do
|
|
612
|
-
let(:payment_state) { 'pending' }
|
|
613
|
-
|
|
614
|
-
it 'returns true' do
|
|
615
|
-
expect(subject).to be true
|
|
616
|
-
end
|
|
617
|
-
end
|
|
618
|
-
|
|
619
|
-
context 'checkout payment' do
|
|
620
|
-
let(:payment_state) { 'checkout' }
|
|
621
|
-
|
|
622
|
-
it 'returns true' do
|
|
623
|
-
expect(subject).to be true
|
|
624
|
-
end
|
|
625
|
-
end
|
|
626
|
-
|
|
627
|
-
context 'void payment' do
|
|
628
|
-
let(:payment_state) { Spree::StoreCredit::VOID_ACTION }
|
|
629
|
-
|
|
630
|
-
it 'returns false' do
|
|
631
|
-
expect(subject).to be false
|
|
632
|
-
end
|
|
633
|
-
end
|
|
634
|
-
|
|
635
|
-
context 'invalid payment' do
|
|
636
|
-
let(:payment_state) { 'invalid' }
|
|
637
|
-
|
|
638
|
-
it 'returns false' do
|
|
639
|
-
expect(subject).to be false
|
|
640
|
-
end
|
|
641
|
-
end
|
|
642
|
-
|
|
643
|
-
context 'complete payment' do
|
|
644
|
-
let(:payment_state) { 'completed' }
|
|
645
|
-
|
|
646
|
-
it 'returns false' do
|
|
647
|
-
expect(subject).to be false
|
|
648
|
-
end
|
|
649
|
-
end
|
|
650
|
-
end
|
|
651
|
-
|
|
652
|
-
describe '#can_void?' do
|
|
653
|
-
let(:store_credit) { create(:store_credit) }
|
|
654
|
-
let(:payment) { create(:payment, state: payment_state) }
|
|
655
|
-
|
|
656
|
-
subject { store_credit.can_void?(payment) }
|
|
657
|
-
|
|
658
|
-
context 'pending payment' do
|
|
659
|
-
let(:payment_state) { 'pending' }
|
|
660
|
-
|
|
661
|
-
it 'returns true' do
|
|
662
|
-
expect(subject).to be true
|
|
663
|
-
end
|
|
664
|
-
end
|
|
665
|
-
|
|
666
|
-
context 'checkout payment' do
|
|
667
|
-
let(:payment_state) { 'checkout' }
|
|
668
|
-
|
|
669
|
-
it 'returns false' do
|
|
670
|
-
expect(subject).to be false
|
|
671
|
-
end
|
|
672
|
-
end
|
|
673
|
-
|
|
674
|
-
context 'void payment' do
|
|
675
|
-
let(:payment_state) { Spree::StoreCredit::VOID_ACTION }
|
|
676
|
-
|
|
677
|
-
it 'returns false' do
|
|
678
|
-
expect(subject).to be false
|
|
679
|
-
end
|
|
680
|
-
end
|
|
681
|
-
|
|
682
|
-
context 'invalid payment' do
|
|
683
|
-
let(:payment_state) { 'invalid' }
|
|
684
|
-
|
|
685
|
-
it 'returns false' do
|
|
686
|
-
expect(subject).to be false
|
|
687
|
-
end
|
|
688
|
-
end
|
|
689
|
-
|
|
690
|
-
context 'complete payment' do
|
|
691
|
-
let(:payment_state) { 'completed' }
|
|
692
|
-
|
|
693
|
-
it 'returns false' do
|
|
694
|
-
expect(subject).to be false
|
|
695
|
-
end
|
|
696
|
-
end
|
|
697
|
-
end
|
|
698
|
-
|
|
699
|
-
describe '#can_credit?' do
|
|
700
|
-
let(:store_credit) { create(:store_credit) }
|
|
701
|
-
let(:payment) { create(:payment, state: payment_state) }
|
|
702
|
-
|
|
703
|
-
subject { store_credit.can_credit?(payment) }
|
|
704
|
-
|
|
705
|
-
context 'payment is not completed' do
|
|
706
|
-
let(:payment_state) { 'pending' }
|
|
707
|
-
|
|
708
|
-
it 'returns false' do
|
|
709
|
-
expect(subject).to be false
|
|
710
|
-
end
|
|
711
|
-
end
|
|
712
|
-
|
|
713
|
-
context 'payment is completed' do
|
|
714
|
-
let(:payment_state) { 'completed' }
|
|
715
|
-
|
|
716
|
-
context 'credit is owed on the order' do
|
|
717
|
-
before { allow(payment.order).to receive_messages(payment_state: 'credit_owed') }
|
|
718
|
-
|
|
719
|
-
context "payment doesn't have allowed credit" do
|
|
720
|
-
before { allow(payment).to receive_messages(credit_allowed: 0.0) }
|
|
721
|
-
|
|
722
|
-
it 'returns false' do
|
|
723
|
-
expect(subject).to be false
|
|
724
|
-
end
|
|
725
|
-
end
|
|
726
|
-
|
|
727
|
-
context 'payment has allowed credit' do
|
|
728
|
-
before { allow(payment).to receive_messages(credit_allowed: 5.0) }
|
|
729
|
-
|
|
730
|
-
it 'returns true' do
|
|
731
|
-
expect(subject).to be true
|
|
732
|
-
end
|
|
733
|
-
end
|
|
734
|
-
end
|
|
735
|
-
end
|
|
736
|
-
|
|
737
|
-
describe '#store_events' do
|
|
738
|
-
context 'create' do
|
|
739
|
-
context 'user has one store credit' do
|
|
740
|
-
let(:store_credit_amount) { 100.0 }
|
|
741
|
-
|
|
742
|
-
subject { create(:store_credit, amount: store_credit_amount) }
|
|
743
|
-
|
|
744
|
-
it 'creates a store credit event' do
|
|
745
|
-
expect { subject }.to change { Spree::StoreCreditEvent.count }.by(1)
|
|
746
|
-
end
|
|
747
|
-
|
|
748
|
-
it 'makes the store credit event an allocation event' do
|
|
749
|
-
expect(subject.store_credit_events.first.action).to eq Spree::StoreCredit::ALLOCATION_ACTION
|
|
750
|
-
end
|
|
751
|
-
|
|
752
|
-
it "saves the user's total store credit in the event" do
|
|
753
|
-
expect(subject.store_credit_events.first.user_total_amount).to eq store_credit_amount
|
|
754
|
-
end
|
|
755
|
-
end
|
|
756
|
-
|
|
757
|
-
context 'user has multiple store credits' do
|
|
758
|
-
let(:store_credit_amount) { 100.0 }
|
|
759
|
-
let(:additional_store_credit_amount) { 200.0 }
|
|
760
|
-
|
|
761
|
-
let(:user) { create(:user) }
|
|
762
|
-
let!(:store_credit) { create(:store_credit, user: user, amount: store_credit_amount) }
|
|
763
|
-
|
|
764
|
-
subject { create(:store_credit, user: user, amount: additional_store_credit_amount) }
|
|
765
|
-
|
|
766
|
-
it "saves the user's total store credit in the event" do
|
|
767
|
-
amount = store_credit_amount + additional_store_credit_amount
|
|
768
|
-
expect(subject.store_credit_events.first.user_total_amount).to eq amount
|
|
769
|
-
end
|
|
770
|
-
end
|
|
771
|
-
|
|
772
|
-
context 'an action is specified' do
|
|
773
|
-
it 'creates an event with the set action' do
|
|
774
|
-
store_credit = build(:store_credit)
|
|
775
|
-
store_credit.action = Spree::StoreCredit::VOID_ACTION
|
|
776
|
-
store_credit.action_authorization_code = '1-SC-TEST'
|
|
777
|
-
|
|
778
|
-
expect { store_credit.save! }.to change {
|
|
779
|
-
Spree::StoreCreditEvent.where(action: Spree::StoreCredit::VOID_ACTION).count
|
|
780
|
-
}.by(1)
|
|
781
|
-
end
|
|
782
|
-
end
|
|
783
|
-
end
|
|
784
|
-
end
|
|
785
|
-
end
|
|
786
|
-
end
|