spree_core 3.2.1 → 3.2.2

Sign up to get free protection for your applications and to get access to all the features.
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