spree_core 3.0.10 → 3.1.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (289) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/spree.js.coffee.erb +12 -3
  3. data/app/helpers/spree/base_helper.rb +4 -1
  4. data/app/helpers/spree/products_helper.rb +37 -6
  5. data/app/mailers/spree/base_mailer.rb +11 -2
  6. data/app/models/concerns/spree/adjustment_source.rb +3 -10
  7. data/app/models/concerns/spree/default_price.rb +7 -1
  8. data/app/models/concerns/spree/named_type.rb +1 -1
  9. data/app/models/concerns/spree/user_api_authentication.rb +7 -1
  10. data/app/models/concerns/spree/user_methods.rb +47 -0
  11. data/app/models/concerns/spree/user_reporting.rb +2 -2
  12. data/app/models/concerns/spree/vat_price_calculation.rb +47 -0
  13. data/app/models/spree/address.rb +8 -7
  14. data/app/models/spree/adjustable/adjuster/base.rb +25 -0
  15. data/app/models/spree/adjustable/adjuster/promotion.rb +41 -0
  16. data/app/models/spree/adjustable/adjuster/tax.rb +26 -0
  17. data/app/models/spree/adjustable/adjustments_updater.rb +22 -45
  18. data/app/models/spree/adjustment.rb +8 -10
  19. data/app/models/spree/app_configuration.rb +5 -2
  20. data/app/models/spree/base.rb +4 -0
  21. data/app/models/spree/calculator.rb +0 -5
  22. data/app/models/spree/calculator/default_tax.rb +2 -10
  23. data/app/models/spree/classification.rb +7 -3
  24. data/app/models/spree/country.rb +14 -3
  25. data/app/models/spree/credit_card.rb +21 -31
  26. data/app/models/spree/customer_return.rb +7 -15
  27. data/app/models/spree/gateway.rb +7 -6
  28. data/app/models/spree/image.rb +1 -1
  29. data/app/models/spree/inventory_unit.rb +9 -6
  30. data/app/models/spree/legacy_user.rb +1 -6
  31. data/app/models/spree/line_item.rb +69 -68
  32. data/app/models/spree/log_entry.rb +1 -4
  33. data/app/models/spree/option_type.rb +15 -6
  34. data/app/models/spree/option_type_prototype.rb +9 -0
  35. data/app/models/spree/option_value.rb +11 -3
  36. data/app/models/spree/option_value_variant.rb +6 -0
  37. data/app/models/spree/order.rb +113 -64
  38. data/app/models/spree/order/checkout.rb +8 -11
  39. data/app/models/spree/order/currency_updater.rb +1 -1
  40. data/app/models/spree/order/store_credit.rb +96 -0
  41. data/app/models/spree/order_contents.rb +6 -1
  42. data/app/models/spree/order_inventory.rb +4 -8
  43. data/app/models/spree/order_promotion.rb +6 -0
  44. data/app/models/spree/order_updater.rb +2 -7
  45. data/app/models/spree/payment.rb +46 -19
  46. data/app/models/spree/payment/gateway_options.rb +8 -4
  47. data/app/models/spree/payment_method.rb +12 -13
  48. data/app/models/spree/payment_method/store_credit.rb +130 -0
  49. data/app/models/spree/preference.rb +1 -1
  50. data/app/models/spree/price.rb +16 -6
  51. data/app/models/spree/product.rb +52 -49
  52. data/app/models/spree/product/scopes.rb +7 -2
  53. data/app/models/spree/product_option_type.rb +7 -2
  54. data/app/models/spree/product_promotion_rule.rb +9 -0
  55. data/app/models/spree/product_property.rb +8 -10
  56. data/app/models/spree/promotion.rb +19 -19
  57. data/app/models/spree/promotion/rules/product.rb +3 -1
  58. data/app/models/spree/promotion/rules/taxon.rb +2 -1
  59. data/app/models/spree/promotion/rules/user.rb +4 -4
  60. data/app/models/spree/promotion_action.rb +3 -3
  61. data/app/models/spree/promotion_category.rb +1 -1
  62. data/app/models/spree/promotion_rule_taxon.rb +9 -0
  63. data/app/models/spree/promotion_rule_user.rb +9 -0
  64. data/app/models/spree/property.rb +2 -1
  65. data/app/models/spree/property_prototype.rb +9 -0
  66. data/app/models/spree/prototype.rb +8 -3
  67. data/app/models/spree/prototype_taxon.rb +9 -0
  68. data/app/models/spree/refund.rb +10 -7
  69. data/app/models/spree/refund_reason.rb +1 -1
  70. data/app/models/spree/reimbursement.rb +12 -16
  71. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +23 -6
  72. data/app/models/spree/reimbursement_type/store_credit.rb +28 -0
  73. data/app/models/spree/return_authorization.rb +8 -13
  74. data/app/models/spree/return_authorization_reason.rb +1 -1
  75. data/app/models/spree/return_item.rb +13 -12
  76. data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +1 -1
  77. data/app/models/spree/role.rb +3 -2
  78. data/app/models/spree/role_user.rb +6 -0
  79. data/app/models/spree/shipment.rb +18 -23
  80. data/app/models/spree/shipment_handler.rb +2 -2
  81. data/app/models/spree/shipping_category.rb +6 -3
  82. data/app/models/spree/shipping_method.rb +11 -10
  83. data/app/models/spree/shipping_method_zone.rb +6 -0
  84. data/app/models/spree/shipping_rate.rb +16 -29
  85. data/app/models/spree/state.rb +3 -2
  86. data/app/models/spree/state_change.rb +1 -1
  87. data/app/models/spree/stock/content_item.rb +10 -12
  88. data/app/models/spree/stock/coordinator.rb +13 -14
  89. data/app/models/spree/stock/estimator.rb +28 -30
  90. data/app/models/spree/stock/inventory_unit_builder.rb +1 -9
  91. data/app/models/spree/stock/packer.rb +1 -1
  92. data/app/models/spree/stock/quantifier.rb +5 -5
  93. data/app/models/spree/stock/splitter/backordered.rb +2 -2
  94. data/app/models/spree/stock_item.rb +12 -18
  95. data/app/models/spree/stock_location.rb +4 -7
  96. data/app/models/spree/stock_movement.rb +11 -9
  97. data/app/models/spree/stock_transfer.rb +11 -12
  98. data/app/models/spree/store.rb +14 -6
  99. data/app/models/spree/store_credit.rb +252 -0
  100. data/app/models/spree/store_credit_category.rb +22 -0
  101. data/app/models/spree/store_credit_event.rb +38 -0
  102. data/app/models/spree/store_credit_type.rb +6 -0
  103. data/app/models/spree/tax_category.rb +3 -8
  104. data/app/models/spree/tax_rate.rb +56 -122
  105. data/app/models/spree/taxon.rb +11 -5
  106. data/app/models/spree/tracker.rb +12 -1
  107. data/app/models/spree/validations/db_maximum_length_validator.rb +2 -1
  108. data/app/models/spree/variant.rb +82 -50
  109. data/app/models/spree/zone.rb +21 -17
  110. data/app/models/spree/zone_member.rb +6 -0
  111. data/app/validators/db_maximum_length_validator.rb +11 -0
  112. data/app/views/layouts/spree/base_mailer.html.erb +38 -781
  113. data/app/views/spree/order_mailer/_adjustment.html.erb +8 -0
  114. data/app/views/spree/order_mailer/_subtotal.html.erb +8 -0
  115. data/app/views/spree/order_mailer/_total.html.erb +8 -0
  116. data/app/views/spree/order_mailer/cancel_email.html.erb +13 -28
  117. data/app/views/spree/order_mailer/cancel_email.text.erb +1 -1
  118. data/app/views/spree/order_mailer/confirm_email.html.erb +49 -63
  119. data/app/views/spree/order_mailer/confirm_email.text.erb +1 -1
  120. data/app/views/spree/shared/_base_mailer_header.html.erb +5 -7
  121. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +777 -0
  122. data/app/views/spree/shared/_error_messages.html.erb +1 -1
  123. data/app/views/spree/shared/_mailer_line_item.html.erb +12 -0
  124. data/app/views/spree/shipment_mailer/shipped_email.html.erb +21 -14
  125. data/app/views/spree/shipment_mailer/shipped_email.text.erb +3 -3
  126. data/config/initializers/user_class_extensions.rb +7 -38
  127. data/config/locales/en.yml +113 -13
  128. data/config/routes.rb +7 -0
  129. data/db/default/spree/default_reimbursement_type.rb +1 -1
  130. data/db/default/spree/zones.rb +4 -5
  131. data/db/migrate/20150118210639_create_spree_store_credits.rb +24 -0
  132. data/db/migrate/20150118211500_create_spree_store_credit_categories.rb +8 -0
  133. data/db/migrate/20150118212051_create_spree_store_credit_events.rb +17 -0
  134. data/db/migrate/20150118212101_create_spree_store_credit_types.rb +10 -0
  135. data/db/migrate/20150314013438_add_missing_indexes.rb +25 -0
  136. data/db/migrate/20150317174308_remove_duplicated_indexes_from_multi_columns.rb +18 -0
  137. data/db/migrate/20150324104002_remove_user_index_from_spree_state_changes.rb +14 -0
  138. data/db/migrate/20150522071831_add_position_to_spree_payment_methods.rb +5 -0
  139. data/db/migrate/20150626181949_add_taxable_adjustment_total_to_line_item.rb +19 -0
  140. data/db/migrate/20150627090949_migrate_payment_methods_display.rb +12 -0
  141. data/db/migrate/20150714154102_spree_payment_method_store_credits.rb +12 -0
  142. data/db/migrate/20150726141425_rename_has_and_belongs_to_associations_to_model_names.rb +18 -0
  143. data/db/migrate/20150727191614_spree_store_credit_types.rb +11 -0
  144. data/db/migrate/20150819154308_add_discontinued_to_products_and_variants.rb +68 -0
  145. data/db/migrate/20151220072838_remove_shipping_method_id_from_spree_orders.rb +13 -0
  146. data/db/migrate/20160207191757_add_id_column_to_earlier_habtm_tables.rb +16 -0
  147. data/db/migrate/20160219165458_add_indexes.rb +14 -0
  148. data/lib/generators/spree/dummy/templates/rails/database.yml +31 -24
  149. data/lib/generators/spree/dummy/templates/rails/test.rb +2 -1
  150. data/lib/spree/core.rb +16 -0
  151. data/lib/spree/core/controller_helpers/auth.rb +1 -1
  152. data/lib/spree/core/controller_helpers/common.rb +3 -3
  153. data/lib/spree/core/controller_helpers/order.rb +6 -5
  154. data/lib/spree/core/controller_helpers/search.rb +1 -1
  155. data/lib/spree/core/controller_helpers/store.rb +29 -0
  156. data/lib/spree/core/delegate_belongs_to.rb +2 -2
  157. data/lib/spree/core/engine.rb +30 -25
  158. data/lib/spree/core/environment.rb +1 -1
  159. data/lib/spree/core/importer/order.rb +37 -40
  160. data/lib/spree/core/number_generator.rb +52 -0
  161. data/lib/spree/core/product_filters.rb +1 -1
  162. data/lib/spree/core/search/base.rb +4 -3
  163. data/lib/spree/core/version.rb +1 -1
  164. data/lib/spree/localized_number.rb +3 -1
  165. data/lib/spree/permitted_attributes.rb +5 -2
  166. data/lib/spree/testing_support/common_rake.rb +3 -3
  167. data/lib/spree/testing_support/factories.rb +3 -3
  168. data/lib/spree/testing_support/factories/address_factory.rb +1 -1
  169. data/lib/spree/testing_support/factories/country_factory.rb +2 -2
  170. data/lib/spree/testing_support/factories/order_factory.rb +2 -2
  171. data/lib/spree/testing_support/factories/payment_factory.rb +5 -0
  172. data/lib/spree/testing_support/factories/payment_method_factory.rb +8 -0
  173. data/lib/spree/testing_support/factories/promotion_rule_factory.rb +5 -0
  174. data/lib/spree/testing_support/factories/refund_factory.rb +9 -1
  175. data/lib/spree/testing_support/factories/return_authorization_factory.rb +2 -0
  176. data/lib/spree/testing_support/factories/state_factory.rb +2 -2
  177. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +9 -0
  178. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +8 -0
  179. data/lib/spree/testing_support/factories/store_credit_factory.rb +17 -0
  180. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +11 -0
  181. data/lib/spree/testing_support/factories/user_factory.rb +1 -1
  182. data/lib/spree/testing_support/factories/zone_member_factory.rb +6 -0
  183. data/lib/spree/testing_support/microdata.rb +189 -0
  184. data/lib/tasks/core.rake +68 -0
  185. data/lib/tasks/exchanges.rake +2 -2
  186. data/spec/fixtures/microdata.html +22 -0
  187. data/spec/fixtures/microdata_itemref.html +15 -0
  188. data/spec/fixtures/microdata_no_itemscope.html +20 -0
  189. data/spec/helpers/base_helper_spec.rb +64 -1
  190. data/spec/helpers/products_helper_spec.rb +75 -3
  191. data/spec/lib/i18n_spec.rb +2 -2
  192. data/spec/lib/search/base_spec.rb +2 -2
  193. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +4 -2
  194. data/spec/lib/spree/core/controller_helpers/store_spec.rb +56 -0
  195. data/spec/lib/spree/core/importer/order_spec.rb +226 -123
  196. data/spec/lib/spree/core/number_generator_spec.rb +175 -0
  197. data/spec/lib/spree/core_spec.rb +23 -0
  198. data/spec/lib/spree/localized_number_spec.rb +10 -0
  199. data/spec/mailers/order_mailer_spec.rb +11 -13
  200. data/spec/mailers/shipment_mailer_spec.rb +26 -8
  201. data/spec/mailers/test_mailer_spec.rb +15 -1
  202. data/spec/models/option_type_prototype_spec.rb +9 -0
  203. data/spec/models/spree/ability_spec.rb +6 -13
  204. data/spec/models/spree/address_spec.rb +1 -1
  205. data/spec/models/spree/adjustable/adjuster/base_spec.rb +10 -0
  206. data/spec/models/spree/adjustable/adjuster/promotion_spec.rb +211 -0
  207. data/spec/models/spree/adjustable/adjuster/tax_spec.rb +86 -0
  208. data/spec/models/spree/adjustable/adjustments_updater_spec.rb +2 -262
  209. data/spec/models/spree/adjustment_spec.rb +27 -1
  210. data/spec/models/spree/app_configuration_spec.rb +5 -2
  211. data/spec/models/spree/calculator/default_tax_spec.rb +39 -14
  212. data/spec/models/spree/concerns/user_methods_spec.rb +55 -0
  213. data/spec/models/spree/concerns/vat_price_calculation_spec.rb +66 -0
  214. data/spec/models/spree/country_spec.rb +45 -8
  215. data/spec/models/spree/credit_card_spec.rb +8 -8
  216. data/spec/models/spree/customer_return_spec.rb +4 -26
  217. data/spec/models/spree/gateway_spec.rb +7 -0
  218. data/spec/models/spree/image_spec.rb +3 -0
  219. data/spec/models/spree/inventory_unit_spec.rb +1 -18
  220. data/spec/models/spree/line_item_spec.rb +78 -18
  221. data/spec/models/spree/option_type_spec.rb +2 -2
  222. data/spec/models/spree/option_value_spec.rb +8 -3
  223. data/spec/models/spree/order/checkout_spec.rb +49 -39
  224. data/spec/models/spree/order/currency_updater_spec.rb +3 -3
  225. data/spec/models/spree/order/finalizing_spec.rb +0 -3
  226. data/spec/models/spree/order/payment_spec.rb +1 -1
  227. data/spec/models/spree/order/state_machine_spec.rb +1 -6
  228. data/spec/models/spree/order/store_credit_spec.rb +423 -0
  229. data/spec/models/spree/order/updating_spec.rb +2 -2
  230. data/spec/models/spree/order_contents_spec.rb +42 -1
  231. data/spec/models/spree/order_inventory_spec.rb +27 -17
  232. data/spec/models/spree/order_spec.rb +65 -52
  233. data/spec/models/spree/payment/gateway_options_spec.rb +10 -2
  234. data/spec/models/spree/payment/store_credit_spec.rb +60 -0
  235. data/spec/models/spree/payment_method/store_credit_spec.rb +291 -0
  236. data/spec/models/spree/payment_method_spec.rb +22 -14
  237. data/spec/models/spree/payment_spec.rb +37 -44
  238. data/spec/models/spree/price_spec.rb +86 -0
  239. data/spec/models/spree/product/scopes_spec.rb +35 -0
  240. data/spec/models/spree/product_option_type_spec.rb +6 -2
  241. data/spec/models/spree/product_promotion_rule_spec.rb +9 -0
  242. data/spec/models/spree/product_property_spec.rb +11 -0
  243. data/spec/models/spree/product_spec.rb +82 -15
  244. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +1 -1
  245. data/spec/models/spree/promotion/rules/user_spec.rb +8 -0
  246. data/spec/models/spree/promotion_action_spec.rb +1 -1
  247. data/spec/models/spree/promotion_rule_spec.rb +1 -1
  248. data/spec/models/spree/promotion_rule_taxon_spec.rb +9 -0
  249. data/spec/models/spree/promotion_rule_user_spec.rb +9 -0
  250. data/spec/models/spree/promotion_spec.rb +57 -36
  251. data/spec/models/spree/property_prototype_spec.rb +9 -0
  252. data/spec/models/spree/prototype_taxon_spec.rb +9 -0
  253. data/spec/models/spree/refund_reason_spec.rb +7 -0
  254. data/spec/models/spree/reimbursement_spec.rb +3 -30
  255. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +17 -5
  256. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +101 -0
  257. data/spec/models/spree/return_authorization_reason_spec.rb +7 -0
  258. data/spec/models/spree/return_authorization_spec.rb +2 -22
  259. data/spec/models/spree/return_item_spec.rb +50 -1
  260. data/spec/models/spree/returns_calculator_spec.rb +1 -1
  261. data/spec/models/spree/role_spec.rb +7 -0
  262. data/spec/models/spree/shipment_spec.rb +17 -17
  263. data/spec/models/spree/shipping_calculator_spec.rb +2 -2
  264. data/spec/models/spree/shipping_category_spec.rb +14 -0
  265. data/spec/models/spree/shipping_method_spec.rb +9 -2
  266. data/spec/models/spree/shipping_rate_spec.rb +40 -41
  267. data/spec/models/spree/state_spec.rb +12 -1
  268. data/spec/models/spree/stock/content_item_spec.rb +9 -0
  269. data/spec/models/spree/stock/estimator_spec.rb +56 -8
  270. data/spec/models/spree/stock/quantifier_spec.rb +61 -32
  271. data/spec/models/spree/stock_item_spec.rb +19 -1
  272. data/spec/models/spree/store_credit_event_spec.rb +101 -0
  273. data/spec/models/spree/store_credit_spec.rb +786 -0
  274. data/spec/models/spree/store_spec.rb +39 -11
  275. data/spec/models/spree/tax_category_spec.rb +6 -1
  276. data/spec/models/spree/tax_rate_spec.rb +204 -44
  277. data/spec/models/spree/user_spec.rb +105 -38
  278. data/spec/models/spree/variant_spec.rb +281 -9
  279. data/spec/models/spree/zone_member_spec.rb +38 -0
  280. data/spec/models/spree/zone_spec.rb +32 -8
  281. data/spec/spec_helper.rb +3 -0
  282. data/spec/support/concerns/{adjustment_source_spec.rb → adjustment_source.rb} +0 -0
  283. data/spec/support/concerns/{default_price_spec.rb → default_price.rb} +9 -0
  284. data/spec/validators/db_maximum_length_validator_spec.rb +22 -0
  285. data/spree_core.gemspec +5 -6
  286. metadata +99 -36
  287. data/CHANGELOG.md +0 -4
  288. data/app/models/concerns/spree/number_generator.rb +0 -39
  289. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +0 -24
@@ -1,9 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Spree::PaymentMethod, type: :model do
4
- describe "#available" do
4
+ context "visibility scopes" do
5
5
  before do
6
- [nil, 'both', 'front_end', 'back_end'].each do |display_on|
6
+ [nil, '', 'both', 'front_end', 'back_end'].each do |display_on|
7
7
  Spree::Gateway::Test.create(
8
8
  name: 'Display Both',
9
9
  display_on: display_on,
@@ -13,24 +13,32 @@ describe Spree::PaymentMethod, type: :model do
13
13
  end
14
14
  end
15
15
 
16
- it "should have 4 total methods" do
17
- expect(Spree::PaymentMethod.all.size).to eq(4)
16
+ it "should have 5 total methods" do
17
+ expect(Spree::PaymentMethod.count).to eq(5)
18
18
  end
19
19
 
20
- it "should return all methods available to front-end/back-end when no parameter is passed" do
21
- expect(Spree::PaymentMethod.available.size).to eq(2)
22
- end
23
-
24
- it "should return all methods available to front-end/back-end when display_on = :both" do
25
- expect(Spree::PaymentMethod.available(:both).size).to eq(2)
20
+ describe "#available" do
21
+ it "should return all methods available to front-end/back-end" do
22
+ methods = Spree::PaymentMethod.available
23
+ expect(methods.size).to eq(3)
24
+ expect(methods.pluck(:display_on)).to eq(['both', 'front_end', 'back_end'])
25
+ end
26
26
  end
27
27
 
28
- it "should return all methods available to front-end when display_on = :front_end" do
29
- expect(Spree::PaymentMethod.available(:front_end).size).to eq(2)
28
+ describe "#available_on_front_end" do
29
+ it "should return all methods available to front-end" do
30
+ methods = Spree::PaymentMethod.available_on_front_end
31
+ expect(methods.size).to eq(2)
32
+ expect(methods.pluck(:display_on)).to eq(['both', 'front_end'])
33
+ end
30
34
  end
31
35
 
32
- it "should return all methods available to back-end when display_on = :back_end" do
33
- expect(Spree::PaymentMethod.available(:back_end).size).to eq(2)
36
+ describe "#available_on_back_end" do
37
+ it "should return all methods available to back-end" do
38
+ methods = Spree::PaymentMethod.available_on_back_end
39
+ expect(methods.size).to eq(2)
40
+ expect(methods.pluck(:display_on)).to eq(['both', 'back_end'])
41
+ end
34
42
  end
35
43
  end
36
44
 
@@ -5,8 +5,8 @@ describe Spree::Payment, :type => :model do
5
5
  let(:refund_reason) { create(:refund_reason) }
6
6
 
7
7
  let(:gateway) do
8
- gateway = Spree::Gateway::Bogus.create(active: true, name: 'Bogus')
9
- allow(gateway).to receive_messages source_required: true
8
+ gateway = Spree::Gateway::Bogus.new(:active => true)
9
+ allow(gateway).to receive_messages :source_required => true
10
10
  gateway
11
11
  end
12
12
 
@@ -43,6 +43,41 @@ describe Spree::Payment, :type => :model do
43
43
  allow(payment.log_entries).to receive(:create!)
44
44
  end
45
45
 
46
+ describe 'delegate' do
47
+ it { is_expected.to delegate_method(:currency).to(:order) }
48
+ end
49
+
50
+ describe 'Constants' do
51
+ it { expect(Spree::Payment::INVALID_STATES).to eq(%w(failed invalid)) }
52
+ end
53
+
54
+ describe 'scopes' do
55
+ describe '.valid' do
56
+ let!(:invalid_payment) do
57
+ create(:payment, avs_response: 'Y', cvv_response_code: 'M', cvv_response_message: '', state: 'invalid')
58
+ end
59
+
60
+ let!(:failed_payment) do
61
+ create(:payment, avs_response: 'Y', cvv_response_code: 'M', cvv_response_message: '', state: 'failed')
62
+ end
63
+
64
+ let!(:checkout_payment) do
65
+ create(:payment, avs_response: 'A', cvv_response_code: 'M', cvv_response_message: '', state: 'checkout')
66
+ end
67
+
68
+ let!(:completed_payment) do
69
+ create(:payment, avs_response: 'Y', cvv_response_code: 'N', cvv_response_message: '', state: 'completed')
70
+ end
71
+
72
+ subject { Spree::Payment.valid }
73
+
74
+ it { is_expected.to_not include(invalid_payment) }
75
+ it { is_expected.to_not include(failed_payment) }
76
+ it { is_expected.to include(checkout_payment) }
77
+ it { is_expected.to include(completed_payment) }
78
+ end
79
+ end
80
+
46
81
  context '.risky' do
47
82
 
48
83
  let!(:payment_1) { create(:payment, avs_response: 'Y', cvv_response_code: 'M', cvv_response_message: 'Match') }
@@ -664,48 +699,6 @@ describe Spree::Payment, :type => :model do
664
699
  end
665
700
  end
666
701
 
667
- describe "#set_unique_number" do
668
- # Regression test for #1998
669
- it "sets a unique number on create" do
670
- payment.generate_number
671
- payment.save
672
-
673
- expect(payment.number).to_not be_blank
674
- expect(payment.number.length).to eq 8
675
- expect(payment.number).to be_a(String)
676
- end
677
-
678
- # Regression test for #3733
679
- it "does not regenerate the number on re-save" do
680
- payment.run_callbacks(:create)
681
- payment.save
682
- old_number = payment.number
683
- payment.save
684
- expect(payment.number).to eq old_number
685
- end
686
-
687
- context "other payment exists" do
688
- let(:other_payment) {
689
- payment = Spree::Payment.new
690
- payment.source = card
691
- payment.order = order
692
- payment.payment_method = gateway
693
- payment
694
- }
695
-
696
- it "doesn't set duplicate number" do
697
- other_payment.run_callbacks(:create)
698
- other_payment.save!
699
-
700
- payment.run_callbacks(:create)
701
- payment.save!
702
-
703
- expect(payment.number).to_not be_blank
704
- expect(payment.number).to_not eq other_payment.number
705
- end
706
- end
707
- end
708
-
709
702
  describe "#amount=" do
710
703
  before do
711
704
  subject.amount = amount
@@ -1,6 +1,34 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Spree::Price, :type => :model do
4
+ describe '#amount=' do
5
+ let(:price) { Spree::Price.new }
6
+ let(:amount) { '3,0A0' }
7
+
8
+ before do
9
+ price.amount = amount
10
+ end
11
+
12
+ it 'is expected to equal to localized number' do
13
+ expect(price.amount).to eq(Spree::LocalizedNumber.parse(amount))
14
+ end
15
+ end
16
+
17
+ describe '#price' do
18
+ let(:price) { Spree::Price.new }
19
+ let(:amount) { 3000.00 }
20
+
21
+ context 'when amount is changed' do
22
+ before do
23
+ price.amount = amount
24
+ end
25
+
26
+ it 'is expected to equal to price' do
27
+ expect(price.amount).to eq(price.price)
28
+ end
29
+ end
30
+ end
31
+
4
32
  describe 'validations' do
5
33
  let(:variant) { stub_model Spree::Variant }
6
34
  subject { Spree::Price.new variant: variant, amount: amount }
@@ -39,4 +67,62 @@ describe Spree::Price, :type => :model do
39
67
  it { is_expected.to be_valid }
40
68
  end
41
69
  end
70
+
71
+ describe '#price_including_vat_for(zone)' do
72
+ let(:variant) { stub_model Spree::Variant }
73
+ let(:default_zone) { Spree::Zone.new }
74
+ let(:zone) { Spree::Zone.new }
75
+ let(:amount) { 10 }
76
+ let(:tax_category) { Spree::TaxCategory.new }
77
+ let(:price) { Spree::Price.new variant: variant, amount: amount }
78
+ let(:price_options) { { tax_zone: zone } }
79
+
80
+ subject(:price_with_vat) { price.price_including_vat_for(price_options) }
81
+
82
+ context 'when called with a non-default zone' do
83
+ before do
84
+ allow(variant).to receive(:tax_category).and_return(tax_category)
85
+ expect(price).to receive(:default_zone).at_least(:once).and_return(default_zone)
86
+ allow(price).to receive(:apply_foreign_vat?).and_return(true)
87
+ allow(price).to receive(:included_tax_amount).with(tax_zone: default_zone, tax_category: tax_category) { 0.19 }
88
+ allow(price).to receive(:included_tax_amount).with(tax_zone: zone, tax_category: tax_category) { 0.25 }
89
+ end
90
+
91
+ it "returns the correct price including another VAT to two digits" do
92
+ expect(price_with_vat).to eq(10.50)
93
+ end
94
+ end
95
+
96
+ context 'when called from the default zone' do
97
+ before do
98
+ allow(variant).to receive(:tax_category).and_return(tax_category)
99
+ expect(price).to receive(:default_zone).at_least(:once).and_return(zone)
100
+ end
101
+
102
+ it "returns the correct price" do
103
+ expect(price).to receive(:price).and_call_original
104
+ expect(price_with_vat).to eq(10.00)
105
+ end
106
+ end
107
+
108
+ context 'when no default zone is set' do
109
+ before do
110
+ allow(variant).to receive(:tax_category).and_return(tax_category)
111
+ expect(price).to receive(:default_zone).at_least(:once).and_return(nil)
112
+ end
113
+
114
+ it "returns the correct price" do
115
+ expect(price).to receive(:price).and_call_original
116
+ expect(price.price_including_vat_for(tax_zone: zone)).to eq(10.00)
117
+ end
118
+ end
119
+ end
120
+
121
+ describe '#display_price_including_vat_for(zone)' do
122
+ subject { Spree::Price.new amount: 10 }
123
+ it 'calls #price_including_vat_for' do
124
+ expect(subject).to receive(:price_including_vat_for)
125
+ subject.display_price_including_vat_for(nil)
126
+ end
127
+ end
42
128
  end
@@ -3,6 +3,41 @@ require 'spec_helper'
3
3
  describe "Product scopes", :type => :model do
4
4
  let!(:product) { create(:product) }
5
5
 
6
+ describe '#available' do
7
+ context 'when discontinued' do
8
+ let!(:discontinued_product) { create(:product, discontinue_on: Time.current - 1.day) }
9
+
10
+ it { expect(Spree::Product.available).not_to include(discontinued_product) }
11
+ end
12
+
13
+ context 'when not discontinued' do
14
+ let!(:product_2) { create(:product, discontinue_on: Time.current + 1.day) }
15
+
16
+ it { expect(Spree::Product.available).to include(product_2) }
17
+ end
18
+
19
+ context 'when available' do
20
+ let!(:product_2) { create(:product, available_on: Time.current - 1.day) }
21
+
22
+ it { expect(Spree::Product.available).to include(product_2) }
23
+ end
24
+
25
+ context 'when not available' do
26
+ let!(:unavailable_product) { create(:product, available_on: Time.current + 1.day) }
27
+
28
+ it { expect(Spree::Product.available).not_to include(unavailable_product) }
29
+ end
30
+
31
+ context 'when multiple prices present' do
32
+ let!(:price_1) { create(:price, currency: 'EUR', variant: product.master) }
33
+ let!(:price_2) { create(:price, currency: 'EUR', variant: product.master) }
34
+
35
+ it 'should not duplicate product' do
36
+ expect(Spree::Product.available).to eq([product])
37
+ end
38
+ end
39
+ end
40
+
6
41
  context "A product assigned to parent and child taxons" do
7
42
  before do
8
43
  @taxonomy = create(:taxonomy)
@@ -1,5 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Spree::ProductOptionType, :type => :model do
4
-
3
+ describe Spree::ProductOptionType do
4
+ describe 'Validations' do
5
+ it { is_expected.to validate_presence_of(:product) }
6
+ it { is_expected.to validate_presence_of(:option_type) }
7
+ it { is_expected.to validate_uniqueness_of(:product_id).scoped_to(:option_type_id).allow_nil }
8
+ end
5
9
  end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::ProductPromotionRule do
4
+ describe 'Validations' do
5
+ it { is_expected.to validate_presence_of(:product) }
6
+ it { is_expected.to validate_presence_of(:promotion_rule) }
7
+ it { is_expected.to validate_uniqueness_of(:product_id).scoped_to(:promotion_rule_id).allow_nil }
8
+ end
9
+ end
@@ -8,4 +8,15 @@ describe Spree::ProductProperty, :type => :model do
8
8
  pp.touch
9
9
  end
10
10
  end
11
+
12
+ context 'property_name=' do
13
+ before do
14
+ @pp = create(:product_property)
15
+ end
16
+
17
+ it "should assign property" do
18
+ @pp.property_name = "Size"
19
+ expect(@pp.property.name).to eq('Size')
20
+ end
21
+ end
11
22
  end
@@ -11,6 +11,18 @@ end
11
11
 
12
12
  describe Spree::Product, :type => :model do
13
13
 
14
+ describe 'Associations' do
15
+ it 'should have many promotions' do
16
+ is_expected.to have_many(:promotions).
17
+ class_name('Spree::Promotion').through(:promotion_rules)
18
+ end
19
+
20
+ it 'should have many possible_promotions' do
21
+ is_expected.to have_many(:possible_promotions).
22
+ class_name('Spree::Promotion').through(:promotion_rules).source(:promotion)
23
+ end
24
+ end
25
+
14
26
  context 'product instance' do
15
27
  let(:product) { create(:product) }
16
28
  let(:variant) { create(:variant, :product => product) }
@@ -148,6 +160,17 @@ describe Spree::Product, :type => :model do
148
160
  end
149
161
  end
150
162
 
163
+ context "#can_supply?" do
164
+ it "should be true" do
165
+ expect(product.can_supply?).to be(true)
166
+ end
167
+
168
+ it "should be false" do
169
+ product.variants_including_master.each { |v| v.stock_items.update_all count_on_hand: 0, backorderable: false }
170
+ expect(product.can_supply?).to be(false)
171
+ end
172
+ end
173
+
151
174
  context "variants_and_option_values" do
152
175
  let!(:high) { create(:variant, product: product) }
153
176
  let!(:low) { create(:variant, product: product) }
@@ -160,15 +183,17 @@ describe Spree::Product, :type => :model do
160
183
  end
161
184
 
162
185
  describe 'Variants sorting' do
186
+ ORDER_REGEXP = /ORDER BY (\`|\")spree_variants(\`|\").(\'|\")position(\'|\") ASC/
187
+
163
188
  context 'without master variant' do
164
189
  it 'sorts variants by position' do
165
- expect(product.variants.to_sql).to match(/ORDER BY (\`|\")spree_variants(\`|\").position ASC/)
190
+ expect(product.variants.to_sql).to match(ORDER_REGEXP)
166
191
  end
167
192
  end
168
193
 
169
194
  context 'with master variant' do
170
195
  it 'sorts variants by position' do
171
- expect(product.variants_including_master.to_sql).to match(/ORDER BY (\`|\")spree_variants(\`|\").position ASC/)
196
+ expect(product.variants_including_master.to_sql).to match(ORDER_REGEXP)
172
197
  end
173
198
  end
174
199
  end
@@ -298,6 +323,22 @@ describe Spree::Product, :type => :model do
298
323
  }.to change { product.properties.length }.by(1)
299
324
  end
300
325
 
326
+ context 'optional property_presentation' do
327
+ subject { Spree::Property.where(name: 'foo').first.presentation }
328
+ let(:name) { 'foo' }
329
+ let(:presentation) { 'baz' }
330
+
331
+ describe 'is not used' do
332
+ before { product.set_property(name, 'bar') }
333
+ it { is_expected.to eq name }
334
+ end
335
+
336
+ describe 'is used' do
337
+ before { product.set_property(name, 'bar', presentation) }
338
+ it { is_expected.to eq presentation }
339
+ end
340
+ end
341
+
301
342
  # Regression test for #2455
302
343
  it "should not overwrite properties' presentation names" do
303
344
  Spree::Property.where(:name => 'foo').first_or_create!(:presentation => "Foo's Presentation Name")
@@ -309,18 +350,20 @@ describe Spree::Product, :type => :model do
309
350
 
310
351
  # Regression test for #4416
311
352
  context "#possible_promotions" do
312
- let!(:promotion) do
313
- create(:promotion, advertise: true, starts_at: 1.day.ago)
314
- end
315
- let!(:rule) do
316
- Spree::Promotion::Rules::Product.create(
317
- promotion: promotion,
318
- products: [product]
319
- )
353
+ let!(:possible_promotion) { create(:promotion, advertise: true, starts_at: 1.day.ago) }
354
+ let!(:unadvertised_promotion) { create(:promotion, advertise: false, starts_at: 1.day.ago) }
355
+ let!(:inactive_promotion) { create(:promotion, advertise: true, starts_at: 1.day.since) }
356
+
357
+ before do
358
+ product.promotion_rules.create!(promotion: possible_promotion)
359
+ product.promotion_rules.create!(promotion: unadvertised_promotion)
360
+ product.promotion_rules.create!(promotion: inactive_promotion)
320
361
  end
321
362
 
322
363
  it "lists the promotion as a possible promotion" do
323
- expect(product.possible_promotions).to include(promotion)
364
+ expect(product.possible_promotions).to include(possible_promotion)
365
+ expect(product.possible_promotions).to_not include(unadvertised_promotion)
366
+ expect(product.possible_promotions).to_not include(inactive_promotion)
324
367
  end
325
368
  end
326
369
  end
@@ -340,11 +383,9 @@ describe Spree::Product, :type => :model do
340
383
 
341
384
  context "when prototype with option types is supplied" do
342
385
  def build_option_type_with_values(name, values)
343
- ot = create(:option_type, :name => name)
344
- values.each do |val|
345
- ot.option_values.create(:name => val.downcase, :presentation => val)
386
+ values.each_with_object(create :option_type, name: name) do |val, ot|
387
+ ot.option_values.create(name: val.downcase, presentation: val)
346
388
  end
347
- ot
348
389
  end
349
390
 
350
391
  let(:prototype) do
@@ -471,4 +512,30 @@ describe Spree::Product, :type => :model do
471
512
  product = Spree::Product.new
472
513
  expect(product.master.is_master).to be true
473
514
  end
515
+
516
+ context "#discontinue!" do
517
+ let(:product) { create(:product, sku: 'a-sku') }
518
+
519
+ it "sets the discontinued" do
520
+ product.discontinue!
521
+ product.reload
522
+ expect(product.discontinued?).to be(true)
523
+ end
524
+
525
+ it "changes updated_at" do
526
+ expect { product.discontinue! }.to change { product.updated_at }
527
+ end
528
+ end
529
+
530
+ context "#discontinued?" do
531
+ let(:product_live) { build(:product, sku: "a-sku") }
532
+ it "should be false" do
533
+ expect(product_live.discontinued?).to be(false)
534
+ end
535
+
536
+ let(:product_discontinued) { build(:product, sku: "a-sku", discontinue_on: Time.now - 1.day) }
537
+ it "should be true" do
538
+ expect(product_discontinued.discontinued?).to be(true)
539
+ end
540
+ end
474
541
  end