solidus_core 2.10.0 → 2.11.0

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