solidus_core 2.10.3 → 2.11.4

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.

Potentially problematic release.


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

Files changed (552) 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 +2 -2
  19. data/app/models/spree/calculator.rb +4 -4
  20. data/app/models/spree/calculator/default_tax.rb +1 -1
  21. data/app/models/spree/calculator/free_shipping.rb +1 -0
  22. data/app/models/spree/calculator/percent_per_item.rb +6 -4
  23. data/app/models/spree/calculator/price_sack.rb +2 -1
  24. data/app/models/spree/credit_card.rb +2 -2
  25. data/app/models/spree/customer_return.rb +4 -2
  26. data/app/models/spree/exchange.rb +1 -1
  27. data/app/models/spree/image/active_storage_attachment.rb +21 -0
  28. data/app/models/spree/inventory_unit.rb +1 -1
  29. data/app/models/spree/line_item.rb +13 -4
  30. data/app/models/spree/option_type.rb +1 -1
  31. data/app/models/spree/option_value.rb +2 -2
  32. data/app/models/spree/order.rb +91 -20
  33. data/app/models/spree/order/checkout.rb +1 -0
  34. data/app/models/spree/order/payments.rb +2 -2
  35. data/app/models/spree/order_inventory.rb +16 -4
  36. data/app/models/spree/order_merger.rb +6 -4
  37. data/app/models/spree/order_promotion.rb +1 -1
  38. data/app/models/spree/order_updater.rb +11 -10
  39. data/app/models/spree/payment.rb +3 -3
  40. data/app/models/spree/payment/cancellation.rb +3 -22
  41. data/app/models/spree/payment/processing.rb +54 -30
  42. data/app/models/spree/payment_method.rb +8 -9
  43. data/app/models/spree/payment_source.rb +2 -2
  44. data/app/models/spree/preference.rb +1 -1
  45. data/app/models/spree/price.rb +2 -8
  46. data/app/models/spree/product.rb +19 -14
  47. data/app/models/spree/product/scopes.rb +9 -5
  48. data/app/models/spree/promotion.rb +18 -7
  49. data/app/models/spree/promotion/actions/free_shipping.rb +6 -5
  50. data/app/models/spree/promotion_action.rb +1 -7
  51. data/app/models/spree/promotion_code.rb +6 -1
  52. data/app/models/spree/promotion_code_batch.rb +1 -1
  53. data/app/models/spree/promotion_handler/coupon.rb +2 -2
  54. data/app/models/spree/promotion_rule.rb +1 -1
  55. data/app/models/spree/promotion_rule_role.rb +1 -1
  56. data/app/models/spree/refund.rb +60 -12
  57. data/app/models/spree/reimbursement.rb +27 -0
  58. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +10 -3
  59. data/app/models/spree/return_authorization.rb +1 -1
  60. data/app/models/spree/return_item.rb +21 -10
  61. data/app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb +1 -1
  62. data/app/models/spree/role.rb +1 -1
  63. data/app/models/spree/shipment.rb +2 -2
  64. data/app/models/spree/shipping_calculator.rb +1 -1
  65. data/app/models/spree/shipping_manifest.rb +2 -2
  66. data/app/models/spree/shipping_method.rb +2 -9
  67. data/app/models/spree/shipping_rate.rb +1 -1
  68. data/app/models/spree/shipping_rate_tax.rb +1 -1
  69. data/app/models/spree/stock/inventory_unit_builder.rb +18 -7
  70. data/app/models/spree/stock/inventory_units_finalizer.rb +3 -5
  71. data/app/models/spree/stock/package.rb +1 -1
  72. data/app/models/spree/stock/simple_coordinator.rb +1 -3
  73. data/app/models/spree/stock_item.rb +2 -8
  74. data/app/models/spree/stock_movement.rb +2 -0
  75. data/app/models/spree/store.rb +1 -1
  76. data/app/models/spree/store_credit.rb +1 -7
  77. data/app/models/spree/store_credit_category.rb +30 -3
  78. data/app/models/spree/store_credit_event.rb +1 -7
  79. data/app/models/spree/store_credit_reason.rb +0 -4
  80. data/app/models/spree/tax/tax_helpers.rb +1 -1
  81. data/app/models/spree/tax_category.rb +2 -8
  82. data/app/models/spree/tax_rate.rb +7 -7
  83. data/app/models/spree/taxon.rb +1 -1
  84. data/app/models/spree/taxon/active_storage_attachment.rb +19 -0
  85. data/app/models/spree/user_address.rb +8 -2
  86. data/app/models/spree/variant.rb +7 -13
  87. data/app/models/spree/variant_property_rule.rb +5 -1
  88. data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +8 -3
  89. data/app/models/spree/zone.rb +1 -1
  90. data/config/locales/en.yml +44 -5
  91. data/db/default/spree/countries.rb +1 -1
  92. data/db/default/spree/states.rb +12 -4
  93. data/db/default/spree/store_credit.rb +2 -2
  94. data/db/migrate/20180416083007_add_apply_to_all_to_variant_property_rule.rb +12 -0
  95. data/db/migrate/20200320144521_add_default_billng_flag_to_user_addresses.rb +6 -0
  96. data/db/migrate/20200530111458_add_bcc_email_to_spree_stores.rb +7 -0
  97. data/db/migrate/20201008213609_add_discontinue_on_to_spree_products.rb +7 -0
  98. data/lib/generators/solidus/install/install_generator.rb +253 -0
  99. data/lib/generators/{spree → solidus}/install/templates/config/initializers/spree.rb.tt +36 -5
  100. data/lib/generators/{spree → solidus}/install/templates/vendor/assets/javascripts/spree/backend/all.js +0 -0
  101. data/lib/generators/{spree → solidus}/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -0
  102. data/lib/generators/{spree → solidus}/install/templates/vendor/assets/stylesheets/spree/backend/all.css +0 -0
  103. data/lib/generators/{spree → solidus}/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +0 -0
  104. data/lib/generators/spree/dummy/templates/rails/test.rb +1 -1
  105. data/lib/generators/spree/install/install_generator.rb +7 -189
  106. data/lib/solidus/migrations/promotions_with_code_handlers.rb +1 -1
  107. data/lib/spree/app_configuration.rb +117 -51
  108. data/lib/spree/awesome_nested_set_override.rb +44 -0
  109. data/lib/spree/core.rb +6 -11
  110. data/lib/spree/core/controller_helpers/auth.rb +17 -4
  111. data/lib/spree/core/controller_helpers/current_host.rb +17 -0
  112. data/lib/spree/core/controller_helpers/order.rb +8 -7
  113. data/lib/spree/core/engine.rb +39 -2
  114. data/lib/spree/core/importer/order.rb +24 -10
  115. data/lib/spree/core/permalinks.rb +1 -3
  116. data/lib/spree/core/product_filters.rb +6 -5
  117. data/lib/spree/core/state_machines.rb +20 -1
  118. data/lib/spree/core/state_machines/order.rb +249 -0
  119. data/lib/spree/core/state_machines/return_item/reception_status.rb +2 -2
  120. data/lib/spree/core/version.rb +1 -1
  121. data/lib/spree/encryptor.rb +25 -0
  122. data/lib/spree/event.rb +40 -7
  123. data/lib/spree/event/adapters/active_support_notifications.rb +32 -0
  124. data/lib/spree/event/configuration.rb +11 -6
  125. data/lib/spree/event/subscriber.rb +38 -18
  126. data/lib/spree/event/subscriber_registry.rb +92 -0
  127. data/lib/spree/i18n.rb +1 -1
  128. data/lib/spree/mailer_previews/carton_preview.rb +2 -1
  129. data/lib/spree/paranoia_deprecations.rb +32 -12
  130. data/lib/spree/permission_sets/configuration_display.rb +14 -14
  131. data/lib/spree/permission_sets/default_customer.rb +16 -16
  132. data/lib/spree/permission_sets/order_display.rb +11 -11
  133. data/lib/spree/permission_sets/order_management.rb +1 -1
  134. data/lib/spree/permission_sets/product_display.rb +9 -9
  135. data/lib/spree/permission_sets/promotion_display.rb +5 -5
  136. data/lib/spree/permission_sets/restricted_stock_display.rb +2 -2
  137. data/lib/spree/permission_sets/restricted_stock_management.rb +1 -1
  138. data/lib/spree/permission_sets/stock_display.rb +2 -2
  139. data/lib/spree/permission_sets/stock_management.rb +1 -1
  140. data/lib/spree/permission_sets/user_display.rb +3 -3
  141. data/lib/spree/permission_sets/user_management.rb +4 -3
  142. data/lib/spree/permitted_attributes.rb +9 -8
  143. data/lib/spree/preferences/preferable.rb +4 -3
  144. data/lib/spree/preferences/preferable_class_methods.rb +22 -3
  145. data/lib/spree/testing_support.rb +40 -0
  146. data/lib/spree/testing_support/ability_helpers.rb +9 -9
  147. data/lib/spree/testing_support/authorization_helpers.rb +1 -0
  148. data/lib/spree/testing_support/blacklist_urls.rb +23 -0
  149. data/lib/spree/testing_support/capybara_ext.rb +3 -0
  150. data/lib/spree/testing_support/common_rake.rb +3 -3
  151. data/lib/spree/testing_support/dummy_app.rb +44 -23
  152. data/lib/spree/testing_support/dummy_app/migrations.rb +5 -6
  153. data/lib/spree/testing_support/dummy_app/rake_tasks.rb +1 -3
  154. data/lib/spree/testing_support/factories.rb +2 -4
  155. data/lib/spree/testing_support/factories/address_factory.rb +3 -4
  156. data/lib/spree/testing_support/factories/adjustment_factory.rb +2 -5
  157. data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +3 -0
  158. data/lib/spree/testing_support/factories/calculator_factory.rb +3 -0
  159. data/lib/spree/testing_support/factories/carton_factory.rb +2 -2
  160. data/lib/spree/testing_support/factories/country_factory.rb +3 -0
  161. data/lib/spree/testing_support/factories/credit_card_factory.rb +3 -0
  162. data/lib/spree/testing_support/factories/customer_return_factory.rb +2 -3
  163. data/lib/spree/testing_support/factories/image_factory.rb +4 -1
  164. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +2 -4
  165. data/lib/spree/testing_support/factories/line_item_factory.rb +2 -2
  166. data/lib/spree/testing_support/factories/option_type_factory.rb +3 -0
  167. data/lib/spree/testing_support/factories/option_value_factory.rb +3 -0
  168. data/lib/spree/testing_support/factories/order_factory.rb +2 -6
  169. data/lib/spree/testing_support/factories/order_promotion_factory.rb +2 -2
  170. data/lib/spree/testing_support/factories/payment_factory.rb +2 -4
  171. data/lib/spree/testing_support/factories/payment_method_factory.rb +3 -0
  172. data/lib/spree/testing_support/factories/price_factory.rb +2 -1
  173. data/lib/spree/testing_support/factories/product_factory.rb +2 -5
  174. data/lib/spree/testing_support/factories/product_option_type_factory.rb +2 -2
  175. data/lib/spree/testing_support/factories/product_property_factory.rb +2 -2
  176. data/lib/spree/testing_support/factories/promotion_category_factory.rb +3 -0
  177. data/lib/spree/testing_support/factories/promotion_code_factory.rb +2 -2
  178. data/lib/spree/testing_support/factories/promotion_factory.rb +8 -2
  179. data/lib/spree/testing_support/factories/property_factory.rb +3 -0
  180. data/lib/spree/testing_support/factories/refund_factory.rb +3 -2
  181. data/lib/spree/testing_support/factories/refund_reason_factory.rb +3 -0
  182. data/lib/spree/testing_support/factories/reimbursement_factory.rb +3 -2
  183. data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +3 -0
  184. data/lib/spree/testing_support/factories/return_authorization_factory.rb +2 -3
  185. data/lib/spree/testing_support/factories/return_item_factory.rb +2 -4
  186. data/lib/spree/testing_support/factories/return_reason_factory.rb +3 -0
  187. data/lib/spree/testing_support/factories/role_factory.rb +3 -0
  188. data/lib/spree/testing_support/factories/shipment_factory.rb +2 -3
  189. data/lib/spree/testing_support/factories/shipping_category_factory.rb +3 -0
  190. data/lib/spree/testing_support/factories/shipping_method_factory.rb +2 -3
  191. data/lib/spree/testing_support/factories/shipping_rate_factory.rb +2 -2
  192. data/lib/spree/testing_support/factories/state_factory.rb +2 -1
  193. data/lib/spree/testing_support/factories/stock_item_factory.rb +2 -2
  194. data/lib/spree/testing_support/factories/stock_location_factory.rb +2 -3
  195. data/lib/spree/testing_support/factories/stock_movement_factory.rb +2 -1
  196. data/lib/spree/testing_support/factories/stock_package_factory.rb +2 -2
  197. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +11 -0
  198. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +3 -2
  199. data/lib/spree/testing_support/factories/store_credit_factory.rb +2 -3
  200. data/lib/spree/testing_support/factories/store_credit_reason_factory.rb +6 -1
  201. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +3 -0
  202. data/lib/spree/testing_support/factories/store_factory.rb +4 -1
  203. data/lib/spree/testing_support/factories/tax_category_factory.rb +2 -1
  204. data/lib/spree/testing_support/factories/tax_rate_factory.rb +2 -3
  205. data/lib/spree/testing_support/factories/taxon_factory.rb +6 -1
  206. data/lib/spree/testing_support/factories/taxonomy_factory.rb +3 -0
  207. data/lib/spree/testing_support/factories/user_factory.rb +2 -3
  208. data/lib/spree/testing_support/factories/variant_factory.rb +2 -4
  209. data/lib/spree/testing_support/factories/variant_property_rule_condition_factory.rb +2 -2
  210. data/lib/spree/testing_support/factories/variant_property_rule_factory.rb +2 -3
  211. data/lib/spree/testing_support/factories/variant_property_rule_value_factory.rb +2 -2
  212. data/lib/spree/testing_support/factories/zone_factory.rb +3 -3
  213. data/lib/spree/testing_support/fixtures/blank.jpg +0 -0
  214. data/lib/spree/testing_support/job_helpers.rb +24 -0
  215. data/lib/spree/testing_support/order_walkthrough.rb +1 -1
  216. data/lib/spree/testing_support/precompiled_assets.rb +15 -0
  217. data/lib/spree/testing_support/preferences.rb +3 -1
  218. data/lib/spree/testing_support/shared_examples/gallery.rb +1 -1
  219. data/lib/spree/testing_support/translations.rb +25 -0
  220. data/{app/models → lib}/spree/user_class_handle.rb +0 -0
  221. data/lib/tasks/email.rake +3 -2
  222. data/solidus_core.gemspec +8 -5
  223. metadata +97 -374
  224. data/script/rails +0 -10
  225. data/spec/fixtures/thinking-cat.jpg +0 -0
  226. data/spec/helpers/base_helper_spec.rb +0 -168
  227. data/spec/helpers/products_helper_spec.rb +0 -202
  228. data/spec/helpers/taxons_helper_spec.rb +0 -43
  229. data/spec/jobs/promotion_code_batch_job_spec.rb +0 -96
  230. data/spec/lib/calculated_adjustments_spec.rb +0 -133
  231. data/spec/lib/i18n_spec.rb +0 -97
  232. data/spec/lib/search/base_spec.rb +0 -91
  233. data/spec/lib/search/variant_spec.rb +0 -115
  234. data/spec/lib/spree/app_configuration_spec.rb +0 -140
  235. data/spec/lib/spree/core/class_constantizer_spec.rb +0 -91
  236. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +0 -73
  237. data/spec/lib/spree/core/controller_helpers/order_spec.rb +0 -126
  238. data/spec/lib/spree/core/controller_helpers/payment_parameters_spec.rb +0 -195
  239. data/spec/lib/spree/core/controller_helpers/pricing_spec.rb +0 -94
  240. data/spec/lib/spree/core/controller_helpers/search_spec.rb +0 -21
  241. data/spec/lib/spree/core/controller_helpers/store_spec.rb +0 -18
  242. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +0 -48
  243. data/spec/lib/spree/core/current_store_spec.rb +0 -33
  244. data/spec/lib/spree/core/environment_extension_spec.rb +0 -46
  245. data/spec/lib/spree/core/importer/order_spec.rb +0 -484
  246. data/spec/lib/spree/core/role_configuration_spec.rb +0 -155
  247. data/spec/lib/spree/core/stock_configuration_spec.rb +0 -95
  248. data/spec/lib/spree/core/testing_support/factories/address_factory_spec.rb +0 -61
  249. data/spec/lib/spree/core/testing_support/factories/adjustment_factory_spec.rb +0 -20
  250. data/spec/lib/spree/core/testing_support/factories/adjustment_reason_factory_spec.rb +0 -14
  251. data/spec/lib/spree/core/testing_support/factories/calculator_factory_spec.rb +0 -44
  252. data/spec/lib/spree/core/testing_support/factories/carton_factory_spec.rb +0 -14
  253. data/spec/lib/spree/core/testing_support/factories/country_factory_spec.rb +0 -14
  254. data/spec/lib/spree/core/testing_support/factories/credit_card_factory_spec.rb +0 -14
  255. data/spec/lib/spree/core/testing_support/factories/customer_return_factory_spec.rb +0 -39
  256. data/spec/lib/spree/core/testing_support/factories/image_factory_spec.rb +0 -14
  257. data/spec/lib/spree/core/testing_support/factories/inventory_unit_factory_spec.rb +0 -14
  258. data/spec/lib/spree/core/testing_support/factories/line_item_factory_spec.rb +0 -14
  259. data/spec/lib/spree/core/testing_support/factories/option_type_factory_spec.rb +0 -14
  260. data/spec/lib/spree/core/testing_support/factories/option_value_factory_spec.rb +0 -14
  261. data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +0 -376
  262. data/spec/lib/spree/core/testing_support/factories/order_promotion_factory_spec.rb +0 -14
  263. data/spec/lib/spree/core/testing_support/factories/payment_factory_spec.rb +0 -40
  264. data/spec/lib/spree/core/testing_support/factories/payment_method_factory_spec.rb +0 -32
  265. data/spec/lib/spree/core/testing_support/factories/price_factory_spec.rb +0 -14
  266. data/spec/lib/spree/core/testing_support/factories/product_factory_spec.rb +0 -32
  267. data/spec/lib/spree/core/testing_support/factories/product_option_type_factory_spec.rb +0 -14
  268. data/spec/lib/spree/core/testing_support/factories/product_property_factory_spec.rb +0 -14
  269. data/spec/lib/spree/core/testing_support/factories/promotion_category_factory_spec.rb +0 -14
  270. data/spec/lib/spree/core/testing_support/factories/promotion_code_factory_spec.rb +0 -14
  271. data/spec/lib/spree/core/testing_support/factories/promotion_factory_spec.rb +0 -32
  272. data/spec/lib/spree/core/testing_support/factories/property_factory_spec.rb +0 -14
  273. data/spec/lib/spree/core/testing_support/factories/refund_factory_spec.rb +0 -14
  274. data/spec/lib/spree/core/testing_support/factories/refund_reason_factory_spec.rb +0 -14
  275. data/spec/lib/spree/core/testing_support/factories/reimbursement_factory_spec.rb +0 -20
  276. data/spec/lib/spree/core/testing_support/factories/reimbursement_type_factory_spec.rb +0 -14
  277. data/spec/lib/spree/core/testing_support/factories/return_authorization_factory_spec.rb +0 -14
  278. data/spec/lib/spree/core/testing_support/factories/return_item_factory_spec.rb +0 -20
  279. data/spec/lib/spree/core/testing_support/factories/return_reason_factory_spec.rb +0 -14
  280. data/spec/lib/spree/core/testing_support/factories/role_factory_spec.rb +0 -20
  281. data/spec/lib/spree/core/testing_support/factories/shipment_factory_spec.rb +0 -14
  282. data/spec/lib/spree/core/testing_support/factories/shipping_category_factory_spec.rb +0 -14
  283. data/spec/lib/spree/core/testing_support/factories/shipping_method_factory_spec.rb +0 -44
  284. data/spec/lib/spree/core/testing_support/factories/shipping_rate_factory_spec.rb +0 -14
  285. data/spec/lib/spree/core/testing_support/factories/state_factory_spec.rb +0 -59
  286. data/spec/lib/spree/core/testing_support/factories/stock_item_factory_spec.rb +0 -14
  287. data/spec/lib/spree/core/testing_support/factories/stock_location_factory_spec.rb +0 -35
  288. data/spec/lib/spree/core/testing_support/factories/stock_movement_factory_spec.rb +0 -14
  289. data/spec/lib/spree/core/testing_support/factories/stock_package_factory_spec.rb +0 -28
  290. data/spec/lib/spree/core/testing_support/factories/store_credit_category_factory_spec.rb +0 -14
  291. data/spec/lib/spree/core/testing_support/factories/store_credit_event_factory_spec.rb +0 -43
  292. data/spec/lib/spree/core/testing_support/factories/store_credit_factory_spec.rb +0 -14
  293. data/spec/lib/spree/core/testing_support/factories/store_credit_reason_factory_spec.rb +0 -14
  294. data/spec/lib/spree/core/testing_support/factories/store_credit_type_factory_spec.rb +0 -20
  295. data/spec/lib/spree/core/testing_support/factories/store_factory_spec.rb +0 -14
  296. data/spec/lib/spree/core/testing_support/factories/tax_category_factory_spec.rb +0 -14
  297. data/spec/lib/spree/core/testing_support/factories/tax_rate_factory_spec.rb +0 -14
  298. data/spec/lib/spree/core/testing_support/factories/taxon_factory_spec.rb +0 -14
  299. data/spec/lib/spree/core/testing_support/factories/taxonomy_factory_spec.rb +0 -14
  300. data/spec/lib/spree/core/testing_support/factories/user_factory_spec.rb +0 -24
  301. data/spec/lib/spree/core/testing_support/factories/variant_factory_spec.rb +0 -56
  302. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_condition_factory_spec.rb +0 -14
  303. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_factory_spec.rb +0 -14
  304. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_value_factory_spec.rb +0 -14
  305. data/spec/lib/spree/core/testing_support/factories/zone_factory_spec.rb +0 -20
  306. data/spec/lib/spree/core/testing_support/preferences_spec.rb +0 -61
  307. data/spec/lib/spree/core/validators/email_spec.rb +0 -53
  308. data/spec/lib/spree/core/version_spec.rb +0 -19
  309. data/spec/lib/spree/event/subscriber_spec.rb +0 -85
  310. data/spec/lib/spree/event_spec.rb +0 -130
  311. data/spec/lib/spree/localized_number_spec.rb +0 -45
  312. data/spec/lib/spree/migrations_spec.rb +0 -32
  313. data/spec/lib/spree/money_spec.rb +0 -298
  314. data/spec/lib/spree/permission_sets/default_customer_spec.rb +0 -22
  315. data/spec/lib/spree/permitted_attributes_spec.rb +0 -41
  316. data/spec/lib/spree/promo/environment_spec.rb +0 -53
  317. data/spec/lib/tasks/dummy_task.rake +0 -12
  318. data/spec/lib/tasks/dummy_task_spec.rb +0 -30
  319. data/spec/lib/tasks/migrations/migrate_shipping_rate_taxes_spec.rb +0 -21
  320. data/spec/mailers/carton_mailer_spec.rb +0 -44
  321. data/spec/mailers/order_mailer_spec.rb +0 -117
  322. data/spec/mailers/promotion_code_batch_mailer_spec.rb +0 -47
  323. data/spec/mailers/reimbursement_mailer_spec.rb +0 -36
  324. data/spec/mailers/test_mailer_spec.rb +0 -13
  325. data/spec/models/spree/ability_spec.rb +0 -279
  326. data/spec/models/spree/address_spec.rb +0 -399
  327. data/spec/models/spree/adjustment_reason_spec.rb +0 -11
  328. data/spec/models/spree/adjustment_spec.rb +0 -339
  329. data/spec/models/spree/asset_spec.rb +0 -25
  330. data/spec/models/spree/calculator/default_tax_spec.rb +0 -260
  331. data/spec/models/spree/calculator/distributed_amount_spec.rb +0 -82
  332. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +0 -39
  333. data/spec/models/spree/calculator/flat_rate_spec.rb +0 -52
  334. data/spec/models/spree/calculator/flexi_rate_spec.rb +0 -158
  335. data/spec/models/spree/calculator/free_shipping_spec.rb +0 -8
  336. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +0 -20
  337. data/spec/models/spree/calculator/percent_per_item_spec.rb +0 -12
  338. data/spec/models/spree/calculator/price_sack_spec.rb +0 -35
  339. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +0 -70
  340. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +0 -44
  341. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +0 -18
  342. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +0 -56
  343. data/spec/models/spree/calculator/shipping/per_item_spec.rb +0 -25
  344. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +0 -44
  345. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +0 -99
  346. data/spec/models/spree/calculator/tiered_percent_spec.rb +0 -197
  347. data/spec/models/spree/calculator_spec.rb +0 -43
  348. data/spec/models/spree/carton_spec.rb +0 -145
  349. data/spec/models/spree/classification_spec.rb +0 -126
  350. data/spec/models/spree/concerns/display_money_spec.rb +0 -44
  351. data/spec/models/spree/concerns/ordered_property_value_list_spec.rb +0 -52
  352. data/spec/models/spree/concerns/user_address_book_spec.rb +0 -358
  353. data/spec/models/spree/concerns/user_methods_spec.rb +0 -122
  354. data/spec/models/spree/country_spec.rb +0 -154
  355. data/spec/models/spree/credit_card_spec.rb +0 -373
  356. data/spec/models/spree/customer_return_spec.rb +0 -294
  357. data/spec/models/spree/distributed_amounts_handler_spec.rb +0 -83
  358. data/spec/models/spree/exchange_spec.rb +0 -76
  359. data/spec/models/spree/fulfilment_changer_spec.rb +0 -340
  360. data/spec/models/spree/gallery/product_gallery_spec.rb +0 -21
  361. data/spec/models/spree/gallery/variant_gallery_spec.rb +0 -21
  362. data/spec/models/spree/gateway/bogus_simple.rb +0 -14
  363. data/spec/models/spree/gateway/bogus_spec.rb +0 -14
  364. data/spec/models/spree/gateway_spec.rb +0 -14
  365. data/spec/models/spree/image_spec.rb +0 -25
  366. data/spec/models/spree/inventory_unit_spec.rb +0 -309
  367. data/spec/models/spree/line_item_spec.rb +0 -240
  368. data/spec/models/spree/option_type_spec.rb +0 -16
  369. data/spec/models/spree/option_value_spec.rb +0 -52
  370. data/spec/models/spree/order/address_spec.rb +0 -52
  371. data/spec/models/spree/order/adjustments_spec.rb +0 -29
  372. data/spec/models/spree/order/callbacks_spec.rb +0 -44
  373. data/spec/models/spree/order/checkout_spec.rb +0 -740
  374. data/spec/models/spree/order/finalizing_spec.rb +0 -92
  375. data/spec/models/spree/order/number_generator_spec.rb +0 -47
  376. data/spec/models/spree/order/outstanding_balance_integration_spec.rb +0 -138
  377. data/spec/models/spree/order/payment_spec.rb +0 -280
  378. data/spec/models/spree/order/risk_assessment_spec.rb +0 -70
  379. data/spec/models/spree/order/state_machine_spec.rb +0 -122
  380. data/spec/models/spree/order/totals_spec.rb +0 -26
  381. data/spec/models/spree/order/validations_spec.rb +0 -17
  382. data/spec/models/spree/order_cancellations_spec.rb +0 -233
  383. data/spec/models/spree/order_capturing_spec.rb +0 -16
  384. data/spec/models/spree/order_contents_spec.rb +0 -362
  385. data/spec/models/spree/order_inventory_spec.rb +0 -285
  386. data/spec/models/spree/order_merger_spec.rb +0 -162
  387. data/spec/models/spree/order_mutex_spec.rb +0 -89
  388. data/spec/models/spree/order_promotion_spec.rb +0 -33
  389. data/spec/models/spree/order_shipping_spec.rb +0 -247
  390. data/spec/models/spree/order_spec.rb +0 -1687
  391. data/spec/models/spree/order_taxation_spec.rb +0 -128
  392. data/spec/models/spree/order_update_attributes_spec.rb +0 -49
  393. data/spec/models/spree/order_updater_spec.rb +0 -556
  394. data/spec/models/spree/payment/cancellation_spec.rb +0 -84
  395. data/spec/models/spree/payment_create_spec.rb +0 -195
  396. data/spec/models/spree/payment_method/bogus_credit_card_spec.rb +0 -10
  397. data/spec/models/spree/payment_method/check_spec.rb +0 -80
  398. data/spec/models/spree/payment_method/credit_card_spec.rb +0 -68
  399. data/spec/models/spree/payment_method/simple_bogus_credit_card_spec.rb +0 -20
  400. data/spec/models/spree/payment_method/store_credit_spec.rb +0 -325
  401. data/spec/models/spree/payment_method_spec.rb +0 -408
  402. data/spec/models/spree/payment_spec.rb +0 -1270
  403. data/spec/models/spree/permission_sets/base_spec.rb +0 -14
  404. data/spec/models/spree/permission_sets/configuration_display.rb +0 -79
  405. data/spec/models/spree/permission_sets/configuration_management_spec.rb +0 -49
  406. data/spec/models/spree/permission_sets/dashboard_display_spec.rb +0 -23
  407. data/spec/models/spree/permission_sets/order_display_spec.rb +0 -56
  408. data/spec/models/spree/permission_sets/order_management_spec.rb +0 -43
  409. data/spec/models/spree/permission_sets/product_display_spec.rb +0 -57
  410. data/spec/models/spree/permission_sets/product_management_spec.rb +0 -39
  411. data/spec/models/spree/permission_sets/promotion_display_spec.rb +0 -41
  412. data/spec/models/spree/permission_sets/promotion_management_spec.rb +0 -29
  413. data/spec/models/spree/permission_sets/restricted_stock_display_spec.rb +0 -42
  414. data/spec/models/spree/permission_sets/restricted_stock_management_spec.rb +0 -42
  415. data/spec/models/spree/permission_sets/stock_display_spec.rb +0 -25
  416. data/spec/models/spree/permission_sets/stock_management_spec.rb +0 -23
  417. data/spec/models/spree/permission_sets/user_display_spec.rb +0 -39
  418. data/spec/models/spree/permission_sets/user_management_spec.rb +0 -58
  419. data/spec/models/spree/preference_spec.rb +0 -79
  420. data/spec/models/spree/preferences/configuration_spec.rb +0 -27
  421. data/spec/models/spree/preferences/preferable_spec.rb +0 -334
  422. data/spec/models/spree/preferences/scoped_store_spec.rb +0 -62
  423. data/spec/models/spree/preferences/static_model_preferences_spec.rb +0 -79
  424. data/spec/models/spree/preferences/statically_configurable_spec.rb +0 -67
  425. data/spec/models/spree/preferences/store_spec.rb +0 -40
  426. data/spec/models/spree/price_spec.rb +0 -150
  427. data/spec/models/spree/product/scopes_spec.rb +0 -164
  428. data/spec/models/spree/product_duplicator_spec.rb +0 -92
  429. data/spec/models/spree/product_filter_spec.rb +0 -28
  430. data/spec/models/spree/product_property_spec.rb +0 -20
  431. data/spec/models/spree/product_spec.rb +0 -584
  432. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +0 -126
  433. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +0 -198
  434. data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +0 -298
  435. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +0 -61
  436. data/spec/models/spree/promotion/rules/first_order_spec.rb +0 -87
  437. data/spec/models/spree/promotion/rules/first_repeat_purchase_since_spec.rb +0 -71
  438. data/spec/models/spree/promotion/rules/item_total_spec.rb +0 -128
  439. data/spec/models/spree/promotion/rules/nth_order_spec.rb +0 -72
  440. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +0 -54
  441. data/spec/models/spree/promotion/rules/option_value_spec.rb +0 -96
  442. data/spec/models/spree/promotion/rules/product_spec.rb +0 -193
  443. data/spec/models/spree/promotion/rules/store_spec.rb +0 -35
  444. data/spec/models/spree/promotion/rules/taxon_spec.rb +0 -227
  445. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +0 -33
  446. data/spec/models/spree/promotion/rules/user_role_spec.rb +0 -88
  447. data/spec/models/spree/promotion/rules/user_spec.rb +0 -39
  448. data/spec/models/spree/promotion_action_spec.rb +0 -44
  449. data/spec/models/spree/promotion_category_spec.rb +0 -19
  450. data/spec/models/spree/promotion_code/batch_builder_spec.rb +0 -107
  451. data/spec/models/spree/promotion_code_batch_spec.rb +0 -54
  452. data/spec/models/spree/promotion_code_spec.rb +0 -206
  453. data/spec/models/spree/promotion_handler/cart_spec.rb +0 -132
  454. data/spec/models/spree/promotion_handler/coupon_spec.rb +0 -419
  455. data/spec/models/spree/promotion_handler/page_spec.rb +0 -45
  456. data/spec/models/spree/promotion_handler/shipping_spec.rb +0 -96
  457. data/spec/models/spree/promotion_rule_spec.rb +0 -34
  458. data/spec/models/spree/promotion_spec.rb +0 -945
  459. data/spec/models/spree/refund_spec.rb +0 -200
  460. data/spec/models/spree/reimbursement/credit_spec.rb +0 -38
  461. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +0 -144
  462. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +0 -85
  463. data/spec/models/spree/reimbursement_performer_spec.rb +0 -33
  464. data/spec/models/spree/reimbursement_spec.rb +0 -278
  465. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +0 -52
  466. data/spec/models/spree/reimbursement_type/credit_spec.rb +0 -56
  467. data/spec/models/spree/reimbursement_type/exchange_spec.rb +0 -48
  468. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +0 -110
  469. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +0 -111
  470. data/spec/models/spree/return_authorization_spec.rb +0 -226
  471. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +0 -79
  472. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +0 -59
  473. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +0 -86
  474. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +0 -35
  475. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +0 -31
  476. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +0 -42
  477. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +0 -66
  478. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +0 -43
  479. data/spec/models/spree/return_item_spec.rb +0 -785
  480. data/spec/models/spree/returns_calculator_spec.rb +0 -16
  481. data/spec/models/spree/shipment_spec.rb +0 -914
  482. data/spec/models/spree/shipping_calculator_spec.rb +0 -45
  483. data/spec/models/spree/shipping_manifest_spec.rb +0 -110
  484. data/spec/models/spree/shipping_method_spec.rb +0 -292
  485. data/spec/models/spree/shipping_rate_spec.rb +0 -154
  486. data/spec/models/spree/shipping_rate_tax_spec.rb +0 -79
  487. data/spec/models/spree/state_spec.rb +0 -43
  488. data/spec/models/spree/stock/allocator/on_hand_first_spec.rb +0 -146
  489. data/spec/models/spree/stock/availability_spec.rb +0 -143
  490. data/spec/models/spree/stock/availability_validator_spec.rb +0 -140
  491. data/spec/models/spree/stock/content_item_spec.rb +0 -70
  492. data/spec/models/spree/stock/differentiator_spec.rb +0 -41
  493. data/spec/models/spree/stock/estimator_spec.rb +0 -241
  494. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +0 -34
  495. data/spec/models/spree/stock/inventory_units_finalizer_spec.rb +0 -58
  496. data/spec/models/spree/stock/location_filter/active_spec.rb +0 -22
  497. data/spec/models/spree/stock/location_sorter/default_first_spec.rb +0 -22
  498. data/spec/models/spree/stock/location_sorter/unsorted_spec.rb +0 -21
  499. data/spec/models/spree/stock/package_spec.rb +0 -182
  500. data/spec/models/spree/stock/quantifier_spec.rb +0 -113
  501. data/spec/models/spree/stock/shipping_rate_selector_spec.rb +0 -18
  502. data/spec/models/spree/stock/shipping_rate_sorter_spec.rb +0 -18
  503. data/spec/models/spree/stock/simple_coordinator_spec.rb +0 -264
  504. data/spec/models/spree/stock/splitter/backordered_spec.rb +0 -31
  505. data/spec/models/spree/stock/splitter/base_spec.rb +0 -22
  506. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +0 -48
  507. data/spec/models/spree/stock/splitter/weight_spec.rb +0 -31
  508. data/spec/models/spree/stock/splitter_chain_spec.rb +0 -66
  509. data/spec/models/spree/stock_item_spec.rb +0 -348
  510. data/spec/models/spree/stock_location_spec.rb +0 -288
  511. data/spec/models/spree/stock_movement_spec.rb +0 -58
  512. data/spec/models/spree/stock_quantities_spec.rb +0 -249
  513. data/spec/models/spree/store_credit_category_spec.rb +0 -19
  514. data/spec/models/spree/store_credit_event_spec.rb +0 -328
  515. data/spec/models/spree/store_credit_spec.rb +0 -900
  516. data/spec/models/spree/store_selector/by_server_name_spec.rb +0 -28
  517. data/spec/models/spree/store_selector/legacy_spec.rb +0 -46
  518. data/spec/models/spree/store_spec.rb +0 -156
  519. data/spec/models/spree/tax/order_adjuster_spec.rb +0 -35
  520. data/spec/models/spree/tax/shipping_rate_taxer_spec.rb +0 -59
  521. data/spec/models/spree/tax/tax_location_spec.rb +0 -79
  522. data/spec/models/spree/tax/taxation_integration_spec.rb +0 -815
  523. data/spec/models/spree/tax_calculator/default_spec.rb +0 -56
  524. data/spec/models/spree/tax_category_spec.rb +0 -50
  525. data/spec/models/spree/tax_rate_spec.rb +0 -317
  526. data/spec/models/spree/taxon_spec.rb +0 -197
  527. data/spec/models/spree/taxonomy_spec.rb +0 -15
  528. data/spec/models/spree/taxons/paperclip_attachment_spec.rb +0 -29
  529. data/spec/models/spree/unit_cancel_spec.rb +0 -126
  530. data/spec/models/spree/user_last_url_storer/rules/authentication_rule_spec.rb +0 -31
  531. data/spec/models/spree/user_last_url_storer_spec.rb +0 -60
  532. data/spec/models/spree/user_spec.rb +0 -247
  533. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +0 -33
  534. data/spec/models/spree/variant/price_selector_spec.rb +0 -90
  535. data/spec/models/spree/variant/pricing_options_spec.rb +0 -204
  536. data/spec/models/spree/variant/scopes_spec.rb +0 -94
  537. data/spec/models/spree/variant/vat_price_generator_spec.rb +0 -77
  538. data/spec/models/spree/variant_property_rule_condition_spec.rb +0 -17
  539. data/spec/models/spree/variant_property_rule_spec.rb +0 -85
  540. data/spec/models/spree/variant_property_rule_value_spec.rb +0 -20
  541. data/spec/models/spree/variant_spec.rb +0 -862
  542. data/spec/models/spree/wallet_payment_source_spec.rb +0 -77
  543. data/spec/models/spree/wallet_spec.rb +0 -155
  544. data/spec/models/spree/zone_spec.rb +0 -248
  545. data/spec/rails_helper.rb +0 -46
  546. data/spec/shared_examples/calculator_shared_examples.rb +0 -10
  547. data/spec/spec_helper.rb +0 -36
  548. data/spec/support/big_decimal.rb +0 -7
  549. data/spec/support/concerns/default_price.rb +0 -44
  550. data/spec/support/concerns/payment_source.rb +0 -66
  551. data/spec/support/concerns/working_factories.rb +0 -15
  552. 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