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
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Order, type: :model do
4
+ let(:order) { stub_model(Spree::Order) }
5
+ before do
6
+ Spree::Order.define_state_machine!
7
+ end
8
+
9
+ context "validations" do
10
+ context "email validation" do
11
+ # Regression test for #1238
12
+ it "o'brien@gmail.com is a valid email address" do
13
+ order.state = 'address'
14
+ order.email = "o'brien@gmail.com"
15
+ expect(order.error_on(:email).size).to eq(0)
16
+ end
17
+ end
18
+ end
19
+
20
+ context "#save" do
21
+ context "when associated with a registered user" do
22
+ let(:user) { double(:user, email: "test@example.com") }
23
+
24
+ before do
25
+ allow(order).to receive_messages user: user
26
+ end
27
+
28
+ it "should assign the email address of the user" do
29
+ order.run_callbacks(:create)
30
+ expect(order.email).to eq(user.email)
31
+ end
32
+ end
33
+ end
34
+
35
+ context "in the cart state" do
36
+ it "should not validate email address" do
37
+ order.state = "cart"
38
+ order.email = nil
39
+ expect(order.error_on(:email).size).to eq(0)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,770 @@
1
+ require 'spec_helper'
2
+ require 'spree/testing_support/order_walkthrough'
3
+
4
+ describe Spree::Order, type: :model do
5
+ let(:order) { Spree::Order.new }
6
+
7
+ before { create(:store) }
8
+
9
+ def assert_state_changed(order, from, to)
10
+ state_change_exists = order.state_changes.where(previous_state: from, next_state: to).exists?
11
+ assert state_change_exists, "Expected order to transition from #{from} to #{to}, but didn't."
12
+ end
13
+
14
+ context "with default state machine" do
15
+ let(:transitions) do
16
+ [
17
+ { address: :delivery },
18
+ { delivery: :payment },
19
+ { payment: :confirm },
20
+ { confirm: :complete },
21
+ { payment: :complete },
22
+ { delivery: :complete }
23
+ ]
24
+ end
25
+
26
+ it "has the following transitions" do
27
+ transitions.each do |transition|
28
+ transition = Spree::Order.find_transition(from: transition.keys.first, to: transition.values.first)
29
+ expect(transition).not_to be_nil
30
+ end
31
+ end
32
+
33
+ it "does not have a transition from delivery to confirm" do
34
+ transition = Spree::Order.find_transition(from: :delivery, to: :confirm)
35
+ expect(transition).to be_nil
36
+ end
37
+
38
+ it '.find_transition when contract was broken' do
39
+ expect(Spree::Order.find_transition({foo: :bar, baz: :dog})).to be_falsey
40
+ end
41
+
42
+ it '.remove_transition' do
43
+ options = {from: transitions.first.keys.first, to: transitions.first.values.first}
44
+ expect(Spree::Order).to receive_messages(
45
+ removed_transitions: [],
46
+ next_event_transitions: transitions.dup
47
+ )
48
+ expect(Spree::Order.remove_transition(options)).to be_truthy
49
+ expect(Spree::Order.removed_transitions).to eql([options])
50
+ expect(Spree::Order.next_event_transitions).to_not include(transitions.first)
51
+ end
52
+
53
+ it '.remove_transition when contract was broken' do
54
+ expect(Spree::Order.remove_transition(nil)).to be_falsey
55
+ end
56
+
57
+ it "always return integer on checkout_step_index" do
58
+ expect(order.checkout_step_index("imnotthere")).to be_a Integer
59
+ expect(order.checkout_step_index("delivery")).to be > 0
60
+ end
61
+
62
+ it "passes delivery state when transitioning from address over delivery to payment" do
63
+ allow(order).to receive_messages payment_required?: true
64
+ order.state = "address"
65
+ expect(order.passed_checkout_step?("delivery")).to be false
66
+ order.state = "delivery"
67
+ expect(order.passed_checkout_step?("delivery")).to be false
68
+ order.state = "payment"
69
+ expect(order.passed_checkout_step?("delivery")).to be true
70
+ end
71
+
72
+ context "#checkout_steps" do
73
+ context "when confirmation not required" do
74
+ before do
75
+ allow(order).to receive_messages confirmation_required?: false
76
+ allow(order).to receive_messages payment_required?: true
77
+ end
78
+
79
+ specify do
80
+ expect(order.checkout_steps).to eq(%w(address delivery payment complete))
81
+ end
82
+ end
83
+
84
+ context "when confirmation required" do
85
+ before do
86
+ allow(order).to receive_messages confirmation_required?: true
87
+ allow(order).to receive_messages payment_required?: true
88
+ end
89
+
90
+ specify do
91
+ expect(order.checkout_steps).to eq(%w(address delivery payment confirm complete))
92
+ end
93
+ end
94
+
95
+ context "when payment not required" do
96
+ before { allow(order).to receive_messages payment_required?: false }
97
+ specify do
98
+ expect(order.checkout_steps).to eq(%w(address delivery complete))
99
+ end
100
+ end
101
+
102
+ context "when payment required" do
103
+ before { allow(order).to receive_messages payment_required?: true }
104
+ specify do
105
+ expect(order.checkout_steps).to eq(%w(address delivery payment complete))
106
+ end
107
+ end
108
+ end
109
+
110
+ it "starts out at cart" do
111
+ expect(order.state).to eq("cart")
112
+ end
113
+
114
+ context "to address" do
115
+ before do
116
+ order.email = "user@example.com"
117
+ order.save!
118
+ end
119
+
120
+ context "with a line item" do
121
+ before do
122
+ order.line_items << FactoryGirl.create(:line_item)
123
+ end
124
+
125
+ it "transitions to address" do
126
+ order.next!
127
+ assert_state_changed(order, 'cart', 'address')
128
+ expect(order.state).to eq("address")
129
+ end
130
+
131
+ it "doesn't raise an error if the default address is invalid" do
132
+ order.user = mock_model(Spree::LegacyUser, ship_address: Spree::Address.new, bill_address: Spree::Address.new)
133
+ expect { order.next! }.to_not raise_error
134
+ end
135
+
136
+ context "with default addresses" do
137
+ let(:default_address) { FactoryGirl.create(:address) }
138
+
139
+ before do
140
+ order.user = FactoryGirl.create(:user, "#{address_kind}_address" => default_address)
141
+ order.next!
142
+ order.reload
143
+ end
144
+
145
+ shared_examples "it cloned the default address" do
146
+ it do
147
+ default_attributes = default_address.attributes
148
+ order_attributes = order.send("#{address_kind}_address".to_sym).try(:attributes) || {}
149
+
150
+ expect(order_attributes.except('id', 'created_at', 'updated_at')).to eql(default_attributes.except('id', 'created_at', 'updated_at'))
151
+ end
152
+ end
153
+
154
+ it_behaves_like "it cloned the default address" do
155
+ let(:address_kind) { 'ship' }
156
+ end
157
+
158
+ it_behaves_like "it cloned the default address" do
159
+ let(:address_kind) { 'bill' }
160
+ end
161
+ end
162
+ end
163
+
164
+ it "cannot transition to address without any line items" do
165
+ expect(order.line_items).to be_blank
166
+ expect { order.next! }.to raise_error(StateMachines::InvalidTransition, /#{Spree.t(:there_are_no_items_for_this_order)}/)
167
+ end
168
+ end
169
+
170
+ context "from address" do
171
+ before do
172
+ order.state = 'address'
173
+ allow(order).to receive(:has_available_payment)
174
+ shipment = FactoryGirl.create(:shipment, order: order)
175
+ order.email = "user@example.com"
176
+ order.save!
177
+ end
178
+
179
+ it "updates totals" do
180
+ allow(order).to receive_messages(ensure_available_shipping_rates: true)
181
+ line_item = FactoryGirl.create(:line_item, price: 10, adjustment_total: 10)
182
+ line_item.variant.update_attributes!(price: 10)
183
+ order.line_items << line_item
184
+ tax_rate = create(:tax_rate, tax_category: line_item.tax_category, amount: 0.05)
185
+ allow(Spree::TaxRate).to receive_messages match: [tax_rate]
186
+ FactoryGirl.create(:tax_adjustment, adjustable: line_item, source: tax_rate, order: order)
187
+ order.email = "user@example.com"
188
+ order.next!
189
+ expect(order.adjustment_total).to eq(0.5)
190
+ expect(order.additional_tax_total).to eq(0.5)
191
+ expect(order.included_tax_total).to eq(0)
192
+ expect(order.total).to eq(10.5)
193
+ end
194
+
195
+ it 'updates prices' do
196
+ allow(order).to receive_messages(ensure_available_shipping_rates: true)
197
+ line_item = FactoryGirl.create(:line_item, price: 10, adjustment_total: 10)
198
+ line_item.variant.update_attributes!(price: 20)
199
+ order.line_items << line_item
200
+ tax_rate = create :tax_rate,
201
+ included_in_price: true,
202
+ tax_category: line_item.tax_category,
203
+ amount: 0.05
204
+ allow(Spree::TaxRate).to receive_messages(match: [tax_rate])
205
+ FactoryGirl.create :tax_adjustment,
206
+ adjustable: line_item,
207
+ source: tax_rate,
208
+ order: order
209
+ order.email = "user@example.com"
210
+ order.next!
211
+ expect(order.adjustment_total).to eq(0)
212
+ expect(order.additional_tax_total).to eq(0)
213
+ expect(order.included_tax_total).to eq(0.95)
214
+ expect(order.total).to eq(20)
215
+ end
216
+
217
+ it "transitions to delivery" do
218
+ allow(order).to receive_messages(ensure_available_shipping_rates: true)
219
+ order.next!
220
+ assert_state_changed(order, 'address', 'delivery')
221
+ expect(order.state).to eq("delivery")
222
+ end
223
+
224
+ it "does not call persist_order_address if there is no address on the order" do
225
+ # otherwise, it will crash
226
+ allow(order).to receive_messages(ensure_available_shipping_rates: true)
227
+
228
+ order.user = FactoryGirl.create(:user)
229
+ order.save!
230
+
231
+ expect(order.user).to_not receive(:persist_order_address).with(order)
232
+ order.next!
233
+ end
234
+
235
+ it "calls persist_order_address on the order's user" do
236
+ allow(order).to receive_messages(ensure_available_shipping_rates: true)
237
+
238
+ order.user = FactoryGirl.create(:user)
239
+ order.ship_address = FactoryGirl.create(:address)
240
+ order.bill_address = FactoryGirl.create(:address)
241
+ order.save!
242
+
243
+ expect(order.user).to receive(:persist_order_address).with(order)
244
+ order.next!
245
+ end
246
+
247
+ it "does not call persist_order_address on the order's user for a temporary address" do
248
+ allow(order).to receive_messages(ensure_available_shipping_rates: true)
249
+
250
+ order.user = FactoryGirl.create(:user)
251
+ order.temporary_address = true
252
+ order.save!
253
+
254
+ expect(order.user).to_not receive(:persist_order_address)
255
+ order.next!
256
+ end
257
+
258
+ context "cannot transition to delivery" do
259
+ context "with an existing shipment" do
260
+ before do
261
+ line_item = FactoryGirl.create(:line_item, price: 10)
262
+ order.line_items << line_item
263
+ end
264
+
265
+ context "if there are no shipping rates for any shipment" do
266
+ it "raises an InvalidTransitionError" do
267
+ transition = lambda { order.next! }
268
+ expect(transition).to raise_error(StateMachines::InvalidTransition, /#{Spree.t(:items_cannot_be_shipped)}/)
269
+ end
270
+
271
+ it "deletes all the shipments" do
272
+ order.next
273
+ expect(order.shipments).to be_empty
274
+ end
275
+ end
276
+ end
277
+ end
278
+ end
279
+
280
+ context "to delivery" do
281
+ context 'when order has default selected_shipping_rate_id' do
282
+ let(:shipment) { create(:shipment, order: order) }
283
+ let(:shipping_method) { create(:shipping_method) }
284
+ let(:shipping_rate) { [
285
+ Spree::ShippingRate.create!(shipping_method: shipping_method, cost: 10.00, shipment: shipment)
286
+ ] }
287
+
288
+ before do
289
+ order.state = 'address'
290
+ shipment.selected_shipping_rate_id = shipping_rate.first.id
291
+ order.email = "user@example.com"
292
+ order.save!
293
+
294
+ allow(order).to receive(:has_available_payment)
295
+ allow(order).to receive(:create_proposed_shipments)
296
+ allow(order).to receive(:ensure_available_shipping_rates) { true }
297
+ end
298
+
299
+ it 'should invoke set_shipment_cost' do
300
+ expect(order).to receive(:set_shipments_cost)
301
+ order.next!
302
+ end
303
+
304
+ it 'should update shipment_total' do
305
+ expect { order.next! }.to change{ order.shipment_total }.by(10.00)
306
+ end
307
+ end
308
+ end
309
+
310
+ context "from delivery" do
311
+ before do
312
+ order.state = 'delivery'
313
+ allow(order).to receive(:apply_free_shipping_promotions)
314
+ end
315
+
316
+ it "attempts to apply free shipping promotions" do
317
+ expect(order).to receive(:apply_free_shipping_promotions)
318
+ order.next!
319
+ end
320
+
321
+ context "with payment required" do
322
+ before do
323
+ allow(order).to receive_messages payment_required?: true
324
+ end
325
+
326
+ it "transitions to payment" do
327
+ expect(order).to receive(:set_shipments_cost)
328
+ order.next!
329
+ assert_state_changed(order, 'delivery', 'payment')
330
+ expect(order.state).to eq('payment')
331
+ end
332
+ end
333
+
334
+ context "without payment required" do
335
+ before do
336
+ allow(order).to receive_messages payment_required?: false
337
+ end
338
+
339
+ it "transitions to complete" do
340
+ order.next!
341
+ expect(order.state).to eq("complete")
342
+ end
343
+ end
344
+
345
+ context "correctly determining payment required based on shipping information" do
346
+ let(:shipment) do
347
+ FactoryGirl.create(:shipment)
348
+ end
349
+
350
+ before do
351
+ # Needs to be set here because we're working with a persisted order object
352
+ order.email = "test@example.com"
353
+ order.save!
354
+ order.shipments << shipment
355
+ end
356
+
357
+ context "with a shipment that has a price" do
358
+ before do
359
+ shipment.shipping_rates.first.update_column(:cost, 10)
360
+ order.set_shipments_cost
361
+ end
362
+
363
+ it "transitions to payment" do
364
+ order.next!
365
+ expect(order.state).to eq("payment")
366
+ end
367
+ end
368
+
369
+ context "with a shipment that is free" do
370
+ before do
371
+ shipment.shipping_rates.first.update_column(:cost, 0)
372
+ order.set_shipments_cost
373
+ end
374
+
375
+ it "skips payment, transitions to complete" do
376
+ order.next!
377
+ expect(order.state).to eq("complete")
378
+ end
379
+ end
380
+ end
381
+ end
382
+
383
+ context "from payment" do
384
+ before do
385
+ order.state = 'payment'
386
+ end
387
+
388
+ context "with confirmation required" do
389
+ before do
390
+ allow(order).to receive_messages confirmation_required?: true
391
+ end
392
+
393
+ it "transitions to confirm" do
394
+ order.next!
395
+ assert_state_changed(order, 'payment', 'confirm')
396
+ expect(order.state).to eq("confirm")
397
+ end
398
+ end
399
+
400
+ context "without confirmation required" do
401
+ before do
402
+ order.email = "spree@example.com"
403
+ allow(order).to receive_messages confirmation_required?: false
404
+ allow(order).to receive_messages payment_required?: true
405
+ order.payments << FactoryGirl.create(:payment, state: payment_state, order: order)
406
+ end
407
+
408
+ context 'when there is at least one valid payment' do
409
+ let(:payment_state) { 'checkout' }
410
+
411
+ context 'line_items are in stock' do
412
+ before do
413
+ expect(order).to receive(:process_payments!).once { true }
414
+ end
415
+
416
+ it "transitions to complete" do
417
+ order.next!
418
+ assert_state_changed(order, 'payment', 'complete')
419
+ expect(order.state).to eq('complete')
420
+ end
421
+ end
422
+
423
+ context 'line_items are not in stock' do
424
+ before do
425
+ expect(order).to receive(:ensure_line_items_are_in_stock).once { false }
426
+ end
427
+
428
+ it 'should not receive process_payments!' do
429
+ expect(order).not_to receive(:process_payments!)
430
+ order.next
431
+ end
432
+
433
+ it 'does not transition to complete' do
434
+ order.next
435
+ expect(order.state).to eq('payment')
436
+ end
437
+ end
438
+ end
439
+
440
+ context 'when there is only an invalid payment' do
441
+ let(:payment_state) { 'failed' }
442
+
443
+ it "raises a StateMachine::InvalidTransition" do
444
+ expect {
445
+ order.next!
446
+ }.to raise_error(StateMachines::InvalidTransition, /#{Spree.t(:no_payment_found)}/)
447
+
448
+ expect(order.errors[:base]).to include(Spree.t(:no_payment_found))
449
+ end
450
+ end
451
+ end
452
+
453
+ # Regression test for #2028
454
+ context "when payment is not required" do
455
+ before do
456
+ allow(order).to receive_messages payment_required?: false
457
+ end
458
+
459
+ it "does not call process payments" do
460
+ expect(order).not_to receive(:process_payments!)
461
+ order.next!
462
+ assert_state_changed(order, 'payment', 'complete')
463
+ expect(order.state).to eq("complete")
464
+ end
465
+ end
466
+ end
467
+ end
468
+
469
+ context "to complete" do
470
+ before do
471
+ order.state = 'confirm'
472
+ order.save!
473
+ end
474
+
475
+ context "default credit card" do
476
+ before do
477
+ order.user = FactoryGirl.create(:user)
478
+ order.email = 'spree@example.org'
479
+ order.payments << FactoryGirl.create(:payment)
480
+
481
+ # make sure we will actually capture a payment
482
+ allow(order).to receive_messages(payment_required?: true)
483
+ order.line_items << FactoryGirl.create(:line_item)
484
+ Spree::OrderUpdater.new(order).update
485
+
486
+ order.save!
487
+ end
488
+
489
+ it "makes the current credit card a user's default credit card" do
490
+ order.next!
491
+ expect(order.state).to eq 'complete'
492
+ expect(order.user.reload.default_credit_card.try(:id)).to eq(order.credit_cards.first.id)
493
+ end
494
+
495
+ it "does not assign a default credit card if temporary_credit_card is set" do
496
+ order.temporary_credit_card = true
497
+ order.next!
498
+ expect(order.user.reload.default_credit_card).to be_nil
499
+ end
500
+ end
501
+ end
502
+
503
+ context "subclassed order" do
504
+ # This causes another test above to fail, but fixing this test should make
505
+ # the other test pass
506
+ class SubclassedOrder < Spree::Order
507
+ checkout_flow do
508
+ go_to_state :payment
509
+ go_to_state :complete
510
+ end
511
+ end
512
+
513
+ skip "should only call default transitions once when checkout_flow is redefined" do
514
+ order = SubclassedOrder.new
515
+ allow(order).to receive_messages payment_required?: true
516
+ expect(order).to receive(:process_payments!).once
517
+ order.state = "payment"
518
+ order.next!
519
+ assert_state_changed(order, 'payment', 'complete')
520
+ expect(order.state).to eq("complete")
521
+ end
522
+ end
523
+
524
+ context "re-define checkout flow" do
525
+ before do
526
+ @old_checkout_flow = Spree::Order.checkout_flow
527
+ Spree::Order.class_eval do
528
+ checkout_flow do
529
+ go_to_state :payment
530
+ go_to_state :complete
531
+ end
532
+ end
533
+ end
534
+
535
+ after do
536
+ Spree::Order.checkout_flow(&@old_checkout_flow)
537
+ end
538
+
539
+ it "should not keep old event transitions when checkout_flow is redefined" do
540
+ expect(Spree::Order.next_event_transitions).to eq([{cart: :payment}, {payment: :complete}])
541
+ end
542
+
543
+ it "should not keep old events when checkout_flow is redefined" do
544
+ state_machine = Spree::Order.state_machine
545
+ expect(state_machine.states.any? { |s| s.name == :address }).to be false
546
+ known_states = state_machine.events[:next].branches.map(&:known_states).flatten
547
+ expect(known_states).not_to include(:address)
548
+ expect(known_states).not_to include(:delivery)
549
+ expect(known_states).not_to include(:confirm)
550
+ end
551
+ end
552
+
553
+ # Regression test for #3665
554
+ context "with only a complete step" do
555
+ before do
556
+ @old_checkout_flow = Spree::Order.checkout_flow
557
+ Spree::Order.class_eval do
558
+ checkout_flow do
559
+ go_to_state :complete
560
+ end
561
+ end
562
+ end
563
+
564
+ after do
565
+ Spree::Order.checkout_flow(&@old_checkout_flow)
566
+ end
567
+
568
+ it "does not attempt to process payments" do
569
+ allow(order).to receive_message_chain(:line_items, :present?) { true }
570
+ allow(order).to receive(:ensure_line_items_are_in_stock) { true }
571
+ allow(order).to receive(:ensure_line_item_variants_are_not_discontinued) { true }
572
+ expect(order).not_to receive(:payment_required?)
573
+ expect(order).not_to receive(:process_payments!)
574
+ order.next!
575
+ assert_state_changed(order, 'cart', 'complete')
576
+ end
577
+
578
+ end
579
+
580
+ context "insert checkout step" do
581
+ before do
582
+ @old_checkout_flow = Spree::Order.checkout_flow
583
+ Spree::Order.class_eval do
584
+ insert_checkout_step :new_step, before: :address
585
+ end
586
+ end
587
+
588
+ after do
589
+ Spree::Order.checkout_flow(&@old_checkout_flow)
590
+ end
591
+
592
+ it "should maintain removed transitions" do
593
+ transition = Spree::Order.find_transition(from: :delivery, to: :confirm)
594
+ expect(transition).to be_nil
595
+ end
596
+
597
+ context "before" do
598
+ before do
599
+ Spree::Order.class_eval do
600
+ insert_checkout_step :before_address, before: :address
601
+ end
602
+ end
603
+
604
+ specify do
605
+ order = Spree::Order.new
606
+ expect(order.checkout_steps).to eq(%w(new_step before_address address delivery complete))
607
+ end
608
+
609
+ it 'goes through checkout without raising error' do
610
+ expect{ OrderWalkthrough.up_to(:complete) }.to_not raise_error
611
+ end
612
+ end
613
+
614
+ context "after" do
615
+ before do
616
+ Spree::Order.class_eval do
617
+ insert_checkout_step :after_address, after: :address
618
+ end
619
+ end
620
+
621
+ specify do
622
+ order = Spree::Order.new
623
+ expect(order.checkout_steps).to eq(%w(new_step address after_address delivery complete))
624
+ end
625
+
626
+ it 'goes through checkout without raising error' do
627
+ expect{ OrderWalkthrough.up_to(:complete) }.to_not raise_error
628
+ end
629
+ end
630
+ end
631
+
632
+ context "remove checkout step" do
633
+ before do
634
+ @old_checkout_flow = Spree::Order.checkout_flow
635
+ Spree::Order.class_eval do
636
+ remove_checkout_step :address
637
+ end
638
+ end
639
+
640
+ after do
641
+ Spree::Order.checkout_flow(&@old_checkout_flow)
642
+ end
643
+
644
+ it "should maintain removed transitions" do
645
+ transition = Spree::Order.find_transition(from: :delivery, to: :confirm)
646
+ expect(transition).to be_nil
647
+ end
648
+
649
+ specify do
650
+ order = Spree::Order.new
651
+ expect(order.checkout_steps).to eq(%w(delivery complete))
652
+ end
653
+ end
654
+
655
+ describe 'update_from_params' do
656
+ let(:permitted_params) { {} }
657
+ let(:params) { {} }
658
+
659
+ it 'calls update_atributes without order params' do
660
+ expect(order).to receive(:update_attributes).with({})
661
+ order.update_from_params( params, permitted_params)
662
+ end
663
+
664
+ it 'runs the callbacks' do
665
+ expect(order).to receive(:run_callbacks).with(:updating_from_params)
666
+ order.update_from_params( params, permitted_params)
667
+ end
668
+
669
+ context "passing a credit card" do
670
+ let(:permitted_params) do
671
+ Spree::PermittedAttributes.checkout_attributes +
672
+ [payments_attributes: Spree::PermittedAttributes.payment_attributes]
673
+ end
674
+
675
+ let(:credit_card) { create(:credit_card, user_id: order.user_id) }
676
+
677
+ let(:params) do
678
+ ActionController::Parameters.new(
679
+ order: { payments_attributes: [{payment_method_id: 1}], existing_card: credit_card.id },
680
+ cvc_confirm: "737",
681
+ payment_source: {
682
+ "1" => { name: "Luis Braga",
683
+ number: "4111 1111 1111 1111",
684
+ expiry: "06 / 2016",
685
+ verification_value: "737",
686
+ cc_type: "" }
687
+ }
688
+ )
689
+ end
690
+
691
+ before { order.user_id = 3 }
692
+
693
+ it "sets confirmation value when its available via :cvc_confirm" do
694
+ allow(Spree::CreditCard).to receive_messages find: credit_card
695
+ expect(credit_card).to receive(:verification_value=)
696
+ order.update_from_params(params, permitted_params)
697
+ end
698
+
699
+ it "sets existing card as source for new payment" do
700
+ expect {
701
+ order.update_from_params(params, permitted_params)
702
+ }.to change { Spree::Payment.count }.by(1)
703
+
704
+ expect(Spree::Payment.last.source).to eq credit_card
705
+ end
706
+
707
+ it "sets request_env on payment" do
708
+ request_env = { "USER_AGENT" => "Firefox" }
709
+
710
+ order.update_from_params(params, permitted_params, request_env)
711
+ expect(order.payments[0].request_env).to eq request_env
712
+ end
713
+
714
+ it "dont let users mess with others users cards" do
715
+ credit_card.update_column :user_id, 5
716
+
717
+ expect {
718
+ order.update_from_params(params, permitted_params)
719
+ }.to raise_error(Spree.t(:invalid_credit_card))
720
+ end
721
+ end
722
+
723
+ context 'has params' do
724
+ let(:permitted_params) { [ :good_param ] }
725
+ let(:params) { ActionController::Parameters.new(order: { bad_param: 'okay' } ) }
726
+
727
+ it 'does not let through unpermitted attributes' do
728
+ expect(order).to receive(:update_attributes).with(ActionController::Parameters.new.permit!)
729
+ order.update_from_params(params, permitted_params)
730
+ end
731
+
732
+ context 'has existing_card param' do
733
+ let(:permitted_params) do
734
+ Spree::PermittedAttributes.checkout_attributes +
735
+ [payments_attributes: Spree::PermittedAttributes.payment_attributes]
736
+ end
737
+ let(:credit_card) { create(:credit_card, user_id: order.user_id) }
738
+ let(:params) do
739
+ ActionController::Parameters.new(
740
+ order: { payments_attributes: [{payment_method_id: 1}], existing_card: credit_card.id }
741
+ )
742
+ end
743
+
744
+ before do
745
+ Dummy::Application.config.action_controller.action_on_unpermitted_parameters = :raise
746
+ order.user_id = 3
747
+ end
748
+
749
+ after do
750
+ Dummy::Application.config.action_controller.action_on_unpermitted_parameters = :log
751
+ end
752
+
753
+ it 'does not attempt to permit existing_card' do
754
+ expect {
755
+ order.update_from_params(params, permitted_params)
756
+ }.not_to raise_error
757
+ end
758
+ end
759
+
760
+ context 'has allowed params' do
761
+ let(:params) { ActionController::Parameters.new(order: { good_param: 'okay' } ) }
762
+
763
+ it 'accepts permitted attributes' do
764
+ expect(order).to receive(:assign_attributes).with(ActionController::Parameters.new("good_param" => 'okay').permit!)
765
+ order.update_from_params(params, permitted_params)
766
+ end
767
+ end
768
+ end
769
+ end
770
+ end