solidus_core 2.2.2 → 2.3.0.beta1

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.
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
@@ -3,10 +3,14 @@ require 'spec_helper'
3
3
  describe Spree::Store, type: :model do
4
4
  it { is_expected.to respond_to(:cart_tax_country_iso) }
5
5
 
6
- describe ".by_url" do
6
+ describe ".by_url (deprecated)" do
7
7
  let!(:store) { create(:store, url: "website1.com\nwww.subdomain.com") }
8
8
  let!(:store_2) { create(:store, url: 'freethewhales.com') }
9
9
 
10
+ around do |example|
11
+ Spree::Deprecation.silence { example.run }
12
+ end
13
+
10
14
  it "should find stores by url" do
11
15
  by_domain = Spree::Store.by_url('www.subdomain.com')
12
16
 
@@ -15,7 +19,7 @@ describe Spree::Store, type: :model do
15
19
  end
16
20
  end
17
21
 
18
- describe '.current' do
22
+ describe '.current (deprecated)' do
19
23
  let!(:store_1) { create(:store) }
20
24
  let!(:store_default) { create(:store, name: 'default', default: true) }
21
25
  let!(:store_2) { create(:store, default: false, url: 'www.subdomain.com') }
@@ -23,6 +27,10 @@ describe Spree::Store, type: :model do
23
27
 
24
28
  delegate :current, to: :described_class
25
29
 
30
+ around do |example|
31
+ Spree::Deprecation.silence { example.run }
32
+ end
33
+
26
34
  context "with no match" do
27
35
  it 'should return the default domain' do
28
36
  expect(current('foobar.com')).to eql(store_default)
@@ -12,31 +12,21 @@ RSpec.describe Spree::Tax::OrderAdjuster do
12
12
  end
13
13
 
14
14
  describe '#adjust!' do
15
- let(:line_items) { build_stubbed_list(:line_item, 2) }
16
- let(:order) { build_stubbed(:order, line_items: line_items) }
17
- let(:rates_for_order_zone) { [] }
18
- let(:rates_for_default_zone) { [] }
19
- let(:item_adjuster) { Spree::Tax::ItemAdjuster.new(line_items.first) }
15
+ let(:order) { Spree::Order.new }
16
+
17
+ let(:custom_calculator_class) { double }
18
+ let(:custom_calculator_instance) { double }
20
19
 
21
20
  before do
22
- expect(Spree::TaxRate).to receive(:for_address).with(order.tax_address).and_return(rates_for_order_zone)
21
+ Spree::Config.tax_calculator_class = custom_calculator_class
23
22
  end
24
23
 
25
- it 'calls the item adjuster with all line items' do
26
- expect(Spree::Tax::ItemAdjuster).to receive(:new).
27
- with(
28
- line_items.first,
29
- rates_for_order: rates_for_order_zone,
30
- rates_for_default_zone: rates_for_default_zone
31
- ).and_return(item_adjuster)
32
- expect(Spree::Tax::ItemAdjuster).to receive(:new).
33
- with(
34
- line_items.second,
35
- rates_for_order: rates_for_order_zone,
36
- rates_for_default_zone: rates_for_default_zone
37
- ).and_return(item_adjuster)
38
-
39
- expect(item_adjuster).to receive(:adjust!).twice
24
+ it 'calls the configured tax calculator' do
25
+ expect(custom_calculator_class).to receive(:new).with(order).at_least(:once).and_return(custom_calculator_instance)
26
+ expect(custom_calculator_instance).to receive(:calculate).at_least(:once).and_return(
27
+ Spree::Tax::OrderTax.new(order_id: order.id, line_item_taxes: [], shipment_taxes: [])
28
+ )
29
+
40
30
  adjuster.adjust!
41
31
  end
42
32
  end
@@ -22,12 +22,19 @@ describe Spree::Tax::ShippingRateTaxer do
22
22
  let(:shipment) { create :shipment, order: order }
23
23
  let!(:shipping_method) { create :shipping_method, tax_category: tax_category, zones: [zone] }
24
24
  let(:zone) { create :zone, countries: [ship_address.country] }
25
- let!(:tax_rate_one) { create :tax_rate, tax_category: tax_category, zone: zone, amount: 0.1 }
26
- let!(:tax_rate_two) { create :tax_rate, tax_category: tax_category, zone: zone, amount: 0.2 }
25
+ let!(:tax_rate_one) { create :tax_rate, tax_categories: [tax_category], zone: zone, amount: 0.1 }
26
+ let!(:tax_rate_two) do
27
+ create(
28
+ :tax_rate,
29
+ tax_categories: [create(:tax_category), tax_category],
30
+ zone: zone,
31
+ amount: 0.2
32
+ )
33
+ end
27
34
  let!(:non_applicable_rate) { create :tax_rate, zone: zone }
28
35
  let(:shipping_rate) { create :shipping_rate, cost: 10, shipping_method: shipping_method }
29
36
 
30
- it 'builds a shipping rate tax for every tax rate' do
37
+ it 'builds a shipping rate tax for every matching tax rate' do
31
38
  expect(subject.taxes.length).to eq(2)
32
39
  expect(subject.taxes.map(&:tax_rate)).to include(tax_rate_one)
33
40
  expect(subject.taxes.map(&:tax_rate)).to include(tax_rate_two)
@@ -23,14 +23,24 @@ RSpec.describe "Taxation system integration tests" do
23
23
  tax_category: normal_category,
24
24
  shipping_category: normal_shipping_category
25
25
  end
26
+ let(:fruit_product) do
27
+ create :product,
28
+ price: 5,
29
+ name: "Food",
30
+ tax_category: fruit_category,
31
+ shipping_category: normal_shipping_category
32
+ end
26
33
 
27
34
  let(:book) { book_product.master }
28
35
  let(:download) { download_product.master }
29
36
  let(:sweater) { sweater_product.master }
37
+ let(:fruit) { fruit_product.master }
30
38
 
31
39
  let(:books_category) { create :tax_category, name: "Books" }
32
40
  let(:normal_category) { create :tax_category, name: "Normal" }
33
41
  let(:digital_category) { create :tax_category, name: "Digital Goods" }
42
+ let(:fruit_category) { create :tax_category, name: "Fruit Product" }
43
+ let(:milk_category) { create :tax_category, name: "Milk Product" }
34
44
 
35
45
  let(:books_shipping_category) { create :shipping_category, name: "Book Shipping" }
36
46
  let(:normal_shipping_category) { create :shipping_category, name: "Normal Shipping" }
@@ -55,7 +65,7 @@ RSpec.describe "Taxation system integration tests" do
55
65
  name: "German reduced VAT",
56
66
  included_in_price: true,
57
67
  amount: 0.07,
58
- tax_category: books_category,
68
+ tax_categories: [books_category],
59
69
  zone: eu_zone
60
70
  )
61
71
  end
@@ -65,7 +75,7 @@ RSpec.describe "Taxation system integration tests" do
65
75
  name: "German VAT",
66
76
  included_in_price: true,
67
77
  amount: 0.19,
68
- tax_category: normal_category,
78
+ tax_categories: [normal_category],
69
79
  zone: eu_zone
70
80
  )
71
81
  end
@@ -75,7 +85,17 @@ RSpec.describe "Taxation system integration tests" do
75
85
  name: "German VAT",
76
86
  included_in_price: true,
77
87
  amount: 0.19,
78
- tax_category: digital_category,
88
+ tax_categories: [digital_category],
89
+ zone: germany_zone
90
+ )
91
+ end
92
+ let!(:german_food_vat) do
93
+ create(
94
+ :tax_rate,
95
+ name: "German Food VAT",
96
+ included_in_price: true,
97
+ amount: 0.09,
98
+ tax_categories: [fruit_category, milk_category],
79
99
  zone: germany_zone
80
100
  )
81
101
  end
@@ -85,7 +105,7 @@ RSpec.describe "Taxation system integration tests" do
85
105
  name: "Romanian VAT",
86
106
  included_in_price: true,
87
107
  amount: 0.24,
88
- tax_category: digital_category,
108
+ tax_categories: [digital_category],
89
109
  zone: romania_zone
90
110
  )
91
111
  end
@@ -222,6 +242,22 @@ RSpec.describe "Taxation system integration tests" do
222
242
  expect(shipping_rate.display_price).to eq("$2.00 (incl. $0.32 German VAT)")
223
243
  end
224
244
  end
245
+
246
+ context 'an order containg a fruit' do
247
+ let(:variant) { fruit }
248
+
249
+ it 'still has the original price' do
250
+ expect(line_item.price).to eq(5)
251
+ end
252
+
253
+ it 'has one tax adjustment' do
254
+ expect(line_item.adjustments.tax.count).to eq(1)
255
+ end
256
+
257
+ it 'has 0.45 of included tax' do
258
+ expect(line_item.included_tax_total).to eq(0.41)
259
+ end
260
+ end
225
261
  end
226
262
 
227
263
  context 'to romania' do
@@ -345,7 +381,6 @@ RSpec.describe "Taxation system integration tests" do
345
381
  end
346
382
  end
347
383
  end
348
-
349
384
  # Technically, this can't be the case yet as the order won't pass the shipment stage,
350
385
  # but the taxation code shouldn't implicitly depend on the shipping code.
351
386
  context 'to an address that does not have a zone associated' do
@@ -528,7 +563,7 @@ RSpec.describe "Taxation system integration tests" do
528
563
  create(
529
564
  :tax_rate,
530
565
  name: "New York Sales Tax",
531
- tax_category: books_category,
566
+ tax_categories: [books_category],
532
567
  zone: new_york_zone,
533
568
  included_in_price: false,
534
569
  amount: 0.05
@@ -539,7 +574,7 @@ RSpec.describe "Taxation system integration tests" do
539
574
  create(
540
575
  :tax_rate,
541
576
  name: "Federal Sales Tax",
542
- tax_category: books_category,
577
+ tax_categories: [books_category],
543
578
  zone: united_states_zone,
544
579
  included_in_price: false,
545
580
  amount: 0.10
@@ -550,7 +585,7 @@ RSpec.describe "Taxation system integration tests" do
550
585
  create(
551
586
  :tax_rate,
552
587
  name: "Federal Sales Tax",
553
- tax_category: digital_category,
588
+ tax_categories: [digital_category],
554
589
  zone: united_states_zone,
555
590
  included_in_price: false,
556
591
  amount: 0.20
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Spree::TaxCalculator::Default do
4
+ let(:shipping_address) { FactoryGirl.create(:address, state: new_york) }
5
+ let(:order) { FactoryGirl.create(:order, ship_address: shipping_address, state: "delivery") }
6
+
7
+ let(:new_york) { FactoryGirl.create(:state, state_code: "NY") }
8
+ let(:new_york_zone) { FactoryGirl.create(:zone, states: [new_york]) }
9
+
10
+ let(:books_category) { FactoryGirl.create(:tax_category, name: "Books") }
11
+ let!(:book_tax_rate) do
12
+ FactoryGirl.create(
13
+ :tax_rate,
14
+ name: "New York Sales Tax",
15
+ tax_categories: [books_category],
16
+ zone: new_york_zone,
17
+ included_in_price: false,
18
+ amount: 0.05
19
+ )
20
+ end
21
+
22
+ before do
23
+ book = FactoryGirl.create(
24
+ :product,
25
+ price: 20,
26
+ name: "Book",
27
+ tax_category: books_category,
28
+ )
29
+
30
+ order.contents.add(book.master)
31
+ end
32
+
33
+ let(:calculator) { described_class.new(order) }
34
+
35
+ describe '#calculate' do
36
+ subject(:calculated_taxes) { calculator.calculate }
37
+
38
+ it { is_expected.to be_a Spree::Tax::OrderTax }
39
+
40
+ it "has tax information for the line item", aggregate_failures: true do
41
+ expect(calculated_taxes.line_item_taxes.count).to eq 1
42
+
43
+ line_item_tax = calculated_taxes.line_item_taxes.first
44
+ expect(line_item_tax.amount).to eq 1
45
+ expect(line_item_tax.included_in_price).to be false
46
+ expect(line_item_tax.tax_rate).to eq book_tax_rate
47
+ expect(line_item_tax.label).to eq "New York Sales Tax 5.000%"
48
+ end
49
+
50
+ it "has tax information for the shipments" do
51
+ expect(calculated_taxes.shipment_taxes).to be_empty
52
+ end
53
+ end
54
+ end
@@ -264,4 +264,96 @@ describe Spree::TaxRate, type: :model do
264
264
  end
265
265
  end
266
266
  end
267
+
268
+ describe "#active?" do
269
+ subject(:rate) { create(:tax_rate, validity).active? }
270
+
271
+ context "when validity is not set" do
272
+ let(:validity) { {} }
273
+
274
+ it { is_expected.to eq(true) }
275
+ end
276
+
277
+ context "when starts_at is set" do
278
+ context "now" do
279
+ let(:validity) { { starts_at: DateTime.now } }
280
+
281
+ it { is_expected.to eq(true) }
282
+ end
283
+
284
+ context "in the past" do
285
+ let(:validity) { { starts_at: 1.day.ago } }
286
+
287
+ it { is_expected.to eq(true) }
288
+ end
289
+
290
+ context "in the future" do
291
+ let(:validity) { { starts_at: 1.day.from_now } }
292
+
293
+ it { is_expected.to eq(false) }
294
+ end
295
+ end
296
+
297
+ context "when expires_at is set" do
298
+ context "now" do
299
+ let(:validity) { { expires_at: DateTime.now } }
300
+
301
+ it { is_expected.to eq(false) }
302
+ end
303
+
304
+ context "in the past" do
305
+ let(:validity) { { expires_at: 1.day.ago } }
306
+
307
+ it { is_expected.to eq(false) }
308
+ end
309
+
310
+ context "in the future" do
311
+ let(:validity) { { expires_at: 1.day.from_now } }
312
+
313
+ it { is_expected.to eq(true) }
314
+ end
315
+ end
316
+
317
+ context "when starts_at and expires_at are set" do
318
+ context "so that today is in range" do
319
+ let(:validity) { { starts_at: 1.day.ago, expires_at: 1.day.from_now } }
320
+
321
+ it { is_expected.to eq(true) }
322
+ end
323
+
324
+ context "both in the past" do
325
+ let(:validity) { { starts_at: 2.days.ago, expires_at: 1.day.ago } }
326
+
327
+ it { is_expected.to eq(false) }
328
+ end
329
+
330
+ context "both in the future" do
331
+ let(:validity) { { starts_at: 1.day.from_now, expires_at: 2.days.from_now } }
332
+
333
+ it { is_expected.to eq(false) }
334
+ end
335
+ end
336
+ end
337
+
338
+ describe '#tax_category (deprecated)' do
339
+ let(:tax_rate) { create(:tax_rate, tax_categories: [tax_category]) }
340
+ let(:tax_category) { create(:tax_category) }
341
+
342
+ it "returns the first tax category" do
343
+ tax_category = Spree::Deprecation.silence { tax_rate.tax_category }
344
+ expect(tax_category).to eq(tax_category)
345
+ end
346
+ end
347
+
348
+ describe '#tax_category= (deprecated)' do
349
+ let(:tax_rate) { Spree::TaxRate.new }
350
+ let(:tax_category) { create(:tax_category) }
351
+
352
+ it "can assign the tax categories" do
353
+ Spree::Deprecation.silence {
354
+ tax_rate.tax_category = tax_category
355
+ }
356
+ expect(tax_rate.tax_categories).to eq([tax_category])
357
+ end
358
+ end
267
359
  end
@@ -10,10 +10,10 @@ describe Spree::Variant::VatPriceGenerator do
10
10
  context "with Germany as default admin country" do
11
11
  let(:germany) { create(:country, iso: "DE") }
12
12
  let(:germany_zone) { create(:zone, countries: [germany]) }
13
- let!(:german_vat) { create(:tax_rate, included_in_price: true, amount: 0.19, zone: germany_zone, tax_category: tax_category) }
13
+ let!(:german_vat) { create(:tax_rate, included_in_price: true, amount: 0.19, zone: germany_zone, tax_categories: [tax_category]) }
14
14
  let(:france) { create(:country, iso: "FR") }
15
15
  let(:france_zone) { create(:zone, countries: [france]) }
16
- let!(:french_vat) { create(:tax_rate, included_in_price: true, amount: 0.20, zone: france_zone, tax_category: tax_category) }
16
+ let!(:french_vat) { create(:tax_rate, included_in_price: true, amount: 0.20, zone: france_zone, tax_categories: [tax_category]) }
17
17
 
18
18
  before do
19
19
  Spree::Config.admin_vat_country_iso = "DE"
@@ -45,10 +45,10 @@ describe Spree::Variant::VatPriceGenerator do
45
45
  context "with no default admin country" do
46
46
  let(:germany) { create(:country, iso: "DE") }
47
47
  let(:germany_zone) { create(:zone, countries: [germany]) }
48
- let!(:german_vat) { create(:tax_rate, included_in_price: true, amount: 0.19, zone: germany_zone, tax_category: tax_category) }
48
+ let!(:german_vat) { create(:tax_rate, included_in_price: true, amount: 0.19, zone: germany_zone, tax_categories: [tax_category]) }
49
49
  let(:france) { create(:country, iso: "FR") }
50
50
  let(:france_zone) { create(:zone, countries: [france]) }
51
- let!(:french_vat) { create(:tax_rate, included_in_price: true, amount: 0.20, zone: france_zone, tax_category: tax_category) }
51
+ let!(:french_vat) { create(:tax_rate, included_in_price: true, amount: 0.20, zone: france_zone, tax_categories: [tax_category]) }
52
52
 
53
53
  it "builds a correct price including VAT for all VAT countries" do
54
54
  subject
@@ -17,6 +17,12 @@ describe Spree::Variant, type: :model do
17
17
  variant.price = 0
18
18
  expect(variant).to be_valid
19
19
  end
20
+
21
+ it "should require a product" do
22
+ expect(variant).to be_valid
23
+ variant.product = nil
24
+ expect(variant).to be_invalid
25
+ end
20
26
  end
21
27
 
22
28
  context "after create" do
@@ -63,8 +69,8 @@ describe Spree::Variant, type: :model do
63
69
 
64
70
  let(:tax_category) { create(:tax_category) }
65
71
 
66
- let!(:high_vat) { create(:tax_rate, included_in_price: true, amount: 0.25, zone: high_vat_zone, tax_category: tax_category) }
67
- let!(:low_vat) { create(:tax_rate, included_in_price: true, amount: 0.15, zone: low_vat_zone, tax_category: tax_category) }
72
+ let!(:high_vat) { create(:tax_rate, included_in_price: true, amount: 0.25, zone: high_vat_zone, tax_categories: [tax_category]) }
73
+ let!(:low_vat) { create(:tax_rate, included_in_price: true, amount: 0.15, zone: low_vat_zone, tax_categories: [tax_category]) }
68
74
 
69
75
  let(:product) { build(:product, tax_category: tax_category) }
70
76
 
data/spec/spec_helper.rb CHANGED
@@ -37,7 +37,7 @@ require 'spree/testing_support/factories'
37
37
  require 'spree/testing_support/preferences'
38
38
  require 'cancan/matchers'
39
39
 
40
- ActiveJob::Base.queue_adapter = :inline
40
+ ActiveJob::Base.queue_adapter = :test
41
41
 
42
42
  RSpec.configure do |config|
43
43
  config.color = true
@@ -65,6 +65,7 @@ RSpec.configure do |config|
65
65
  reset_spree_preferences
66
66
  end
67
67
 
68
+ config.include ActiveJob::TestHelper
68
69
  config.include FactoryGirl::Syntax::Methods
69
70
  config.include Spree::TestingSupport::Preferences
70
71
  config.extend WithModel
@@ -1,2 +1,2 @@
1
- class Spree::Gateway::Test < Spree::Gateway
1
+ class Spree::Gateway::Test < Spree::PaymentMethod::CreditCard
2
2
  end