solidus_core 2.10.5 → 2.11.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of solidus_core might be problematic. Click here for more details.

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