spree_core 3.2.9 → 3.3.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (383) hide show
  1. checksums.yaml +4 -4
  2. data/app/models/concerns/spree/named_type.rb +1 -1
  3. data/app/models/concerns/spree/number_as_param.rb +9 -0
  4. data/app/models/concerns/spree/user_address.rb +4 -2
  5. data/app/models/concerns/spree/user_methods.rb +2 -3
  6. data/app/models/spree/ability.rb +1 -2
  7. data/app/models/spree/address.rb +1 -1
  8. data/app/models/spree/base.rb +2 -0
  9. data/app/models/spree/calculator.rb +1 -1
  10. data/app/models/spree/calculator/percent_per_item.rb +4 -3
  11. data/app/models/spree/calculator/returns/default_refund_amount.rb +16 -14
  12. data/app/models/spree/country.rb +1 -1
  13. data/app/models/spree/credit_card.rb +26 -21
  14. data/app/models/spree/customer_return.rb +2 -2
  15. data/app/models/spree/exchange.rb +7 -2
  16. data/app/models/spree/image.rb +1 -1
  17. data/app/models/spree/inventory_unit.rb +39 -3
  18. data/app/models/spree/line_item.rb +2 -7
  19. data/app/models/spree/option_type.rb +1 -1
  20. data/app/models/spree/option_type_prototype.rb +1 -1
  21. data/app/models/spree/option_value.rb +1 -1
  22. data/app/models/spree/option_value_variant.rb +3 -0
  23. data/app/models/spree/order.rb +82 -81
  24. data/app/models/spree/order/checkout.rb +23 -33
  25. data/app/models/spree/order/currency_updater.rb +1 -1
  26. data/app/models/spree/order/payments.rb +1 -1
  27. data/app/models/spree/order/store_credit.rb +6 -1
  28. data/app/models/spree/order_contents.rb +14 -2
  29. data/app/models/spree/order_inventory.rb +64 -60
  30. data/app/models/spree/payment.rb +8 -13
  31. data/app/models/spree/payment/processing.rb +2 -2
  32. data/app/models/spree/payment_method.rb +4 -2
  33. data/app/models/spree/preference.rb +1 -1
  34. data/app/models/spree/preferences/preferable.rb +1 -1
  35. data/app/models/spree/product.rb +1 -1
  36. data/app/models/spree/product/scopes.rb +2 -2
  37. data/app/models/spree/promotion.rb +2 -2
  38. data/app/models/spree/promotion/rules/option_value.rb +13 -5
  39. data/app/models/spree/promotion_rule_user.rb +1 -1
  40. data/app/models/spree/property_prototype.rb +1 -1
  41. data/app/models/spree/prototype_taxon.rb +1 -1
  42. data/app/models/spree/refund.rb +2 -2
  43. data/app/models/spree/reimbursement.rb +2 -1
  44. data/app/models/spree/reimbursement_type.rb +1 -1
  45. data/app/models/spree/return_authorization.rb +1 -0
  46. data/app/models/spree/return_item.rb +35 -9
  47. data/app/models/spree/role.rb +1 -1
  48. data/app/models/spree/role_user.rb +1 -1
  49. data/app/models/spree/shipment.rb +63 -64
  50. data/app/models/spree/shipment_handler.rb +1 -1
  51. data/app/models/spree/shipping_category.rb +1 -1
  52. data/app/models/spree/shipping_method.rb +12 -10
  53. data/app/models/spree/state_change.rb +1 -1
  54. data/app/models/spree/stock/adjuster.rb +35 -14
  55. data/app/models/spree/stock/availability_validator.rb +1 -1
  56. data/app/models/spree/stock/content_item.rb +9 -8
  57. data/app/models/spree/stock/coordinator.rb +3 -9
  58. data/app/models/spree/stock/estimator.rb +1 -1
  59. data/app/models/spree/stock/inventory_unit_builder.rb +10 -9
  60. data/app/models/spree/stock/package.rb +6 -6
  61. data/app/models/spree/stock/packer.rb +8 -15
  62. data/app/models/spree/stock/prioritizer.rb +13 -10
  63. data/app/models/spree/stock/splitter/weight.rb +62 -10
  64. data/app/models/spree/stock_item.rb +42 -29
  65. data/app/models/spree/stock_location.rb +5 -1
  66. data/app/models/spree/stock_movement.rb +1 -2
  67. data/app/models/spree/stock_transfer.rb +2 -3
  68. data/app/models/spree/store.rb +1 -1
  69. data/app/models/spree/store_credit.rb +9 -6
  70. data/app/models/spree/store_credit_category.rb +1 -1
  71. data/app/models/spree/tax_category.rb +1 -1
  72. data/app/models/spree/tax_rate.rb +1 -1
  73. data/app/models/spree/taxon.rb +5 -2
  74. data/app/models/spree/taxonomy.rb +1 -1
  75. data/app/models/spree/tracker.rb +1 -1
  76. data/app/models/spree/variant.rb +4 -3
  77. data/app/models/spree/zone.rb +19 -21
  78. data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +61 -0
  79. data/config/locales/en.yml +7 -6
  80. data/db/migrate/20130807024301_upgrade_adjustments.rb +6 -0
  81. data/db/migrate/20130807024302_rename_adjustment_fields.rb +6 -0
  82. data/db/migrate/20161125065505_add_quantity_to_inventory_units.rb +5 -0
  83. data/db/migrate/20170119122701_add_original_return_item_id_to_spree_inventory_units.rb +29 -0
  84. data/db/migrate/20170315152755_add_unique_index_on_number_to_spree_orders.rb +16 -0
  85. data/db/migrate/20170316154338_add_unique_index_on_number_to_spree_stock_transfer.rb +16 -0
  86. data/db/migrate/20170316205511_add_unique_index_on_number_to_spree_shipment.rb +16 -0
  87. data/db/migrate/20170320134043_add_unique_index_on_number_to_spree_payments.rb +17 -0
  88. data/db/migrate/20170320142750_add_unique_index_on_number_to_spree_return_authorizations.rb +16 -0
  89. data/db/migrate/20170320145040_add_unique_index_on_number_to_spree_customer_returns.rb +16 -0
  90. data/db/migrate/20170320145518_add_unique_index_on_number_to_spree_reimbursements.rb +16 -0
  91. data/db/migrate/20170323151450_add_missing_unique_indexes_for_unique_attributes.rb +37 -0
  92. data/db/migrate/20170329110859_add_index_on_stock_location_to_spree_customer_returns.rb +5 -0
  93. data/db/migrate/20170329113917_add_index_on_prototype_to_spree_option_type_prototype.rb +19 -0
  94. data/db/migrate/20170330082155_add_indexes_to_spree_option_value_variant.rb +19 -0
  95. data/db/migrate/20170330132215_add_index_on_promotion_id_to_order_promotions.rb +5 -0
  96. data/db/migrate/20170331101758_add_indexes_for_property_prototype.rb +20 -0
  97. data/db/migrate/20170331103334_add_index_for_prototype_id_to_prototype_taxons.rb +5 -0
  98. data/db/migrate/20170331110454_add_indexes_to_refunds.rb +6 -0
  99. data/db/migrate/20170331111757_add_indexes_to_reimbursement_credits.rb +6 -0
  100. data/db/migrate/20170331115246_add_indexes_to_return_authorizations.rb +6 -0
  101. data/db/migrate/20170331120125_add_indexes_to_return_items.rb +11 -0
  102. data/db/migrate/20170331121725_add_index_to_role_users.rb +18 -0
  103. data/db/migrate/20170331123625_add_index_to_shipping_method_categories.rb +5 -0
  104. data/db/migrate/20170331123832_add_index_to_shipping_method_zones.rb +20 -0
  105. data/db/migrate/20170331124251_add_index_to_spree_shipping_rates.rb +6 -0
  106. data/db/migrate/20170331124513_add_index_to_spree_stock_items.rb +5 -0
  107. data/db/migrate/20170331124924_add_index_to_spree_stock_movement.rb +5 -0
  108. data/db/migrate/20170413211707_change_indexes_on_friendly_id_slugs.rb +10 -0
  109. data/lib/generators/spree/install/install_generator.rb +41 -36
  110. data/lib/spree/core.rb +0 -1
  111. data/lib/spree/core/engine.rb +3 -3
  112. data/lib/spree/core/importer/order.rb +23 -19
  113. data/lib/spree/core/number_generator.rb +3 -5
  114. data/lib/spree/core/product_duplicator.rb +7 -3
  115. data/lib/spree/core/search/base.rb +1 -0
  116. data/lib/spree/core/validators/email.rb +1 -1
  117. data/lib/spree/core/version.rb +1 -1
  118. data/lib/spree/money.rb +1 -15
  119. data/lib/spree/permitted_attributes.rb +1 -1
  120. data/lib/spree/testing_support/common_rake.rb +0 -2
  121. data/lib/spree/testing_support/factories.rb +3 -3
  122. data/lib/spree/testing_support/factories/address_factory.rb +1 -1
  123. data/lib/spree/testing_support/factories/adjustment_factory.rb +1 -1
  124. data/lib/spree/testing_support/factories/calculator_factory.rb +1 -1
  125. data/lib/spree/testing_support/factories/country_factory.rb +1 -1
  126. data/lib/spree/testing_support/factories/credit_card_factory.rb +1 -1
  127. data/lib/spree/testing_support/factories/customer_return_factory.rb +1 -1
  128. data/lib/spree/testing_support/factories/image_factory.rb +1 -1
  129. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +1 -1
  130. data/lib/spree/testing_support/factories/line_item_factory.rb +1 -1
  131. data/lib/spree/testing_support/factories/options_factory.rb +1 -1
  132. data/lib/spree/testing_support/factories/order_factory.rb +7 -1
  133. data/lib/spree/testing_support/factories/payment_factory.rb +1 -1
  134. data/lib/spree/testing_support/factories/payment_method_factory.rb +1 -1
  135. data/lib/spree/testing_support/factories/price_factory.rb +1 -1
  136. data/lib/spree/testing_support/factories/product_factory.rb +1 -1
  137. data/lib/spree/testing_support/factories/product_option_type_factory.rb +1 -1
  138. data/lib/spree/testing_support/factories/product_property_factory.rb +1 -1
  139. data/lib/spree/testing_support/factories/promotion_category_factory.rb +1 -1
  140. data/lib/spree/testing_support/factories/promotion_factory.rb +1 -1
  141. data/lib/spree/testing_support/factories/promotion_rule_factory.rb +1 -1
  142. data/lib/spree/testing_support/factories/property_factory.rb +1 -1
  143. data/lib/spree/testing_support/factories/prototype_factory.rb +1 -1
  144. data/lib/spree/testing_support/factories/refund_factory.rb +1 -1
  145. data/lib/spree/testing_support/factories/reimbursement_factory.rb +1 -1
  146. data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +1 -1
  147. data/lib/spree/testing_support/factories/return_authorization_factory.rb +1 -1
  148. data/lib/spree/testing_support/factories/return_item_factory.rb +1 -1
  149. data/lib/spree/testing_support/factories/role_factory.rb +1 -1
  150. data/lib/spree/testing_support/factories/shipment_factory.rb +1 -1
  151. data/lib/spree/testing_support/factories/shipping_category_factory.rb +1 -1
  152. data/lib/spree/testing_support/factories/shipping_method_factory.rb +2 -1
  153. data/lib/spree/testing_support/factories/state_factory.rb +1 -1
  154. data/lib/spree/testing_support/factories/stock_factory.rb +1 -1
  155. data/lib/spree/testing_support/factories/stock_item_factory.rb +1 -1
  156. data/lib/spree/testing_support/factories/stock_location_factory.rb +1 -1
  157. data/lib/spree/testing_support/factories/stock_movement_factory.rb +1 -1
  158. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +1 -1
  159. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +1 -1
  160. data/lib/spree/testing_support/factories/store_credit_factory.rb +1 -1
  161. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +1 -1
  162. data/lib/spree/testing_support/factories/store_factory.rb +1 -1
  163. data/lib/spree/testing_support/factories/tag_factory.rb +1 -1
  164. data/lib/spree/testing_support/factories/tax_category_factory.rb +1 -1
  165. data/lib/spree/testing_support/factories/tax_rate_factory.rb +1 -1
  166. data/lib/spree/testing_support/factories/taxon_factory.rb +2 -2
  167. data/lib/spree/testing_support/factories/taxonomy_factory.rb +2 -2
  168. data/lib/spree/testing_support/factories/tracker_factory.rb +1 -1
  169. data/lib/spree/testing_support/factories/user_factory.rb +1 -1
  170. data/lib/spree/testing_support/factories/variant_factory.rb +1 -1
  171. data/lib/spree/testing_support/factories/zone_factory.rb +1 -1
  172. data/lib/spree/testing_support/factories/zone_member_factory.rb +1 -1
  173. data/lib/spree/testing_support/microdata.rb +3 -0
  174. data/lib/spree/testing_support/order_walkthrough.rb +9 -9
  175. data/lib/tasks/exchanges.rake +8 -10
  176. data/spec/helpers/base_helper_spec.rb +200 -0
  177. data/spec/helpers/products_helper_spec.rb +289 -0
  178. data/spec/lib/calculated_adjustments_spec.rb +7 -0
  179. data/spec/lib/i18n_spec.rb +123 -0
  180. data/spec/lib/search/base_spec.rb +86 -0
  181. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +103 -0
  182. data/spec/lib/spree/core/controller_helpers/order_spec.rb +110 -0
  183. data/spec/lib/spree/core/controller_helpers/search_spec.rb +17 -0
  184. data/spec/lib/spree/core/controller_helpers/store_spec.rb +72 -0
  185. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +39 -0
  186. data/spec/lib/spree/core/delegate_belongs_to_spec.rb +22 -0
  187. data/spec/lib/spree/core/importer/order_spec.rb +607 -0
  188. data/spec/lib/spree/core/number_generator_spec.rb +139 -0
  189. data/spec/lib/spree/core/token_generator_spec.rb +24 -0
  190. data/spec/lib/spree/core/validators/email_spec.rb +54 -0
  191. data/spec/lib/spree/core_spec.rb +23 -0
  192. data/spec/lib/spree/localized_number_spec.rb +54 -0
  193. data/spec/lib/spree/migrations_spec.rb +36 -0
  194. data/spec/lib/spree/money_spec.rb +122 -0
  195. data/spec/lib/tasks/exchanges_spec.rb +136 -0
  196. data/spec/mailers/order_mailer_spec.rb +122 -0
  197. data/spec/mailers/reimbursement_mailer_spec.rb +52 -0
  198. data/spec/mailers/shipment_mailer_spec.rb +81 -0
  199. data/spec/mailers/test_mailer_spec.rb +38 -0
  200. data/spec/models/spree/ability_spec.rb +251 -0
  201. data/spec/models/spree/address_spec.rb +402 -0
  202. data/spec/models/spree/adjustable/adjuster/base_spec.rb +10 -0
  203. data/spec/models/spree/adjustable/adjuster/promotion_spec.rb +211 -0
  204. data/spec/models/spree/adjustable/adjuster/tax_spec.rb +86 -0
  205. data/spec/models/spree/adjustable/adjustments_updater_spec.rb +26 -0
  206. data/spec/models/spree/adjustment_spec.rb +189 -0
  207. data/spec/models/spree/app_configuration_spec.rb +26 -0
  208. data/spec/models/spree/asset_spec.rb +28 -0
  209. data/spec/models/spree/calculator/default_tax_spec.rb +152 -0
  210. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +25 -0
  211. data/spec/models/spree/calculator/flat_rate_spec.rb +47 -0
  212. data/spec/models/spree/calculator/flexi_rate_spec.rb +41 -0
  213. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +15 -0
  214. data/spec/models/spree/calculator/price_sack_spec.rb +30 -0
  215. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +47 -0
  216. data/spec/models/spree/calculator/shipping.rb +8 -0
  217. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +23 -0
  218. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +13 -0
  219. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +52 -0
  220. data/spec/models/spree/calculator/shipping/per_item_spec.rb +20 -0
  221. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +29 -0
  222. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +40 -0
  223. data/spec/models/spree/calculator/tiered_percent_spec.rb +51 -0
  224. data/spec/models/spree/calculator_spec.rb +69 -0
  225. data/spec/models/spree/classification_spec.rb +93 -0
  226. data/spec/models/spree/concerns/display_money_spec.rb +43 -0
  227. data/spec/models/spree/concerns/user_methods_spec.rb +82 -0
  228. data/spec/models/spree/concerns/vat_price_calculation_spec.rb +66 -0
  229. data/spec/models/spree/country_spec.rb +55 -0
  230. data/spec/models/spree/credit_card_spec.rb +328 -0
  231. data/spec/models/spree/customer_return_spec.rb +240 -0
  232. data/spec/models/spree/exchange_spec.rb +75 -0
  233. data/spec/models/spree/gateway/bogus_simple.rb +20 -0
  234. data/spec/models/spree/gateway/bogus_spec.rb +13 -0
  235. data/spec/models/spree/gateway_spec.rb +61 -0
  236. data/spec/models/spree/image_spec.rb +8 -0
  237. data/spec/models/spree/inventory_unit_spec.rb +256 -0
  238. data/spec/models/spree/line_item_spec.rb +348 -0
  239. data/spec/models/spree/option_type_prototype_spec.rb +9 -0
  240. data/spec/models/spree/option_type_spec.rb +14 -0
  241. data/spec/models/spree/option_value_spec.rb +18 -0
  242. data/spec/models/spree/order/address_spec.rb +50 -0
  243. data/spec/models/spree/order/adjustments_spec.rb +29 -0
  244. data/spec/models/spree/order/callbacks_spec.rb +42 -0
  245. data/spec/models/spree/order/checkout_spec.rb +770 -0
  246. data/spec/models/spree/order/currency_updater_spec.rb +32 -0
  247. data/spec/models/spree/order/finalizing_spec.rb +114 -0
  248. data/spec/models/spree/order/helpers_spec.rb +5 -0
  249. data/spec/models/spree/order/payment_spec.rb +214 -0
  250. data/spec/models/spree/order/risk_assessment_spec.rb +84 -0
  251. data/spec/models/spree/order/shipments_spec.rb +43 -0
  252. data/spec/models/spree/order/state_machine_spec.rb +212 -0
  253. data/spec/models/spree/order/store_credit_spec.rb +457 -0
  254. data/spec/models/spree/order/tax_spec.rb +84 -0
  255. data/spec/models/spree/order/totals_spec.rb +24 -0
  256. data/spec/models/spree/order/updating_spec.rb +18 -0
  257. data/spec/models/spree/order/validations_spec.rb +15 -0
  258. data/spec/models/spree/order_contents_spec.rb +332 -0
  259. data/spec/models/spree/order_inventory_spec.rb +247 -0
  260. data/spec/models/spree/order_merger_spec.rb +135 -0
  261. data/spec/models/spree/order_spec.rb +1067 -0
  262. data/spec/models/spree/order_updater_spec.rb +305 -0
  263. data/spec/models/spree/payment/gateway_options_spec.rb +127 -0
  264. data/spec/models/spree/payment/store_credit_spec.rb +60 -0
  265. data/spec/models/spree/payment_method/store_credit_spec.rb +291 -0
  266. data/spec/models/spree/payment_method_spec.rb +108 -0
  267. data/spec/models/spree/payment_spec.rb +922 -0
  268. data/spec/models/spree/preference_spec.rb +80 -0
  269. data/spec/models/spree/preferences/configuration_spec.rb +30 -0
  270. data/spec/models/spree/preferences/preferable_spec.rb +344 -0
  271. data/spec/models/spree/preferences/scoped_store_spec.rb +58 -0
  272. data/spec/models/spree/preferences/store_spec.rb +46 -0
  273. data/spec/models/spree/price_spec.rb +128 -0
  274. data/spec/models/spree/product/scopes_spec.rb +174 -0
  275. data/spec/models/spree/product_duplicator_spec.rb +102 -0
  276. data/spec/models/spree/product_filter_spec.rb +26 -0
  277. data/spec/models/spree/product_option_type_spec.rb +9 -0
  278. data/spec/models/spree/product_promotion_rule_spec.rb +9 -0
  279. data/spec/models/spree/product_property_spec.rb +26 -0
  280. data/spec/models/spree/product_spec.rb +626 -0
  281. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +113 -0
  282. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +148 -0
  283. data/spec/models/spree/promotion/actions/create_line_items_spec.rb +86 -0
  284. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +36 -0
  285. data/spec/models/spree/promotion/rules/country_spec.rb +36 -0
  286. data/spec/models/spree/promotion/rules/first_order_spec.rb +75 -0
  287. data/spec/models/spree/promotion/rules/item_total_spec.rb +282 -0
  288. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +42 -0
  289. data/spec/models/spree/promotion/rules/option_value_spec.rb +90 -0
  290. data/spec/models/spree/promotion/rules/product_spec.rb +143 -0
  291. data/spec/models/spree/promotion/rules/taxon_spec.rb +102 -0
  292. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +27 -0
  293. data/spec/models/spree/promotion/rules/user_spec.rb +45 -0
  294. data/spec/models/spree/promotion_action_spec.rb +10 -0
  295. data/spec/models/spree/promotion_category_spec.rb +17 -0
  296. data/spec/models/spree/promotion_handler/cart_spec.rb +102 -0
  297. data/spec/models/spree/promotion_handler/coupon_spec.rb +323 -0
  298. data/spec/models/spree/promotion_handler/free_shipping_spec.rb +48 -0
  299. data/spec/models/spree/promotion_handler/page_spec.rb +44 -0
  300. data/spec/models/spree/promotion_rule_spec.rb +29 -0
  301. data/spec/models/spree/promotion_rule_taxon_spec.rb +9 -0
  302. data/spec/models/spree/promotion_rule_user_spec.rb +9 -0
  303. data/spec/models/spree/promotion_spec.rb +674 -0
  304. data/spec/models/spree/property_prototype_spec.rb +9 -0
  305. data/spec/models/spree/property_spec.rb +5 -0
  306. data/spec/models/spree/prototype_spec.rb +5 -0
  307. data/spec/models/spree/prototype_taxon_spec.rb +9 -0
  308. data/spec/models/spree/refund_reason_spec.rb +20 -0
  309. data/spec/models/spree/refund_spec.rb +195 -0
  310. data/spec/models/spree/reimbursement/credit_spec.rb +36 -0
  311. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +140 -0
  312. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +83 -0
  313. data/spec/models/spree/reimbursement_performer_spec.rb +30 -0
  314. data/spec/models/spree/reimbursement_spec.rb +188 -0
  315. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +63 -0
  316. data/spec/models/spree/reimbursement_type/credit_spec.rb +53 -0
  317. data/spec/models/spree/reimbursement_type/exchange_spec.rb +46 -0
  318. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +55 -0
  319. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +101 -0
  320. data/spec/models/spree/return_authorization_reason_spec.rb +7 -0
  321. data/spec/models/spree/return_authorization_spec.rb +230 -0
  322. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +77 -0
  323. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +58 -0
  324. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +61 -0
  325. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +32 -0
  326. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +29 -0
  327. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +35 -0
  328. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +65 -0
  329. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +43 -0
  330. data/spec/models/spree/return_item_spec.rb +734 -0
  331. data/spec/models/spree/returns_calculator_spec.rb +14 -0
  332. data/spec/models/spree/role_spec.rb +7 -0
  333. data/spec/models/spree/shipment_spec.rb +744 -0
  334. data/spec/models/spree/shipping_calculator_spec.rb +45 -0
  335. data/spec/models/spree/shipping_category_spec.rb +19 -0
  336. data/spec/models/spree/shipping_method_spec.rb +125 -0
  337. data/spec/models/spree/shipping_rate_spec.rb +140 -0
  338. data/spec/models/spree/state_spec.rb +29 -0
  339. data/spec/models/spree/stock/availability_validator_spec.rb +42 -0
  340. data/spec/models/spree/stock/content_item_spec.rb +31 -0
  341. data/spec/models/spree/stock/coordinator_spec.rb +61 -0
  342. data/spec/models/spree/stock/differentiator_spec.rb +39 -0
  343. data/spec/models/spree/stock/estimator_spec.rb +202 -0
  344. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +37 -0
  345. data/spec/models/spree/stock/package_spec.rb +182 -0
  346. data/spec/models/spree/stock/packer_spec.rb +70 -0
  347. data/spec/models/spree/stock/prioritizer_spec.rb +125 -0
  348. data/spec/models/spree/stock/quantifier_spec.rb +126 -0
  349. data/spec/models/spree/stock/splitter/backordered_spec.rb +29 -0
  350. data/spec/models/spree/stock/splitter/base_spec.rb +21 -0
  351. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +47 -0
  352. data/spec/models/spree/stock/splitter/weight_spec.rb +32 -0
  353. data/spec/models/spree/stock_item_spec.rb +465 -0
  354. data/spec/models/spree/stock_location_spec.rb +243 -0
  355. data/spec/models/spree/stock_movement_spec.rb +120 -0
  356. data/spec/models/spree/stock_transfer_spec.rb +50 -0
  357. data/spec/models/spree/store_credit_event_spec.rb +101 -0
  358. data/spec/models/spree/store_credit_spec.rb +798 -0
  359. data/spec/models/spree/store_spec.rb +78 -0
  360. data/spec/models/spree/tax_category_spec.rb +32 -0
  361. data/spec/models/spree/tax_rate_spec.rb +561 -0
  362. data/spec/models/spree/taxon_spec.rb +93 -0
  363. data/spec/models/spree/taxonomy_spec.rb +18 -0
  364. data/spec/models/spree/tracker_spec.rb +21 -0
  365. data/spec/models/spree/user_spec.rb +203 -0
  366. data/spec/models/spree/variant_spec.rb +818 -0
  367. data/spec/models/spree/zone_member_spec.rb +38 -0
  368. data/spec/models/spree/zone_spec.rb +472 -0
  369. data/spec/spec_helper.rb +82 -0
  370. data/spec/support/big_decimal.rb +5 -0
  371. data/spec/support/concerns/adjustment_source.rb +23 -0
  372. data/spec/support/concerns/default_price.rb +37 -0
  373. data/spec/support/rake.rb +13 -0
  374. data/spec/support/test_gateway.rb +2 -0
  375. data/spree_core.gemspec +13 -13
  376. metadata +252 -45
  377. data/app/models/concerns/spree/user_api_authentication.rb +0 -19
  378. data/app/models/spree/calculator/free_shipping.rb +0 -23
  379. data/config/initializers/premailer_rails.rb +0 -3
  380. data/config/initializers/user_class_extensions.rb +0 -10
  381. data/spec/fixtures/microdata.html +0 -22
  382. data/spec/fixtures/microdata_itemref.html +0 -15
  383. data/spec/fixtures/microdata_no_itemscope.html +0 -20
@@ -2,23 +2,21 @@ namespace :exchanges do
2
2
  desc %q{Takes unreturned exchanged items and creates a new order to charge
3
3
  the customer for not returning them}
4
4
  task charge_unreturned_items: :environment do
5
-
6
- unreturned_return_items = Spree::ReturnItem.awaiting_return.exchange_processed.joins(:exchange_inventory_unit).where([
5
+ unreturned_return_items_scope = Spree::ReturnItem.awaiting_return.exchange_processed
6
+ unreturned_return_items = unreturned_return_items_scope.joins(:exchange_inventory_units).where([
7
7
  "spree_inventory_units.created_at < :days_ago AND spree_inventory_units.state = :iu_state",
8
8
  days_ago: Spree::Config[:expedited_exchanges_days_window].days.ago, iu_state: "shipped"
9
- ]).to_a
9
+ ]).distinct.to_a
10
10
 
11
11
  # Determine that a return item has already been deemed unreturned and therefore charged
12
12
  # by the fact that its exchange inventory unit has popped off to a different order
13
- unreturned_return_items.select! { |ri| ri.inventory_unit.order_id == ri.exchange_inventory_unit.order_id }
13
+ unreturned_return_items.select! { |ri| ri.exchange_inventory_units.exists?(order_id: ri.inventory_unit.order_id) }
14
14
 
15
15
  failed_orders = []
16
16
 
17
- unreturned_return_items.group_by(&:exchange_shipment).each do |shipment, return_items|
17
+ unreturned_return_items.group_by(&:exchange_shipments).each do |shipments, return_items|
18
18
  begin
19
- inventory_units = return_items.map(&:exchange_inventory_unit)
20
-
21
- original_order = shipment.order
19
+ original_order = shipments.first.order
22
20
  order_attributes = {
23
21
  bill_address: original_order.bill_address,
24
22
  ship_address: original_order.ship_address,
@@ -30,7 +28,7 @@ namespace :exchanges do
30
28
  order.associate_user!(original_order.user) if original_order.user
31
29
 
32
30
  return_items.group_by(&:exchange_variant).map do |variant, variant_return_items|
33
- variant_inventory_units = variant_return_items.map(&:exchange_inventory_unit)
31
+ variant_inventory_units = variant_return_items.map(&:exchange_inventory_units).flatten
34
32
  line_item = Spree::LineItem.create!(variant: variant, quantity: variant_return_items.count, order: order)
35
33
  variant_inventory_units.each { |i| i.update_attributes!(line_item_id: line_item.id, order_id: order.id) }
36
34
  end
@@ -50,7 +48,7 @@ namespace :exchanges do
50
48
  # the order builds a shipment on its own on transition to delivery, but we want
51
49
  # the original exchange shipment, not the built one
52
50
  order.shipments.destroy_all
53
- shipment.update_attributes!(order_id: order.id)
51
+ shipments.each { |shipment| shipment.update_attributes!(order_id: order.id) }
54
52
  order.update_attributes!(state: "confirm")
55
53
 
56
54
  order.reload.next!
@@ -0,0 +1,200 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::BaseHelper, type: :helper do
4
+ include Spree::BaseHelper
5
+
6
+ let(:current_store){ create :store }
7
+
8
+ context "available_countries" do
9
+ let(:country) { create(:country) }
10
+
11
+ before do
12
+ 3.times { create(:country) }
13
+ end
14
+
15
+ context "with no checkout zone defined" do
16
+ before do
17
+ Spree::Config[:checkout_zone] = nil
18
+ end
19
+
20
+ it "return complete list of countries" do
21
+ expect(available_countries.count).to eq(Spree::Country.count)
22
+ end
23
+ end
24
+
25
+ context "with a checkout zone defined" do
26
+ context "checkout zone is of type country" do
27
+ before do
28
+ @country_zone = create(:zone, name: "CountryZone")
29
+ @country_zone.members.create(zoneable: country)
30
+ Spree::Config[:checkout_zone] = @country_zone.name
31
+ end
32
+
33
+ it "return only the countries defined by the checkout zone" do
34
+ expect(available_countries).to eq([country])
35
+ end
36
+ end
37
+
38
+ context "checkout zone is of type state" do
39
+ before do
40
+ state_zone = create(:zone, name: "StateZone")
41
+ state = create(:state, country: country)
42
+ state_zone.members.create(zoneable: state)
43
+ Spree::Config[:checkout_zone] = state_zone.name
44
+ end
45
+
46
+ it "return complete list of countries" do
47
+ expect(available_countries.count).to eq(Spree::Country.count)
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ # Regression test for #1436
54
+ context "defining custom image helpers" do
55
+ let(:product) { mock_model(Spree::Product, images: [], variant_images: []) }
56
+ before do
57
+ Spree::Image.class_eval do
58
+ attachment_definitions[:attachment][:styles].merge!({very_strange: '1x1'})
59
+ end
60
+ end
61
+
62
+ it "should not raise errors when style exists" do
63
+ expect { very_strange_image(product) }.not_to raise_error
64
+ end
65
+
66
+ it "should raise NoMethodError when style is not exists" do
67
+ expect { another_strange_image(product) }.to raise_error(NoMethodError)
68
+ end
69
+ end
70
+
71
+ context "link_to_tracking" do
72
+ it "returns tracking link if available" do
73
+ a = link_to_tracking_html(shipping_method: true, tracking: '123', tracking_url: 'http://g.c/?t=123').css('a')
74
+
75
+ expect(a.text).to eq '123'
76
+ expect(a.attr('href').value).to eq 'http://g.c/?t=123'
77
+ end
78
+
79
+ it "returns tracking without link if link unavailable" do
80
+ html = link_to_tracking_html(shipping_method: true, tracking: '123', tracking_url: nil)
81
+ expect(html.css('span').text).to eq '123'
82
+ end
83
+
84
+ it "returns nothing when no shipping method" do
85
+ html = link_to_tracking_html(shipping_method: nil, tracking: '123')
86
+ expect(html.css('span').text).to eq ''
87
+ end
88
+
89
+ it "returns nothing when no tracking" do
90
+ html = link_to_tracking_html(tracking: nil)
91
+ expect(html.css('span').text).to eq ''
92
+ end
93
+
94
+ def link_to_tracking_html(options = {})
95
+ node = link_to_tracking(double(:shipment, options))
96
+ Nokogiri::HTML(node.to_s)
97
+ end
98
+ end
99
+
100
+ # Regression test for #2396
101
+ context "meta_data_tags" do
102
+ it "truncates a product description to 160 characters" do
103
+ # Because the controller_name method returns "test"
104
+ # controller_name is used by this method to infer what it is supposed
105
+ # to be generating meta_data_tags for
106
+ text = FFaker::Lorem.paragraphs(2).join(" ")
107
+ @test = Spree::Product.new(description: text)
108
+ tags = Nokogiri::HTML.parse(meta_data_tags)
109
+ content = tags.css("meta[name=description]").first["content"]
110
+ assert content.length <= 160, "content length is not truncated to 160 characters"
111
+ end
112
+ end
113
+
114
+ # Regression test for #5384
115
+ context "custom image helpers conflict with inproper statements" do
116
+ let(:product) { mock_model(Spree::Product, images: [], variant_images: []) }
117
+ before do
118
+ Spree::Image.class_eval do
119
+ attachment_definitions[:attachment][:styles].merge!({foobar: '1x1'})
120
+ end
121
+ end
122
+
123
+ it "should not raise errors when helper method called" do
124
+ expect { foobar_image(product) }.not_to raise_error
125
+ end
126
+
127
+ it "should raise NoMethodError when statement with name equal to style name called" do
128
+ expect { foobar(product) }.to raise_error(NoMethodError)
129
+ end
130
+ end
131
+
132
+ context "pretty_time" do
133
+ it "prints in a format" do
134
+ expect(pretty_time(DateTime.new(2012, 5, 6, 13, 33))).to eq "May 06, 2012 1:33 PM"
135
+ end
136
+ end
137
+
138
+ describe "#display_price" do
139
+ let!(:product) { create(:product) }
140
+ let(:current_currency) { "USD" }
141
+ let(:current_price_options) { { tax_zone: current_tax_zone } }
142
+
143
+ context "when there is no current order" do
144
+ let (:current_tax_zone) { nil }
145
+
146
+ it "returns the price including default vat" do
147
+ expect(display_price(product)).to eq("$19.99")
148
+ end
149
+
150
+ context "with a default VAT" do
151
+ let(:current_tax_zone) { create(:zone_with_country, default_tax: true) }
152
+ let!(:tax_rate) do
153
+ create :tax_rate,
154
+ included_in_price: true,
155
+ zone: current_tax_zone,
156
+ tax_category: product.tax_category,
157
+ amount: 0.2
158
+ end
159
+
160
+ it "returns the price adding the VAT" do
161
+ expect(display_price(product)).to eq("$19.99")
162
+ end
163
+ end
164
+ end
165
+
166
+ context "with an order that has a tax zone" do
167
+ let(:current_tax_zone) { create(:zone_with_country) }
168
+ let(:current_order) { Spree::Order.new }
169
+ let(:default_zone) { create(:zone_with_country, default_tax: true) }
170
+
171
+ let!(:default_vat) do
172
+ create :tax_rate,
173
+ included_in_price: true,
174
+ zone: default_zone,
175
+ tax_category: product.tax_category,
176
+ amount: 0.2
177
+ end
178
+
179
+ context "that matches no VAT" do
180
+ it "returns the price excluding VAT" do
181
+ expect(display_price(product)).to eq("$16.66")
182
+ end
183
+ end
184
+
185
+ context "that matches a VAT" do
186
+ let!(:other_vat) do
187
+ create :tax_rate,
188
+ included_in_price: true,
189
+ zone: current_tax_zone,
190
+ tax_category: product.tax_category,
191
+ amount: 0.4
192
+ end
193
+
194
+ it "returns the price adding the VAT" do
195
+ expect(display_price(product)).to eq("$23.32")
196
+ end
197
+ end
198
+ end
199
+ end
200
+ end
@@ -0,0 +1,289 @@
1
+ # encoding: utf-8
2
+
3
+ require "spec_helper"
4
+
5
+ module Spree
6
+ describe ProductsHelper, type: :helper do
7
+ include ProductsHelper
8
+
9
+ let(:product) { create(:product) }
10
+ let(:currency) { 'USD' }
11
+
12
+ before do
13
+ allow(helper).to receive(:current_currency) { currency }
14
+ end
15
+
16
+ context "#variant_price_diff" do
17
+ let(:product_price) { 10 }
18
+ let(:variant_price) { 10 }
19
+
20
+ before do
21
+ @variant = create(:variant, product: product)
22
+ product.price = 15
23
+ @variant.price = 10
24
+ allow(product).to receive(:amount_in) { product_price }
25
+ allow(@variant).to receive(:amount_in) { variant_price }
26
+ end
27
+
28
+ subject { helper.variant_price(@variant) }
29
+
30
+ context "when variant is same as master" do
31
+ it { is_expected.to be_nil }
32
+ end
33
+
34
+ context "when the master has no price" do
35
+ let(:product_price) { nil }
36
+
37
+ it { is_expected.to be_nil }
38
+ end
39
+
40
+ context "when currency is default" do
41
+ context "when variant is more than master" do
42
+ let(:variant_price) { 15 }
43
+
44
+ it { is_expected.to eq("(Add: $5.00)") }
45
+ # Regression test for #2737
46
+ it { is_expected.to be_html_safe }
47
+ end
48
+
49
+ context "when variant is less than master" do
50
+ let(:product_price) { 15 }
51
+
52
+ it { is_expected.to eq("(Subtract: $5.00)") }
53
+ end
54
+ end
55
+
56
+ context "when currency is JPY" do
57
+ let(:variant_price) { 100 }
58
+ let(:product_price) { 100 }
59
+ let(:currency) { 'JPY' }
60
+
61
+ context "when variant is more than master" do
62
+ let(:variant_price) { 150 }
63
+
64
+ it { is_expected.to eq("(Add: &#x00A5;50)") }
65
+ end
66
+
67
+ context "when variant is less than master" do
68
+ let(:product_price) { 150 }
69
+
70
+ it { is_expected.to eq("(Subtract: &#x00A5;50)") }
71
+ end
72
+ end
73
+ end
74
+
75
+ context "#variant_price_full" do
76
+ before do
77
+ Spree::Config[:show_variant_full_price] = true
78
+ @variant1 = create(:variant, product: product)
79
+ @variant2 = create(:variant, product: product)
80
+ end
81
+
82
+ context "when currency is default" do
83
+ it "should return the variant price if the price is different than master" do
84
+ product.price = 10
85
+ @variant1.price = 15
86
+ @variant2.price = 20
87
+ expect(helper.variant_price(@variant1)).to eq("$15.00")
88
+ expect(helper.variant_price(@variant2)).to eq("$20.00")
89
+ end
90
+ end
91
+
92
+ context "when currency is JPY" do
93
+ let(:currency) { 'JPY' }
94
+
95
+ before do
96
+ product.variants.active.each do |variant|
97
+ variant.prices.each do |price|
98
+ price.currency = currency
99
+ price.save!
100
+ end
101
+ end
102
+ end
103
+
104
+ it "should return the variant price if the price is different than master" do
105
+ product.price = 100
106
+ @variant1.price = 150
107
+ expect(helper.variant_price(@variant1)).to eq("&#x00A5;150")
108
+ end
109
+ end
110
+
111
+ it "should be nil when all variant prices are equal" do
112
+ product.price = 10
113
+ @variant1.default_price.update_column(:amount, 10)
114
+ @variant2.default_price.update_column(:amount, 10)
115
+ expect(helper.variant_price(@variant1)).to be_nil
116
+ expect(helper.variant_price(@variant2)).to be_nil
117
+ end
118
+ end
119
+
120
+
121
+ context "#product_description" do
122
+ # Regression test for #1607
123
+ it "renders a product description without excessive paragraph breaks" do
124
+ product.description = %Q{
125
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus a ligula leo. Proin eu arcu at ipsum dapibus ullamcorper. Pellentesque egestas orci nec magna condimentum luctus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut ac ante et mauris bibendum ultricies non sed massa. Fusce facilisis dui eget lacus scelerisque eget aliquam urna ultricies. Duis et rhoncus quam. Praesent tellus nisi, ultrices sed iaculis quis, euismod interdum ipsum.</p>
126
+ <ul>
127
+ <li>Lorem ipsum dolor sit amet</li>
128
+ <li>Lorem ipsum dolor sit amet</li>
129
+ </ul>
130
+ }
131
+ description = product_description(product)
132
+ expect(description.strip).to eq(product.description.strip)
133
+ end
134
+
135
+ it "renders a product description with automatic paragraph breaks" do
136
+ product.description = %Q{
137
+ THIS IS THE BEST PRODUCT EVER!
138
+
139
+ "IT CHANGED MY LIFE" - Sue, MD}
140
+
141
+ description = product_description(product)
142
+ expect(description.strip).to eq(%Q{<p>\nTHIS IS THE BEST PRODUCT EVER!</p>"IT CHANGED MY LIFE" - Sue, MD})
143
+ end
144
+
145
+ it "renders a product description without any formatting based on configuration" do
146
+ initialDescription = %Q{
147
+ <p>hello world</p>
148
+
149
+ <p>tihs is completely awesome and it works</p>
150
+
151
+ <p>why so many spaces in the code. and why some more formatting afterwards?</p>
152
+ }
153
+
154
+ product.description = initialDescription
155
+
156
+ Spree::Config[:show_raw_product_description] = true
157
+ description = product_description(product)
158
+ expect(description).to eq(initialDescription)
159
+ end
160
+
161
+ context "renders a product description default description incase description is blank" do
162
+ before { product.description = '' }
163
+ it { expect(product_description(product)).to eq(Spree.t(:product_has_no_description)) }
164
+ end
165
+ end
166
+
167
+ shared_examples_for "line item descriptions" do
168
+ context 'variant has a blank description' do
169
+ let(:description) { nil }
170
+ it { is_expected.to eq(Spree.t(:product_has_no_description)) }
171
+ end
172
+ context 'variant has a description' do
173
+ let(:description) { 'test_desc' }
174
+ it { is_expected.to eq(description) }
175
+ end
176
+ context 'description has nonbreaking spaces' do
177
+ let(:description) { 'test&nbsp;desc' }
178
+ it { is_expected.to eq('test desc') }
179
+ end
180
+ context 'description has line endings' do
181
+ let(:description) { "test\n\r\ndesc" }
182
+ it { is_expected.to eq('test desc') }
183
+ end
184
+ end
185
+
186
+ context '#line_item_description_text' do
187
+ subject { line_item_description_text description }
188
+
189
+ it_should_behave_like "line item descriptions"
190
+ end
191
+
192
+ context '#cache_key_for_products' do
193
+ let(:zone) { Spree::Zone.new }
194
+ let(:price_options) { { tax_zone: zone } }
195
+
196
+ subject { helper.cache_key_for_products }
197
+ before(:each) do
198
+ @products = double('products collection')
199
+ allow(helper).to receive(:params) { {page: 10} }
200
+ allow(helper).to receive(:current_price_options) { price_options }
201
+ end
202
+
203
+ context 'when there is a maximum updated date' do
204
+ let(:updated_at) { Date.new(2011, 12, 13) }
205
+ before :each do
206
+ allow(@products).to receive(:count) { 5 }
207
+ allow(@products).to receive(:maximum).with(:updated_at) { updated_at }
208
+ end
209
+
210
+ it { is_expected.to eq("en/USD/spree/zones/new/spree/products/all-10-20111213-5") }
211
+ end
212
+
213
+ context 'when there is no considered maximum updated date' do
214
+ let(:today) { Date.new(2013, 12, 11) }
215
+ before :each do
216
+ allow(@products).to receive(:count) { 1234567 }
217
+ allow(@products).to receive(:maximum).with(:updated_at) { nil }
218
+ allow(Date).to receive(:today) { today }
219
+ end
220
+
221
+ it { is_expected.to eq("en/USD/spree/zones/new/spree/products/all-10-20131211-1234567") }
222
+ end
223
+ end
224
+
225
+ context "#cache_key_for_product" do
226
+ let(:product) { Spree::Product.new }
227
+ let(:price_options) { { tax_zone: zone } }
228
+
229
+ subject(:cache_key) { helper.cache_key_for_product(product) }
230
+
231
+ before do
232
+ allow(helper).to receive(:current_price_options) { price_options }
233
+ end
234
+
235
+ context "when there is a current tax zone" do
236
+ let(:zone) { Spree::Zone.new }
237
+
238
+ it "includes the current_tax_zone" do
239
+ is_expected.to eq("en/USD/spree/zones/new/spree/products/new/")
240
+ end
241
+ end
242
+
243
+ context "when there is no current tax zone" do
244
+ let(:zone) { nil }
245
+
246
+ it { is_expected.to eq("en/USD/spree/products/new/") }
247
+ end
248
+
249
+ context "when current_price_options includes nil values" do
250
+ let(:price_options) do
251
+ {
252
+ a: nil,
253
+ b: Spree::Zone.new
254
+ }
255
+ end
256
+
257
+ it "does not include nil values" do
258
+ expect(cache_key).to eq("en/USD/spree/zones/new/spree/products/new/")
259
+ end
260
+ end
261
+
262
+ context "when current_price_options includes values that do not implement cache_key" do
263
+ let(:price_options) do
264
+ {
265
+ a: true,
266
+ b: Spree::Zone.new
267
+ }
268
+ end
269
+
270
+ it "includes string representations of these values" do
271
+ expect(cache_key).to eq("en/USD/true/spree/zones/new/spree/products/new/")
272
+ end
273
+ end
274
+
275
+ context "when keys in the options hash are inserted in non-alphabetical order" do
276
+ let(:price_options) do
277
+ {
278
+ b: Spree::Zone.new,
279
+ a: true
280
+ }
281
+ end
282
+
283
+ it "the values are nevertheless returned in alphabetical order of their keys" do
284
+ expect(cache_key).to eq("en/USD/true/spree/zones/new/spree/products/new/")
285
+ end
286
+ end
287
+ end
288
+ end
289
+ end