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,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Asset, :type => :model do
4
+ describe "#viewable" do
5
+ it "touches association" do
6
+ product = build(:custom_product)
7
+
8
+ expect do
9
+ Spree::Asset.create! { |a| a.viewable = product.master }
10
+ end.to change { product.updated_at }
11
+ end
12
+ end
13
+
14
+ describe "#acts_as_list scope" do
15
+ it "should start from first position for different viewables" do
16
+ asset1 = Spree::Asset.create(viewable_type: 'Spree::Image', viewable_id: 1)
17
+ asset2 = Spree::Asset.create(viewable_type: 'Spree::LineItem', viewable_id: 1)
18
+
19
+ expect(asset1.position).to eq 1
20
+ expect(asset2.position).to eq 1
21
+ end
22
+ end
23
+
24
+ end
@@ -0,0 +1,127 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Calculator::DefaultTax, :type => :model do
4
+ let!(:country) { create(:country) }
5
+ let!(:zone) { create(:zone, :name => "Country Zone", :default_tax => true, :zone_members => []) }
6
+ let!(:tax_category) { create(:tax_category, :tax_rates => []) }
7
+ let!(:rate) { create(:tax_rate, :tax_category => tax_category, :amount => 0.05, :included_in_price => included_in_price) }
8
+ let(:included_in_price) { false }
9
+ let!(:calculator) { Spree::Calculator::DefaultTax.new(:calculable => rate ) }
10
+ let!(:order) { create(:order) }
11
+ let!(:line_item) { create(:line_item, :price => 10, :quantity => 3, :tax_category => tax_category) }
12
+ let!(:shipment) { create(:shipment, :cost => 15) }
13
+
14
+ context "#compute" do
15
+ context "when given an order" do
16
+ let!(:line_item_1) { line_item }
17
+ let!(:line_item_2) { create(:line_item, :price => 10, :quantity => 3, :tax_category => tax_category) }
18
+
19
+ before do
20
+ allow(order).to receive_messages :line_items => [line_item_1, line_item_2]
21
+ end
22
+
23
+ context "when no line items match the tax category" do
24
+ before do
25
+ line_item_1.tax_category = nil
26
+ line_item_2.tax_category = nil
27
+ end
28
+
29
+ it "should be 0" do
30
+ expect(calculator.compute(order)).to eq(0)
31
+ end
32
+ end
33
+
34
+ context "when one item matches the tax category" do
35
+ before do
36
+ line_item_1.tax_category = tax_category
37
+ line_item_2.tax_category = nil
38
+ end
39
+
40
+ it "should be equal to the item total * rate" do
41
+ expect(calculator.compute(order)).to eq(1.5)
42
+ end
43
+
44
+ context "correctly rounds to within two decimal places" do
45
+ before do
46
+ line_item_1.price = 10.333
47
+ line_item_1.quantity = 1
48
+ end
49
+
50
+ specify do
51
+ # Amount is 0.51665, which will be rounded to...
52
+ expect(calculator.compute(order)).to eq(0.52)
53
+ end
54
+
55
+ end
56
+ end
57
+
58
+ context "when more than one item matches the tax category" do
59
+ it "should be equal to the sum of the item totals * rate" do
60
+ expect(calculator.compute(order)).to eq(3)
61
+ end
62
+ end
63
+
64
+ context "when tax is included in price" do
65
+ let(:included_in_price) { true }
66
+
67
+ it "will return the deducted amount from the totals" do
68
+ # total price including 5% tax = $60
69
+ # ex pre-tax = $57.14
70
+ # 57.14 + %5 = 59.997 (or "close enough" to $60)
71
+ # 60 - 57.14 = $2.86
72
+ expect(calculator.compute(order).to_f).to eql 2.86
73
+ end
74
+ end
75
+ end
76
+
77
+ context "when tax is included in price" do
78
+ let(:included_in_price) { true }
79
+ context "when the variant matches the tax category" do
80
+
81
+ context "when line item is discounted" do
82
+ before do
83
+ line_item.promo_total = -1
84
+ Spree::TaxRate.store_pre_tax_amount(line_item, [rate])
85
+ end
86
+
87
+ it "should be equal to the item's discounted total * rate" do
88
+ expect(calculator.compute(line_item)).to eql 1.38
89
+ end
90
+ end
91
+
92
+ it "should be equal to the item's full price * rate" do
93
+ Spree::TaxRate.store_pre_tax_amount(line_item, [rate])
94
+ expect(calculator.compute(line_item)).to eql 1.43
95
+ end
96
+ end
97
+ end
98
+
99
+ context "when tax is not included in price" do
100
+ context "when the line item is discounted" do
101
+ before { line_item.promo_total = -1 }
102
+
103
+ it "should be equal to the item's pre-tax total * rate" do
104
+ expect(calculator.compute(line_item)).to eq(1.45)
105
+ end
106
+ end
107
+
108
+ context "when the variant matches the tax category" do
109
+ it "should be equal to the item pre-tax total * rate" do
110
+ expect(calculator.compute(line_item)).to eq(1.50)
111
+ end
112
+ end
113
+ end
114
+
115
+ context "when given a shipment" do
116
+ it "should be 5% of 15" do
117
+ expect(calculator.compute(shipment)).to eq(0.75)
118
+ end
119
+
120
+ it "takes discounts into consideration" do
121
+ shipment.promo_total = -1
122
+ # 5% of 14
123
+ expect(calculator.compute(shipment)).to eq(0.7)
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Calculator::FlatPercentItemTotal, :type => :model do
4
+ let(:calculator) { Spree::Calculator::FlatPercentItemTotal.new }
5
+ let(:line_item) { mock_model Spree::LineItem }
6
+
7
+ before { allow(calculator).to receive_messages preferred_flat_percent: 10 }
8
+
9
+ context "compute" do
10
+ it "should round result correctly" do
11
+ allow(line_item).to receive_messages amount: 31.08
12
+ expect(calculator.compute(line_item)).to eq 3.11
13
+
14
+ allow(line_item).to receive_messages amount: 31.00
15
+ expect(calculator.compute(line_item)).to eq 3.10
16
+ end
17
+
18
+ it 'returns object.amount if computed amount is greater' do
19
+ allow(calculator).to receive_messages preferred_flat_percent: 110
20
+ allow(line_item).to receive_messages amount: 30.00
21
+
22
+ expect(calculator.compute(line_item)).to eq 30.0
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Calculator::FlatRate, type: :model do
4
+ let(:calculator) { Spree::Calculator::FlatRate.new }
5
+
6
+ let(:order) do
7
+ mock_model(
8
+ Spree::Order, quantity: 10, currency: "USD"
9
+ )
10
+ end
11
+
12
+ context "compute" do
13
+ it "should compute the amount as the rate when currency matches the order's currency" do
14
+ calculator.preferred_amount = 25.0
15
+ calculator.preferred_currency = "GBP"
16
+ allow(order).to receive_messages currency: "GBP"
17
+ expect(calculator.compute(order).round(2)).to eq(25.0)
18
+ end
19
+
20
+ it "should compute the amount as 0 when currency does not match the order's currency" do
21
+ calculator.preferred_amount = 100.0
22
+ calculator.preferred_currency = "GBP"
23
+ allow(order).to receive_messages currency: "USD"
24
+ expect(calculator.compute(order).round(2)).to eq(0.0)
25
+ end
26
+
27
+ it "should compute the amount as 0 when currency is blank" do
28
+ calculator.preferred_amount = 100.0
29
+ calculator.preferred_currency = ""
30
+ allow(order).to receive_messages currency: "GBP"
31
+ expect(calculator.compute(order).round(2)).to eq(0.0)
32
+ end
33
+
34
+ it "should compute the amount as the rate when the currencies use different casing" do
35
+ calculator.preferred_amount = 100.0
36
+ calculator.preferred_currency = "gBp"
37
+ allow(order).to receive_messages currency: "GBP"
38
+ expect(calculator.compute(order).round(2)).to eq(100.0)
39
+ end
40
+
41
+ it "should compute the amount as 0 when there is no object" do
42
+ calculator.preferred_amount = 100.0
43
+ calculator.preferred_currency = "GBP"
44
+ expect(calculator.compute.round(2)).to eq(0.0)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Calculator::FlexiRate, :type => :model do
4
+ let(:calculator) { Spree::Calculator::FlexiRate.new }
5
+
6
+ let(:order) do
7
+ mock_model(
8
+ Spree::Order, quantity: 10
9
+ )
10
+ end
11
+
12
+ context "compute" do
13
+ it "should compute amount correctly when all fees are 0" do
14
+ expect(calculator.compute(order).round(2)).to eq(0.0)
15
+ end
16
+
17
+ it "should compute amount correctly when first_item has a value" do
18
+ allow(calculator).to receive_messages :preferred_first_item => 1.0
19
+ expect(calculator.compute(order).round(2)).to eq(1.0)
20
+ end
21
+
22
+ it "should compute amount correctly when additional_items has a value" do
23
+ allow(calculator).to receive_messages :preferred_additional_item => 1.0
24
+ expect(calculator.compute(order).round(2)).to eq(9.0)
25
+ end
26
+
27
+ it "should compute amount correctly when additional_items and first_item have values" do
28
+ allow(calculator).to receive_messages :preferred_first_item => 5.0, :preferred_additional_item => 1.0
29
+ expect(calculator.compute(order).round(2)).to eq(14.0)
30
+ end
31
+
32
+ it "should compute amount correctly when additional_items and first_item have values AND max items has value" do
33
+ allow(calculator).to receive_messages :preferred_first_item => 5.0, :preferred_additional_item => 1.0, :preferred_max_items => 3
34
+ expect(calculator.compute(order).round(2)).to eq(7.0)
35
+ end
36
+
37
+ it "should allow creation of new object with all the attributes" do
38
+ Spree::Calculator::FlexiRate.new(:preferred_first_item => 1, :preferred_additional_item => 1, :preferred_max_items => 1)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ class Calculator
5
+ describe PercentOnLineItem, :type => :model do
6
+ let(:line_item) { double("LineItem", amount: 100) }
7
+
8
+ before { subject.preferred_percent = 15 }
9
+
10
+ it "computes based on item price and quantity" do
11
+ expect(subject.compute(line_item)).to eq 15
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Calculator::PriceSack, :type => :model do
4
+ let(:calculator) do
5
+ calculator = Spree::Calculator::PriceSack.new
6
+ calculator.preferred_minimal_amount = 5
7
+ calculator.preferred_normal_amount = 10
8
+ calculator.preferred_discount_amount = 1
9
+ calculator
10
+ end
11
+
12
+ let(:order) { stub_model(Spree::Order) }
13
+ let(:shipment) { stub_model(Spree::Shipment, :amount => 10) }
14
+
15
+ # Regression test for #714 and #739
16
+ it "computes with an order object" do
17
+ calculator.compute(order)
18
+ end
19
+
20
+ # Regression test for #1156
21
+ it "computes with a shipment object" do
22
+ calculator.compute(shipment)
23
+ end
24
+
25
+ # Regression test for #2055
26
+ it "computes the correct amount" do
27
+ expect(calculator.compute(2)).to eq(calculator.preferred_normal_amount)
28
+ expect(calculator.compute(6)).to eq(calculator.preferred_discount_amount)
29
+ end
30
+ end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Calculator::Returns::DefaultRefundAmount, :type => :model do
4
+ let(:order) { create(:order) }
5
+ let(:line_item_quantity) { 2 }
6
+ let(:pre_tax_amount) { 100.0 }
7
+ let(:line_item) { create(:line_item, price: 100.0, quantity: line_item_quantity, pre_tax_amount: pre_tax_amount) }
8
+ let(:inventory_unit) { build(:inventory_unit, order: order, line_item: line_item) }
9
+ let(:return_item) { build(:return_item, inventory_unit: inventory_unit ) }
10
+ let(:calculator) { Spree::Calculator::Returns::DefaultRefundAmount.new }
11
+
12
+ before { order.line_items << line_item }
13
+
14
+ subject { calculator.compute(return_item) }
15
+
16
+ context "not an exchange" do
17
+ context "no promotions or taxes" do
18
+ it { is_expected.to eq pre_tax_amount / line_item_quantity }
19
+ end
20
+
21
+ context "order adjustments" do
22
+ let(:adjustment_amount) { -10.0 }
23
+
24
+ before do
25
+ order.adjustments << create(:adjustment, order: order, amount: adjustment_amount, eligible: true, label: 'Adjustment', source_type: 'Spree::Order')
26
+ order.adjustments.first.update_attributes(amount: adjustment_amount)
27
+ end
28
+
29
+ it { is_expected.to eq (pre_tax_amount - adjustment_amount.abs) / line_item_quantity }
30
+ end
31
+
32
+ context "shipping adjustments" do
33
+ let(:adjustment_total) { -50.0 }
34
+
35
+ before { order.shipments << Spree::Shipment.new(adjustment_total: adjustment_total) }
36
+
37
+ it { is_expected.to eq pre_tax_amount / line_item_quantity }
38
+ end
39
+ end
40
+
41
+ context "an exchange" do
42
+ let(:return_item) { build(:exchange_return_item) }
43
+
44
+ it { is_expected.to eq 0.0 }
45
+ end
46
+
47
+ context "pre_tax_amount is zero" do
48
+ let(:pre_tax_amount) { 0.0 }
49
+ it { is_expected.to eq 0.0 }
50
+ end
51
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ module Calculator::Shipping
5
+ describe FlatPercentItemTotal, :type => :model do
6
+ let(:variant1) { build(:variant, :price => 10.11) }
7
+ let(:variant2) { build(:variant, :price => 20.2222) }
8
+
9
+ let(:line_item1) { build(:line_item, variant: variant1) }
10
+ let(:line_item2) { build(:line_item, variant: variant2) }
11
+
12
+ let(:package) do
13
+ build(:stock_package, variants_contents: { variant1 => 2, variant2 => 1 })
14
+ end
15
+
16
+ subject { FlatPercentItemTotal.new(:preferred_flat_percent => 10) }
17
+
18
+ it "should round result correctly" do
19
+ expect(subject.compute(package)).to eq(4.04)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ module Calculator::Shipping
5
+ describe FlatRate, :type => :model do
6
+ subject { Calculator::Shipping::FlatRate.new(:preferred_amount => 4.00) }
7
+
8
+ it 'always returns the same rate' do
9
+ expect(subject.compute(build(:stock_package_fulfilled))).to eql 4.00
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ module Calculator::Shipping
5
+ describe FlexiRate, :type => :model do
6
+ let(:variant1) { build(:variant, :price => 10) }
7
+ let(:variant2) { build(:variant, :price => 20) }
8
+
9
+ let(:package) do
10
+ build(:stock_package, variants_contents: { variant1 => 4, variant2 => 6 })
11
+ end
12
+
13
+ let(:subject) { FlexiRate.new }
14
+
15
+ context "compute" do
16
+ it "should compute amount correctly when all fees are 0" do
17
+ expect(subject.compute(package).round(2)).to eq(0.0)
18
+ end
19
+
20
+ it "should compute amount correctly when first_item has a value" do
21
+ subject.preferred_first_item = 1.0
22
+ expect(subject.compute(package).round(2)).to eq(1.0)
23
+ end
24
+
25
+ it "should compute amount correctly when additional_items has a value" do
26
+ subject.preferred_additional_item = 1.0
27
+ expect(subject.compute(package).round(2)).to eq(9.0)
28
+ end
29
+
30
+ it "should compute amount correctly when additional_items and first_item have values" do
31
+ subject.preferred_first_item = 5.0
32
+ subject.preferred_additional_item = 1.0
33
+ expect(subject.compute(package).round(2)).to eq(14.0)
34
+ end
35
+
36
+ it "should compute amount correctly when additional_items and first_item have values AND max items has value" do
37
+ subject.preferred_first_item = 5.0
38
+ subject.preferred_additional_item = 1.0
39
+ subject.preferred_max_items = 3
40
+ expect(subject.compute(package).round(2)).to eq(26.0)
41
+ end
42
+
43
+ it "should allow creation of new object with all the attributes" do
44
+ FlexiRate.new(:preferred_first_item => 1,
45
+ :preferred_additional_item => 1,
46
+ :preferred_max_items => 1)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+