solidus_core 1.0.2 → 1.0.3

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 (216) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1 -0
  3. data/Gemfile +3 -0
  4. data/Rakefile +16 -0
  5. data/script/rails +9 -0
  6. data/solidus_core.gemspec +48 -0
  7. data/spec/fixtures/thinking-cat.jpg +0 -0
  8. data/spec/helpers/base_helper_spec.rb +173 -0
  9. data/spec/helpers/order_helper_spec.rb +12 -0
  10. data/spec/helpers/products_helper_spec.rb +220 -0
  11. data/spec/helpers/taxons_helper_spec.rb +17 -0
  12. data/spec/lib/calculated_adjustments_spec.rb +7 -0
  13. data/spec/lib/i18n_spec.rb +123 -0
  14. data/spec/lib/search/base_spec.rb +86 -0
  15. data/spec/lib/search/variant_spec.rb +92 -0
  16. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +66 -0
  17. data/spec/lib/spree/core/controller_helpers/order_spec.rb +92 -0
  18. data/spec/lib/spree/core/controller_helpers/search_spec.rb +17 -0
  19. data/spec/lib/spree/core/controller_helpers/store_spec.rb +16 -0
  20. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +39 -0
  21. data/spec/lib/spree/core/current_store_spec.rb +36 -0
  22. data/spec/lib/spree/core/delegate_belongs_to_spec.rb +22 -0
  23. data/spec/lib/spree/core/importer/order_spec.rb +431 -0
  24. data/spec/lib/spree/core/role_configuration_spec.rb +138 -0
  25. data/spec/lib/spree/core/validators/email_spec.rb +48 -0
  26. data/spec/lib/spree/localized_number_spec.rb +38 -0
  27. data/spec/lib/spree/migrations_spec.rb +36 -0
  28. data/spec/lib/spree/money_spec.rb +127 -0
  29. data/spec/lib/tasks/exchanges_spec.rb +231 -0
  30. data/spec/lib/tasks/migrations/copy_shipped_shipments_to_cartons_spec.rb +115 -0
  31. data/spec/lib/tasks/order_capturing_spec.rb +56 -0
  32. data/spec/mailers/carton_mailer_spec.rb +43 -0
  33. data/spec/mailers/order_mailer_spec.rb +122 -0
  34. data/spec/mailers/reimbursement_mailer_spec.rb +40 -0
  35. data/spec/mailers/test_mailer_spec.rb +15 -0
  36. data/spec/models/spree/ability_spec.rb +276 -0
  37. data/spec/models/spree/address_spec.rb +250 -0
  38. data/spec/models/spree/adjustment_reason_spec.rb +13 -0
  39. data/spec/models/spree/adjustment_spec.rb +177 -0
  40. data/spec/models/spree/app_configuration_spec.rb +20 -0
  41. data/spec/models/spree/asset_spec.rb +24 -0
  42. data/spec/models/spree/calculator/default_tax_spec.rb +127 -0
  43. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +25 -0
  44. data/spec/models/spree/calculator/flat_rate_spec.rb +47 -0
  45. data/spec/models/spree/calculator/flexi_rate_spec.rb +41 -0
  46. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +15 -0
  47. data/spec/models/spree/calculator/price_sack_spec.rb +30 -0
  48. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +51 -0
  49. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +23 -0
  50. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +13 -0
  51. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +52 -0
  52. data/spec/models/spree/calculator/shipping/per_item_spec.rb +20 -0
  53. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +30 -0
  54. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +36 -0
  55. data/spec/models/spree/calculator/tiered_percent_spec.rb +47 -0
  56. data/spec/models/spree/calculator_spec.rb +36 -0
  57. data/spec/models/spree/carton_spec.rb +133 -0
  58. data/spec/models/spree/classification_spec.rb +15 -0
  59. data/spec/models/spree/concerns/display_money_spec.rb +43 -0
  60. data/spec/models/spree/concerns/user_methods_spec.rb +41 -0
  61. data/spec/models/spree/credit_card_spec.rb +334 -0
  62. data/spec/models/spree/customer_return_spec.rb +276 -0
  63. data/spec/models/spree/exchange_spec.rb +79 -0
  64. data/spec/models/spree/gateway/bogus_simple.rb +20 -0
  65. data/spec/models/spree/gateway/bogus_spec.rb +13 -0
  66. data/spec/models/spree/gateway_spec.rb +82 -0
  67. data/spec/models/spree/inventory_unit_spec.rb +307 -0
  68. data/spec/models/spree/item_adjustments_spec.rb +256 -0
  69. data/spec/models/spree/line_item_spec.rb +191 -0
  70. data/spec/models/spree/option_type_spec.rb +14 -0
  71. data/spec/models/spree/option_value_spec.rb +22 -0
  72. data/spec/models/spree/order/address_spec.rb +50 -0
  73. data/spec/models/spree/order/adjustments_spec.rb +39 -0
  74. data/spec/models/spree/order/callbacks_spec.rb +42 -0
  75. data/spec/models/spree/order/checkout_spec.rb +902 -0
  76. data/spec/models/spree/order/currency_updater_spec.rb +32 -0
  77. data/spec/models/spree/order/finalizing_spec.rb +111 -0
  78. data/spec/models/spree/order/payment_spec.rb +210 -0
  79. data/spec/models/spree/order/risk_assessment_spec.rb +68 -0
  80. data/spec/models/spree/order/state_machine_spec.rb +221 -0
  81. data/spec/models/spree/order/tax_spec.rb +84 -0
  82. data/spec/models/spree/order/totals_spec.rb +24 -0
  83. data/spec/models/spree/order/updating_spec.rb +18 -0
  84. data/spec/models/spree/order/validations_spec.rb +15 -0
  85. data/spec/models/spree/order_cancellations_spec.rb +120 -0
  86. data/spec/models/spree/order_capturing_spec.rb +116 -0
  87. data/spec/models/spree/order_contents_spec.rb +265 -0
  88. data/spec/models/spree/order_inventory_spec.rb +228 -0
  89. data/spec/models/spree/order_mutex_spec.rb +85 -0
  90. data/spec/models/spree/order_promotion_spec.rb +31 -0
  91. data/spec/models/spree/order_shipping_spec.rb +247 -0
  92. data/spec/models/spree/order_spec.rb +1412 -0
  93. data/spec/models/spree/order_stock_location_spec.rb +18 -0
  94. data/spec/models/spree/order_updater_spec.rb +299 -0
  95. data/spec/models/spree/payment_method/store_credit_spec.rb +294 -0
  96. data/spec/models/spree/payment_method_spec.rb +96 -0
  97. data/spec/models/spree/payment_spec.rb +1044 -0
  98. data/spec/models/spree/permission_sets/base_spec.rb +12 -0
  99. data/spec/models/spree/permission_sets/configuration_display.rb +82 -0
  100. data/spec/models/spree/permission_sets/configuration_management_spec.rb +50 -0
  101. data/spec/models/spree/permission_sets/dashboard_display_spec.rb +22 -0
  102. data/spec/models/spree/permission_sets/order_display_spec.rb +49 -0
  103. data/spec/models/spree/permission_sets/order_management_spec.rb +36 -0
  104. data/spec/models/spree/permission_sets/product_display_spec.rb +60 -0
  105. data/spec/models/spree/permission_sets/product_management_spec.rb +40 -0
  106. data/spec/models/spree/permission_sets/promotion_display_spec.rb +34 -0
  107. data/spec/models/spree/permission_sets/promotion_management_spec.rb +26 -0
  108. data/spec/models/spree/permission_sets/report_display_spec.rb +24 -0
  109. data/spec/models/spree/permission_sets/restricted_transfer_management_spec.rb +132 -0
  110. data/spec/models/spree/permission_sets/stock_display_spec.rb +26 -0
  111. data/spec/models/spree/permission_sets/stock_management_spec.rb +24 -0
  112. data/spec/models/spree/permission_sets/user_display_spec.rb +36 -0
  113. data/spec/models/spree/permission_sets/user_management_spec.rb +28 -0
  114. data/spec/models/spree/preference_spec.rb +80 -0
  115. data/spec/models/spree/preferences/configuration_spec.rb +30 -0
  116. data/spec/models/spree/preferences/preferable_spec.rb +294 -0
  117. data/spec/models/spree/preferences/scoped_store_spec.rb +58 -0
  118. data/spec/models/spree/preferences/static_model_preferences_spec.rb +78 -0
  119. data/spec/models/spree/preferences/statically_configurable_spec.rb +60 -0
  120. data/spec/models/spree/preferences/store_spec.rb +39 -0
  121. data/spec/models/spree/price_spec.rb +42 -0
  122. data/spec/models/spree/product/scopes_spec.rb +148 -0
  123. data/spec/models/spree/product_duplicator_spec.rb +103 -0
  124. data/spec/models/spree/product_filter_spec.rb +26 -0
  125. data/spec/models/spree/product_property_spec.rb +20 -0
  126. data/spec/models/spree/product_spec.rb +437 -0
  127. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +96 -0
  128. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +165 -0
  129. data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +115 -0
  130. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +40 -0
  131. data/spec/models/spree/promotion/rules/first_order_spec.rb +75 -0
  132. data/spec/models/spree/promotion/rules/item_total_spec.rb +67 -0
  133. data/spec/models/spree/promotion/rules/nth_order_spec.rb +70 -0
  134. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +42 -0
  135. data/spec/models/spree/promotion/rules/option_value_spec.rb +94 -0
  136. data/spec/models/spree/promotion/rules/product_spec.rb +143 -0
  137. data/spec/models/spree/promotion/rules/taxon_spec.rb +102 -0
  138. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +27 -0
  139. data/spec/models/spree/promotion/rules/user_spec.rb +37 -0
  140. data/spec/models/spree/promotion_builder_spec.rb +118 -0
  141. data/spec/models/spree/promotion_category_spec.rb +17 -0
  142. data/spec/models/spree/promotion_code/code_builder_spec.rb +79 -0
  143. data/spec/models/spree/promotion_code_spec.rb +187 -0
  144. data/spec/models/spree/promotion_handler/cart_spec.rb +114 -0
  145. data/spec/models/spree/promotion_handler/coupon_spec.rb +335 -0
  146. data/spec/models/spree/promotion_handler/free_shipping_spec.rb +47 -0
  147. data/spec/models/spree/promotion_handler/page_spec.rb +44 -0
  148. data/spec/models/spree/promotion_rule_spec.rb +28 -0
  149. data/spec/models/spree/promotion_spec.rb +767 -0
  150. data/spec/models/spree/refund_spec.rb +204 -0
  151. data/spec/models/spree/reimbursement/credit_spec.rb +36 -0
  152. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +140 -0
  153. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +83 -0
  154. data/spec/models/spree/reimbursement_performer_spec.rb +30 -0
  155. data/spec/models/spree/reimbursement_spec.rb +231 -0
  156. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +51 -0
  157. data/spec/models/spree/reimbursement_type/credit_spec.rb +53 -0
  158. data/spec/models/spree/reimbursement_type/exchange_spec.rb +46 -0
  159. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +107 -0
  160. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +97 -0
  161. data/spec/models/spree/return_authorization_spec.rb +290 -0
  162. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +77 -0
  163. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +58 -0
  164. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +85 -0
  165. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +32 -0
  166. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +29 -0
  167. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +35 -0
  168. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +65 -0
  169. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +43 -0
  170. data/spec/models/spree/return_item_spec.rb +775 -0
  171. data/spec/models/spree/returns_calculator_spec.rb +14 -0
  172. data/spec/models/spree/shipment_spec.rb +709 -0
  173. data/spec/models/spree/shipping_calculator_spec.rb +45 -0
  174. data/spec/models/spree/shipping_method_spec.rb +88 -0
  175. data/spec/models/spree/shipping_rate_spec.rb +142 -0
  176. data/spec/models/spree/state_spec.rb +14 -0
  177. data/spec/models/spree/stock/availability_validator_spec.rb +83 -0
  178. data/spec/models/spree/stock/coordinator_spec.rb +116 -0
  179. data/spec/models/spree/stock/differentiator_spec.rb +39 -0
  180. data/spec/models/spree/stock/estimator_spec.rb +146 -0
  181. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +38 -0
  182. data/spec/models/spree/stock/package_spec.rb +163 -0
  183. data/spec/models/spree/stock/packer_spec.rb +91 -0
  184. data/spec/models/spree/stock/prioritizer_spec.rb +125 -0
  185. data/spec/models/spree/stock/quantifier_spec.rb +115 -0
  186. data/spec/models/spree/stock/splitter/backordered_spec.rb +29 -0
  187. data/spec/models/spree/stock/splitter/base_spec.rb +21 -0
  188. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +50 -0
  189. data/spec/models/spree/stock/splitter/weight_spec.rb +29 -0
  190. data/spec/models/spree/stock_item_spec.rb +426 -0
  191. data/spec/models/spree/stock_location_spec.rb +279 -0
  192. data/spec/models/spree/stock_movement_spec.rb +56 -0
  193. data/spec/models/spree/stock_transfer_spec.rb +290 -0
  194. data/spec/models/spree/store_credit_category_spec.rb +17 -0
  195. data/spec/models/spree/store_credit_event_spec.rb +314 -0
  196. data/spec/models/spree/store_credit_spec.rb +876 -0
  197. data/spec/models/spree/store_spec.rb +55 -0
  198. data/spec/models/spree/tax_category_spec.rb +27 -0
  199. data/spec/models/spree/tax_rate_spec.rb +378 -0
  200. data/spec/models/spree/taxon_spec.rb +74 -0
  201. data/spec/models/spree/taxonomy_spec.rb +18 -0
  202. data/spec/models/spree/tracker_spec.rb +21 -0
  203. data/spec/models/spree/transfer_item_spec.rb +264 -0
  204. data/spec/models/spree/unit_cancel_spec.rb +148 -0
  205. data/spec/models/spree/user_spec.rb +223 -0
  206. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +23 -0
  207. data/spec/models/spree/variant/scopes_spec.rb +55 -0
  208. data/spec/models/spree/variant_spec.rb +546 -0
  209. data/spec/models/spree/zone_spec.rb +305 -0
  210. data/spec/spec_helper.rb +78 -0
  211. data/spec/support/big_decimal.rb +5 -0
  212. data/spec/support/concerns/default_price.rb +34 -0
  213. data/spec/support/dummy_ability.rb +4 -0
  214. data/spec/support/test_gateway.rb +2 -0
  215. metadata +229 -3
  216. data/lib/spree/testing_support/rspec-activemodel-mocks_patch.rb +0 -8
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Store, :type => :model do
4
+
5
+ describe ".by_url" do
6
+ let!(:store) { create(:store, url: "website1.com\nwww.subdomain.com") }
7
+ let!(:store_2) { create(:store, url: 'freethewhales.com') }
8
+
9
+ it "should find stores by url" do
10
+ by_domain = Spree::Store.by_url('www.subdomain.com')
11
+
12
+ expect(by_domain).to include(store)
13
+ expect(by_domain).not_to include(store_2)
14
+ end
15
+ end
16
+
17
+ describe '.current' do
18
+ # there is a default store created with the test_app rake task.
19
+ let!(:store_1) { Spree::Store.first || create(:store) }
20
+
21
+ let!(:store_2) { create(:store, default: false, url: 'www.subdomain.com') }
22
+ let!(:store_3) { create(:store, default: false, url: 'www.another.com', code: 'CODE')}
23
+
24
+ it 'should return default when no domain' do
25
+ expect(subject.class.current).to eql(store_1)
26
+ end
27
+
28
+ it 'should return store for domain' do
29
+ expect(subject.class.current('spreecommerce.com')).to eql(store_1)
30
+ expect(subject.class.current('www.subdomain.com')).to eql(store_2)
31
+ end
32
+
33
+ it 'should return store by code' do
34
+ expect(subject.class.current('CODE')).to eql(store_3)
35
+ end
36
+ end
37
+
38
+ describe ".default" do
39
+ let!(:store) { create(:store) }
40
+ let!(:store_2) { create(:store, default: true) }
41
+
42
+ it "should ensure there is a default if one doesn't exist yet" do
43
+ expect(store_2.default).to be true
44
+ end
45
+
46
+ it "should ensure there is only one default" do
47
+ [store, store_2].each(&:reload)
48
+
49
+ expect(Spree::Store.where(default: true).count).to eq(1)
50
+ expect(store_2.default).to be true
51
+ expect(store.default).not_to be true
52
+ end
53
+ end
54
+
55
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::TaxCategory, :type => :model do
4
+ context 'default tax category' do
5
+ let(:tax_category) { create(:tax_category) }
6
+ let(:new_tax_category) { create(:tax_category) }
7
+
8
+ before do
9
+ tax_category.update_column(:is_default, true)
10
+ end
11
+
12
+ it "should undefault the previous default tax category" do
13
+ new_tax_category.update_attributes({:is_default => true})
14
+ expect(new_tax_category.is_default).to be true
15
+
16
+ tax_category.reload
17
+ expect(tax_category.is_default).to be false
18
+ end
19
+
20
+ it "should undefault the previous default tax category except when updating the existing default tax category" do
21
+ tax_category.update_column(:description, "Updated description")
22
+
23
+ tax_category.reload
24
+ expect(tax_category.is_default).to be true
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,378 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::TaxRate, :type => :model do
4
+ context "match" do
5
+ let(:order) { create(:order) }
6
+ let(:country) { create(:country) }
7
+ let(:tax_category) { create(:tax_category) }
8
+ let(:calculator) { Spree::Calculator::FlatRate.new }
9
+
10
+ it "should return an empty array when tax_zone is nil" do
11
+ allow(order).to receive_messages :tax_zone => nil
12
+ expect(Spree::TaxRate.match(order.tax_zone)).to eq([])
13
+ end
14
+
15
+ context "when no rate zones match the tax zone" do
16
+ before do
17
+ Spree::TaxRate.create(:amount => 1, :zone => create(:zone))
18
+ end
19
+
20
+ context "when there is no default tax zone" do
21
+ before do
22
+ @zone = create(:zone, :name => "Country Zone", :default_tax => false, :zone_members => [])
23
+ @zone.zone_members.create(:zoneable => country)
24
+ end
25
+
26
+ it "should return an empty array" do
27
+ allow(order).to receive_messages :tax_zone => @zone
28
+ expect(Spree::TaxRate.match(order.tax_zone)).to eq([])
29
+ end
30
+
31
+ it "should return the rate that matches the rate zone" do
32
+ rate = Spree::TaxRate.create(
33
+ :amount => 1,
34
+ :zone => @zone,
35
+ :tax_category => tax_category,
36
+ :calculator => calculator
37
+ )
38
+
39
+ allow(order).to receive_messages :tax_zone => @zone
40
+ expect(Spree::TaxRate.match(order.tax_zone)).to eq([rate])
41
+ end
42
+
43
+ it "should return all rates that match the rate zone" do
44
+ rate1 = Spree::TaxRate.create(
45
+ :amount => 1,
46
+ :zone => @zone,
47
+ :tax_category => tax_category,
48
+ :calculator => calculator
49
+ )
50
+
51
+ rate2 = Spree::TaxRate.create(
52
+ :amount => 2,
53
+ :zone => @zone,
54
+ :tax_category => tax_category,
55
+ :calculator => Spree::Calculator::FlatRate.new
56
+ )
57
+
58
+ allow(order).to receive_messages :tax_zone => @zone
59
+ expect(Spree::TaxRate.match(order.tax_zone)).to match_array([rate1, rate2])
60
+ end
61
+
62
+ context "when the tax_zone is contained within a rate zone" do
63
+ before do
64
+ sub_zone = create(:zone, :name => "State Zone", :zone_members => [])
65
+ sub_zone.zone_members.create(:zoneable => create(:state, :country => country))
66
+ allow(order).to receive_messages :tax_zone => sub_zone
67
+ @rate = Spree::TaxRate.create(
68
+ :amount => 1,
69
+ :zone => @zone,
70
+ :tax_category => tax_category,
71
+ :calculator => calculator
72
+ )
73
+ end
74
+
75
+ it "should return the rate zone" do
76
+ expect(Spree::TaxRate.match(order.tax_zone)).to eq([@rate])
77
+ end
78
+ end
79
+ end
80
+
81
+ context "when there is a default tax zone" do
82
+ before do
83
+ @zone = create(:zone, :name => "Country Zone", :default_tax => true, :zone_members => [])
84
+ @zone.zone_members.create(:zoneable => country)
85
+ end
86
+
87
+ let(:included_in_price) { false }
88
+ let!(:rate) do
89
+ Spree::TaxRate.create(:amount => 1,
90
+ :zone => @zone,
91
+ :tax_category => tax_category,
92
+ :calculator => calculator,
93
+ :included_in_price => included_in_price)
94
+ end
95
+
96
+ subject { Spree::TaxRate.match(order.tax_zone) }
97
+
98
+ context "when the order has the same tax zone" do
99
+ before do
100
+ allow(order).to receive_messages :tax_zone => @zone
101
+ allow(order).to receive_messages :tax_address => tax_address
102
+ end
103
+
104
+ let(:tax_address) { stub_model(Spree::Address) }
105
+
106
+ context "when the tax is not a VAT" do
107
+ it { is_expected.to eq([rate]) }
108
+ end
109
+
110
+ context "when the tax is a VAT" do
111
+ let(:included_in_price) { true }
112
+ it { is_expected.to eq([rate]) }
113
+ end
114
+ end
115
+
116
+ context "when the order has a different tax zone" do
117
+ before do
118
+ allow(order).to receive_messages :tax_zone => create(:zone, :name => "Other Zone")
119
+ allow(order).to receive_messages :tax_address => tax_address
120
+ end
121
+
122
+ context "when the order has a tax_address" do
123
+ let(:tax_address) { stub_model(Spree::Address) }
124
+
125
+ context "when the tax is a VAT" do
126
+ let(:included_in_price) { true }
127
+ # The rate should match in this instance because:
128
+ # 1) It's the default rate (and as such, a negative adjustment should apply)
129
+ it { is_expected.to eq([rate]) }
130
+ end
131
+
132
+ context "when the tax is not VAT" do
133
+ it "returns no tax rate" do
134
+ expect(subject).to be_empty
135
+ end
136
+ end
137
+ end
138
+
139
+ context "when the order does not have a tax_address" do
140
+ let(:tax_address) { nil}
141
+
142
+ context "when the tax is a VAT" do
143
+ let(:included_in_price) { true }
144
+ # The rate should match in this instance because:
145
+ # 1) The order has no tax address by this stage
146
+ # 2) With no tax address, it has no tax zone
147
+ # 3) Therefore, we assume the default tax zone
148
+ # 4) This default zone has a default tax rate.
149
+ it { is_expected.to eq([rate]) }
150
+ end
151
+
152
+ context "when the tax is not a VAT" do
153
+ it { is_expected.to be_empty }
154
+ end
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
160
+
161
+ context ".adjust" do
162
+ let(:order) { stub_model(Spree::Order) }
163
+ let(:tax_category_1) { stub_model(Spree::TaxCategory) }
164
+ let(:tax_category_2) { stub_model(Spree::TaxCategory) }
165
+ let(:rate_1) { stub_model(Spree::TaxRate, :tax_category => tax_category_1) }
166
+ let(:rate_2) { stub_model(Spree::TaxRate, :tax_category => tax_category_2) }
167
+
168
+ context "with line items" do
169
+ let(:line_item) do
170
+ stub_model(Spree::LineItem,
171
+ :price => 10.0,
172
+ :quantity => 1,
173
+ :tax_category => tax_category_1,
174
+ :variant => stub_model(Spree::Variant)
175
+ )
176
+ end
177
+
178
+ let(:line_items) { [line_item] }
179
+
180
+ before do
181
+ allow(Spree::TaxRate).to receive_messages :match => [rate_1, rate_2]
182
+ end
183
+
184
+ it "should apply adjustments for two tax rates to the order" do
185
+ expect(rate_1).to receive(:adjust)
186
+ expect(rate_2).not_to receive(:adjust)
187
+ Spree::TaxRate.adjust(order.tax_zone, line_items)
188
+ end
189
+ end
190
+
191
+ context "with shipments" do
192
+ let(:shipments) { [stub_model(Spree::Shipment, :cost => 10.0, :tax_category => tax_category_1)] }
193
+
194
+ before do
195
+ allow(Spree::TaxRate).to receive_messages :match => [rate_1, rate_2]
196
+ end
197
+
198
+ it "should apply adjustments for two tax rates to the order" do
199
+ expect(rate_1).to receive(:adjust)
200
+ expect(rate_2).not_to receive(:adjust)
201
+ Spree::TaxRate.adjust(order.tax_zone, shipments)
202
+ end
203
+ end
204
+ end
205
+
206
+ context "#adjust" do
207
+ before do
208
+ @country = create(:country)
209
+ @zone = create(:zone, :name => "Country Zone", :default_tax => true, :zone_members => [])
210
+ @zone.zone_members.create(:zoneable => @country)
211
+ @category = Spree::TaxCategory.create :name => "Taxable Foo"
212
+ @category2 = Spree::TaxCategory.create(:name => "Non Taxable")
213
+ @rate1 = Spree::TaxRate.create(
214
+ :amount => 0.10,
215
+ :calculator => Spree::Calculator::DefaultTax.create,
216
+ :tax_category => @category,
217
+ :zone => @zone
218
+ )
219
+ @rate2 = Spree::TaxRate.create(
220
+ :amount => 0.05,
221
+ :calculator => Spree::Calculator::DefaultTax.create,
222
+ :tax_category => @category,
223
+ :zone => @zone
224
+ )
225
+ @order = Spree::Order.create!
226
+ @taxable = create(:product, :tax_category => @category)
227
+ @nontaxable = create(:product, :tax_category => @category2)
228
+ end
229
+
230
+ context "not taxable line item " do
231
+ let!(:line_item) { @order.contents.add(@nontaxable.master, 1) }
232
+
233
+ it "should not create a tax adjustment" do
234
+ Spree::TaxRate.adjust(@order.tax_zone, @order.line_items)
235
+ expect(line_item.adjustments.tax.charge.count).to eq(0)
236
+ end
237
+
238
+ it "should not create a refund" do
239
+ Spree::TaxRate.adjust(@order.tax_zone, @order.line_items)
240
+ expect(line_item.adjustments.credit.count).to eq(0)
241
+ end
242
+ end
243
+
244
+ context "taxable line item" do
245
+ let!(:line_item) { @order.contents.add(@taxable.master, 1) }
246
+
247
+ context "when price includes tax" do
248
+ before do
249
+ @rate1.update_column(:included_in_price, true)
250
+ @rate2.update_column(:included_in_price, true)
251
+ Spree::TaxRate.store_pre_tax_amount(line_item, [@rate1, @rate2])
252
+ end
253
+
254
+ context "when zone is contained by default tax zone" do
255
+ it "should create two adjustments, one for each tax rate" do
256
+ Spree::TaxRate.adjust(@order.tax_zone, @order.line_items)
257
+ expect(line_item.adjustments.count).to eq(1)
258
+ end
259
+
260
+ it "should not create a tax refund" do
261
+ Spree::TaxRate.adjust(@order.tax_zone, @order.line_items)
262
+ expect(line_item.adjustments.credit.count).to eq(0)
263
+ end
264
+ end
265
+
266
+ context "when order's zone is neither the default zone, or included in the default zone, but matches the rate's zone" do
267
+ before do
268
+ # With no zone members, this zone will not contain anything
269
+ # Previously:
270
+ # Zone.stub_chain :default_tax, :contains? => false
271
+ @zone.zone_members.delete_all
272
+ end
273
+ it "should create an adjustment" do
274
+ Spree::TaxRate.adjust(@order.tax_zone, @order.line_items)
275
+ expect(line_item.adjustments.charge.count).to eq(1)
276
+ end
277
+
278
+ it "should not create a tax refund for each tax rate" do
279
+ Spree::TaxRate.adjust(@order.tax_zone, @order.line_items)
280
+ expect(line_item.adjustments.credit.count).to eq(0)
281
+ end
282
+ end
283
+
284
+ context "when order's zone does not match default zone, is not included in the default zone, AND does not match the rate's zone" do
285
+ before do
286
+ @new_zone = create(:zone, :name => "New Zone", :default_tax => false)
287
+ @new_country = create(:country, :name => "New Country")
288
+ @new_zone.zone_members.create(:zoneable => @new_country)
289
+ @order.ship_address = create(:address, :country => @new_country)
290
+ @order.save
291
+ end
292
+
293
+ it "should not create positive adjustments" do
294
+ Spree::TaxRate.adjust(@order.tax_zone, @order.line_items)
295
+ expect(line_item.adjustments.charge.count).to eq(0)
296
+ end
297
+
298
+ it "should create a tax refund for each tax rate" do
299
+ Spree::TaxRate.adjust(@order.tax_zone, @order.line_items)
300
+ expect(line_item.adjustments.credit.count).to eq(1)
301
+ end
302
+ end
303
+
304
+ context "when price does not include tax" do
305
+ before do
306
+ allow(@order).to receive_messages :tax_zone => @zone
307
+ [@rate1, @rate2].each do |rate|
308
+ rate.included_in_price = false
309
+ rate.zone = @zone
310
+ rate.save
311
+ end
312
+ Spree::TaxRate.adjust(@order.tax_zone, @order.line_items)
313
+ end
314
+
315
+ it "should delete adjustments for open order when taxrate is deleted" do
316
+ @rate1.destroy!
317
+ @rate2.destroy!
318
+ expect(line_item.adjustments.count).to eq(0)
319
+ end
320
+
321
+ it "should not delete adjustments for complete order when taxrate is deleted" do
322
+ @order.update_column :completed_at, Time.now
323
+ @rate1.destroy!
324
+ @rate2.destroy!
325
+ expect(line_item.adjustments.count).to eq(2)
326
+ end
327
+
328
+ it "should create an adjustment" do
329
+ expect(line_item.adjustments.count).to eq(2)
330
+ end
331
+
332
+ it "should not create a tax refund" do
333
+ expect(line_item.adjustments.credit.count).to eq(0)
334
+ end
335
+
336
+ describe 'tax adjustments' do
337
+ before { Spree::TaxRate.adjust(@order.tax_zone, @order.line_items) }
338
+
339
+ it "should apply adjustments when a tax zone is present" do
340
+ expect(line_item.adjustments.count).to eq(2)
341
+ end
342
+
343
+ describe 'when the tax zone is removed' do
344
+ before { allow(@order).to receive_messages :tax_zone => nil }
345
+
346
+ it 'does not apply any adjustments' do
347
+ Spree::TaxRate.adjust(@order.tax_zone, @order.line_items)
348
+ expect(line_item.adjustments.count).to eq(0)
349
+ end
350
+ end
351
+ end
352
+ end
353
+
354
+ context "when two rates apply" do
355
+ before do
356
+ @price_before_taxes = line_item.price / (1 + @rate1.amount + @rate2.amount)
357
+ # Use the same rounding method as in DefaultTax calculator
358
+ @price_before_taxes = BigDecimal.new(@price_before_taxes).round(2, BigDecimal::ROUND_HALF_UP)
359
+ line_item.update_column(:pre_tax_amount, @price_before_taxes)
360
+ # Clear out any previously automatically-applied adjustments
361
+ @order.all_adjustments.delete_all
362
+ @rate1.adjust(@order.tax_zone, line_item)
363
+ @rate2.adjust(@order.tax_zone, line_item)
364
+ end
365
+
366
+ it "should create two price adjustments" do
367
+ expect(@order.line_item_adjustments.count).to eq(2)
368
+ end
369
+
370
+ it "price adjustments should be accurate" do
371
+ included_tax = @order.line_item_adjustments.sum(:amount)
372
+ expect(@price_before_taxes + included_tax).to eq(line_item.price)
373
+ end
374
+ end
375
+ end
376
+ end
377
+ end
378
+ end