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.
Files changed (207) hide show
  1. checksums.yaml +4 -4
  2. data/lib/spree/core/version.rb +1 -1
  3. data/spree_core.gemspec +1 -1
  4. metadata +3 -206
  5. data/spec/fixtures/microdata.html +0 -22
  6. data/spec/fixtures/microdata_itemref.html +0 -15
  7. data/spec/fixtures/microdata_no_itemscope.html +0 -20
  8. data/spec/fixtures/thinking-cat.jpg +0 -0
  9. data/spec/helpers/base_helper_spec.rb +0 -200
  10. data/spec/helpers/products_helper_spec.rb +0 -289
  11. data/spec/lib/calculated_adjustments_spec.rb +0 -7
  12. data/spec/lib/i18n_spec.rb +0 -123
  13. data/spec/lib/search/base_spec.rb +0 -86
  14. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +0 -103
  15. data/spec/lib/spree/core/controller_helpers/order_spec.rb +0 -110
  16. data/spec/lib/spree/core/controller_helpers/search_spec.rb +0 -17
  17. data/spec/lib/spree/core/controller_helpers/store_spec.rb +0 -72
  18. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +0 -39
  19. data/spec/lib/spree/core/delegate_belongs_to_spec.rb +0 -22
  20. data/spec/lib/spree/core/importer/order_spec.rb +0 -605
  21. data/spec/lib/spree/core/number_generator_spec.rb +0 -175
  22. data/spec/lib/spree/core/token_generator_spec.rb +0 -24
  23. data/spec/lib/spree/core/validators/email_spec.rb +0 -53
  24. data/spec/lib/spree/core_spec.rb +0 -23
  25. data/spec/lib/spree/localized_number_spec.rb +0 -48
  26. data/spec/lib/spree/migrations_spec.rb +0 -36
  27. data/spec/lib/spree/money_spec.rb +0 -122
  28. data/spec/lib/tasks/exchanges_spec.rb +0 -136
  29. data/spec/mailers/order_mailer_spec.rb +0 -122
  30. data/spec/mailers/reimbursement_mailer_spec.rb +0 -47
  31. data/spec/mailers/shipment_mailer_spec.rb +0 -81
  32. data/spec/mailers/test_mailer_spec.rb +0 -38
  33. data/spec/models/option_type_prototype_spec.rb +0 -9
  34. data/spec/models/spree/ability_spec.rb +0 -251
  35. data/spec/models/spree/address_spec.rb +0 -402
  36. data/spec/models/spree/adjustable/adjuster/base_spec.rb +0 -10
  37. data/spec/models/spree/adjustable/adjuster/promotion_spec.rb +0 -211
  38. data/spec/models/spree/adjustable/adjuster/tax_spec.rb +0 -86
  39. data/spec/models/spree/adjustable/adjustments_updater_spec.rb +0 -26
  40. data/spec/models/spree/adjustment_spec.rb +0 -189
  41. data/spec/models/spree/app_configuration_spec.rb +0 -26
  42. data/spec/models/spree/asset_spec.rb +0 -28
  43. data/spec/models/spree/calculator/default_tax_spec.rb +0 -152
  44. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +0 -25
  45. data/spec/models/spree/calculator/flat_rate_spec.rb +0 -47
  46. data/spec/models/spree/calculator/flexi_rate_spec.rb +0 -41
  47. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +0 -15
  48. data/spec/models/spree/calculator/price_sack_spec.rb +0 -30
  49. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +0 -47
  50. data/spec/models/spree/calculator/shipping.rb +0 -8
  51. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +0 -23
  52. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +0 -13
  53. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +0 -52
  54. data/spec/models/spree/calculator/shipping/per_item_spec.rb +0 -20
  55. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +0 -29
  56. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +0 -40
  57. data/spec/models/spree/calculator/tiered_percent_spec.rb +0 -51
  58. data/spec/models/spree/calculator_spec.rb +0 -69
  59. data/spec/models/spree/classification_spec.rb +0 -93
  60. data/spec/models/spree/concerns/display_money_spec.rb +0 -43
  61. data/spec/models/spree/concerns/user_methods_spec.rb +0 -82
  62. data/spec/models/spree/concerns/vat_price_calculation_spec.rb +0 -66
  63. data/spec/models/spree/country_spec.rb +0 -55
  64. data/spec/models/spree/credit_card_spec.rb +0 -328
  65. data/spec/models/spree/customer_return_spec.rb +0 -240
  66. data/spec/models/spree/exchange_spec.rb +0 -75
  67. data/spec/models/spree/gateway/bogus_simple.rb +0 -20
  68. data/spec/models/spree/gateway/bogus_spec.rb +0 -13
  69. data/spec/models/spree/gateway_spec.rb +0 -61
  70. data/spec/models/spree/image_spec.rb +0 -8
  71. data/spec/models/spree/inventory_unit_spec.rb +0 -256
  72. data/spec/models/spree/line_item_spec.rb +0 -346
  73. data/spec/models/spree/option_type_spec.rb +0 -14
  74. data/spec/models/spree/option_value_spec.rb +0 -18
  75. data/spec/models/spree/order/address_spec.rb +0 -50
  76. data/spec/models/spree/order/adjustments_spec.rb +0 -29
  77. data/spec/models/spree/order/callbacks_spec.rb +0 -42
  78. data/spec/models/spree/order/checkout_spec.rb +0 -770
  79. data/spec/models/spree/order/currency_updater_spec.rb +0 -32
  80. data/spec/models/spree/order/finalizing_spec.rb +0 -114
  81. data/spec/models/spree/order/helpers_spec.rb +0 -5
  82. data/spec/models/spree/order/payment_spec.rb +0 -214
  83. data/spec/models/spree/order/risk_assessment_spec.rb +0 -84
  84. data/spec/models/spree/order/shipments_spec.rb +0 -43
  85. data/spec/models/spree/order/state_machine_spec.rb +0 -212
  86. data/spec/models/spree/order/store_credit_spec.rb +0 -426
  87. data/spec/models/spree/order/tax_spec.rb +0 -84
  88. data/spec/models/spree/order/totals_spec.rb +0 -24
  89. data/spec/models/spree/order/updating_spec.rb +0 -18
  90. data/spec/models/spree/order/validations_spec.rb +0 -15
  91. data/spec/models/spree/order_contents_spec.rb +0 -297
  92. data/spec/models/spree/order_inventory_spec.rb +0 -239
  93. data/spec/models/spree/order_merger_spec.rb +0 -135
  94. data/spec/models/spree/order_spec.rb +0 -1046
  95. data/spec/models/spree/order_updater_spec.rb +0 -305
  96. data/spec/models/spree/payment/gateway_options_spec.rb +0 -127
  97. data/spec/models/spree/payment/store_credit_spec.rb +0 -60
  98. data/spec/models/spree/payment_method/store_credit_spec.rb +0 -291
  99. data/spec/models/spree/payment_method_spec.rb +0 -103
  100. data/spec/models/spree/payment_spec.rb +0 -919
  101. data/spec/models/spree/preference_spec.rb +0 -80
  102. data/spec/models/spree/preferences/configuration_spec.rb +0 -30
  103. data/spec/models/spree/preferences/preferable_spec.rb +0 -344
  104. data/spec/models/spree/preferences/scoped_store_spec.rb +0 -58
  105. data/spec/models/spree/preferences/store_spec.rb +0 -46
  106. data/spec/models/spree/price_spec.rb +0 -128
  107. data/spec/models/spree/product/scopes_spec.rb +0 -183
  108. data/spec/models/spree/product_duplicator_spec.rb +0 -103
  109. data/spec/models/spree/product_filter_spec.rb +0 -26
  110. data/spec/models/spree/product_option_type_spec.rb +0 -9
  111. data/spec/models/spree/product_promotion_rule_spec.rb +0 -9
  112. data/spec/models/spree/product_property_spec.rb +0 -26
  113. data/spec/models/spree/product_spec.rb +0 -629
  114. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +0 -113
  115. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +0 -148
  116. data/spec/models/spree/promotion/actions/create_line_items_spec.rb +0 -86
  117. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +0 -36
  118. data/spec/models/spree/promotion/rules/country_spec.rb +0 -36
  119. data/spec/models/spree/promotion/rules/first_order_spec.rb +0 -75
  120. data/spec/models/spree/promotion/rules/item_total_spec.rb +0 -282
  121. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +0 -42
  122. data/spec/models/spree/promotion/rules/option_value_spec.rb +0 -90
  123. data/spec/models/spree/promotion/rules/product_spec.rb +0 -143
  124. data/spec/models/spree/promotion/rules/taxon_spec.rb +0 -102
  125. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +0 -27
  126. data/spec/models/spree/promotion/rules/user_spec.rb +0 -45
  127. data/spec/models/spree/promotion_action_spec.rb +0 -10
  128. data/spec/models/spree/promotion_category_spec.rb +0 -17
  129. data/spec/models/spree/promotion_handler/cart_spec.rb +0 -102
  130. data/spec/models/spree/promotion_handler/coupon_spec.rb +0 -323
  131. data/spec/models/spree/promotion_handler/free_shipping_spec.rb +0 -48
  132. data/spec/models/spree/promotion_handler/page_spec.rb +0 -44
  133. data/spec/models/spree/promotion_rule_spec.rb +0 -29
  134. data/spec/models/spree/promotion_rule_taxon_spec.rb +0 -9
  135. data/spec/models/spree/promotion_rule_user_spec.rb +0 -9
  136. data/spec/models/spree/promotion_spec.rb +0 -679
  137. data/spec/models/spree/property_prototype_spec.rb +0 -9
  138. data/spec/models/spree/property_spec.rb +0 -5
  139. data/spec/models/spree/prototype_spec.rb +0 -5
  140. data/spec/models/spree/prototype_taxon_spec.rb +0 -9
  141. data/spec/models/spree/refund_reason_spec.rb +0 -20
  142. data/spec/models/spree/refund_spec.rb +0 -195
  143. data/spec/models/spree/reimbursement/credit_spec.rb +0 -36
  144. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +0 -140
  145. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +0 -83
  146. data/spec/models/spree/reimbursement_performer_spec.rb +0 -30
  147. data/spec/models/spree/reimbursement_spec.rb +0 -188
  148. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +0 -63
  149. data/spec/models/spree/reimbursement_type/credit_spec.rb +0 -53
  150. data/spec/models/spree/reimbursement_type/exchange_spec.rb +0 -46
  151. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +0 -55
  152. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +0 -101
  153. data/spec/models/spree/return_authorization_reason_spec.rb +0 -7
  154. data/spec/models/spree/return_authorization_spec.rb +0 -230
  155. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +0 -77
  156. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +0 -58
  157. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +0 -61
  158. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +0 -32
  159. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +0 -29
  160. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +0 -35
  161. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +0 -65
  162. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +0 -43
  163. data/spec/models/spree/return_item_spec.rb +0 -731
  164. data/spec/models/spree/returns_calculator_spec.rb +0 -14
  165. data/spec/models/spree/role_spec.rb +0 -7
  166. data/spec/models/spree/shipment_spec.rb +0 -742
  167. data/spec/models/spree/shipping_calculator_spec.rb +0 -45
  168. data/spec/models/spree/shipping_category_spec.rb +0 -19
  169. data/spec/models/spree/shipping_method_spec.rb +0 -95
  170. data/spec/models/spree/shipping_rate_spec.rb +0 -140
  171. data/spec/models/spree/state_spec.rb +0 -29
  172. data/spec/models/spree/stock/availability_validator_spec.rb +0 -36
  173. data/spec/models/spree/stock/content_item_spec.rb +0 -31
  174. data/spec/models/spree/stock/coordinator_spec.rb +0 -61
  175. data/spec/models/spree/stock/differentiator_spec.rb +0 -39
  176. data/spec/models/spree/stock/estimator_spec.rb +0 -202
  177. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +0 -38
  178. data/spec/models/spree/stock/package_spec.rb +0 -182
  179. data/spec/models/spree/stock/packer_spec.rb +0 -70
  180. data/spec/models/spree/stock/prioritizer_spec.rb +0 -125
  181. data/spec/models/spree/stock/quantifier_spec.rb +0 -126
  182. data/spec/models/spree/stock/splitter/backordered_spec.rb +0 -29
  183. data/spec/models/spree/stock/splitter/base_spec.rb +0 -21
  184. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +0 -47
  185. data/spec/models/spree/stock/splitter/weight_spec.rb +0 -32
  186. data/spec/models/spree/stock_item_spec.rb +0 -432
  187. data/spec/models/spree/stock_location_spec.rb +0 -243
  188. data/spec/models/spree/stock_movement_spec.rb +0 -120
  189. data/spec/models/spree/stock_transfer_spec.rb +0 -50
  190. data/spec/models/spree/store_credit_event_spec.rb +0 -101
  191. data/spec/models/spree/store_credit_spec.rb +0 -786
  192. data/spec/models/spree/store_spec.rb +0 -78
  193. data/spec/models/spree/tax_category_spec.rb +0 -32
  194. data/spec/models/spree/tax_rate_spec.rb +0 -561
  195. data/spec/models/spree/taxon_spec.rb +0 -85
  196. data/spec/models/spree/taxonomy_spec.rb +0 -18
  197. data/spec/models/spree/tracker_spec.rb +0 -21
  198. data/spec/models/spree/user_spec.rb +0 -203
  199. data/spec/models/spree/variant_spec.rb +0 -818
  200. data/spec/models/spree/zone_member_spec.rb +0 -38
  201. data/spec/models/spree/zone_spec.rb +0 -472
  202. data/spec/spec_helper.rb +0 -79
  203. data/spec/support/big_decimal.rb +0 -5
  204. data/spec/support/concerns/adjustment_source.rb +0 -23
  205. data/spec/support/concerns/default_price.rb +0 -37
  206. data/spec/support/rake.rb +0 -13
  207. data/spec/support/test_gateway.rb +0 -2
@@ -1,78 +0,0 @@
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
-
23
- it 'should return default when no domain' do
24
- expect(subject.class.current).to eql(store_1)
25
- end
26
-
27
- it 'should return store for domain' do
28
- expect(subject.class.current('spreecommerce.com')).to eql(store_1)
29
- expect(subject.class.current('www.subdomain.com')).to eql(store_2)
30
- end
31
- end
32
-
33
- describe '.default' do
34
- context 'when a default store is already present' do
35
- let!(:store) { create(:store) }
36
- let!(:store_2) { create(:store, default: true) }
37
-
38
- it 'should return the already existing default store' do
39
- expect(Spree::Store.default).to eq(store_2)
40
- end
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
-
54
- context 'when store is not saved' do
55
- before do
56
- store.default = true
57
- store.code = nil
58
- store.save
59
- end
60
-
61
- it 'ensure old default location still default' do
62
- [store, store_2].each(&:reload)
63
- expect(store.default).to be false
64
- expect(store_2.default).to be true
65
- end
66
- end
67
- end
68
-
69
- context 'when a default store is not present' do
70
- it 'should build a new default store' do
71
- expect(Spree::Store.default.class).to eq(Spree::Store)
72
- expect(Spree::Store.default.persisted?).to eq(false)
73
- expect(Spree::Store.default.default).to be(true)
74
- end
75
- end
76
- end
77
-
78
- end
@@ -1,32 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Spree::TaxCategory, type: :model do
4
- describe 'Validations' do
5
- it { is_expected.to validate_presence_of(:name) }
6
- it { is_expected.to validate_uniqueness_of(:name).scoped_to(:deleted_at).case_insensitive.allow_blank }
7
- end
8
-
9
- context 'default tax category' do
10
- let(:tax_category) { create(:tax_category) }
11
- let(:new_tax_category) { create(:tax_category) }
12
-
13
- before do
14
- tax_category.update_column(:is_default, true)
15
- end
16
-
17
- it "should undefault the previous default tax category" do
18
- new_tax_category.update_attributes({is_default: true})
19
- expect(new_tax_category.is_default).to be true
20
-
21
- tax_category.reload
22
- expect(tax_category.is_default).to be false
23
- end
24
-
25
- it "should undefault the previous default tax category except when updating the existing default tax category" do
26
- tax_category.update_column(:description, "Updated description")
27
-
28
- tax_category.reload
29
- expect(tax_category.is_default).to be true
30
- end
31
- end
32
- end
@@ -1,561 +0,0 @@
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
- end
102
-
103
- context "when the tax is not a VAT" do
104
- it { is_expected.to eq([rate]) }
105
- end
106
-
107
- context "when the tax is a VAT" do
108
- let(:included_in_price) { true }
109
- it { is_expected.to eq([rate]) }
110
- end
111
- end
112
-
113
- context "when the order has a different tax zone" do
114
- before do
115
- allow(order).to receive_messages tax_zone: create(:zone, name: "Other Zone")
116
- end
117
-
118
- context "when the tax is a VAT" do
119
- let(:included_in_price) { true }
120
- # The rate should NOT match in this instance because:
121
- # The order has a different tax zone, and the price is
122
- # henceforth a net price and will not change.
123
- it 'return no tax rate' do
124
- expect(subject).to be_empty
125
- end
126
- end
127
-
128
- context "when the tax is not VAT" do
129
- it "returns no tax rate" do
130
- expect(subject).to be_empty
131
- end
132
- end
133
- end
134
- end
135
- end
136
- end
137
-
138
- describe ".adjust" do
139
- let(:order) { stub_model(Spree::Order) }
140
- let(:tax_category_1) { stub_model(Spree::TaxCategory) }
141
- let(:tax_category_2) { stub_model(Spree::TaxCategory) }
142
- let(:rate_1) { stub_model(Spree::TaxRate, tax_category: tax_category_1) }
143
- let(:rate_2) { stub_model(Spree::TaxRate, tax_category: tax_category_2) }
144
-
145
- context "with line items" do
146
- let(:line_item) do
147
- stub_model(Spree::LineItem,
148
- price: 10.0,
149
- quantity: 1,
150
- tax_category: tax_category_1,
151
- variant: stub_model(Spree::Variant)
152
- )
153
- end
154
-
155
- let(:line_items) { [line_item] }
156
-
157
- before do
158
- allow(Spree::TaxRate).to receive_messages match: [rate_1, rate_2]
159
- end
160
-
161
- it "should apply adjustments for two tax rates to the order" do
162
- expect(rate_1).to receive(:adjust)
163
- expect(rate_2).not_to receive(:adjust)
164
- Spree::TaxRate.adjust(order, line_items)
165
- end
166
- end
167
-
168
- context "without tax rates" do
169
- let(:line_item) do
170
- stub_model(Spree::LineItem,
171
- :price => 10.0,
172
- :quantity => 2,
173
- :tax_category => nil,
174
- :variant => stub_model(Spree::Variant)
175
- )
176
- end
177
-
178
- let(:line_items) { [line_item] }
179
-
180
- it "should update pre_tax_total to match line item cost if no taxes" do
181
- line_item.tax_category = nil
182
- Spree::TaxRate.adjust(order, line_items)
183
- expect(line_item.pre_tax_amount).to eq line_item.price * line_item.quantity
184
- end
185
- end
186
-
187
- context "with shipments" do
188
- let(:shipments) { [stub_model(Spree::Shipment, cost: 10.0, tax_category: tax_category_1)] }
189
-
190
- before do
191
- allow(Spree::TaxRate).to receive_messages match: [rate_1, rate_2]
192
- end
193
-
194
- it "should apply adjustments for two tax rates to the order" do
195
- expect(rate_1).to receive(:adjust)
196
- expect(rate_2).not_to receive(:adjust)
197
- Spree::TaxRate.adjust(order, shipments)
198
- end
199
- end
200
-
201
- context "for MOSS taxation in Europe" do
202
- let(:germany) { create :country, name: "Germany" }
203
- let(:india) { create :country, name: "India" }
204
- let(:france) { create :country, name: "France" }
205
- let(:france_zone) { create :zone_with_country, name: "France Zone" }
206
- let(:germany_zone) { create :zone_with_country, name: "Germany Zone", default_tax: true }
207
- let(:india_zone) { create :zone_with_country, name: "India" }
208
- let(:moss_category) { Spree::TaxCategory.create(name: "Digital Goods") }
209
- let(:normal_category) { Spree::TaxCategory.create(name: "Analogue Goods") }
210
- let(:eu_zone) { create(:zone, name: "EU") }
211
-
212
- let!(:german_vat) do
213
- Spree::TaxRate.create(
214
- name: "German VAT",
215
- amount: 0.19,
216
- calculator: Spree::Calculator::DefaultTax.create,
217
- tax_category: moss_category,
218
- zone: germany_zone,
219
- included_in_price: true
220
- )
221
- end
222
- let!(:french_vat) do
223
- Spree::TaxRate.create(
224
- name: "French VAT",
225
- amount: 0.25,
226
- calculator: Spree::Calculator::DefaultTax.create,
227
- tax_category: moss_category,
228
- zone: france_zone,
229
- included_in_price: true
230
- )
231
- end
232
- let!(:eu_vat) do
233
- Spree::TaxRate.create(
234
- name: "EU_VAT",
235
- amount: 0.19,
236
- calculator: Spree::Calculator::DefaultTax.create,
237
- tax_category: normal_category,
238
- zone: eu_zone,
239
- included_in_price: true
240
- )
241
- end
242
-
243
- let(:download) { create(:product, tax_category: moss_category, price: 100) }
244
- let(:tshirt) { create(:product, tax_category: normal_category, price: 100) }
245
- let(:order) { Spree::Order.create }
246
-
247
- before do
248
- germany_zone.zone_members.create(zoneable: germany)
249
- france_zone.zone_members.create(zoneable: france)
250
- india_zone.zone_members.create(zoneable: india)
251
- eu_zone.zone_members.create(zoneable: germany)
252
- eu_zone.zone_members.create(zoneable: france)
253
- end
254
-
255
- context "a download" do
256
- before do
257
- order.contents.add(download.master, 1)
258
- end
259
-
260
- it "without an adress costs 100 euros including tax" do
261
- Spree::TaxRate.adjust(order, order.line_items)
262
- order.update_with_updater!
263
- expect(order.display_total).to eq(Spree::Money.new(100))
264
- expect(order.included_tax_total).to eq(15.97)
265
- end
266
-
267
- it "to germany costs 100 euros including tax" do
268
- allow(order).to receive(:tax_zone).and_return(germany_zone)
269
- Spree::TaxRate.adjust(order, order.line_items)
270
- order.update_with_updater!
271
- expect(order.display_total).to eq(Spree::Money.new(100))
272
- expect(order.included_tax_total).to eq(15.97)
273
- end
274
-
275
- it "to france costs more including tax" do
276
- allow(order).to receive(:tax_zone).and_return(france_zone)
277
- order.update_line_item_prices!
278
- Spree::TaxRate.adjust(order, order.line_items)
279
- order.update_with_updater!
280
- expect(order.display_total).to eq(Spree::Money.new(105.04))
281
- expect(order.included_tax_total).to eq(21.01)
282
- expect(order.additional_tax_total).to eq(0)
283
- end
284
-
285
- it "to somewhere else costs the net amount" do
286
- allow(order).to receive(:tax_zone).and_return(india_zone)
287
- order.update_line_item_prices!
288
- Spree::TaxRate.adjust(order, order.line_items)
289
- order.update_with_updater!
290
- expect(order.included_tax_total).to eq(0)
291
- expect(order.included_tax_total).to eq(0)
292
- expect(order.display_total).to eq(Spree::Money.new(84.03))
293
- end
294
- end
295
-
296
- context "a t-shirt" do
297
- before do
298
- order.contents.add(tshirt.master, 1)
299
- end
300
-
301
- it "to germany costs 100 euros including tax" do
302
- allow(order).to receive(:tax_zone).and_return(germany_zone)
303
- Spree::TaxRate.adjust(order, order.line_items)
304
- order.update_with_updater!
305
- expect(order.display_total).to eq(Spree::Money.new(100))
306
- expect(order.included_tax_total).to eq(15.97)
307
- end
308
-
309
- it "to france costs 100 euros including tax" do
310
- allow(order).to receive(:tax_zone).and_return(france_zone)
311
- order.update_line_item_prices!
312
- Spree::TaxRate.adjust(order, order.line_items)
313
- order.update_with_updater!
314
- expect(order.display_total).to eq(Spree::Money.new(100.00))
315
- expect(order.included_tax_total).to eq(15.97)
316
- expect(order.additional_tax_total).to eq(0)
317
- end
318
-
319
- it "to somewhere else costs the net amount" do
320
- allow(order).to receive(:tax_zone).and_return(india_zone)
321
- order.update_line_item_prices!
322
- Spree::TaxRate.adjust(order, order.line_items)
323
- order.update_with_updater!
324
- expect(order.included_tax_total).to eq(0)
325
- expect(order.display_total).to eq(Spree::Money.new(84.03))
326
- end
327
- end
328
- end
329
- end
330
-
331
- describe ".included_tax_amount_for" do
332
- let!(:order) { create :order_with_line_items }
333
- let!(:included_tax_rate) do
334
- create :tax_rate,
335
- included_in_price: true,
336
- tax_category: order.line_items.first.tax_category,
337
- zone: order.tax_zone,
338
- amount: 0.4
339
- end
340
-
341
- let!(:other_included_tax_rate) do
342
- create :tax_rate,
343
- included_in_price: true,
344
- tax_category: order.line_items.first.tax_category,
345
- zone: order.tax_zone,
346
- amount: 0.05
347
- end
348
-
349
- let!(:additional_tax_rate) do
350
- create :tax_rate,
351
- included_in_price: false,
352
- tax_category: order.line_items.first.tax_category,
353
- zone: order.tax_zone,
354
- amount: 0.2
355
- end
356
-
357
- let!(:included_tax_rate_from_somewhere_else) do
358
- create :tax_rate,
359
- included_in_price: true,
360
- tax_category: order.line_items.first.tax_category,
361
- zone: create(:zone_with_country),
362
- amount: 0.1
363
- end
364
- let(:price_options) do
365
- {
366
- tax_zone: order.tax_zone,
367
- tax_category: line_item.tax_category
368
- }
369
- end
370
-
371
-
372
- let(:line_item) { order.line_items.first }
373
- subject(:included_tax_amount) { Spree::TaxRate.included_tax_amount_for(price_options) }
374
-
375
- it 'will only get me tax amounts from tax_rates that match' do
376
- expect(subject).to eq(included_tax_rate.amount + other_included_tax_rate.amount)
377
- end
378
- end
379
-
380
- describe "#adjust" do
381
- before do
382
- @country = create(:country)
383
- @zone = create(:zone, name: "Country Zone", default_tax: true, zone_members: [])
384
- @zone.zone_members.create(zoneable: @country)
385
- @category = Spree::TaxCategory.create name: "Taxable Foo"
386
- @category2 = Spree::TaxCategory.create(name: "Non Taxable")
387
- @rate1 = Spree::TaxRate.create(
388
- amount: 0.10,
389
- calculator: Spree::Calculator::DefaultTax.create,
390
- tax_category: @category,
391
- zone: @zone
392
- )
393
- @rate2 = Spree::TaxRate.create(
394
- amount: 0.05,
395
- calculator: Spree::Calculator::DefaultTax.create,
396
- tax_category: @category,
397
- zone: @zone
398
- )
399
- @order = Spree::Order.create!
400
- @taxable = create(:product, tax_category: @category)
401
- @nontaxable = create(:product, tax_category: @category2)
402
- end
403
-
404
- context "not taxable line item " do
405
- let!(:line_item) { @order.contents.add(@nontaxable.master, 1) }
406
-
407
- it "should not create a tax adjustment" do
408
- Spree::TaxRate.adjust(@order, @order.line_items)
409
- expect(line_item.adjustments.tax.charge.count).to eq(0)
410
- end
411
-
412
- it "should not create a refund" do
413
- Spree::TaxRate.adjust(@order, @order.line_items)
414
- expect(line_item.adjustments.credit.count).to eq(0)
415
- end
416
- end
417
-
418
- context "taxable line item" do
419
- let!(:line_item) { @order.contents.add(@taxable.master, 1) }
420
-
421
- context "when price includes tax" do
422
- before do
423
- @rate1.update_column(:included_in_price, true)
424
- @rate2.update_column(:included_in_price, true)
425
- Spree::TaxRate.store_pre_tax_amount(line_item, [@rate1, @rate2])
426
- end
427
-
428
- context "when zone is contained by default tax zone" do
429
- it "should create two adjustments, one for each tax rate" do
430
- Spree::TaxRate.adjust(@order, @order.line_items)
431
- expect(line_item.adjustments.count).to eq(2)
432
- end
433
-
434
- it "should not create a tax refund" do
435
- Spree::TaxRate.adjust(@order, @order.line_items)
436
- expect(line_item.adjustments.credit.count).to eq(0)
437
- end
438
- end
439
-
440
- context "when order's zone is neither the default zone, or included in the default zone, but matches the rate's zone" do
441
- before do
442
- new_rate = Spree::TaxRate.create(
443
- amount: 0.2,
444
- included_in_price: true,
445
- calculator: Spree::Calculator::DefaultTax.create,
446
- tax_category: @category,
447
- zone: create(:zone_with_country)
448
- )
449
- allow(@order).to receive(:tax_zone).and_return(new_rate.zone)
450
- end
451
-
452
- it "should create an adjustment" do
453
- Spree::TaxRate.adjust(@order, @order.line_items)
454
- expect(line_item.adjustments.charge.count).to eq(1)
455
- end
456
-
457
- it "should not create a tax refund for each tax rate" do
458
- Spree::TaxRate.adjust(@order, @order.line_items)
459
- expect(line_item.adjustments.credit.count).to eq(0)
460
- end
461
- end
462
-
463
- 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
464
- before do
465
- @new_zone = create(:zone, name: "New Zone", default_tax: false)
466
- @new_country = create(:country, name: "New Country")
467
- @new_zone.zone_members.create(zoneable: @new_country)
468
- @order.ship_address = create(:address, country: @new_country)
469
- @order.save
470
- @order.reload
471
- end
472
-
473
- it "should not create positive adjustments" do
474
- Spree::TaxRate.adjust(@order, @order.line_items)
475
- expect(line_item.adjustments.charge.count).to eq(0)
476
- end
477
-
478
- it "should not create a tax refund for each tax rate" do
479
- Spree::TaxRate.adjust(@order, @order.line_items)
480
- expect(line_item.adjustments.credit.count).to eq(0)
481
- end
482
- end
483
-
484
- context "when price does not include tax" do
485
- before do
486
- allow(@order).to receive_messages tax_zone: @zone
487
- [@rate1, @rate2].each do |rate|
488
- rate.included_in_price = false
489
- rate.zone = @zone
490
- rate.save
491
- end
492
- Spree::TaxRate.adjust(@order, @order.line_items)
493
- end
494
-
495
- it "should delete adjustments for open order when taxrate is deleted" do
496
- @rate1.destroy!
497
- @rate2.destroy!
498
- expect(line_item.adjustments.count).to eq(0)
499
- end
500
-
501
- it "should not delete adjustments for complete order when taxrate is deleted" do
502
- @order.update_column :completed_at, Time.current
503
- @rate1.destroy!
504
- @rate2.destroy!
505
- expect(line_item.adjustments.count).to eq(2)
506
- end
507
-
508
- it "should create an adjustment" do
509
- expect(line_item.adjustments.count).to eq(2)
510
- end
511
-
512
- it "should not create a tax refund" do
513
- expect(line_item.adjustments.credit.count).to eq(0)
514
- end
515
-
516
- describe 'tax adjustments' do
517
- before { Spree::TaxRate.adjust(@order, @order.line_items) }
518
-
519
- it "should apply adjustments when a tax zone is present" do
520
- expect(line_item.adjustments.count).to eq(2)
521
- line_item.adjustments.each do |adjustment|
522
- expect(adjustment.label).to eq("#{adjustment.source.tax_category.name} #{adjustment.source.amount * 100}%")
523
- end
524
- end
525
-
526
- describe 'when the tax zone is removed' do
527
- before { allow(@order).to receive_messages tax_zone: nil }
528
-
529
- it 'does not apply any adjustments' do
530
- Spree::TaxRate.adjust(@order, @order.line_items)
531
- expect(line_item.adjustments.count).to eq(0)
532
- end
533
- end
534
- end
535
- end
536
-
537
- context "when two rates apply" do
538
- before do
539
- @price_before_taxes = line_item.price / (1 + @rate1.amount + @rate2.amount)
540
- # Use the same rounding method as in DefaultTax calculator
541
- @price_before_taxes = BigDecimal.new(@price_before_taxes).round(2, BigDecimal::ROUND_HALF_UP)
542
- line_item.update_column(:pre_tax_amount, @price_before_taxes)
543
- # Clear out any previously automatically-applied adjustments
544
- @order.all_adjustments.delete_all
545
- @rate1.adjust(@order, line_item)
546
- @rate2.adjust(@order, line_item)
547
- end
548
-
549
- it "should create two price adjustments" do
550
- expect(@order.line_item_adjustments.count).to eq(2)
551
- end
552
-
553
- it "price adjustments should be accurate" do
554
- included_tax = @order.line_item_adjustments.sum(:amount)
555
- expect(@price_before_taxes + included_tax).to eq(line_item.total)
556
- end
557
- end
558
- end
559
- end
560
- end
561
- end