solidus_core_devise_token_auth 2.8.0.alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (815) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +1 -0
  3. data/LICENSE +26 -0
  4. data/README.md +69 -0
  5. data/Rakefile +37 -0
  6. data/app/assets/config/solidus_core_manifest.js +1 -0
  7. data/app/assets/images/logo/solidus_logo.png +0 -0
  8. data/app/assets/images/noimage/large.png +0 -0
  9. data/app/assets/images/noimage/mini.png +0 -0
  10. data/app/assets/images/noimage/product.png +0 -0
  11. data/app/assets/images/noimage/small.png +0 -0
  12. data/app/assets/javascripts/spree.js.erb +72 -0
  13. data/app/controllers/spree/base_controller.rb +15 -0
  14. data/app/helpers/spree/base_helper.rb +160 -0
  15. data/app/helpers/spree/checkout_helper.rb +33 -0
  16. data/app/helpers/spree/products_helper.rb +74 -0
  17. data/app/helpers/spree/store_helper.rb +23 -0
  18. data/app/helpers/spree/taxons_helper.rb +22 -0
  19. data/app/jobs/spree/promotion_code_batch_job.rb +26 -0
  20. data/app/mailers/spree/base_mailer.rb +18 -0
  21. data/app/mailers/spree/carton_mailer.rb +29 -0
  22. data/app/mailers/spree/order_mailer.rb +36 -0
  23. data/app/mailers/spree/promotion_code_batch_mailer.rb +15 -0
  24. data/app/mailers/spree/reimbursement_mailer.rb +13 -0
  25. data/app/mailers/spree/test_mailer.rb +11 -0
  26. data/app/models/concerns/spree/adjustment_source.rb +27 -0
  27. data/app/models/concerns/spree/calculated_adjustments.rb +40 -0
  28. data/app/models/concerns/spree/default_price.rb +27 -0
  29. data/app/models/concerns/spree/display_money.rb +34 -0
  30. data/app/models/concerns/spree/named_type.rb +14 -0
  31. data/app/models/concerns/spree/ordered_property_value_list.rb +28 -0
  32. data/app/models/concerns/spree/ransackable_attributes.rb +22 -0
  33. data/app/models/concerns/spree/user_address_book.rb +149 -0
  34. data/app/models/concerns/spree/user_methods.rb +77 -0
  35. data/app/models/concerns/spree/user_payment_source.rb +26 -0
  36. data/app/models/concerns/spree/user_reporting.rb +24 -0
  37. data/app/models/spree/ability.rb +64 -0
  38. data/app/models/spree/address.rb +222 -0
  39. data/app/models/spree/adjustment.rb +168 -0
  40. data/app/models/spree/adjustment_reason.rb +12 -0
  41. data/app/models/spree/asset.rb +8 -0
  42. data/app/models/spree/base.rb +46 -0
  43. data/app/models/spree/billing_integration.rb +23 -0
  44. data/app/models/spree/calculator/default_tax.rb +60 -0
  45. data/app/models/spree/calculator/distributed_amount.rb +33 -0
  46. data/app/models/spree/calculator/flat_percent_item_total.rb +20 -0
  47. data/app/models/spree/calculator/flat_rate.rb +18 -0
  48. data/app/models/spree/calculator/flexi_rate.rb +27 -0
  49. data/app/models/spree/calculator/free_shipping.rb +21 -0
  50. data/app/models/spree/calculator/percent_on_line_item.rb +13 -0
  51. data/app/models/spree/calculator/percent_per_item.rb +49 -0
  52. data/app/models/spree/calculator/price_sack.rb +27 -0
  53. data/app/models/spree/calculator/returns/default_refund_amount.rb +34 -0
  54. data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +21 -0
  55. data/app/models/spree/calculator/shipping/flat_rate.rb +17 -0
  56. data/app/models/spree/calculator/shipping/flexi_rate.rb +34 -0
  57. data/app/models/spree/calculator/shipping/per_item.rb +21 -0
  58. data/app/models/spree/calculator/shipping/price_sack.rb +27 -0
  59. data/app/models/spree/calculator/tiered_flat_rate.rb +52 -0
  60. data/app/models/spree/calculator/tiered_percent.rb +61 -0
  61. data/app/models/spree/calculator.rb +49 -0
  62. data/app/models/spree/carton.rb +59 -0
  63. data/app/models/spree/classification.rb +13 -0
  64. data/app/models/spree/country.rb +28 -0
  65. data/app/models/spree/credit_card.rb +197 -0
  66. data/app/models/spree/customer_return.rb +78 -0
  67. data/app/models/spree/distributed_amounts_handler.rb +43 -0
  68. data/app/models/spree/exchange.rb +45 -0
  69. data/app/models/spree/fulfilment_changer.rb +135 -0
  70. data/app/models/spree/gallery/product_gallery.rb +18 -0
  71. data/app/models/spree/gallery/variant_gallery.rb +18 -0
  72. data/app/models/spree/gateway/bogus.rb +13 -0
  73. data/app/models/spree/gateway/bogus_simple.rb +13 -0
  74. data/app/models/spree/gateway.rb +14 -0
  75. data/app/models/spree/image.rb +56 -0
  76. data/app/models/spree/inventory_unit.rb +159 -0
  77. data/app/models/spree/legacy_user.rb +26 -0
  78. data/app/models/spree/line_item.rb +206 -0
  79. data/app/models/spree/line_item_action.rb +8 -0
  80. data/app/models/spree/log_entry.rb +11 -0
  81. data/app/models/spree/option_type.rb +32 -0
  82. data/app/models/spree/option_value.rb +33 -0
  83. data/app/models/spree/option_values_variant.rb +8 -0
  84. data/app/models/spree/order/checkout.rb +243 -0
  85. data/app/models/spree/order/number_generator.rb +45 -0
  86. data/app/models/spree/order/payments.rb +55 -0
  87. data/app/models/spree/order.rb +914 -0
  88. data/app/models/spree/order_cancellations.rb +125 -0
  89. data/app/models/spree/order_capturing.rb +50 -0
  90. data/app/models/spree/order_contents.rb +126 -0
  91. data/app/models/spree/order_inventory.rb +115 -0
  92. data/app/models/spree/order_merger.rb +143 -0
  93. data/app/models/spree/order_mutex.rb +35 -0
  94. data/app/models/spree/order_promotion.rb +27 -0
  95. data/app/models/spree/order_shipping.rb +89 -0
  96. data/app/models/spree/order_taxation.rb +81 -0
  97. data/app/models/spree/order_update_attributes.rb +41 -0
  98. data/app/models/spree/order_updater.rb +271 -0
  99. data/app/models/spree/payment/cancellation.rb +62 -0
  100. data/app/models/spree/payment/processing.rb +225 -0
  101. data/app/models/spree/payment.rb +284 -0
  102. data/app/models/spree/payment_capture_event.rb +11 -0
  103. data/app/models/spree/payment_create.rb +93 -0
  104. data/app/models/spree/payment_method/bogus_credit_card.rb +90 -0
  105. data/app/models/spree/payment_method/check.rb +40 -0
  106. data/app/models/spree/payment_method/credit_card.rb +43 -0
  107. data/app/models/spree/payment_method/simple_bogus_credit_card.rb +26 -0
  108. data/app/models/spree/payment_method/store_credit.rb +122 -0
  109. data/app/models/spree/payment_method.rb +281 -0
  110. data/app/models/spree/payment_source.rb +47 -0
  111. data/app/models/spree/preference.rb +7 -0
  112. data/app/models/spree/price.rb +89 -0
  113. data/app/models/spree/product/scopes.rb +259 -0
  114. data/app/models/spree/product.rb +400 -0
  115. data/app/models/spree/product_option_type.rb +9 -0
  116. data/app/models/spree/product_promotion_rule.rb +8 -0
  117. data/app/models/spree/product_property.rb +14 -0
  118. data/app/models/spree/promotion/actions/create_adjustment.rb +80 -0
  119. data/app/models/spree/promotion/actions/create_item_adjustments.rb +102 -0
  120. data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +142 -0
  121. data/app/models/spree/promotion/actions/free_shipping.rb +57 -0
  122. data/app/models/spree/promotion/rules/first_order.rb +40 -0
  123. data/app/models/spree/promotion/rules/first_repeat_purchase_since.rb +36 -0
  124. data/app/models/spree/promotion/rules/item_total.rb +45 -0
  125. data/app/models/spree/promotion/rules/nth_order.rb +45 -0
  126. data/app/models/spree/promotion/rules/one_use_per_user.rb +25 -0
  127. data/app/models/spree/promotion/rules/option_value.rb +50 -0
  128. data/app/models/spree/promotion/rules/product.rb +74 -0
  129. data/app/models/spree/promotion/rules/store.rb +22 -0
  130. data/app/models/spree/promotion/rules/taxon.rb +103 -0
  131. data/app/models/spree/promotion/rules/user.rb +30 -0
  132. data/app/models/spree/promotion/rules/user_logged_in.rb +20 -0
  133. data/app/models/spree/promotion/rules/user_role.rb +45 -0
  134. data/app/models/spree/promotion.rb +260 -0
  135. data/app/models/spree/promotion_action.rb +53 -0
  136. data/app/models/spree/promotion_category.rb +8 -0
  137. data/app/models/spree/promotion_chooser.rb +34 -0
  138. data/app/models/spree/promotion_code/batch_builder.rb +78 -0
  139. data/app/models/spree/promotion_code.rb +44 -0
  140. data/app/models/spree/promotion_code_batch.rb +27 -0
  141. data/app/models/spree/promotion_handler/cart.rb +55 -0
  142. data/app/models/spree/promotion_handler/coupon.rb +92 -0
  143. data/app/models/spree/promotion_handler/free_shipping.rb +9 -0
  144. data/app/models/spree/promotion_handler/page.rb +26 -0
  145. data/app/models/spree/promotion_handler/shipping.rb +61 -0
  146. data/app/models/spree/promotion_rule.rb +51 -0
  147. data/app/models/spree/promotion_rule_role.rb +8 -0
  148. data/app/models/spree/promotion_rule_store.rb +10 -0
  149. data/app/models/spree/promotion_rule_taxon.rb +8 -0
  150. data/app/models/spree/promotion_rule_user.rb +10 -0
  151. data/app/models/spree/property.rb +20 -0
  152. data/app/models/spree/refund.rb +90 -0
  153. data/app/models/spree/refund_reason.rb +15 -0
  154. data/app/models/spree/reimbursement/credit.rb +29 -0
  155. data/app/models/spree/reimbursement/reimbursement_type_engine.rb +56 -0
  156. data/app/models/spree/reimbursement/reimbursement_type_validator.rb +17 -0
  157. data/app/models/spree/reimbursement.rb +186 -0
  158. data/app/models/spree/reimbursement_performer.rb +40 -0
  159. data/app/models/spree/reimbursement_tax_calculator.rb +35 -0
  160. data/app/models/spree/reimbursement_type/credit.rb +15 -0
  161. data/app/models/spree/reimbursement_type/exchange.rb +11 -0
  162. data/app/models/spree/reimbursement_type/original_payment.rb +15 -0
  163. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +72 -0
  164. data/app/models/spree/reimbursement_type/store_credit.rb +29 -0
  165. data/app/models/spree/reimbursement_type.rb +18 -0
  166. data/app/models/spree/return_authorization.rb +90 -0
  167. data/app/models/spree/return_item/eligibility_validator/base_validator.rb +30 -0
  168. data/app/models/spree/return_item/eligibility_validator/default.rb +36 -0
  169. data/app/models/spree/return_item/eligibility_validator/inventory_shipped.rb +22 -0
  170. data/app/models/spree/return_item/eligibility_validator/no_reimbursements.rb +22 -0
  171. data/app/models/spree/return_item/eligibility_validator/order_completed.rb +22 -0
  172. data/app/models/spree/return_item/eligibility_validator/rma_required.rb +22 -0
  173. data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +22 -0
  174. data/app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb +47 -0
  175. data/app/models/spree/return_item/exchange_variant_eligibility/same_product.rb +13 -0
  176. data/app/models/spree/return_item.rb +320 -0
  177. data/app/models/spree/return_reason.rb +14 -0
  178. data/app/models/spree/returns_calculator.rb +9 -0
  179. data/app/models/spree/role.rb +14 -0
  180. data/app/models/spree/role_user.rb +11 -0
  181. data/app/models/spree/shipment.rb +431 -0
  182. data/app/models/spree/shipping_calculator.rb +23 -0
  183. data/app/models/spree/shipping_category.rb +10 -0
  184. data/app/models/spree/shipping_manifest.rb +30 -0
  185. data/app/models/spree/shipping_method.rb +133 -0
  186. data/app/models/spree/shipping_method_category.rb +8 -0
  187. data/app/models/spree/shipping_method_stock_location.rb +6 -0
  188. data/app/models/spree/shipping_method_zone.rb +8 -0
  189. data/app/models/spree/shipping_rate.rb +48 -0
  190. data/app/models/spree/shipping_rate_tax.rb +39 -0
  191. data/app/models/spree/state.rb +40 -0
  192. data/app/models/spree/state_change.rb +17 -0
  193. data/app/models/spree/stock/availability.rb +72 -0
  194. data/app/models/spree/stock/availability_validator.rb +36 -0
  195. data/app/models/spree/stock/content_item.rb +50 -0
  196. data/app/models/spree/stock/differentiator.rb +47 -0
  197. data/app/models/spree/stock/estimator.rb +71 -0
  198. data/app/models/spree/stock/inventory_unit_builder.rb +23 -0
  199. data/app/models/spree/stock/inventory_validator.rb +16 -0
  200. data/app/models/spree/stock/location_sorter/base.rb +38 -0
  201. data/app/models/spree/stock/location_sorter/default_first.rb +15 -0
  202. data/app/models/spree/stock/location_sorter/unsorted.rb +14 -0
  203. data/app/models/spree/stock/package.rb +142 -0
  204. data/app/models/spree/stock/quantifier.rb +49 -0
  205. data/app/models/spree/stock/shipping_rate_selector.rb +17 -0
  206. data/app/models/spree/stock/shipping_rate_sorter.rb +17 -0
  207. data/app/models/spree/stock/simple_coordinator.rb +119 -0
  208. data/app/models/spree/stock/splitter/backordered.rb +23 -0
  209. data/app/models/spree/stock/splitter/base.rb +35 -0
  210. data/app/models/spree/stock/splitter/shipping_category.rb +35 -0
  211. data/app/models/spree/stock/splitter/weight.rb +32 -0
  212. data/app/models/spree/stock/splitter_chain.rb +34 -0
  213. data/app/models/spree/stock_item.rb +128 -0
  214. data/app/models/spree/stock_location.rb +127 -0
  215. data/app/models/spree/stock_movement.rb +28 -0
  216. data/app/models/spree/stock_quantities.rb +83 -0
  217. data/app/models/spree/store.rb +83 -0
  218. data/app/models/spree/store_credit.rb +293 -0
  219. data/app/models/spree/store_credit_category.rb +18 -0
  220. data/app/models/spree/store_credit_event.rb +66 -0
  221. data/app/models/spree/store_credit_type.rb +10 -0
  222. data/app/models/spree/store_credit_update_reason.rb +4 -0
  223. data/app/models/spree/store_payment_method.rb +8 -0
  224. data/app/models/spree/store_selector/by_server_name.rb +32 -0
  225. data/app/models/spree/store_selector/legacy.rb +50 -0
  226. data/app/models/spree/store_shipping_method.rb +8 -0
  227. data/app/models/spree/tax/item_tax.rb +22 -0
  228. data/app/models/spree/tax/order_adjuster.rb +22 -0
  229. data/app/models/spree/tax/order_tax.rb +20 -0
  230. data/app/models/spree/tax/shipping_rate_taxer.rb +24 -0
  231. data/app/models/spree/tax/tax_helpers.rb +17 -0
  232. data/app/models/spree/tax/tax_location.rb +39 -0
  233. data/app/models/spree/tax_calculator/default.rb +85 -0
  234. data/app/models/spree/tax_calculator/shipping_rate.rb +58 -0
  235. data/app/models/spree/tax_category.rb +30 -0
  236. data/app/models/spree/tax_rate.rb +147 -0
  237. data/app/models/spree/tax_rate_tax_category.rb +8 -0
  238. data/app/models/spree/taxon.rb +144 -0
  239. data/app/models/spree/taxonomy.rb +29 -0
  240. data/app/models/spree/unit_cancel.rb +36 -0
  241. data/app/models/spree/user_address.rb +23 -0
  242. data/app/models/spree/user_class_handle.rb +28 -0
  243. data/app/models/spree/user_stock_location.rb +8 -0
  244. data/app/models/spree/validations/db_maximum_length_validator.rb +23 -0
  245. data/app/models/spree/variant/price_selector.rb +37 -0
  246. data/app/models/spree/variant/pricing_options.rb +98 -0
  247. data/app/models/spree/variant/scopes.rb +42 -0
  248. data/app/models/spree/variant/vat_price_generator.rb +63 -0
  249. data/app/models/spree/variant.rb +465 -0
  250. data/app/models/spree/variant_property_rule.rb +44 -0
  251. data/app/models/spree/variant_property_rule_condition.rb +10 -0
  252. data/app/models/spree/variant_property_rule_value.rb +12 -0
  253. data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +40 -0
  254. data/app/models/spree/wallet/default_payment_builder.rb +28 -0
  255. data/app/models/spree/wallet.rb +78 -0
  256. data/app/models/spree/wallet_payment_source.rb +19 -0
  257. data/app/models/spree/zone.rb +148 -0
  258. data/app/models/spree/zone_member.rb +10 -0
  259. data/app/views/layouts/spree/base_mailer.html.erb +784 -0
  260. data/app/views/spree/carton_mailer/shipped_email.html.erb +34 -0
  261. data/app/views/spree/carton_mailer/shipped_email.text.erb +16 -0
  262. data/app/views/spree/order_mailer/cancel_email.html.erb +45 -0
  263. data/app/views/spree/order_mailer/cancel_email.text.erb +16 -0
  264. data/app/views/spree/order_mailer/confirm_email.html.erb +84 -0
  265. data/app/views/spree/order_mailer/confirm_email.text.erb +38 -0
  266. data/app/views/spree/order_mailer/inventory_cancellation_email.html.erb +26 -0
  267. data/app/views/spree/order_mailer/inventory_cancellation_email.text.erb +10 -0
  268. data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_errored.text.erb +2 -0
  269. data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_finished.text.erb +2 -0
  270. data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +39 -0
  271. data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +17 -0
  272. data/app/views/spree/shared/_base_mailer_footer.html.erb +1 -0
  273. data/app/views/spree/shared/_base_mailer_header.html.erb +1 -0
  274. data/app/views/spree/shared/_error_messages.html.erb +11 -0
  275. data/app/views/spree/test_mailer/test_email.html.erb +40 -0
  276. data/app/views/spree/test_mailer/test_email.text.erb +4 -0
  277. data/config/initializers/assets.rb +5 -0
  278. data/config/initializers/friendly_id.rb +90 -0
  279. data/config/locales/en.yml +2107 -0
  280. data/db/default/spree/countries.rb +45 -0
  281. data/db/default/spree/refund_reasons.rb +3 -0
  282. data/db/default/spree/return_reasons.rb +11 -0
  283. data/db/default/spree/roles.rb +3 -0
  284. data/db/default/spree/shipping_categories.rb +3 -0
  285. data/db/default/spree/states.rb +14 -0
  286. data/db/default/spree/stock_locations.rb +4 -0
  287. data/db/default/spree/store_credit.rb +22 -0
  288. data/db/default/spree/stores.rb +10 -0
  289. data/db/default/spree/zones.rb +13 -0
  290. data/db/migrate/20160101010000_solidus_one_four.rb +1102 -0
  291. data/db/migrate/20160420044191_create_spree_wallet_payment_sources.rb +27 -0
  292. data/db/migrate/20160420181916_migrate_credit_cards_to_wallet_payment_sources.rb +29 -0
  293. data/db/migrate/20160924135758_remove_is_default_from_prices.rb +7 -0
  294. data/db/migrate/20161009141333_remove_currency_from_line_items.rb +7 -0
  295. data/db/migrate/20161014221052_add_available_to_columns_and_remove_display_on_from_payment_methods.rb +30 -0
  296. data/db/migrate/20161017102621_create_spree_promotion_code_batch.rb +38 -0
  297. data/db/migrate/20161123154034_add_available_to_users_and_remove_display_on_from_shipping_methods.rb +22 -0
  298. data/db/migrate/20161129035810_add_index_to_spree_payments_number.rb +7 -0
  299. data/db/migrate/20170223235001_remove_spree_store_credits_column.rb +7 -0
  300. data/db/migrate/20170317035819_add_lft_and_rgt_indexes_to_taxons.rb +8 -0
  301. data/db/migrate/20170319191942_remove_order_id_from_inventory_units.rb +30 -0
  302. data/db/migrate/20170412103617_transform_tax_rate_category_relation.rb +50 -0
  303. data/db/migrate/20170422134804_add_roles_unique_constraints.rb +8 -0
  304. data/db/migrate/20170522143442_add_time_range_to_tax_rate.rb +8 -0
  305. data/db/migrate/20170608074534_rename_bogus_gateways.rb +17 -0
  306. data/db/migrate/20170831201542_remove_default_tax_from_spree_zones.rb +7 -0
  307. data/db/migrate/20180202190713_create_promotion_rule_stores.rb +12 -0
  308. data/db/migrate/20180202222641_create_store_shipping_methods.rb +12 -0
  309. data/db/migrate/20180313220213_add_available_locales_to_stores.rb +9 -0
  310. data/db/migrate/20180322142651_add_amount_remaining_to_store_credit_events.rb +61 -0
  311. data/db/migrate/20180328172631_add_join_characters_to_promotion_code_batch.rb +11 -0
  312. data/db/seeds.rb +17 -0
  313. data/lib/generators/spree/custom_user/custom_user_generator.rb +43 -0
  314. data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +40 -0
  315. data/lib/generators/spree/custom_user/templates/migration.rb.tt +30 -0
  316. data/lib/generators/spree/dummy/dummy_generator.rb +148 -0
  317. data/lib/generators/spree/dummy/templates/rails/application.rb.tt +10 -0
  318. data/lib/generators/spree/dummy/templates/rails/boot.rb +6 -0
  319. data/lib/generators/spree/dummy/templates/rails/database.yml +71 -0
  320. data/lib/generators/spree/dummy/templates/rails/routes.rb +2 -0
  321. data/lib/generators/spree/dummy/templates/rails/script/rails +6 -0
  322. data/lib/generators/spree/dummy/templates/rails/test.rb +33 -0
  323. data/lib/generators/spree/install/install_generator.rb +189 -0
  324. data/lib/generators/spree/install/templates/config/initializers/spree.rb.tt +67 -0
  325. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/backend/all.js +10 -0
  326. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/frontend/all.js +10 -0
  327. data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/backend/all.css +9 -0
  328. data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +9 -0
  329. data/lib/solidus/migrations/rename_gateways.rb +39 -0
  330. data/lib/solidus_core.rb +3 -0
  331. data/lib/spree/app_configuration.rb +529 -0
  332. data/lib/spree/config.rb +5 -0
  333. data/lib/spree/core/active_merchant_dependencies.rb +13 -0
  334. data/lib/spree/core/class_constantizer.rb +33 -0
  335. data/lib/spree/core/controller_helpers/auth.rb +83 -0
  336. data/lib/spree/core/controller_helpers/common.rb +82 -0
  337. data/lib/spree/core/controller_helpers/order.rb +107 -0
  338. data/lib/spree/core/controller_helpers/payment_parameters.rb +221 -0
  339. data/lib/spree/core/controller_helpers/pricing.rb +30 -0
  340. data/lib/spree/core/controller_helpers/search.rb +16 -0
  341. data/lib/spree/core/controller_helpers/store.rb +19 -0
  342. data/lib/spree/core/controller_helpers/strong_parameters.rb +63 -0
  343. data/lib/spree/core/current_store.rb +24 -0
  344. data/lib/spree/core/engine.rb +61 -0
  345. data/lib/spree/core/environment/calculators.rb +18 -0
  346. data/lib/spree/core/environment.rb +22 -0
  347. data/lib/spree/core/environment_extension.rb +31 -0
  348. data/lib/spree/core/importer/order.rb +203 -0
  349. data/lib/spree/core/importer/product.rb +65 -0
  350. data/lib/spree/core/importer.rb +11 -0
  351. data/lib/spree/core/permalinks.rb +67 -0
  352. data/lib/spree/core/product_duplicator.rb +75 -0
  353. data/lib/spree/core/product_filters.rb +197 -0
  354. data/lib/spree/core/role_configuration.rb +88 -0
  355. data/lib/spree/core/search/base.rb +120 -0
  356. data/lib/spree/core/search/variant.rb +66 -0
  357. data/lib/spree/core/stock_configuration.rb +26 -0
  358. data/lib/spree/core/validators/email.rb +30 -0
  359. data/lib/spree/core/version.rb +11 -0
  360. data/lib/spree/core.rb +92 -0
  361. data/lib/spree/deprecation.rb +7 -0
  362. data/lib/spree/i18n.rb +35 -0
  363. data/lib/spree/localized_number.rb +30 -0
  364. data/lib/spree/mailer_previews/carton_preview.rb +13 -0
  365. data/lib/spree/mailer_previews/order_preview.rb +25 -0
  366. data/lib/spree/mailer_previews/reimbursement_preview.rb +13 -0
  367. data/lib/spree/migration_helpers.rb +21 -0
  368. data/lib/spree/migrations.rb +85 -0
  369. data/lib/spree/money.rb +133 -0
  370. data/lib/spree/paranoia_deprecations.rb +21 -0
  371. data/lib/spree/permission_sets/base.rb +32 -0
  372. data/lib/spree/permission_sets/configuration_display.rb +25 -0
  373. data/lib/spree/permission_sets/configuration_management.rb +25 -0
  374. data/lib/spree/permission_sets/dashboard_display.rb +11 -0
  375. data/lib/spree/permission_sets/default_customer.rb +37 -0
  376. data/lib/spree/permission_sets/order_display.rb +21 -0
  377. data/lib/spree/permission_sets/order_management.rb +22 -0
  378. data/lib/spree/permission_sets/product_display.rb +19 -0
  379. data/lib/spree/permission_sets/product_management.rb +21 -0
  380. data/lib/spree/permission_sets/promotion_display.rb +15 -0
  381. data/lib/spree/permission_sets/promotion_management.rb +14 -0
  382. data/lib/spree/permission_sets/restricted_stock_display.rb +18 -0
  383. data/lib/spree/permission_sets/restricted_stock_management.rb +18 -0
  384. data/lib/spree/permission_sets/stock_display.rb +12 -0
  385. data/lib/spree/permission_sets/stock_management.rb +12 -0
  386. data/lib/spree/permission_sets/super_user.rb +11 -0
  387. data/lib/spree/permission_sets/user_display.rb +13 -0
  388. data/lib/spree/permission_sets/user_management.rb +21 -0
  389. data/lib/spree/permission_sets.rb +20 -0
  390. data/lib/spree/permitted_attributes.rb +133 -0
  391. data/lib/spree/preferences/configuration.rb +107 -0
  392. data/lib/spree/preferences/preferable.rb +180 -0
  393. data/lib/spree/preferences/preferable_class_methods.rb +88 -0
  394. data/lib/spree/preferences/scoped_store.rb +36 -0
  395. data/lib/spree/preferences/static_model_preferences.rb +49 -0
  396. data/lib/spree/preferences/statically_configurable.rb +39 -0
  397. data/lib/spree/preferences/store.rb +91 -0
  398. data/lib/spree/promo/environment.rb +13 -0
  399. data/lib/spree/testing_support/ability_helpers.rb +107 -0
  400. data/lib/spree/testing_support/authorization_helpers.rb +69 -0
  401. data/lib/spree/testing_support/bar_ability.rb +19 -0
  402. data/lib/spree/testing_support/caching.rb +33 -0
  403. data/lib/spree/testing_support/capybara_ext.rb +147 -0
  404. data/lib/spree/testing_support/common_rake.rb +38 -0
  405. data/lib/spree/testing_support/controller_requests.rb +108 -0
  406. data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/backend/all.js +10 -0
  407. data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/frontend/all.js +10 -0
  408. data/lib/spree/testing_support/dummy_app/assets/stylesheets/spree/backend/all.css +9 -0
  409. data/lib/spree/testing_support/dummy_app/assets/stylesheets/spree/frontend/all.css +9 -0
  410. data/lib/spree/testing_support/dummy_app/database.yml +33 -0
  411. data/lib/spree/testing_support/dummy_app/migrations.rb +47 -0
  412. data/lib/spree/testing_support/dummy_app/rake_tasks.rb +67 -0
  413. data/lib/spree/testing_support/dummy_app/routes.rb +5 -0
  414. data/lib/spree/testing_support/dummy_app/views/layouts/application.html.erb +1 -0
  415. data/lib/spree/testing_support/dummy_app.rb +120 -0
  416. data/lib/spree/testing_support/extension_rake.rb +11 -0
  417. data/lib/spree/testing_support/factories/address_factory.rb +45 -0
  418. data/lib/spree/testing_support/factories/adjustment_factory.rb +45 -0
  419. data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +8 -0
  420. data/lib/spree/testing_support/factories/calculator_factory.rb +26 -0
  421. data/lib/spree/testing_support/factories/carton_factory.rb +26 -0
  422. data/lib/spree/testing_support/factories/country_factory.rb +21 -0
  423. data/lib/spree/testing_support/factories/credit_card_factory.rb +17 -0
  424. data/lib/spree/testing_support/factories/customer_return_factory.rb +35 -0
  425. data/lib/spree/testing_support/factories/image_factory.rb +7 -0
  426. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +26 -0
  427. data/lib/spree/testing_support/factories/line_item_factory.rb +18 -0
  428. data/lib/spree/testing_support/factories/option_type_factory.rb +8 -0
  429. data/lib/spree/testing_support/factories/option_value_factory.rb +10 -0
  430. data/lib/spree/testing_support/factories/order_factory.rb +160 -0
  431. data/lib/spree/testing_support/factories/order_promotion_factory.rb +11 -0
  432. data/lib/spree/testing_support/factories/payment_factory.rb +51 -0
  433. data/lib/spree/testing_support/factories/payment_method_factory.rb +32 -0
  434. data/lib/spree/testing_support/factories/price_factory.rb +11 -0
  435. data/lib/spree/testing_support/factories/product_factory.rb +50 -0
  436. data/lib/spree/testing_support/factories/product_option_type_factory.rb +11 -0
  437. data/lib/spree/testing_support/factories/product_property_factory.rb +11 -0
  438. data/lib/spree/testing_support/factories/promotion_category_factory.rb +7 -0
  439. data/lib/spree/testing_support/factories/promotion_code_factory.rb +11 -0
  440. data/lib/spree/testing_support/factories/promotion_factory.rb +64 -0
  441. data/lib/spree/testing_support/factories/property_factory.rb +8 -0
  442. data/lib/spree/testing_support/factories/refund_factory.rb +21 -0
  443. data/lib/spree/testing_support/factories/refund_reason_factory.rb +7 -0
  444. data/lib/spree/testing_support/factories/reimbursement_factory.rb +21 -0
  445. data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +9 -0
  446. data/lib/spree/testing_support/factories/return_authorization_factory.rb +20 -0
  447. data/lib/spree/testing_support/factories/return_item_factory.rb +23 -0
  448. data/lib/spree/testing_support/factories/return_reason_factory.rb +7 -0
  449. data/lib/spree/testing_support/factories/role_factory.rb +11 -0
  450. data/lib/spree/testing_support/factories/shipment_factory.rb +37 -0
  451. data/lib/spree/testing_support/factories/shipping_category_factory.rb +7 -0
  452. data/lib/spree/testing_support/factories/shipping_method_factory.rb +42 -0
  453. data/lib/spree/testing_support/factories/shipping_rate_factory.rb +11 -0
  454. data/lib/spree/testing_support/factories/state_factory.rb +28 -0
  455. data/lib/spree/testing_support/factories/stock_item_factory.rb +14 -0
  456. data/lib/spree/testing_support/factories/stock_location_factory.rb +41 -0
  457. data/lib/spree/testing_support/factories/stock_movement_factory.rb +15 -0
  458. data/lib/spree/testing_support/factories/stock_package_factory.rb +28 -0
  459. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +7 -0
  460. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +30 -0
  461. data/lib/spree/testing_support/factories/store_credit_factory.rb +16 -0
  462. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +13 -0
  463. data/lib/spree/testing_support/factories/store_credit_update_reason_factory.rb +7 -0
  464. data/lib/spree/testing_support/factories/store_factory.rb +10 -0
  465. data/lib/spree/testing_support/factories/tax_category_factory.rb +10 -0
  466. data/lib/spree/testing_support/factories/tax_rate_factory.rb +14 -0
  467. data/lib/spree/testing_support/factories/taxon_factory.rb +11 -0
  468. data/lib/spree/testing_support/factories/taxonomy_factory.rb +7 -0
  469. data/lib/spree/testing_support/factories/user_factory.rb +21 -0
  470. data/lib/spree/testing_support/factories/variant_factory.rb +43 -0
  471. data/lib/spree/testing_support/factories/variant_property_rule_condition_factory.rb +11 -0
  472. data/lib/spree/testing_support/factories/variant_property_rule_factory.rb +22 -0
  473. data/lib/spree/testing_support/factories/variant_property_rule_value_factory.rb +11 -0
  474. data/lib/spree/testing_support/factories/zone_factory.rb +24 -0
  475. data/lib/spree/testing_support/factories.rb +7 -0
  476. data/lib/spree/testing_support/flash.rb +29 -0
  477. data/lib/spree/testing_support/order_walkthrough.rb +87 -0
  478. data/lib/spree/testing_support/preferences.rb +34 -0
  479. data/lib/spree/testing_support/sequences.rb +8 -0
  480. data/lib/spree/testing_support/shared_examples/gallery.rb +18 -0
  481. data/lib/spree/testing_support/url_helpers.rb +11 -0
  482. data/lib/spree_core.rb +3 -0
  483. data/lib/tasks/core.rake +104 -0
  484. data/lib/tasks/email.rake +9 -0
  485. data/lib/tasks/migrations/copy_order_bill_address_to_credit_card.rake +115 -0
  486. data/lib/tasks/migrations/migrate_shipping_rate_taxes.rake +20 -0
  487. data/lib/tasks/migrations/migrate_user_addresses.rake +31 -0
  488. data/lib/tasks/migrations/rename_gateways.rake +21 -0
  489. data/lib/tasks/order_capturing.rake +25 -0
  490. data/script/rails +10 -0
  491. data/solidus_core.gemspec +48 -0
  492. data/spec/fixtures/thinking-cat.jpg +0 -0
  493. data/spec/helpers/base_helper_spec.rb +168 -0
  494. data/spec/helpers/products_helper_spec.rb +200 -0
  495. data/spec/helpers/taxons_helper_spec.rb +41 -0
  496. data/spec/jobs/promotion_code_batch_job_spec.rb +96 -0
  497. data/spec/lib/calculated_adjustments_spec.rb +133 -0
  498. data/spec/lib/i18n_spec.rb +92 -0
  499. data/spec/lib/search/base_spec.rb +87 -0
  500. data/spec/lib/search/variant_spec.rb +115 -0
  501. data/spec/lib/spree/core/class_constantizer_spec.rb +71 -0
  502. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +69 -0
  503. data/spec/lib/spree/core/controller_helpers/order_spec.rb +126 -0
  504. data/spec/lib/spree/core/controller_helpers/payment_parameters_spec.rb +195 -0
  505. data/spec/lib/spree/core/controller_helpers/pricing_spec.rb +81 -0
  506. data/spec/lib/spree/core/controller_helpers/search_spec.rb +21 -0
  507. data/spec/lib/spree/core/controller_helpers/store_spec.rb +18 -0
  508. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +41 -0
  509. data/spec/lib/spree/core/current_store_spec.rb +33 -0
  510. data/spec/lib/spree/core/environment_extension_spec.rb +36 -0
  511. data/spec/lib/spree/core/importer/order_spec.rb +484 -0
  512. data/spec/lib/spree/core/role_configuration_spec.rb +155 -0
  513. data/spec/lib/spree/core/stock_configuration_spec.rb +59 -0
  514. data/spec/lib/spree/core/testing_support/factories/address_factory_spec.rb +61 -0
  515. data/spec/lib/spree/core/testing_support/factories/adjustment_factory_spec.rb +20 -0
  516. data/spec/lib/spree/core/testing_support/factories/adjustment_reason_factory_spec.rb +14 -0
  517. data/spec/lib/spree/core/testing_support/factories/calculator_factory_spec.rb +44 -0
  518. data/spec/lib/spree/core/testing_support/factories/carton_factory_spec.rb +14 -0
  519. data/spec/lib/spree/core/testing_support/factories/country_factory_spec.rb +14 -0
  520. data/spec/lib/spree/core/testing_support/factories/credit_card_factory_spec.rb +14 -0
  521. data/spec/lib/spree/core/testing_support/factories/customer_return_factory_spec.rb +39 -0
  522. data/spec/lib/spree/core/testing_support/factories/image_factory_spec.rb +14 -0
  523. data/spec/lib/spree/core/testing_support/factories/inventory_unit_factory_spec.rb +14 -0
  524. data/spec/lib/spree/core/testing_support/factories/line_item_factory_spec.rb +14 -0
  525. data/spec/lib/spree/core/testing_support/factories/option_type_factory_spec.rb +14 -0
  526. data/spec/lib/spree/core/testing_support/factories/option_value_factory_spec.rb +14 -0
  527. data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +376 -0
  528. data/spec/lib/spree/core/testing_support/factories/order_promotion_factory_spec.rb +14 -0
  529. data/spec/lib/spree/core/testing_support/factories/payment_factory_spec.rb +40 -0
  530. data/spec/lib/spree/core/testing_support/factories/payment_method_factory_spec.rb +32 -0
  531. data/spec/lib/spree/core/testing_support/factories/price_factory_spec.rb +14 -0
  532. data/spec/lib/spree/core/testing_support/factories/product_factory_spec.rb +32 -0
  533. data/spec/lib/spree/core/testing_support/factories/product_option_type_factory_spec.rb +14 -0
  534. data/spec/lib/spree/core/testing_support/factories/product_property_factory_spec.rb +14 -0
  535. data/spec/lib/spree/core/testing_support/factories/promotion_category_factory_spec.rb +14 -0
  536. data/spec/lib/spree/core/testing_support/factories/promotion_code_factory_spec.rb +14 -0
  537. data/spec/lib/spree/core/testing_support/factories/promotion_factory_spec.rb +32 -0
  538. data/spec/lib/spree/core/testing_support/factories/property_factory_spec.rb +14 -0
  539. data/spec/lib/spree/core/testing_support/factories/refund_factory_spec.rb +14 -0
  540. data/spec/lib/spree/core/testing_support/factories/refund_reason_factory_spec.rb +14 -0
  541. data/spec/lib/spree/core/testing_support/factories/reimbursement_factory_spec.rb +20 -0
  542. data/spec/lib/spree/core/testing_support/factories/reimbursement_type_factory_spec.rb +14 -0
  543. data/spec/lib/spree/core/testing_support/factories/return_authorization_factory_spec.rb +14 -0
  544. data/spec/lib/spree/core/testing_support/factories/return_item_factory_spec.rb +20 -0
  545. data/spec/lib/spree/core/testing_support/factories/return_reason_factory_spec.rb +14 -0
  546. data/spec/lib/spree/core/testing_support/factories/role_factory_spec.rb +20 -0
  547. data/spec/lib/spree/core/testing_support/factories/shipment_factory_spec.rb +14 -0
  548. data/spec/lib/spree/core/testing_support/factories/shipping_category_factory_spec.rb +14 -0
  549. data/spec/lib/spree/core/testing_support/factories/shipping_method_factory_spec.rb +44 -0
  550. data/spec/lib/spree/core/testing_support/factories/shipping_rate_factory_spec.rb +14 -0
  551. data/spec/lib/spree/core/testing_support/factories/state_factory_spec.rb +59 -0
  552. data/spec/lib/spree/core/testing_support/factories/stock_item_factory_spec.rb +14 -0
  553. data/spec/lib/spree/core/testing_support/factories/stock_location_factory_spec.rb +35 -0
  554. data/spec/lib/spree/core/testing_support/factories/stock_movement_factory_spec.rb +14 -0
  555. data/spec/lib/spree/core/testing_support/factories/stock_package_factory_spec.rb +28 -0
  556. data/spec/lib/spree/core/testing_support/factories/store_credit_category_factory_spec.rb +14 -0
  557. data/spec/lib/spree/core/testing_support/factories/store_credit_event_factory_spec.rb +43 -0
  558. data/spec/lib/spree/core/testing_support/factories/store_credit_factory_spec.rb +14 -0
  559. data/spec/lib/spree/core/testing_support/factories/store_credit_type_factory_spec.rb +20 -0
  560. data/spec/lib/spree/core/testing_support/factories/store_credit_update_reason_factory_spec.rb +14 -0
  561. data/spec/lib/spree/core/testing_support/factories/store_factory_spec.rb +14 -0
  562. data/spec/lib/spree/core/testing_support/factories/tax_category_factory_spec.rb +14 -0
  563. data/spec/lib/spree/core/testing_support/factories/tax_rate_factory_spec.rb +14 -0
  564. data/spec/lib/spree/core/testing_support/factories/taxon_factory_spec.rb +14 -0
  565. data/spec/lib/spree/core/testing_support/factories/taxonomy_factory_spec.rb +14 -0
  566. data/spec/lib/spree/core/testing_support/factories/user_factory_spec.rb +24 -0
  567. data/spec/lib/spree/core/testing_support/factories/variant_factory_spec.rb +56 -0
  568. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_condition_factory_spec.rb +14 -0
  569. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_factory_spec.rb +14 -0
  570. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_value_factory_spec.rb +14 -0
  571. data/spec/lib/spree/core/testing_support/factories/zone_factory_spec.rb +20 -0
  572. data/spec/lib/spree/core/testing_support/preferences_spec.rb +28 -0
  573. data/spec/lib/spree/core/validators/email_spec.rb +53 -0
  574. data/spec/lib/spree/core/version_spec.rb +19 -0
  575. data/spec/lib/spree/localized_number_spec.rb +45 -0
  576. data/spec/lib/spree/migrations_spec.rb +32 -0
  577. data/spec/lib/spree/money_spec.rb +305 -0
  578. data/spec/lib/spree/permission_sets/default_customer_spec.rb +22 -0
  579. data/spec/lib/tasks/dummy_task.rake +12 -0
  580. data/spec/lib/tasks/dummy_task_spec.rb +30 -0
  581. data/spec/lib/tasks/migrations/migrate_shipping_rate_taxes_spec.rb +19 -0
  582. data/spec/mailers/carton_mailer_spec.rb +44 -0
  583. data/spec/mailers/order_mailer_spec.rb +117 -0
  584. data/spec/mailers/promotion_code_batch_mailer_spec.rb +47 -0
  585. data/spec/mailers/reimbursement_mailer_spec.rb +36 -0
  586. data/spec/mailers/test_mailer_spec.rb +11 -0
  587. data/spec/models/spree/ability_spec.rb +279 -0
  588. data/spec/models/spree/address_spec.rb +375 -0
  589. data/spec/models/spree/adjustment_reason_spec.rb +11 -0
  590. data/spec/models/spree/adjustment_spec.rb +339 -0
  591. data/spec/models/spree/app_configuration_spec.rb +55 -0
  592. data/spec/models/spree/asset_spec.rb +25 -0
  593. data/spec/models/spree/calculator/default_tax_spec.rb +260 -0
  594. data/spec/models/spree/calculator/distributed_amount_spec.rb +82 -0
  595. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +30 -0
  596. data/spec/models/spree/calculator/flat_rate_spec.rb +52 -0
  597. data/spec/models/spree/calculator/flexi_rate_spec.rb +158 -0
  598. data/spec/models/spree/calculator/free_shipping_spec.rb +8 -0
  599. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +20 -0
  600. data/spec/models/spree/calculator/percent_per_item_spec.rb +12 -0
  601. data/spec/models/spree/calculator/price_sack_spec.rb +35 -0
  602. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +70 -0
  603. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +39 -0
  604. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +18 -0
  605. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +56 -0
  606. data/spec/models/spree/calculator/shipping/per_item_spec.rb +25 -0
  607. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +35 -0
  608. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +99 -0
  609. data/spec/models/spree/calculator/tiered_percent_spec.rb +191 -0
  610. data/spec/models/spree/calculator_spec.rb +43 -0
  611. data/spec/models/spree/carton_spec.rb +137 -0
  612. data/spec/models/spree/classification_spec.rb +114 -0
  613. data/spec/models/spree/concerns/display_money_spec.rb +44 -0
  614. data/spec/models/spree/concerns/ordered_property_value_list_spec.rb +52 -0
  615. data/spec/models/spree/concerns/user_address_book_spec.rb +358 -0
  616. data/spec/models/spree/concerns/user_methods_spec.rb +121 -0
  617. data/spec/models/spree/country_spec.rb +78 -0
  618. data/spec/models/spree/credit_card_spec.rb +373 -0
  619. data/spec/models/spree/customer_return_spec.rb +293 -0
  620. data/spec/models/spree/distributed_amounts_handler_spec.rb +83 -0
  621. data/spec/models/spree/exchange_spec.rb +76 -0
  622. data/spec/models/spree/fulfilment_changer_spec.rb +307 -0
  623. data/spec/models/spree/gallery/product_gallery_spec.rb +21 -0
  624. data/spec/models/spree/gallery/variant_gallery_spec.rb +21 -0
  625. data/spec/models/spree/gateway/bogus_simple.rb +14 -0
  626. data/spec/models/spree/gateway/bogus_spec.rb +14 -0
  627. data/spec/models/spree/gateway_spec.rb +14 -0
  628. data/spec/models/spree/image_spec.rb +25 -0
  629. data/spec/models/spree/inventory_unit_spec.rb +312 -0
  630. data/spec/models/spree/line_item_spec.rb +240 -0
  631. data/spec/models/spree/option_type_spec.rb +16 -0
  632. data/spec/models/spree/option_value_spec.rb +52 -0
  633. data/spec/models/spree/order/address_spec.rb +52 -0
  634. data/spec/models/spree/order/adjustments_spec.rb +29 -0
  635. data/spec/models/spree/order/callbacks_spec.rb +44 -0
  636. data/spec/models/spree/order/checkout_spec.rb +744 -0
  637. data/spec/models/spree/order/finalizing_spec.rb +111 -0
  638. data/spec/models/spree/order/number_generator_spec.rb +47 -0
  639. data/spec/models/spree/order/outstanding_balance_integration_spec.rb +137 -0
  640. data/spec/models/spree/order/payment_spec.rb +280 -0
  641. data/spec/models/spree/order/risk_assessment_spec.rb +70 -0
  642. data/spec/models/spree/order/state_machine_spec.rb +122 -0
  643. data/spec/models/spree/order/totals_spec.rb +26 -0
  644. data/spec/models/spree/order/updating_spec.rb +18 -0
  645. data/spec/models/spree/order/validations_spec.rb +17 -0
  646. data/spec/models/spree/order_cancellations_spec.rb +192 -0
  647. data/spec/models/spree/order_capturing_spec.rb +16 -0
  648. data/spec/models/spree/order_contents_spec.rb +362 -0
  649. data/spec/models/spree/order_inventory_spec.rb +278 -0
  650. data/spec/models/spree/order_merger_spec.rb +159 -0
  651. data/spec/models/spree/order_mutex_spec.rb +89 -0
  652. data/spec/models/spree/order_promotion_spec.rb +33 -0
  653. data/spec/models/spree/order_shipping_spec.rb +247 -0
  654. data/spec/models/spree/order_spec.rb +1633 -0
  655. data/spec/models/spree/order_taxation_spec.rb +128 -0
  656. data/spec/models/spree/order_update_attributes_spec.rb +49 -0
  657. data/spec/models/spree/order_updater_spec.rb +560 -0
  658. data/spec/models/spree/payment/cancellation_spec.rb +83 -0
  659. data/spec/models/spree/payment_create_spec.rb +205 -0
  660. data/spec/models/spree/payment_method/bogus_credit_card_spec.rb +10 -0
  661. data/spec/models/spree/payment_method/check_spec.rb +80 -0
  662. data/spec/models/spree/payment_method/credit_card_spec.rb +68 -0
  663. data/spec/models/spree/payment_method/simple_bogus_credit_card_spec.rb +20 -0
  664. data/spec/models/spree/payment_method/store_credit_spec.rb +325 -0
  665. data/spec/models/spree/payment_method_spec.rb +408 -0
  666. data/spec/models/spree/payment_spec.rb +1274 -0
  667. data/spec/models/spree/permission_sets/base_spec.rb +14 -0
  668. data/spec/models/spree/permission_sets/configuration_display.rb +79 -0
  669. data/spec/models/spree/permission_sets/configuration_management_spec.rb +49 -0
  670. data/spec/models/spree/permission_sets/dashboard_display_spec.rb +23 -0
  671. data/spec/models/spree/permission_sets/order_display_spec.rb +56 -0
  672. data/spec/models/spree/permission_sets/order_management_spec.rb +43 -0
  673. data/spec/models/spree/permission_sets/product_display_spec.rb +57 -0
  674. data/spec/models/spree/permission_sets/product_management_spec.rb +39 -0
  675. data/spec/models/spree/permission_sets/promotion_display_spec.rb +41 -0
  676. data/spec/models/spree/permission_sets/promotion_management_spec.rb +27 -0
  677. data/spec/models/spree/permission_sets/restricted_stock_display_spec.rb +42 -0
  678. data/spec/models/spree/permission_sets/restricted_stock_management_spec.rb +42 -0
  679. data/spec/models/spree/permission_sets/stock_display_spec.rb +25 -0
  680. data/spec/models/spree/permission_sets/stock_management_spec.rb +23 -0
  681. data/spec/models/spree/permission_sets/user_display_spec.rb +39 -0
  682. data/spec/models/spree/permission_sets/user_management_spec.rb +56 -0
  683. data/spec/models/spree/preference_spec.rb +79 -0
  684. data/spec/models/spree/preferences/configuration_spec.rb +27 -0
  685. data/spec/models/spree/preferences/preferable_spec.rb +334 -0
  686. data/spec/models/spree/preferences/scoped_store_spec.rb +62 -0
  687. data/spec/models/spree/preferences/static_model_preferences_spec.rb +79 -0
  688. data/spec/models/spree/preferences/statically_configurable_spec.rb +67 -0
  689. data/spec/models/spree/preferences/store_spec.rb +40 -0
  690. data/spec/models/spree/price_spec.rb +150 -0
  691. data/spec/models/spree/product/scopes_spec.rb +164 -0
  692. data/spec/models/spree/product_duplicator_spec.rb +92 -0
  693. data/spec/models/spree/product_filter_spec.rb +28 -0
  694. data/spec/models/spree/product_property_spec.rb +20 -0
  695. data/spec/models/spree/product_spec.rb +584 -0
  696. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +126 -0
  697. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +198 -0
  698. data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +298 -0
  699. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +61 -0
  700. data/spec/models/spree/promotion/rules/first_order_spec.rb +77 -0
  701. data/spec/models/spree/promotion/rules/first_repeat_purchase_since_spec.rb +71 -0
  702. data/spec/models/spree/promotion/rules/item_total_spec.rb +113 -0
  703. data/spec/models/spree/promotion/rules/nth_order_spec.rb +72 -0
  704. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +44 -0
  705. data/spec/models/spree/promotion/rules/option_value_spec.rb +96 -0
  706. data/spec/models/spree/promotion/rules/product_spec.rb +178 -0
  707. data/spec/models/spree/promotion/rules/store_spec.rb +35 -0
  708. data/spec/models/spree/promotion/rules/taxon_spec.rb +174 -0
  709. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +28 -0
  710. data/spec/models/spree/promotion/rules/user_role_spec.rb +88 -0
  711. data/spec/models/spree/promotion/rules/user_spec.rb +39 -0
  712. data/spec/models/spree/promotion_action_spec.rb +44 -0
  713. data/spec/models/spree/promotion_category_spec.rb +19 -0
  714. data/spec/models/spree/promotion_code/batch_builder_spec.rb +107 -0
  715. data/spec/models/spree/promotion_code_batch_spec.rb +54 -0
  716. data/spec/models/spree/promotion_code_spec.rb +206 -0
  717. data/spec/models/spree/promotion_handler/cart_spec.rb +132 -0
  718. data/spec/models/spree/promotion_handler/coupon_spec.rb +365 -0
  719. data/spec/models/spree/promotion_handler/page_spec.rb +45 -0
  720. data/spec/models/spree/promotion_handler/shipping_spec.rb +96 -0
  721. data/spec/models/spree/promotion_rule_spec.rb +34 -0
  722. data/spec/models/spree/promotion_spec.rb +834 -0
  723. data/spec/models/spree/refund_spec.rb +199 -0
  724. data/spec/models/spree/reimbursement/credit_spec.rb +38 -0
  725. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +144 -0
  726. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +85 -0
  727. data/spec/models/spree/reimbursement_performer_spec.rb +32 -0
  728. data/spec/models/spree/reimbursement_spec.rb +253 -0
  729. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +52 -0
  730. data/spec/models/spree/reimbursement_type/credit_spec.rb +55 -0
  731. data/spec/models/spree/reimbursement_type/exchange_spec.rb +47 -0
  732. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +109 -0
  733. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +99 -0
  734. data/spec/models/spree/return_authorization_spec.rb +226 -0
  735. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +79 -0
  736. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +59 -0
  737. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +86 -0
  738. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +35 -0
  739. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +31 -0
  740. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +42 -0
  741. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +66 -0
  742. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +43 -0
  743. data/spec/models/spree/return_item_spec.rb +776 -0
  744. data/spec/models/spree/returns_calculator_spec.rb +16 -0
  745. data/spec/models/spree/shipment_spec.rb +907 -0
  746. data/spec/models/spree/shipping_calculator_spec.rb +57 -0
  747. data/spec/models/spree/shipping_manifest_spec.rb +110 -0
  748. data/spec/models/spree/shipping_method_spec.rb +260 -0
  749. data/spec/models/spree/shipping_rate_spec.rb +154 -0
  750. data/spec/models/spree/shipping_rate_tax_spec.rb +79 -0
  751. data/spec/models/spree/state_spec.rb +43 -0
  752. data/spec/models/spree/stock/availability_spec.rb +143 -0
  753. data/spec/models/spree/stock/availability_validator_spec.rb +140 -0
  754. data/spec/models/spree/stock/content_item_spec.rb +70 -0
  755. data/spec/models/spree/stock/differentiator_spec.rb +41 -0
  756. data/spec/models/spree/stock/estimator_spec.rb +240 -0
  757. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +34 -0
  758. data/spec/models/spree/stock/location_sorter/default_first_spec.rb +20 -0
  759. data/spec/models/spree/stock/location_sorter/unsorted_spec.rb +19 -0
  760. data/spec/models/spree/stock/package_spec.rb +182 -0
  761. data/spec/models/spree/stock/quantifier_spec.rb +113 -0
  762. data/spec/models/spree/stock/shipping_rate_selector_spec.rb +18 -0
  763. data/spec/models/spree/stock/shipping_rate_sorter_spec.rb +18 -0
  764. data/spec/models/spree/stock/simple_coordinator_spec.rb +247 -0
  765. data/spec/models/spree/stock/splitter/backordered_spec.rb +31 -0
  766. data/spec/models/spree/stock/splitter/base_spec.rb +22 -0
  767. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +48 -0
  768. data/spec/models/spree/stock/splitter/weight_spec.rb +31 -0
  769. data/spec/models/spree/stock/splitter_chain_spec.rb +66 -0
  770. data/spec/models/spree/stock_item_spec.rb +347 -0
  771. data/spec/models/spree/stock_location_spec.rb +288 -0
  772. data/spec/models/spree/stock_movement_spec.rb +58 -0
  773. data/spec/models/spree/stock_quantities_spec.rb +249 -0
  774. data/spec/models/spree/store_credit_category_spec.rb +19 -0
  775. data/spec/models/spree/store_credit_event_spec.rb +328 -0
  776. data/spec/models/spree/store_credit_spec.rb +900 -0
  777. data/spec/models/spree/store_selector/by_server_name_spec.rb +28 -0
  778. data/spec/models/spree/store_selector/legacy_spec.rb +46 -0
  779. data/spec/models/spree/store_spec.rb +156 -0
  780. data/spec/models/spree/tax/order_adjuster_spec.rb +35 -0
  781. data/spec/models/spree/tax/shipping_rate_taxer_spec.rb +59 -0
  782. data/spec/models/spree/tax/tax_location_spec.rb +79 -0
  783. data/spec/models/spree/tax/taxation_integration_spec.rb +815 -0
  784. data/spec/models/spree/tax_calculator/default_spec.rb +56 -0
  785. data/spec/models/spree/tax_category_spec.rb +29 -0
  786. data/spec/models/spree/tax_rate_spec.rb +316 -0
  787. data/spec/models/spree/taxon_spec.rb +169 -0
  788. data/spec/models/spree/taxonomy_spec.rb +15 -0
  789. data/spec/models/spree/unit_cancel_spec.rb +61 -0
  790. data/spec/models/spree/user_spec.rb +247 -0
  791. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +33 -0
  792. data/spec/models/spree/variant/price_selector_spec.rb +90 -0
  793. data/spec/models/spree/variant/pricing_options_spec.rb +181 -0
  794. data/spec/models/spree/variant/scopes_spec.rb +94 -0
  795. data/spec/models/spree/variant/vat_price_generator_spec.rb +77 -0
  796. data/spec/models/spree/variant_property_rule_condition_spec.rb +17 -0
  797. data/spec/models/spree/variant_property_rule_spec.rb +85 -0
  798. data/spec/models/spree/variant_property_rule_value_spec.rb +20 -0
  799. data/spec/models/spree/variant_spec.rb +822 -0
  800. data/spec/models/spree/wallet_payment_source_spec.rb +48 -0
  801. data/spec/models/spree/wallet_spec.rb +155 -0
  802. data/spec/models/spree/zone_spec.rb +248 -0
  803. data/spec/rails_helper.rb +45 -0
  804. data/spec/shared_examples/calculator_shared_examples.rb +10 -0
  805. data/spec/spec_helper.rb +39 -0
  806. data/spec/support/big_decimal.rb +7 -0
  807. data/spec/support/concerns/default_price.rb +36 -0
  808. data/spec/support/concerns/payment_source.rb +66 -0
  809. data/spec/support/concerns/working_factories.rb +15 -0
  810. data/spec/support/dummy_ability.rb +7 -0
  811. data/spec/support/shared_contexts/rake.rb +32 -0
  812. data/vendor/assets/javascripts/jquery.payment.js +648 -0
  813. data/vendor/assets/javascripts/jsuri.js +2 -0
  814. data/vendor/assets/stylesheets/normalize.css +375 -0
  815. metadata +1226 -0
@@ -0,0 +1,1274 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe Spree::Payment, type: :model do
6
+ let(:store) { create :store }
7
+ let(:order) { Spree::Order.create(store: store) }
8
+ let(:refund_reason) { create(:refund_reason) }
9
+
10
+ let(:gateway) do
11
+ gateway = Spree::PaymentMethod::BogusCreditCard.new(active: true, name: 'Bogus gateway')
12
+ allow(gateway).to receive_messages source_required: true
13
+ gateway
14
+ end
15
+
16
+ let(:avs_code) { 'D' }
17
+ let(:cvv_code) { 'M' }
18
+
19
+ let(:card) { create :credit_card }
20
+
21
+ let(:payment) do
22
+ Spree::Payment.create! do |payment|
23
+ payment.source = card
24
+ payment.order = order
25
+ payment.payment_method = gateway
26
+ payment.amount = 5
27
+ end
28
+ end
29
+
30
+ let(:amount_in_cents) { (payment.amount * 100).round }
31
+
32
+ let!(:success_response) do
33
+ ActiveMerchant::Billing::Response.new(true, '', {}, {
34
+ authorization: '123',
35
+ cvv_result: cvv_code,
36
+ avs_result: { code: avs_code }
37
+ })
38
+ end
39
+
40
+ let(:failed_response) do
41
+ ActiveMerchant::Billing::Response.new(false, '', {}, {})
42
+ end
43
+
44
+ context '.risky' do
45
+ let!(:payment_1) { create(:payment, avs_response: 'Y', cvv_response_code: 'M', cvv_response_message: 'Match') }
46
+ let!(:payment_2) { create(:payment, avs_response: 'Y', cvv_response_code: 'M', cvv_response_message: '') }
47
+ let!(:payment_3) { create(:payment, avs_response: 'A', cvv_response_code: 'M', cvv_response_message: 'Match') }
48
+ let!(:payment_4) { create(:payment, avs_response: 'Y', cvv_response_code: 'N', cvv_response_message: 'No Match') }
49
+
50
+ it 'should not return successful responses' do
51
+ expect(subject.class.risky.to_a).to match_array([payment_3, payment_4])
52
+ end
53
+ end
54
+
55
+ context "#captured_amount" do
56
+ context "calculates based on capture events" do
57
+ it "with 0 capture events" do
58
+ expect(payment.captured_amount).to eq(0)
59
+ end
60
+
61
+ it "with some capture events" do
62
+ payment.save
63
+ payment.capture_events.create!(amount: 2.0)
64
+ payment.capture_events.create!(amount: 3.0)
65
+ expect(payment.captured_amount).to eq(5)
66
+ end
67
+ end
68
+ end
69
+
70
+ context '#uncaptured_amount' do
71
+ context "calculates based on capture events" do
72
+ it "with 0 capture events" do
73
+ expect(payment.uncaptured_amount).to eq(5.0)
74
+ end
75
+
76
+ it "with some capture events" do
77
+ payment.save
78
+ payment.capture_events.create!(amount: 2.0)
79
+ payment.capture_events.create!(amount: 3.0)
80
+ expect(payment.uncaptured_amount).to eq(0)
81
+ end
82
+ end
83
+ end
84
+
85
+ context 'validations' do
86
+ it "returns useful error messages when source is invalid" do
87
+ payment.source = Spree::CreditCard.new
88
+ expect(payment).not_to be_valid
89
+ cc_errors = payment.errors['Credit Card']
90
+ expect(cc_errors).to include("Card Number can't be blank")
91
+ expect(cc_errors).to include("Month is not a number")
92
+ expect(cc_errors).to include("Year is not a number")
93
+ expect(cc_errors).to include("Verification Value can't be blank")
94
+ end
95
+ end
96
+
97
+ # Regression test for https://github.com/spree/spree/pull/2224
98
+ context 'failure' do
99
+ it 'should transition to failed from pending state' do
100
+ payment.state = 'pending'
101
+ payment.failure
102
+ expect(payment.state).to eql('failed')
103
+ end
104
+
105
+ it 'should transition to failed from processing state' do
106
+ payment.state = 'processing'
107
+ payment.failure
108
+ expect(payment.state).to eql('failed')
109
+ end
110
+ end
111
+
112
+ context 'invalidate' do
113
+ it 'should transition from checkout to invalid' do
114
+ payment.state = 'checkout'
115
+ payment.invalidate
116
+ expect(payment.state).to eq('invalid')
117
+ end
118
+
119
+ context "the payment's source is invalid" do
120
+ before(:each) do
121
+ card.year = 2014
122
+ payment.source = card
123
+ end
124
+
125
+ it "transitions to invalid" do
126
+ payment.state = 'checkout'
127
+ payment.invalidate
128
+ expect(payment.state).to eq 'invalid'
129
+ end
130
+ end
131
+ end
132
+
133
+ context "processing" do
134
+ describe "#process!" do
135
+ context 'with autocapture' do
136
+ before do
137
+ payment.payment_method.update_attributes!(auto_capture: true)
138
+ end
139
+
140
+ it "should purchase" do
141
+ payment.process!
142
+ expect(payment).to be_completed
143
+ end
144
+ end
145
+
146
+ context 'without autocapture' do
147
+ before do
148
+ payment.payment_method.update_attributes!(auto_capture: false)
149
+ end
150
+
151
+ context 'when in the checkout state' do
152
+ before { payment.update_attributes!(state: 'checkout') }
153
+
154
+ it "authorizes" do
155
+ payment.process!
156
+ expect(payment).to be_pending
157
+ end
158
+ end
159
+
160
+ context 'when in the processing state' do
161
+ before { payment.update_attributes!(state: 'processing') }
162
+
163
+ it "does not authorize" do
164
+ payment.process!
165
+ expect(payment).to be_processing
166
+ end
167
+ end
168
+
169
+ context 'when in the pending state' do
170
+ before { payment.update_attributes!(state: 'pending') }
171
+
172
+ it "does not re-authorize" do
173
+ expect(payment).to_not receive(:authorize!)
174
+ payment.process!
175
+ expect(payment).to be_pending
176
+ end
177
+ end
178
+
179
+ context 'when in a failed state' do
180
+ before { payment.update_attributes!(state: 'failed') }
181
+
182
+ it "raises an exception" do
183
+ expect {
184
+ payment.process!
185
+ }.to raise_error(StateMachines::InvalidTransition, /Cannot transition/)
186
+ end
187
+ end
188
+
189
+ context 'when in the completed state' do
190
+ before { payment.update_attributes!(state: 'completed') }
191
+
192
+ it "authorizes" do
193
+ payment.process!
194
+ # TODO: Is this really what we want to happen in this case?
195
+ expect(payment).to be_pending
196
+ end
197
+ end
198
+ end
199
+
200
+ it "should make the state 'processing'" do
201
+ expect(payment).to receive(:started_processing!)
202
+ payment.process!
203
+ end
204
+
205
+ it "should invalidate if payment method doesnt support source" do
206
+ expect(payment.payment_method).to receive(:supports?).with(payment.source).and_return(false)
207
+ expect { payment.process! }.to raise_error(Spree::Core::GatewayError)
208
+ expect(payment.state).to eq('invalid')
209
+ end
210
+
211
+ # Regression test for https://github.com/spree/spree/issues/4598
212
+ it "should allow payments with a gateway_customer_profile_id" do
213
+ payment.source.update!(gateway_customer_profile_id: "customer_1", brand: 'visa')
214
+ expect(payment.payment_method.gateway_class).to receive(:supports?).with('visa').and_return(false)
215
+ expect(payment).to receive(:started_processing!)
216
+ payment.process!
217
+ end
218
+
219
+ # Another regression test for https://github.com/spree/spree/issues/4598
220
+ it "should allow payments with a gateway_payment_profile_id" do
221
+ payment.source.update!(gateway_payment_profile_id: "customer_1", brand: 'visa')
222
+ expect(payment.payment_method.gateway_class).to receive(:supports?).with('visa').and_return(false)
223
+ expect(payment).to receive(:started_processing!)
224
+ payment.process!
225
+ end
226
+ end
227
+
228
+ describe "#authorize!" do
229
+ it "should call authorize on the gateway with the payment amount" do
230
+ expect(payment.payment_method).to receive(:authorize).with(amount_in_cents,
231
+ card,
232
+ anything).and_return(success_response)
233
+ payment.authorize!
234
+ end
235
+
236
+ it "should call authorize on the gateway with the currency code" do
237
+ allow(payment).to receive_messages currency: 'GBP'
238
+ expect(payment.payment_method).to receive(:authorize).with(amount_in_cents,
239
+ card,
240
+ hash_including({ currency: "GBP" })).and_return(success_response)
241
+ payment.authorize!
242
+ end
243
+
244
+ it "should log the response" do
245
+ payment.save!
246
+ expect {
247
+ payment.authorize!
248
+ }.to change { payment.log_entries.count }.by(1)
249
+ end
250
+
251
+ describe 'billing_address option' do
252
+ context 'when the source is a credit card with an address' do
253
+ let(:card) { create(:credit_card, address: address) }
254
+ let(:address) { create(:address) }
255
+
256
+ it 'sends the credit card address' do
257
+ expect(payment.payment_method).to(
258
+ receive(:authorize).
259
+ with(
260
+ amount_in_cents,
261
+ card,
262
+ hash_including(billing_address: card.address.active_merchant_hash)
263
+ ).
264
+ and_return(success_response)
265
+ )
266
+ payment.authorize!
267
+ end
268
+ end
269
+
270
+ context 'when the source is a credit card without an address' do
271
+ let(:card) { create(:credit_card, address: nil) }
272
+ before { order.update_attributes!(bill_address: address) }
273
+ let(:address) { create(:address) }
274
+
275
+ it 'send the order bill address' do
276
+ expect(payment.payment_method).to(
277
+ receive(:authorize).
278
+ with(
279
+ amount_in_cents,
280
+ card,
281
+ hash_including(billing_address: order.bill_address.active_merchant_hash)
282
+ ).
283
+ and_return(success_response)
284
+ )
285
+ payment.authorize!
286
+ end
287
+ end
288
+
289
+ context 'when the source is not a credit card' do
290
+ before do
291
+ payment.source = store_credit_payment
292
+ payment.payment_method = store_credit_payment_method
293
+ end
294
+
295
+ let(:store_credit_payment) { create(:store_credit_payment) }
296
+ let(:store_credit_payment_method) { create(:store_credit_payment_method) }
297
+ before { order.update_attributes!(bill_address: address) }
298
+ let(:address) { create(:address) }
299
+
300
+ it 'send the order bill address' do
301
+ expect(payment.payment_method).to(
302
+ receive(:authorize).
303
+ with(
304
+ amount_in_cents,
305
+ store_credit_payment,
306
+ hash_including(billing_address: order.bill_address.active_merchant_hash)
307
+ ).
308
+ and_return(success_response)
309
+ )
310
+ payment.authorize!
311
+ end
312
+ end
313
+ end
314
+
315
+ context "if successful" do
316
+ before do
317
+ expect(payment.payment_method).to receive(:authorize).with(amount_in_cents,
318
+ card,
319
+ anything).and_return(success_response)
320
+ end
321
+
322
+ it "should store the response_code, avs_response and cvv_response fields" do
323
+ payment.authorize!
324
+ expect(payment.response_code).to eq('123')
325
+ expect(payment.avs_response).to eq(avs_code)
326
+ expect(payment.cvv_response_code).to eq(cvv_code)
327
+ expect(payment.cvv_response_message).to eq(ActiveMerchant::Billing::CVVResult::MESSAGES[cvv_code])
328
+ end
329
+
330
+ it "should make payment pending" do
331
+ expect(payment).to receive(:pend!)
332
+ payment.authorize!
333
+ end
334
+ end
335
+
336
+ context "if unsuccessful" do
337
+ it "should mark payment as failed" do
338
+ allow(gateway).to receive(:authorize).and_return(failed_response)
339
+ expect(payment).to receive(:failure)
340
+ expect(payment).not_to receive(:pend)
341
+ expect {
342
+ payment.authorize!
343
+ }.to raise_error(Spree::Core::GatewayError)
344
+ end
345
+ end
346
+ end
347
+
348
+ describe "#purchase!" do
349
+ it "should call purchase on the gateway with the payment amount" do
350
+ expect(gateway).to receive(:purchase).with(amount_in_cents, card, anything).and_return(success_response)
351
+ payment.purchase!
352
+ end
353
+
354
+ it "should log the response" do
355
+ payment.save!
356
+ expect {
357
+ payment.purchase!
358
+ }.to change { payment.log_entries.count }.by(1)
359
+ end
360
+
361
+ context "if successful" do
362
+ before do
363
+ expect(payment.payment_method).to receive(:purchase).with(amount_in_cents,
364
+ card,
365
+ anything).and_return(success_response)
366
+ end
367
+
368
+ it "should store the response_code and avs_response" do
369
+ payment.purchase!
370
+ expect(payment.response_code).to eq('123')
371
+ expect(payment.avs_response).to eq(avs_code)
372
+ end
373
+
374
+ it "should make payment complete" do
375
+ expect(payment).to receive(:complete!)
376
+ payment.purchase!
377
+ end
378
+
379
+ it "should log a capture event" do
380
+ payment.purchase!
381
+ expect(payment.capture_events.count).to eq(1)
382
+ expect(payment.capture_events.first.amount).to eq(payment.amount)
383
+ end
384
+
385
+ it "should set the uncaptured amount to 0" do
386
+ payment.purchase!
387
+ expect(payment.uncaptured_amount).to eq(0)
388
+ end
389
+ end
390
+
391
+ context "if unsuccessful" do
392
+ before do
393
+ allow(gateway).to receive(:purchase).and_return(failed_response)
394
+ expect(payment).to receive(:failure)
395
+ expect(payment).not_to receive(:pend)
396
+ end
397
+
398
+ it "should make payment failed" do
399
+ expect { payment.purchase! }.to raise_error(Spree::Core::GatewayError)
400
+ end
401
+
402
+ it "should not log a capture event" do
403
+ expect { payment.purchase! }.to raise_error(Spree::Core::GatewayError)
404
+ expect(payment.capture_events.count).to eq(0)
405
+ end
406
+ end
407
+ end
408
+
409
+ describe "#capture!" do
410
+ context "when payment is pending" do
411
+ before do
412
+ payment.amount = 100
413
+ payment.state = 'pending'
414
+ payment.response_code = '12345'
415
+ end
416
+
417
+ context "if successful" do
418
+ context 'for entire amount' do
419
+ before do
420
+ expect(payment.payment_method).to receive(:capture).with(payment.display_amount.money.cents, payment.response_code, anything).and_return(success_response)
421
+ end
422
+
423
+ it "should make payment complete" do
424
+ expect(payment).to receive(:complete!)
425
+ payment.capture!
426
+ end
427
+
428
+ it "logs capture events" do
429
+ payment.capture!
430
+ expect(payment.capture_events.count).to eq(1)
431
+ expect(payment.capture_events.first.amount).to eq(payment.amount)
432
+ end
433
+ end
434
+
435
+ it "logs capture events" do
436
+ payment.capture!
437
+ expect(payment.capture_events.count).to eq(1)
438
+ expect(payment.capture_events.first.amount).to eq(payment.amount)
439
+ end
440
+ end
441
+
442
+ context "capturing a partial amount" do
443
+ it "logs capture events" do
444
+ payment.capture!(5000)
445
+ expect(payment.capture_events.count).to eq(1)
446
+ expect(payment.capture_events.first.amount).to eq(50)
447
+ end
448
+
449
+ it "stores the captured amount on the payment" do
450
+ payment.capture!(6000)
451
+ expect(payment.captured_amount).to eq(60)
452
+ end
453
+
454
+ it "updates the amount of the payment" do
455
+ payment.capture!(6000)
456
+ expect(payment.reload.amount).to eq(60)
457
+ end
458
+ end
459
+
460
+ context "if unsuccessful" do
461
+ it "should not make payment complete" do
462
+ allow(gateway).to receive_messages capture: failed_response
463
+ expect(payment).to receive(:failure)
464
+ expect(payment).not_to receive(:complete)
465
+ expect { payment.capture! }.to raise_error(Spree::Core::GatewayError)
466
+ end
467
+ end
468
+ end
469
+
470
+ # Regression test for https://github.com/spree/spree/issues/2119
471
+ context "when payment is completed" do
472
+ before do
473
+ payment.state = 'completed'
474
+ end
475
+
476
+ it "should do nothing" do
477
+ expect(payment).not_to receive(:complete)
478
+ expect(payment.payment_method).not_to receive(:capture)
479
+ expect(payment.log_entries).not_to receive(:create!)
480
+ payment.capture!
481
+ end
482
+ end
483
+ end
484
+
485
+ describe "#cancel!" do
486
+ subject { payment.cancel! }
487
+
488
+ before do
489
+ payment.response_code = 'abc'
490
+ payment.state = 'pending'
491
+ end
492
+
493
+ context "if void returns successful response" do
494
+ before do
495
+ expect(gateway).to receive(:try_void) { success_response }
496
+ end
497
+
498
+ it "should update the state to void" do
499
+ expect { subject }.to change { payment.state }.to('void')
500
+ end
501
+
502
+ it "should update the response_code with the authorization from the gateway" do
503
+ expect { subject }.to change { payment.response_code }.to('123')
504
+ end
505
+ end
506
+
507
+ context "if void returns failed response" do
508
+ before do
509
+ expect(gateway).to receive(:try_void) { failed_response }
510
+ end
511
+
512
+ it "should raise gateway error and not change payment state or response_code", :aggregate_failures do
513
+ expect { subject }.to raise_error(Spree::Core::GatewayError)
514
+ expect(payment.state).to eq('pending')
515
+ expect(payment.response_code).to eq('abc')
516
+ end
517
+ end
518
+ end
519
+
520
+ describe "#void_transaction!" do
521
+ before do
522
+ payment.response_code = '123'
523
+ payment.state = 'pending'
524
+ end
525
+
526
+ context "when profiles are supported" do
527
+ it "should call payment_gateway.void with the payment's response_code" do
528
+ allow(gateway).to receive_messages payment_profiles_supported?: true
529
+ expect(gateway).to receive(:void).with('123', card, anything).and_return(success_response)
530
+ payment.void_transaction!
531
+ end
532
+ end
533
+
534
+ context "when profiles are not supported" do
535
+ it "should call payment_gateway.void with the payment's response_code" do
536
+ allow(gateway).to receive_messages payment_profiles_supported?: false
537
+ expect(gateway).to receive(:void).with('123', anything).and_return(success_response)
538
+ payment.void_transaction!
539
+ end
540
+ end
541
+
542
+ it "should log the response" do
543
+ expect {
544
+ payment.void_transaction!
545
+ }.to change { payment.log_entries.count }.by(1)
546
+ end
547
+
548
+ context "if successful" do
549
+ it "should update the response_code with the authorization from the gateway" do
550
+ # Change it to something different
551
+ payment.response_code = 'abc'
552
+ payment.void_transaction!
553
+ expect(payment.response_code).to eq('12345')
554
+ end
555
+ end
556
+
557
+ context "if unsuccessful" do
558
+ it "should not void the payment" do
559
+ allow(gateway).to receive_messages void: failed_response
560
+ expect(payment).not_to receive(:void)
561
+ expect { payment.void_transaction! }.to raise_error(Spree::Core::GatewayError)
562
+ end
563
+ end
564
+
565
+ # Regression test for https://github.com/spree/spree/issues/2119
566
+ context "if payment is already voided" do
567
+ before do
568
+ payment.state = 'void'
569
+ end
570
+
571
+ it "should not void the payment" do
572
+ expect(payment.payment_method).not_to receive(:void)
573
+ payment.void_transaction!
574
+ end
575
+ end
576
+ end
577
+ end
578
+
579
+ context "when already processing" do
580
+ it "should return nil without trying to process the source" do
581
+ payment.state = 'processing'
582
+
583
+ expect(payment.process!).to be_nil
584
+ end
585
+ end
586
+
587
+ context "with source required" do
588
+ context "raises an error if no source is specified" do
589
+ before do
590
+ payment.source = nil
591
+ end
592
+
593
+ specify do
594
+ expect { payment.process! }.to raise_error(Spree::Core::GatewayError, I18n.t('spree.payment_processing_failed'))
595
+ end
596
+ end
597
+ end
598
+
599
+ context "with source optional" do
600
+ context "raises no error if source is not specified" do
601
+ before do
602
+ payment.source = nil
603
+ allow(payment.payment_method).to receive_messages(source_required?: false)
604
+ end
605
+
606
+ specify do
607
+ payment.process!
608
+ end
609
+ end
610
+ end
611
+
612
+ describe "#credit_allowed" do
613
+ # Regression test for https://github.com/spree/spree/issues/4403 and https://github.com/spree/spree/issues/4407
614
+ it "is the difference between offsets total and payment amount" do
615
+ payment.amount = 100
616
+ allow(payment).to receive(:offsets_total).and_return(0)
617
+ expect(payment.credit_allowed).to eq(100)
618
+ allow(payment).to receive(:offsets_total).and_return(-80)
619
+ expect(payment.credit_allowed).to eq(20)
620
+ end
621
+ end
622
+
623
+ describe "#can_credit?" do
624
+ it "is true if credit_allowed > 0" do
625
+ allow(payment).to receive(:credit_allowed).and_return(100)
626
+ expect(payment.can_credit?).to be true
627
+ end
628
+
629
+ it "is false if credit_allowed is 0" do
630
+ allow(payment).to receive(:credit_allowed).and_return(0)
631
+ expect(payment.can_credit?).to be false
632
+ end
633
+ end
634
+
635
+ describe "#fully_refunded?" do
636
+ subject { payment.fully_refunded? }
637
+
638
+ before { payment.amount = 100 }
639
+
640
+ context 'before refund' do
641
+ it { is_expected.to be false }
642
+ end
643
+
644
+ context 'when refund total equals payment amount' do
645
+ before do
646
+ create(:refund, payment: payment, amount: 50)
647
+ create(:refund, payment: payment, amount: 50)
648
+ end
649
+
650
+ it { is_expected.to be true }
651
+ end
652
+ end
653
+
654
+ describe "#save" do
655
+ context "captured payments" do
656
+ it "update order payment total" do
657
+ payment = create(:payment, order: order, state: 'completed')
658
+ expect(order.payment_total).to eq payment.amount
659
+ end
660
+ end
661
+
662
+ context "not completed payments" do
663
+ it "doesn't update order payment total" do
664
+ expect {
665
+ Spree::Payment.create(amount: 100, order: order)
666
+ }.not_to change { order.payment_total }
667
+ end
668
+ end
669
+
670
+ context 'when the payment was completed but now void' do
671
+ let(:payment) do
672
+ Spree::Payment.create(
673
+ amount: 100,
674
+ order: order,
675
+ state: 'completed'
676
+ )
677
+ end
678
+
679
+ it 'updates order payment total' do
680
+ payment.void
681
+ expect(order.payment_total).to eq 0
682
+ end
683
+ end
684
+
685
+ context "completed orders" do
686
+ let(:payment_method) { create(:check_payment_method) }
687
+ before { allow(order).to receive_messages completed?: true }
688
+
689
+ it "updates payment_state and shipments" do
690
+ expect(order.updater).to receive(:update_payment_state)
691
+ expect(order.updater).to receive(:update_shipment_state)
692
+ Spree::Payment.create!(amount: 100, order: order, payment_method: payment_method)
693
+ end
694
+ end
695
+
696
+ context "when profiles are supported" do
697
+ before do
698
+ allow(gateway).to receive_messages payment_profiles_supported?: true
699
+ allow(payment.source).to receive_messages has_payment_profile?: false
700
+ end
701
+
702
+ context "when there is an error connecting to the gateway" do
703
+ it "should call gateway_error " do
704
+ expect(gateway).to receive(:create_profile).and_raise(ActiveMerchant::ConnectionError.new("foo", nil))
705
+ expect do
706
+ Spree::Payment.create(
707
+ amount: 100,
708
+ order: order,
709
+ source: card,
710
+ payment_method: gateway
711
+ )
712
+ end.to raise_error(Spree::Core::GatewayError)
713
+ end
714
+ end
715
+
716
+ context "with multiple payment attempts" do
717
+ let(:attributes) { attributes_for(:credit_card) }
718
+
719
+ it "should not try to create profiles on old failed payment attempts" do
720
+ order.payments.destroy_all
721
+
722
+ allow_any_instance_of(Spree::Payment).to receive(:payment_method) { gateway }
723
+
724
+ Spree::PaymentCreate.new(order, {
725
+ source_attributes: attributes,
726
+ payment_method: gateway,
727
+ amount: 100
728
+ }).build.save!
729
+ expect(gateway).to receive(:create_profile).exactly :once
730
+ expect(order.payments.count).to eq(1)
731
+ Spree::PaymentCreate.new(order, {
732
+ source_attributes: attributes,
733
+ payment_method: gateway,
734
+ amount: 100
735
+ }).build.save!
736
+ end
737
+ end
738
+
739
+ context "when successfully connecting to the gateway" do
740
+ it "should create a payment profile" do
741
+ expect(payment.payment_method).to receive :create_profile
742
+ Spree::Payment.create(
743
+ amount: 100,
744
+ order: order,
745
+ source: card,
746
+ payment_method: gateway
747
+ )
748
+ end
749
+ end
750
+ end
751
+
752
+ context "when profiles are not supported" do
753
+ before { allow(gateway).to receive_messages payment_profiles_supported?: false }
754
+
755
+ it "should not create a payment profile" do
756
+ expect(gateway).not_to receive :create_profile
757
+ Spree::Payment.create(
758
+ amount: 100,
759
+ order: order,
760
+ source: card,
761
+ payment_method: gateway
762
+ )
763
+ end
764
+ end
765
+ end
766
+
767
+ describe '#invalidate_old_payments' do
768
+ it 'should not invalidate other payments if not valid' do
769
+ payment.save
770
+ invalid_payment = Spree::Payment.new(amount: 100, order: order, state: 'invalid', payment_method: gateway)
771
+ invalid_payment.save
772
+ expect(payment.reload.state).to eq('checkout')
773
+ end
774
+
775
+ context 'with order having other payments' do
776
+ let!(:existing_payment) do
777
+ create(:payment,
778
+ payment_method: existing_payment_method,
779
+ source: existing_payment_source,
780
+ order: order,
781
+ amount: 5)
782
+ end
783
+
784
+ let(:payment_method) { create(:payment_method) }
785
+ let(:payment_source) { create(:credit_card) }
786
+ let(:payment) do
787
+ build(:payment,
788
+ payment_method: payment_method,
789
+ source: payment_source,
790
+ order: order,
791
+ amount: 5)
792
+ end
793
+
794
+ context 'that are store credit payments' do
795
+ let(:existing_payment_method) { create(:store_credit_payment_method) }
796
+ let(:existing_payment_source) { create(:store_credit) }
797
+
798
+ it 'does not invalidate existing payments' do
799
+ expect { payment.save! }.to_not change { order.payments.with_state(:invalid).count }
800
+ end
801
+
802
+ context 'when payment itself is a store credit payment' do
803
+ let(:payment_method) { existing_payment_method }
804
+ let(:payment_source) { existing_payment_source }
805
+
806
+ it 'does not invalidate existing payments' do
807
+ expect { payment.save! }.to_not change { order.payments.with_state(:invalid).count }
808
+ end
809
+ end
810
+ end
811
+
812
+ context 'that are not store credit payments' do
813
+ let(:existing_payment_method) { create(:payment_method) }
814
+ let(:existing_payment_source) { create(:credit_card) }
815
+
816
+ it 'invalidates existing payments' do
817
+ expect { payment.save! }.to change { order.payments.with_state(:invalid).count }
818
+ end
819
+ end
820
+ end
821
+
822
+ describe "invalidating payments updates in memory objects" do
823
+ let(:payment_method) { create(:check_payment_method) }
824
+ before do
825
+ Spree::PaymentCreate.new(order, amount: 1, payment_method_id: payment_method.id).build.save!
826
+ expect(order.payments.map(&:state)).to contain_exactly(
827
+ 'checkout'
828
+ )
829
+ Spree::PaymentCreate.new(order, amount: 2, payment_method_id: payment_method.id).build.save!
830
+ end
831
+
832
+ it 'should not have stale payments' do
833
+ expect(order.payments.map(&:state)).to contain_exactly(
834
+ 'invalid',
835
+ 'checkout'
836
+ )
837
+ end
838
+ end
839
+ end
840
+
841
+ # This used to describe #apply_source_attributes, whose behaviour is now part of PaymentCreate
842
+ describe "#apply_source_attributes" do
843
+ context 'with a new source' do
844
+ let(:params) do
845
+ {
846
+ amount: 100,
847
+ payment_method: gateway,
848
+ source_attributes: {
849
+ expiry: "01 / 99",
850
+ number: '1234567890123',
851
+ verification_value: '123',
852
+ name: 'Spree Commerce'
853
+ }
854
+ }
855
+ end
856
+
857
+ it "should build the payment's source" do
858
+ payment = Spree::PaymentCreate.new(order, params).build
859
+ expect(payment).to be_valid
860
+ expect(payment.source).not_to be_nil
861
+ end
862
+
863
+ it "assigns user and gateway to payment source" do
864
+ order = create(:order)
865
+ payment = Spree::PaymentCreate.new(order, params).build
866
+ source = payment.source
867
+
868
+ expect(source.user_id).to eq order.user_id
869
+ expect(source.payment_method_id).to eq gateway.id
870
+ end
871
+
872
+ it "errors when payment source not valid" do
873
+ params = { amount: 100, payment_method: gateway,
874
+ source_attributes: { expiry: "1 / 12" } }
875
+
876
+ payment = Spree::PaymentCreate.new(order, params).build
877
+ expect(payment).not_to be_valid
878
+ expect(payment.source).not_to be_nil
879
+ expect(payment.source.errors[:number].size).to eq(1)
880
+ expect(payment.source.errors[:verification_value].size).to eq(1)
881
+ end
882
+ end
883
+
884
+ context 'with an existing credit card' do
885
+ let(:order) { create(:order, user: user) }
886
+ let(:user) { create(:user) }
887
+ let!(:credit_card) { create(:credit_card, user_id: order.user_id) }
888
+ let!(:wallet_payment_source) { user.wallet.add(credit_card) }
889
+
890
+ let(:params) do
891
+ {
892
+ source_attributes: {
893
+ wallet_payment_source_id: wallet_payment_source.id,
894
+ verification_value: '321'
895
+ }
896
+ }
897
+ end
898
+
899
+ describe "building a payment" do
900
+ subject do
901
+ Spree::PaymentCreate.new(order, params).build.save!
902
+ end
903
+
904
+ it 'sets the existing card as the source for the new payment' do
905
+ expect {
906
+ subject
907
+ }.to change { Spree::Payment.count }.by(1)
908
+
909
+ expect(order.payments.last.source).to eq(credit_card)
910
+ end
911
+
912
+ it 'sets the payment payment_method to that of the credit card' do
913
+ subject
914
+ expect(order.payments.last.payment_method_id).to eq(credit_card.payment_method_id)
915
+ end
916
+
917
+ it 'sets the verification_value on the credit card' do
918
+ subject
919
+ expect(order.payments.last.source.verification_value).to eq('321')
920
+ end
921
+
922
+ it 'sets the request_env on the payment' do
923
+ payment = Spree::PaymentCreate.new(order, params.merge(request_env: { 'USER_AGENT' => 'Firefox' })).build
924
+ payment.save!
925
+ expect(payment.request_env).to eq({ 'USER_AGENT' => 'Firefox' })
926
+ end
927
+
928
+ context 'the credit card belongs to a different user' do
929
+ let(:other_user) { create(:user) }
930
+ before do
931
+ credit_card.update!(user_id: other_user.id)
932
+ user.wallet.remove(credit_card)
933
+ other_user.wallet.add(credit_card)
934
+ end
935
+ it 'errors' do
936
+ expect { subject }.to raise_error(ActiveRecord::RecordNotFound)
937
+ end
938
+ end
939
+
940
+ context 'the credit card has no user' do
941
+ before do
942
+ credit_card.update!(user_id: nil)
943
+ user.wallet.remove(credit_card)
944
+ end
945
+ it 'errors' do
946
+ expect { subject }.to raise_error(ActiveRecord::RecordNotFound)
947
+ end
948
+ end
949
+
950
+ context 'the order has no user' do
951
+ before { order.update_attributes!(user_id: nil) }
952
+ it 'errors' do
953
+ expect { subject }.to raise_error(ActiveRecord::RecordNotFound)
954
+ end
955
+ end
956
+
957
+ context 'the order and the credit card have no user' do
958
+ before do
959
+ order.update_attributes!(user_id: nil)
960
+ credit_card.update!(user_id: nil)
961
+ end
962
+ it 'errors' do
963
+ expect { subject }.to raise_error(ActiveRecord::RecordNotFound)
964
+ end
965
+ end
966
+ end
967
+ end
968
+ end
969
+
970
+ describe "#currency" do
971
+ before { allow(order).to receive(:currency) { "ABC" } }
972
+ it "returns the order currency" do
973
+ expect(payment.currency).to eq("ABC")
974
+ end
975
+ end
976
+
977
+ describe "#display_amount" do
978
+ it "returns a Spree::Money for this amount" do
979
+ expect(payment.display_amount).to eq(Spree::Money.new(payment.amount))
980
+ end
981
+ end
982
+
983
+ # Regression test for https://github.com/spree/spree/issues/2216
984
+ describe "#gateway_options" do
985
+ before { allow(order).to receive_messages(last_ip_address: "192.168.1.1") }
986
+
987
+ it "contains an IP" do
988
+ expect(payment.gateway_options[:ip]).to eq(order.last_ip_address)
989
+ end
990
+
991
+ it "contains the email address from a persisted order" do
992
+ # Sets the payment's order to a different Ruby object entirely
993
+ payment.order = Spree::Order.find(payment.order_id)
994
+ email = 'foo@example.com'
995
+ order.update_attributes(email: email)
996
+ expect(payment.gateway_options[:email]).to eq(email)
997
+ end
998
+ end
999
+
1000
+ describe "#set_unique_identifier" do
1001
+ # Regression test for https://github.com/spree/spree/issues/1998
1002
+ it "sets a unique identifier on create" do
1003
+ payment.run_callbacks(:create)
1004
+ expect(payment.number).not_to be_blank
1005
+ expect(payment.number.size).to eq(8)
1006
+ expect(payment.number).to be_a(String)
1007
+ end
1008
+
1009
+ # Regression test for https://github.com/spree/spree/issues/3733
1010
+ it "does not regenerate the identifier on re-save" do
1011
+ payment.save!
1012
+ old_number = payment.number
1013
+ payment.save!
1014
+ expect(payment.number).to eq(old_number)
1015
+ end
1016
+
1017
+ context "other payment exists" do
1018
+ let(:other_payment) {
1019
+ payment = Spree::Payment.new
1020
+ payment.source = card
1021
+ payment.order = order
1022
+ payment.payment_method = gateway
1023
+ payment
1024
+ }
1025
+
1026
+ before { other_payment.save! }
1027
+
1028
+ it "doesn't set duplicate identifier" do
1029
+ expect(payment).to receive(:generate_identifier).and_return(other_payment.number)
1030
+ expect(payment).to receive(:generate_identifier).and_call_original
1031
+
1032
+ payment.run_callbacks(:create)
1033
+
1034
+ expect(payment.number).not_to be_blank
1035
+ expect(payment.number).not_to eq(other_payment.number)
1036
+ end
1037
+ end
1038
+ end
1039
+
1040
+ describe "#amount=" do
1041
+ before do
1042
+ subject.amount = amount
1043
+ end
1044
+
1045
+ context "when the amount is a string" do
1046
+ context "amount is a decimal" do
1047
+ let(:amount) { '2.99' }
1048
+
1049
+ it '#amount' do
1050
+ expect(subject.amount).to eql(BigDecimal('2.99'))
1051
+ end
1052
+ end
1053
+
1054
+ context "amount is an integer" do
1055
+ let(:amount) { '2' }
1056
+
1057
+ it '#amount' do
1058
+ expect(subject.amount).to eql(BigDecimal('2.0'))
1059
+ end
1060
+ end
1061
+
1062
+ context "amount contains a dollar sign" do
1063
+ let(:amount) { '$2.99' }
1064
+
1065
+ it '#amount' do
1066
+ expect(subject.amount).to eql(BigDecimal('2.99'))
1067
+ end
1068
+ end
1069
+
1070
+ context "amount contains a comma" do
1071
+ let(:amount) { '$2,999.99' }
1072
+
1073
+ it '#amount' do
1074
+ expect(subject.amount).to eql(BigDecimal('2999.99'))
1075
+ end
1076
+ end
1077
+
1078
+ context "amount contains a negative sign" do
1079
+ let(:amount) { '-2.99' }
1080
+
1081
+ it '#amount' do
1082
+ expect(subject.amount).to eql(BigDecimal('-2.99'))
1083
+ end
1084
+ end
1085
+
1086
+ context "amount is invalid" do
1087
+ let(:amount) { 'invalid' }
1088
+
1089
+ # this is a strange default for ActiveRecord
1090
+
1091
+ it '#amount' do
1092
+ expect(subject.amount).to eql(BigDecimal('0'))
1093
+ end
1094
+ end
1095
+
1096
+ context "amount is an empty string" do
1097
+ let(:amount) { '' }
1098
+
1099
+ it '#amount' do
1100
+ expect(subject.amount).to be_nil
1101
+ end
1102
+ end
1103
+ end
1104
+
1105
+ context "when the amount is a number" do
1106
+ let(:amount) { 1.55 }
1107
+
1108
+ it '#amount' do
1109
+ expect(subject.amount).to eql(BigDecimal('1.55'))
1110
+ end
1111
+ end
1112
+
1113
+ context "when the locale uses a coma as a decimal separator" do
1114
+ before(:each) do
1115
+ I18n.backend.store_translations(:fr, { number: { currency: { format: { delimiter: ' ', separator: ',' } } } })
1116
+ I18n.locale = :fr
1117
+ subject.amount = amount
1118
+ end
1119
+
1120
+ after do
1121
+ I18n.locale = I18n.default_locale
1122
+ end
1123
+
1124
+ context "amount is a decimal" do
1125
+ let(:amount) { '2,99' }
1126
+
1127
+ it '#amount' do
1128
+ expect(subject.amount).to eql(BigDecimal('2.99'))
1129
+ end
1130
+ end
1131
+
1132
+ context "amount contains a $ sign" do
1133
+ let(:amount) { '2,99 $' }
1134
+
1135
+ it '#amount' do
1136
+ expect(subject.amount).to eql(BigDecimal('2.99'))
1137
+ end
1138
+ end
1139
+
1140
+ context "amount is a number" do
1141
+ let(:amount) { 2.99 }
1142
+
1143
+ it '#amount' do
1144
+ expect(subject.amount).to eql(BigDecimal('2.99'))
1145
+ end
1146
+ end
1147
+
1148
+ context "amount contains a negative sign" do
1149
+ let(:amount) { '-2,99 $' }
1150
+
1151
+ it '#amount' do
1152
+ expect(subject.amount).to eql(BigDecimal('-2.99'))
1153
+ end
1154
+ end
1155
+
1156
+ context "amount uses a dot as a decimal separator" do
1157
+ let(:amount) { '2.99' }
1158
+
1159
+ it '#amount' do
1160
+ expect(subject.amount).to eql(BigDecimal('2.99'))
1161
+ end
1162
+ end
1163
+ end
1164
+ end
1165
+
1166
+ describe "is_avs_risky?" do
1167
+ it "returns false if avs_response included in NON_RISKY_AVS_CODES" do
1168
+ ('A'..'Z').reject{ |x| subject.class::RISKY_AVS_CODES.include?(x) }.to_a.each do |char|
1169
+ payment.update_attribute(:avs_response, char)
1170
+ expect(payment.is_avs_risky?).to eq false
1171
+ end
1172
+ end
1173
+
1174
+ it "returns false if avs_response.blank?" do
1175
+ payment.update_attribute(:avs_response, nil)
1176
+ expect(payment.is_avs_risky?).to eq false
1177
+ payment.update_attribute(:avs_response, '')
1178
+ expect(payment.is_avs_risky?).to eq false
1179
+ end
1180
+
1181
+ it "returns true if avs_response in RISKY_AVS_CODES" do
1182
+ # should use avs_response_code helper
1183
+ ('A'..'Z').reject{ |x| subject.class::NON_RISKY_AVS_CODES.include?(x) }.to_a.each do |char|
1184
+ payment.update_attribute(:avs_response, char)
1185
+ expect(payment.is_avs_risky?).to eq true
1186
+ end
1187
+ end
1188
+ end
1189
+
1190
+ describe "is_cvv_risky?" do
1191
+ it "returns false if cvv_response_code == 'M'" do
1192
+ payment.update_attribute(:cvv_response_code, "M")
1193
+ expect(payment.is_cvv_risky?).to eq(false)
1194
+ end
1195
+
1196
+ it "returns false if cvv_response_code == nil" do
1197
+ payment.update_attribute(:cvv_response_code, nil)
1198
+ expect(payment.is_cvv_risky?).to eq(false)
1199
+ end
1200
+
1201
+ it "returns false if cvv_response_message == ''" do
1202
+ payment.update_attribute(:cvv_response_message, '')
1203
+ expect(payment.is_cvv_risky?).to eq(false)
1204
+ end
1205
+
1206
+ it "returns true if cvv_response_code == [A-Z], omitting D" do
1207
+ # should use cvv_response_code helper
1208
+ (%w{N P S U} << "").each do |char|
1209
+ payment.update_attribute(:cvv_response_code, char)
1210
+ expect(payment.is_cvv_risky?).to eq(true)
1211
+ end
1212
+ end
1213
+ end
1214
+
1215
+ # Regression test for https://github.com/spree/spree/issues/4072 (kinda)
1216
+ # The need for this was discovered in the research for https://github.com/spree/spree/issues/4072
1217
+ context "state changes" do
1218
+ it "are logged to the database" do
1219
+ expect(payment.state_changes).to be_empty
1220
+ expect(payment.process!).to be true
1221
+ expect(payment.state_changes.count).to eq(2)
1222
+ changes = payment.state_changes.map { |change| { change.previous_state => change.next_state } }
1223
+ expect(changes).to match_array([
1224
+ { "checkout" => "processing" },
1225
+ { "processing" => "pending" }
1226
+ ])
1227
+ end
1228
+ end
1229
+
1230
+ describe "#actions" do
1231
+ let(:source) { Spree::CreditCard.new }
1232
+ before { allow(subject).to receive(:payment_source) { source } }
1233
+
1234
+ it "includes the actions that the source can take" do
1235
+ allow(source).to receive(:can_capture?) { true }
1236
+ expect(subject.actions).to include "capture"
1237
+ end
1238
+
1239
+ it "excludes actions that the source cannot take" do
1240
+ allow(source).to receive(:can_capture?) { false }
1241
+ expect(subject.actions).not_to include "capture"
1242
+ end
1243
+
1244
+ it "does not include 'failure' by default" do
1245
+ expect(subject.actions).not_to include "failure"
1246
+ end
1247
+
1248
+ context "payment state is processing" do
1249
+ it "includes the 'failure' action" do
1250
+ # because the processing state does not provide
1251
+ # clarity about what has happened with an external
1252
+ # payment processor, so we want to allow the ability
1253
+ # to have someone look at the what happened and determine
1254
+ # to mark the payment as having failed
1255
+ subject.state = 'processing'
1256
+ expect(subject.actions).to include "failure"
1257
+ end
1258
+ end
1259
+ end
1260
+
1261
+ describe "#payment_method" do
1262
+ context 'with a soft-deleted payment method' do
1263
+ before do
1264
+ gateway.save!
1265
+ payment.save!
1266
+ gateway.discard
1267
+ end
1268
+
1269
+ it "works with a soft deleted payment method" do
1270
+ expect(payment.reload.payment_method).to eq(gateway)
1271
+ end
1272
+ end
1273
+ end
1274
+ end