solidus_core 2.2.2 → 2.3.0.beta1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of solidus_core might be problematic. Click here for more details.

Files changed (175) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -7
  3. data/app/assets/javascripts/spree.js.erb +2 -2
  4. data/app/helpers/spree/base_helper.rb +3 -4
  5. data/app/models/spree/address.rb +1 -1
  6. data/app/models/spree/adjustment.rb +3 -1
  7. data/app/models/spree/app_configuration.rb +43 -0
  8. data/app/models/spree/billing_integration.rb +2 -2
  9. data/app/models/spree/calculator/default_tax.rb +3 -1
  10. data/app/models/spree/calculator/distributed_amount.rb +24 -0
  11. data/app/models/spree/calculator/free_shipping.rb +0 -1
  12. data/app/models/spree/calculator/tiered_flat_rate.rb +17 -3
  13. data/app/models/spree/calculator/tiered_percent.rb +18 -3
  14. data/app/models/spree/distributed_amounts_handler.rb +43 -0
  15. data/app/models/spree/gateway/bogus.rb +7 -83
  16. data/app/models/spree/gateway/bogus_simple.rb +7 -20
  17. data/app/models/spree/gateway.rb +8 -58
  18. data/app/models/spree/image.rb +1 -1
  19. data/app/models/spree/line_item.rb +1 -1
  20. data/app/models/spree/option_value.rb +1 -1
  21. data/app/models/spree/order/checkout.rb +1 -4
  22. data/app/models/spree/order/number_generator.rb +43 -0
  23. data/app/models/spree/order.rb +33 -38
  24. data/app/models/spree/order_contents.rb +1 -1
  25. data/app/models/spree/order_taxation.rb +79 -0
  26. data/app/models/spree/order_update_attributes.rb +0 -2
  27. data/app/models/spree/order_updater.rb +55 -33
  28. data/app/models/spree/payment.rb +0 -1
  29. data/app/models/spree/payment_method/bogus_credit_card.rb +87 -0
  30. data/app/models/spree/payment_method/check.rb +14 -6
  31. data/app/models/spree/payment_method/credit_card.rb +41 -0
  32. data/app/models/spree/payment_method/simple_bogus_credit_card.rb +24 -0
  33. data/app/models/spree/payment_method/store_credit.rb +5 -13
  34. data/app/models/spree/payment_method.rb +126 -40
  35. data/app/models/spree/preferences/preferable.rb +5 -1
  36. data/app/models/spree/preferences/store.rb +2 -2
  37. data/app/models/spree/product/scopes.rb +14 -1
  38. data/app/models/spree/product.rb +10 -4
  39. data/app/models/spree/promotion_action.rb +4 -0
  40. data/app/models/spree/promotion_code/batch_builder.rb +3 -2
  41. data/app/models/spree/promotion_rule.rb +4 -0
  42. data/app/models/spree/role.rb +2 -0
  43. data/app/models/spree/role_user.rb +2 -0
  44. data/app/models/spree/shipment.rb +4 -2
  45. data/app/models/spree/shipping_method.rb +3 -1
  46. data/app/models/spree/shipping_rate.rb +1 -1
  47. data/app/models/spree/state.rb +10 -2
  48. data/app/models/spree/stock_item.rb +3 -3
  49. data/app/models/spree/store.rb +5 -0
  50. data/app/models/spree/store_credit.rb +2 -2
  51. data/app/models/spree/store_credit_event.rb +1 -1
  52. data/app/models/spree/store_selector/by_server_name.rb +30 -0
  53. data/app/models/spree/store_selector/legacy.rb +48 -0
  54. data/app/models/spree/tax/item_tax.rb +20 -0
  55. data/app/models/spree/tax/order_adjuster.rb +2 -14
  56. data/app/models/spree/tax/order_tax.rb +18 -0
  57. data/app/models/spree/tax/shipping_rate_taxer.rb +4 -13
  58. data/app/models/spree/tax/tax_helpers.rb +5 -3
  59. data/app/models/spree/tax_calculator/default.rb +83 -0
  60. data/app/models/spree/tax_calculator/shipping_rate.rb +46 -0
  61. data/app/models/spree/tax_category.rb +9 -1
  62. data/app/models/spree/tax_rate.rb +31 -7
  63. data/app/models/spree/tax_rate_tax_category.rb +6 -0
  64. data/app/models/spree/taxon.rb +1 -1
  65. data/app/models/spree/variant.rb +1 -1
  66. data/app/views/spree/{shipment_mailer → carton_mailer}/shipped_email.html.erb +3 -3
  67. data/app/views/spree/order_mailer/cancel_email.html.erb +3 -3
  68. data/app/views/spree/order_mailer/confirm_email.html.erb +2 -2
  69. data/app/views/spree/order_mailer/inventory_cancellation_email.html.erb +26 -0
  70. data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +2 -2
  71. data/app/views/spree/test_mailer/test_email.html.erb +2 -2
  72. data/config/locales/en.yml +66 -57
  73. data/db/default/spree/refund_reasons.rb +1 -0
  74. data/db/default/spree/shipping_categories.rb +1 -0
  75. data/db/default/spree/stock_locations.rb +2 -0
  76. data/db/default/spree/stores.rb +3 -4
  77. data/db/migrate/20170412103617_transform_tax_rate_category_relation.rb +48 -0
  78. data/db/migrate/20170422134804_add_roles_unique_constraints.rb +6 -0
  79. data/db/migrate/20170522143442_add_time_range_to_tax_rate.rb +6 -0
  80. data/db/migrate/20170608074534_rename_bogus_gateways.rb +13 -0
  81. data/lib/generators/spree/custom_user/custom_user_generator.rb +1 -1
  82. data/lib/generators/spree/dummy/dummy_generator.rb +10 -4
  83. data/lib/generators/spree/dummy/templates/rails/database.yml +12 -12
  84. data/lib/generators/spree/install/install_generator.rb +5 -5
  85. data/lib/generators/spree/install/templates/config/initializers/{spree.rb → solidus.rb} +0 -0
  86. data/lib/solidus/migrations/rename_gateways.rb +39 -0
  87. data/lib/spree/core/controller_helpers/auth.rb +1 -1
  88. data/lib/spree/core/controller_helpers/order.rb +10 -5
  89. data/lib/spree/core/controller_helpers/store.rb +1 -9
  90. data/lib/spree/core/current_store.rb +6 -14
  91. data/lib/spree/core/engine.rb +4 -3
  92. data/lib/spree/core/importer/order.rb +4 -4
  93. data/lib/spree/core/version.rb +1 -1
  94. data/lib/spree/core.rb +0 -1
  95. data/lib/spree/localized_number.rb +2 -1
  96. data/lib/spree/permitted_attributes.rb +12 -6
  97. data/lib/spree/testing_support/capybara_ext.rb +0 -1
  98. data/lib/spree/testing_support/factories/adjustment_factory.rb +5 -1
  99. data/lib/spree/testing_support/factories/order_factory.rb +26 -24
  100. data/lib/spree/testing_support/factories/payment_factory.rb +4 -0
  101. data/lib/spree/testing_support/factories/payment_method_factory.rb +3 -3
  102. data/lib/spree/testing_support/factories/shipment_factory.rb +7 -3
  103. data/lib/spree/testing_support/factories/tax_rate_factory.rb +1 -1
  104. data/lib/spree/testing_support/factories/variant_factory.rb +3 -1
  105. data/lib/tasks/migrations/copy_order_bill_address_to_credit_card.rake +0 -4
  106. data/lib/tasks/migrations/migrate_user_addresses.rake +2 -2
  107. data/lib/tasks/migrations/rename_gateways.rake +19 -0
  108. data/solidus_core.gemspec +2 -3
  109. data/spec/lib/spree/core/controller_helpers/order_spec.rb +32 -6
  110. data/spec/lib/spree/core/controller_helpers/payment_parameters_spec.rb +0 -1
  111. data/spec/lib/spree/core/current_store_spec.rb +6 -11
  112. data/spec/lib/spree/core/price_migrator_spec.rb +4 -4
  113. data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +199 -91
  114. data/spec/lib/spree/core/testing_support/factories/variant_factory_spec.rb +18 -0
  115. data/spec/lib/spree/localized_number_spec.rb +6 -0
  116. data/spec/mailers/carton_mailer_spec.rb +3 -3
  117. data/spec/models/spree/address_spec.rb +3 -3
  118. data/spec/models/spree/adjustment_spec.rb +71 -27
  119. data/spec/models/spree/calculator/default_tax_spec.rb +72 -1
  120. data/spec/models/spree/calculator/distributed_amount_spec.rb +32 -0
  121. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +20 -1
  122. data/spec/models/spree/calculator/tiered_percent_spec.rb +20 -1
  123. data/spec/models/spree/distributed_amounts_handler_spec.rb +79 -0
  124. data/spec/models/spree/gateway/bogus_simple.rb +7 -13
  125. data/spec/models/spree/gateway/bogus_spec.rb +8 -4
  126. data/spec/models/spree/gateway_spec.rb +6 -105
  127. data/spec/models/spree/image_spec.rb +23 -0
  128. data/spec/models/spree/order/checkout_spec.rb +3 -18
  129. data/spec/models/spree/order/number_generator_spec.rb +45 -0
  130. data/spec/models/spree/order/outstanding_balance_integration_spec.rb +135 -0
  131. data/spec/models/spree/order/payment_spec.rb +7 -2
  132. data/spec/models/spree/order/state_machine_spec.rb +4 -2
  133. data/spec/models/spree/order_capturing_spec.rb +8 -8
  134. data/spec/models/spree/order_contents_spec.rb +8 -1
  135. data/spec/models/spree/order_shipping_spec.rb +5 -1
  136. data/spec/models/spree/order_spec.rb +156 -83
  137. data/spec/models/spree/order_taxation_spec.rb +126 -0
  138. data/spec/models/spree/order_update_attributes_spec.rb +1 -5
  139. data/spec/models/spree/order_updater_spec.rb +20 -21
  140. data/spec/models/spree/payment_create_spec.rb +14 -6
  141. data/spec/models/spree/payment_method/bogus_credit_card_spec.rb +8 -0
  142. data/spec/models/spree/payment_method/check_spec.rb +78 -0
  143. data/spec/models/spree/payment_method/credit_card_spec.rb +66 -0
  144. data/spec/models/spree/payment_method/simple_bogus_credit_card_spec.rb +18 -0
  145. data/spec/models/spree/payment_method_spec.rb +47 -2
  146. data/spec/models/spree/payment_spec.rb +6 -8
  147. data/spec/models/spree/preference_spec.rb +1 -1
  148. data/spec/models/spree/price_spec.rb +1 -1
  149. data/spec/models/spree/product/scopes_spec.rb +46 -0
  150. data/spec/models/spree/promotion_action_spec.rb +4 -0
  151. data/spec/models/spree/promotion_code/batch_builder_spec.rb +25 -3
  152. data/spec/models/spree/promotion_code_batch_spec.rb +0 -6
  153. data/spec/models/spree/promotion_handler/coupon_spec.rb +1 -1
  154. data/spec/models/spree/promotion_rule_spec.rb +5 -0
  155. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +1 -1
  156. data/spec/models/spree/shipment_spec.rb +24 -3
  157. data/spec/models/spree/shipping_rate_spec.rb +5 -5
  158. data/spec/models/spree/state_spec.rb +31 -4
  159. data/spec/models/spree/stock/coordinator_spec.rb +24 -0
  160. data/spec/models/spree/stock/estimator_spec.rb +1 -1
  161. data/spec/models/spree/store_selector/by_server_name_spec.rb +26 -0
  162. data/spec/models/spree/store_selector/legacy_spec.rb +44 -0
  163. data/spec/models/spree/store_spec.rb +10 -2
  164. data/spec/models/spree/tax/order_adjuster_spec.rb +11 -21
  165. data/spec/models/spree/tax/shipping_rate_taxer_spec.rb +10 -3
  166. data/spec/models/spree/tax/taxation_integration_spec.rb +43 -8
  167. data/spec/models/spree/tax_calculator/default_spec.rb +54 -0
  168. data/spec/models/spree/tax_rate_spec.rb +92 -0
  169. data/spec/models/spree/variant/vat_price_generator_spec.rb +4 -4
  170. data/spec/models/spree/variant_spec.rb +8 -2
  171. data/spec/spec_helper.rb +2 -1
  172. data/spec/support/test_gateway.rb +1 -1
  173. metadata +45 -24
  174. data/app/models/spree/tax/item_adjuster.rb +0 -51
  175. data/spec/models/spree/tax/item_adjuster_spec.rb +0 -82
@@ -11,8 +11,8 @@ describe Spree::CartonMailer do
11
11
  # Regression test for https://github.com/spree/spree/issues/2196
12
12
  it "doesn't include out of stock in the email body" do
13
13
  shipment_email = Spree::CartonMailer.shipped_email(order: order, carton: carton)
14
- expect(shipment_email.body).not_to include(%{Out of Stock})
15
- expect(shipment_email.body).to include(%{Your order has been shipped})
14
+ expect(shipment_email).not_to have_body_text(%{Out of Stock})
15
+ expect(shipment_email).to have_body_text(%{Your order has been shipped})
16
16
  expect(shipment_email.subject).to eq "#{order.store.name} Shipment Notification ##{order.number}"
17
17
  end
18
18
 
@@ -38,7 +38,7 @@ describe Spree::CartonMailer do
38
38
 
39
39
  specify do
40
40
  shipped_email = Spree::CartonMailer.shipped_email(order: order, carton: carton)
41
- expect(shipped_email.body).to include("Caro Cliente,")
41
+ expect(shipped_email).to have_body_text("Caro Cliente,")
42
42
  end
43
43
  end
44
44
  end
@@ -21,7 +21,7 @@ describe Spree::Address, type: :model do
21
21
  let(:address) { build(:address, country: country) }
22
22
 
23
23
  before do
24
- allow(country.states).to receive_messages find_all_by_name_or_abbr: [state]
24
+ allow(country.states).to receive_messages with_name_or_abbr: [state]
25
25
  end
26
26
 
27
27
  context 'address does not require state' do
@@ -151,10 +151,10 @@ describe Spree::Address, type: :model do
151
151
  context "zipcode not required" do
152
152
  before { allow(address).to receive_messages require_zipcode?: false }
153
153
 
154
- it "shows no errors when phone is blank" do
154
+ it "shows no errors when zipcode is blank" do
155
155
  address.zipcode = ""
156
156
  address.valid?
157
- expect(address.errors[:zipcode].size).to eq 0
157
+ expect(address.errors[:zipcode]).to be_blank
158
158
  end
159
159
  end
160
160
  end
@@ -79,54 +79,98 @@ describe Spree::Adjustment, type: :model do
79
79
  end
80
80
 
81
81
  context '#update!' do
82
- let(:adjustment) { Spree::Adjustment.create!(label: 'Adjustment', order: order, adjustable: order, amount: 5, finalized: finalized, source: source) }
83
- let(:source) { mock_model(Spree::TaxRate, compute_amount: 10) }
84
-
85
82
  subject { adjustment.update! }
83
+ let(:adjustment) do
84
+ line_item.adjustments.create!(
85
+ label: 'Adjustment',
86
+ order: order,
87
+ adjustable: order,
88
+ amount: 5,
89
+ finalized: finalized,
90
+ source: source,
91
+ )
92
+ end
93
+ let(:order) { create(:order_with_line_items, line_items_price: 100) }
94
+ let(:line_item) { order.line_items.to_a.first }
86
95
 
87
- context "when adjustment is closed" do
96
+ context "when adjustment is finalized" do
88
97
  let(:finalized) { true }
89
98
 
90
- it "does not update the adjustment" do
91
- expect(adjustment).to_not receive(:update_column)
92
- subject
99
+ context 'with a promotion adjustment' do
100
+ let(:source) { promotion.actions.first! }
101
+ let(:promotion) { create(:promotion, :with_line_item_adjustment, adjustment_rate: 7) }
102
+
103
+ it 'does not update the adjustment' do
104
+ expect { subject }.not_to change { adjustment.amount }
105
+ end
93
106
  end
94
- end
95
107
 
96
- context "when adjustment isn't finalized" do
97
- let(:finalized) { false }
108
+ context 'with a tax adjustment' do
109
+ let(:source) { mock_model(Spree::TaxRate, compute_amount: 10) }
98
110
 
99
- it "updates the amount" do
100
- expect { subject }.to change { adjustment.amount }.to(10)
111
+ it 'updates the adjustment' do
112
+ expect { subject }.to change { adjustment.amount }.from(5).to(10)
113
+ end
101
114
  end
102
115
 
103
- context "it is a promotion adjustment" do
104
- let(:promotion) { create(:promotion, :with_order_adjustment, starts_at: promo_start_date) }
105
- let(:promo_start_date) { nil }
106
- let(:promotion_code) { promotion.codes.first }
107
- let(:order) { create(:order_with_line_items, line_items_count: 1) }
116
+ context 'with a sourceless adjustment' do
117
+ let(:source) { nil }
108
118
 
109
- let!(:adjustment) do
110
- promotion.activate(order: order, promotion_code: promotion_code)
111
- order.adjustments.first
119
+ it 'does nothing' do
120
+ expect { subject }.not_to change { adjustment.amount }
112
121
  end
122
+ end
123
+ end
124
+
125
+ context "when adjustment isn't finalized" do
126
+ let(:finalized) { false }
127
+
128
+ context 'with a promotion adjustment' do
129
+ let(:source) { promotion.actions.first! }
130
+ let(:promotion) { create(:promotion, :with_line_item_adjustment, adjustment_rate: 7) }
113
131
 
114
- context "the promotion is eligible" do
115
- it "sets the adjustment elgiible to true" do
132
+ context 'when the promotion is eligible' do
133
+ it 'updates the adjustment' do
134
+ expect { subject }.to change { adjustment.amount }.from(5).to(-7)
135
+ end
136
+
137
+ it 'sets the adjustment elgiible to true' do
116
138
  subject
117
- expect(adjustment.eligible).to eq true
139
+ expect(adjustment.eligible).to eq(true)
118
140
  end
119
141
  end
120
142
 
121
- context "the promotion is not eligible" do
122
- let(:promo_start_date) { Date.tomorrow }
143
+ context 'when the promotion is not eligible' do
144
+ before do
145
+ promotion.update!(starts_at: 1.day.from_now)
146
+ end
123
147
 
124
- it "sets the adjustment elgiible to false" do
148
+ it 'zeros out the adjustment' do
149
+ expect { subject }.to change { adjustment.amount }.from(5).to(0)
150
+ end
151
+
152
+ it 'sets the adjustment elgiible to false' do
125
153
  subject
126
- expect(adjustment.eligible).to eq false
154
+ expect(adjustment.eligible).to eq(false)
127
155
  end
128
156
  end
129
157
  end
158
+
159
+ context 'with a tax adjustment' do
160
+ let(:source) { mock_model(Spree::TaxRate, compute_amount: 10) }
161
+
162
+ it 'updates the adjustment' do
163
+ expect { subject }.to change { adjustment.amount }.from(5).to(10)
164
+ end
165
+ end
166
+
167
+ context 'with a sourceless adjustment' do
168
+ let(:source) { nil }
169
+
170
+ it 'does nothing' do
171
+ expect { subject }.to_not change { adjustment.amount }
172
+ end
173
+ end
130
174
  end
131
175
  end
132
176
 
@@ -6,7 +6,13 @@ describe Spree::Calculator::DefaultTax, type: :model do
6
6
  let!(:zone) { create(:zone, name: "Country Zone", default_tax: default_tax, countries: [tax_rate_country]) }
7
7
  let(:tax_rate_country) { address.country }
8
8
  let(:tax_category) { create(:tax_category) }
9
- let!(:rate) { create(:tax_rate, tax_category: tax_category, amount: 0.05, included_in_price: included_in_price, zone: zone) }
9
+ let(:starts_at) { nil }
10
+ let(:expires_at) { nil }
11
+ let!(:rate) do
12
+ create(:tax_rate, tax_categories: [tax_category], amount: 0.05,
13
+ included_in_price: included_in_price, zone: zone,
14
+ starts_at: starts_at, expires_at: expires_at)
15
+ end
10
16
  let(:included_in_price) { false }
11
17
  let(:default_tax) { false }
12
18
  subject(:calculator) { Spree::Calculator::DefaultTax.new(calculable: rate ) }
@@ -32,6 +38,15 @@ describe Spree::Calculator::DefaultTax, type: :model do
32
38
  it "should be equal to the sum of the item totals * rate" do
33
39
  expect(calculator.compute(order)).to eq(3)
34
40
  end
41
+
42
+ context "when rate is not in its validity period" do
43
+ let(:starts_at) { 1.day.from_now }
44
+ let(:expires_at) { 2.days.from_now }
45
+
46
+ it "should be 0" do
47
+ expect(calculator.compute(order)).to eq(0)
48
+ end
49
+ end
35
50
  end
36
51
 
37
52
  context "when no line items match the tax category" do
@@ -52,6 +67,15 @@ describe Spree::Calculator::DefaultTax, type: :model do
52
67
  expect(calculator.compute(order)).to eq(1.5)
53
68
  end
54
69
 
70
+ context "when rate is not in its validity period" do
71
+ let(:starts_at) { 1.day.from_now }
72
+ let(:expires_at) { 2.days.from_now }
73
+
74
+ it "should be 0" do
75
+ expect(calculator.compute(order)).to eq(0)
76
+ end
77
+ end
78
+
55
79
  context "correctly rounds to within two decimal places" do
56
80
  let(:line_item_one_options) { { price: 10.333, quantity: 1 } }
57
81
 
@@ -73,6 +97,15 @@ describe Spree::Calculator::DefaultTax, type: :model do
73
97
  expect(calculator.compute(order).to_f).to eql 2.86
74
98
  end
75
99
 
100
+ context "when rate is not in its validity period" do
101
+ let(:starts_at) { 1.day.from_now }
102
+ let(:expires_at) { 2.days.from_now }
103
+
104
+ it "should be 0" do
105
+ expect(calculator.compute(order)).to eq(0)
106
+ end
107
+ end
108
+
76
109
  context "when the order's tax address is outside the default VAT zone" do
77
110
  let(:default_tax) { true }
78
111
  let(:default_vat_country) { create(:country, iso: "DE") }
@@ -86,6 +119,17 @@ describe Spree::Calculator::DefaultTax, type: :model do
86
119
  expect(subject.compute(order)).to eq(-2.86)
87
120
  end
88
121
  end
122
+
123
+ context "when rate is not in its validity period" do
124
+ let(:starts_at) { 1.day.from_now }
125
+ let(:expires_at) { 2.days.from_now }
126
+
127
+ it "should be 0" do
128
+ Spree::Deprecation.silence do
129
+ expect(calculator.compute(order)).to eq(0)
130
+ end
131
+ end
132
+ end
89
133
  end
90
134
  end
91
135
  end
@@ -103,6 +147,15 @@ describe Spree::Calculator::DefaultTax, type: :model do
103
147
  expect(calculator.compute(item)).to eql 1.43
104
148
  end
105
149
 
150
+ context "when rate is not in its validity period" do
151
+ let(:starts_at) { 1.day.from_now }
152
+ let(:expires_at) { 2.days.from_now }
153
+
154
+ it "should be 0" do
155
+ expect(calculator.compute(item)).to eq(0)
156
+ end
157
+ end
158
+
106
159
  context "when line item is discounted" do
107
160
  let(:promo_total) { -1 }
108
161
 
@@ -135,12 +188,30 @@ describe Spree::Calculator::DefaultTax, type: :model do
135
188
  it "should be equal to the item's pre-tax total * rate" do
136
189
  expect(calculator.compute(item)).to eq(1.45)
137
190
  end
191
+
192
+ context "when rate is not in its validity period" do
193
+ let(:starts_at) { 1.day.from_now }
194
+ let(:expires_at) { 2.days.from_now }
195
+
196
+ it "should be 0" do
197
+ expect(calculator.compute(item)).to eq(0)
198
+ end
199
+ end
138
200
  end
139
201
 
140
202
  context "when the variant matches the tax category" do
141
203
  it "should be equal to the item pre-tax total * rate" do
142
204
  expect(calculator.compute(item)).to eq(1.50)
143
205
  end
206
+
207
+ context "when rate is not in its validity period" do
208
+ let(:starts_at) { 1.day.from_now }
209
+ let(:expires_at) { 2.days.from_now }
210
+
211
+ it "should be 0" do
212
+ expect(calculator.compute(item)).to eq(0)
213
+ end
214
+ end
144
215
  end
145
216
  end
146
217
  end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+ require 'shared_examples/calculator_shared_examples'
3
+
4
+ describe Spree::Calculator::DistributedAmount, type: :model do
5
+ describe "#compute_line_item" do
6
+ subject { calculator.compute_line_item(order.line_items.first) }
7
+
8
+ let(:calculator) { Spree::Calculator::DistributedAmount.new }
9
+
10
+ let(:order) do
11
+ FactoryGirl.create(
12
+ :order_with_line_items,
13
+ line_items_attributes: [{ price: 50 }, { price: 50 }, { price: 50 }]
14
+ )
15
+ end
16
+
17
+ before do
18
+ calculator.preferred_amount = 15
19
+ calculator.preferred_currency = currency
20
+ end
21
+
22
+ context "when the order currency matches the store's currency" do
23
+ let(:currency) { "USD" }
24
+ it { is_expected.to eq 5 }
25
+ end
26
+
27
+ context "when the order currency does not match the store's currency" do
28
+ let(:currency) { "CAD" }
29
+ it { is_expected.to eq 0 }
30
+ end
31
+ end
32
+ end
@@ -57,22 +57,41 @@ describe Spree::Calculator::TieredFlatRate, type: :model do
57
57
  end
58
58
 
59
59
  describe "#compute" do
60
- let(:line_item) { mock_model Spree::LineItem, amount: amount }
60
+ let(:order) do
61
+ create(
62
+ :order_with_line_items,
63
+ line_items_count: 1,
64
+ line_items_price: amount
65
+ )
66
+ end
67
+ let(:line_item) { order.line_items.first }
68
+ let(:preferred_currency) { "USD" }
69
+
61
70
  before do
62
71
  calculator.preferred_base_amount = 10
63
72
  calculator.preferred_tiers = {
64
73
  100 => 15,
65
74
  200 => 20
66
75
  }
76
+ calculator.preferred_currency = preferred_currency
67
77
  end
78
+
68
79
  subject { calculator.compute(line_item) }
80
+
69
81
  context "when amount falls within the first tier" do
70
82
  let(:amount) { 50 }
71
83
  it { is_expected.to eq 10 }
72
84
  end
85
+
73
86
  context "when amount falls within the second tier" do
74
87
  let(:amount) { 150 }
75
88
  it { is_expected.to eq 15 }
76
89
  end
90
+
91
+ context "when the order's currency does not match the calculator" do
92
+ let(:preferred_currency) { "CAD" }
93
+ let(:amount) { 50 }
94
+ it { is_expected.to eq 0 }
95
+ end
77
96
  end
78
97
  end
@@ -73,8 +73,15 @@ describe Spree::Calculator::TieredPercent, type: :model do
73
73
  end
74
74
 
75
75
  describe "#compute" do
76
- let(:order) { create(:order_with_line_items, line_items_count: line_item_count, line_items_price: price) }
76
+ let(:order) do
77
+ create(
78
+ :order_with_line_items,
79
+ line_items_count: line_item_count,
80
+ line_items_price: price
81
+ )
82
+ end
77
83
  let(:price) { 10 }
84
+ let(:preferred_currency) { "USD" }
78
85
 
79
86
  before do
80
87
  calculator.preferred_base_percent = 10
@@ -82,6 +89,7 @@ describe Spree::Calculator::TieredPercent, type: :model do
82
89
  20 => 15,
83
90
  30 => 20
84
91
  }
92
+ calculator.preferred_currency = preferred_currency
85
93
  end
86
94
 
87
95
  context "with a line item" do
@@ -123,6 +131,12 @@ describe Spree::Calculator::TieredPercent, type: :model do
123
131
  it { is_expected.to eq 6.0 }
124
132
  end
125
133
  end
134
+
135
+ context "when the order's currency does not match the calculator" do
136
+ let(:preferred_currency) { "CAD" }
137
+ let(:line_item_count) { 1 }
138
+ it { is_expected.to eq 0 }
139
+ end
126
140
  end
127
141
 
128
142
  context "with an order" do
@@ -165,6 +179,11 @@ describe Spree::Calculator::TieredPercent, type: :model do
165
179
  it { is_expected.to eq 6.0 }
166
180
  end
167
181
  end
182
+
183
+ context "when the order's currency does not match the calculator" do
184
+ let(:preferred_currency) { "CAD" }
185
+ it { is_expected.to eq 0 }
186
+ end
168
187
  end
169
188
  end
170
189
  end
@@ -0,0 +1,79 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Spree::DistributedAmountsHandler, type: :model do
4
+ let(:order) do
5
+ FactoryGirl.create(
6
+ :order_with_line_items,
7
+ line_items_attributes: line_items_attributes
8
+ )
9
+ end
10
+
11
+ describe "#amount" do
12
+ let(:total_amount) { 15 }
13
+
14
+ subject { described_class.new(line_item, total_amount).amount }
15
+
16
+ context "when there is only one line item" do
17
+ let(:line_items_attributes) { [{ price: 100 }] }
18
+ let(:line_item) { order.line_items.first }
19
+
20
+ it "applies the entire amount to the line item" do
21
+ expect(subject).to eq(15)
22
+ end
23
+ end
24
+
25
+ context "when there are multiple line items" do
26
+ let(:line_items_attributes) do
27
+ [{ price: 50 }, { price: 50 }, { price: 50 }]
28
+ end
29
+
30
+ context "and the line items are equally priced" do
31
+ it "evenly distributes the total amount" do
32
+ expect(
33
+ [
34
+ described_class.new(order.line_items[0], total_amount).amount,
35
+ described_class.new(order.line_items[1], total_amount).amount,
36
+ described_class.new(order.line_items[2], total_amount).amount
37
+ ]
38
+ ).to eq(
39
+ [5, 5, 5]
40
+ )
41
+ end
42
+
43
+ context "and the total amount cannot be equally distributed" do
44
+ let(:total_amount) { 10 }
45
+
46
+ it "applies the remainder of the total amount to the last item" do
47
+ expect(
48
+ [
49
+ described_class.new(order.line_items[0], total_amount).amount,
50
+ described_class.new(order.line_items[1], total_amount).amount,
51
+ described_class.new(order.line_items[2], total_amount).amount
52
+ ]
53
+ ).to eq(
54
+ [3.33, 3.33, 3.34]
55
+ )
56
+ end
57
+ end
58
+ end
59
+
60
+ context "and the line items are not equally priced" do
61
+ let(:line_items_attributes) do
62
+ [{ price: 150 }, { price: 50 }, { price: 100 }]
63
+ end
64
+
65
+ it "distributes the total amount relative to the item's price" do
66
+ expect(
67
+ [
68
+ described_class.new(order.line_items[0], total_amount).amount,
69
+ described_class.new(order.line_items[1], total_amount).amount,
70
+ described_class.new(order.line_items[2], total_amount).amount
71
+ ]
72
+ ).to eq(
73
+ [7.5, 2.5, 5]
74
+ )
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -1,18 +1,12 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Spree::Gateway::BogusSimple, type: :model do
4
- subject { Spree::Gateway::BogusSimple.new }
5
-
6
- # regression test for https://github.com/spree/spree/issues/3824
7
- describe "#capture" do
8
- it "returns success with the right response code" do
9
- response = subject.capture(123, '12345', {})
10
- expect(response.message).to include("success")
11
- end
3
+ describe Spree::Gateway::BogusSimple do
4
+ it 'is deprecated' do
5
+ expect(Spree::Deprecation).to receive(:warn)
6
+ described_class.new
7
+ end
12
8
 
13
- it "returns failure with the wrong response code" do
14
- response = subject.capture(123, 'wrong', {})
15
- expect(response.message).to include("failure")
16
- end
9
+ it 'has Spree::PaymentMethod::SimpleBogusCreditCard as superclass' do
10
+ expect(described_class.ancestors).to include(Spree::PaymentMethod::SimpleBogusCreditCard)
17
11
  end
18
12
  end
@@ -1,8 +1,12 @@
1
1
  require 'spec_helper'
2
2
 
3
- module Spree
4
- describe Gateway::Bogus, type: :model do
5
- let(:bogus) { create(:credit_card_payment_method) }
6
- let!(:cc) { create(:credit_card, payment_method: bogus, gateway_customer_profile_id: "BGS-RERTERT") }
3
+ describe Spree::Gateway::Bogus do
4
+ it 'is deprecated' do
5
+ expect(Spree::Deprecation).to receive(:warn)
6
+ described_class.new
7
+ end
8
+
9
+ it 'has Spree::PaymentMethod::BogusCreditCard as superclass' do
10
+ expect(described_class.ancestors).to include(Spree::PaymentMethod::BogusCreditCard)
7
11
  end
8
12
  end
@@ -1,111 +1,12 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Spree::Gateway, type: :model do
4
- class Provider
5
- def initialize(options)
6
- end
7
-
8
- def authorize; 'authorize'; end
9
-
10
- def purchase; 'purchase'; end
11
-
12
- def capture; 'capture'; end
13
-
14
- def void; 'void'; end
15
-
16
- def credit; 'credit'; end
17
- end
18
-
19
- class TestGateway < Spree::Gateway
20
- def provider_class
21
- Provider
22
- end
3
+ describe Spree::Gateway do
4
+ it 'is deprecated' do
5
+ expect(Spree::Deprecation).to receive(:warn)
6
+ described_class.new
23
7
  end
24
8
 
25
- describe 'ActiveMerchant methods' do
26
- let(:gateway) { TestGateway.new }
27
-
28
- it "passes through authorize" do
29
- expect(gateway.authorize).to eq 'authorize'
30
- end
31
-
32
- it "passes through purchase" do
33
- expect(gateway.purchase).to eq 'purchase'
34
- end
35
-
36
- it "passes through capture" do
37
- expect(gateway.capture).to eq 'capture'
38
- end
39
-
40
- it "passes through void" do
41
- expect(gateway.void).to eq 'void'
42
- end
43
-
44
- it "passes through credit" do
45
- expect(gateway.credit).to eq 'credit'
46
- end
47
- end
48
-
49
- context "fetching payment sources" do
50
- let(:store) { create :store }
51
- let(:user) { create :user }
52
- let(:order) { Spree::Order.create(user: user, completed_at: completed_at, store: store) }
53
-
54
- let(:payment_method) { create(:credit_card_payment_method) }
55
-
56
- let(:cc) do
57
- create(:credit_card,
58
- payment_method: payment_method,
59
- gateway_customer_profile_id: "EFWE",
60
- user: cc_user)
61
- end
62
-
63
- let(:payment) do
64
- create(:payment, order: order, source: cc, payment_method: payment_method)
65
- end
66
-
67
- context 'order is not complete and credit card user is nil' do
68
- let(:cc_user) { nil }
69
- let(:completed_at) { nil }
70
-
71
- it "finds no credit cards associated to the order" do
72
- expect(payment_method.reusable_sources(payment.order)).to be_empty
73
- end
74
- end
75
-
76
- context 'order is complete but credit card user is nil' do
77
- let(:cc_user) { nil }
78
- let(:completed_at) { Date.yesterday }
79
-
80
- it "finds credit cards associated on a order completed" do
81
- expect(payment_method.reusable_sources(payment.order)).to eq [cc]
82
- end
83
- end
84
-
85
- context 'order is not complete but credit card has user' do
86
- let(:cc_user) { user }
87
- let(:completed_at) { nil }
88
- before do
89
- cc_user.wallet.add(cc)
90
- end
91
- it "finds credit cards associated to the user" do
92
- expect(payment_method.reusable_sources(payment.order)).to eq [cc]
93
- end
94
- end
95
- end
96
-
97
- context 'using preference_source' do
98
- let(:klass){ Spree::Gateway::Bogus }
99
- before do
100
- Spree::Config.static_model_preferences.add(klass, 'test_preference_source', server: 'bar')
101
- end
102
- after do
103
- Spree::Config.static_model_preferences.for_class(klass).clear
104
- end
105
- let(:payment_method){ create(:credit_card_payment_method, preference_source: 'test_preference_source') }
106
-
107
- it "reads static preferences" do
108
- expect(payment_method.options).to eq({ server: "bar" })
109
- end
9
+ it 'has Spree::PaymentMethod::CreditCard as superclass' do
10
+ expect(described_class.ancestors).to include(Spree::PaymentMethod::CreditCard)
110
11
  end
111
12
  end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Image, type: :model do
4
+ context '#save' do
5
+ context 'invalid attachment' do
6
+ let(:invalid_image) { File.open(__FILE__) }
7
+ subject { described_class.new(attachment: invalid_image) }
8
+
9
+ it 'returns false' do
10
+ expect(subject.save).to be false
11
+ end
12
+ end
13
+
14
+ context 'valid attachment' do
15
+ let(:valid_image) { File.open(File.join('spec', 'fixtures', 'thinking-cat.jpg')) }
16
+ subject { described_class.new(attachment: valid_image) }
17
+
18
+ it 'returns true' do
19
+ expect(subject.save).to be true
20
+ end
21
+ end
22
+ end
23
+ end