spree_core 5.3.4 → 5.4.0.beta2

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 (331) hide show
  1. checksums.yaml +4 -4
  2. data/app/finders/spree/orders/find_complete.rb +33 -2
  3. data/app/finders/spree/products/find.rb +1 -28
  4. data/app/finders/spree/stores/find_default.rb +17 -0
  5. data/app/finders/spree/variants/visible_finder.rb +1 -0
  6. data/app/helpers/spree/addresses_helper.rb +1 -2
  7. data/app/helpers/spree/base_helper.rb +6 -58
  8. data/app/mailers/spree/base_mailer.rb +4 -3
  9. data/app/models/concerns/spree/adjustment_source.rb +0 -8
  10. data/app/models/concerns/spree/admin_user_methods.rb +32 -2
  11. data/app/models/concerns/spree/image_methods.rb +4 -0
  12. data/app/models/concerns/spree/metadata.rb +10 -0
  13. data/app/models/concerns/spree/number_as_param.rb +5 -3
  14. data/app/models/concerns/spree/prefixed_id.rb +82 -0
  15. data/app/models/concerns/spree/product_scopes.rb +35 -65
  16. data/app/models/concerns/spree/publishable.rb +47 -47
  17. data/app/models/concerns/spree/{multi_store_resource.rb → store_scoped_resource.rb} +1 -10
  18. data/app/models/concerns/spree/stores/markets.rb +124 -0
  19. data/app/models/concerns/spree/user_methods.rb +7 -7
  20. data/app/models/concerns/spree/user_payment_source.rb +2 -0
  21. data/app/models/concerns/spree/user_roles.rb +1 -0
  22. data/app/models/concerns/spree/vat_price_calculation.rb +2 -2
  23. data/app/models/spree/ability.rb +18 -5
  24. data/app/models/spree/address.rb +33 -2
  25. data/app/models/spree/adjustable/promotion_accumulator.rb +1 -1
  26. data/app/models/spree/adjustment.rb +3 -20
  27. data/app/models/spree/api_key.rb +102 -0
  28. data/app/models/spree/asset.rb +2 -0
  29. data/app/models/spree/authentication/strategies/base_strategy.rb +55 -0
  30. data/app/models/spree/authentication/strategies/email_password_strategy.rb +47 -0
  31. data/app/models/spree/base.rb +1 -0
  32. data/app/models/spree/calculator.rb +2 -0
  33. data/app/models/spree/country.rb +60 -0
  34. data/app/models/spree/coupon_code.rb +2 -0
  35. data/app/models/spree/credit_card.rb +2 -27
  36. data/app/models/spree/current.rb +45 -4
  37. data/app/models/spree/customer_group.rb +2 -0
  38. data/app/models/spree/customer_return.rb +2 -0
  39. data/app/models/spree/digital.rb +2 -0
  40. data/app/models/spree/digital_link.rb +2 -0
  41. data/app/models/spree/export.rb +3 -2
  42. data/app/models/spree/exports/products.rb +0 -6
  43. data/app/models/spree/fulfilment_changer.rb +8 -2
  44. data/app/models/spree/gateway/bogus.rb +69 -9
  45. data/app/models/spree/gateway.rb +0 -3
  46. data/app/models/spree/gateway_customer.rb +2 -0
  47. data/app/models/spree/gift_card.rb +2 -0
  48. data/app/models/spree/gift_card_batch.rb +6 -0
  49. data/app/models/spree/image/configuration/active_storage.rb +0 -2
  50. data/app/models/spree/image.rb +25 -31
  51. data/app/models/spree/import.rb +5 -3
  52. data/app/models/spree/import_mapping.rb +2 -0
  53. data/app/models/spree/import_row.rb +2 -0
  54. data/app/models/spree/import_schemas/customers.rb +21 -0
  55. data/app/models/spree/imports/customers.rb +9 -0
  56. data/app/models/spree/integration.rb +2 -0
  57. data/app/models/spree/inventory_unit.rb +2 -0
  58. data/app/models/spree/invitation.rb +6 -6
  59. data/app/models/spree/legacy_admin_user.rb +31 -0
  60. data/app/models/spree/legacy_user.rb +19 -1
  61. data/app/models/spree/line_item.rb +15 -4
  62. data/app/models/spree/log_entry.rb +10 -5
  63. data/app/models/spree/market.rb +83 -0
  64. data/app/models/spree/market_country.rb +25 -0
  65. data/app/models/spree/metafield.rb +2 -0
  66. data/app/models/spree/metafield_definition.rb +2 -0
  67. data/app/models/spree/newsletter_subscriber.rb +2 -0
  68. data/app/models/spree/option_type.rb +2 -0
  69. data/app/models/spree/option_value.rb +2 -0
  70. data/app/models/spree/order/address_book.rb +2 -1
  71. data/app/models/spree/order/checkout.rb +0 -18
  72. data/app/models/spree/order.rb +93 -56
  73. data/app/models/spree/payment/gateway_options.rb +2 -2
  74. data/app/models/spree/payment/processing.rb +5 -5
  75. data/app/models/spree/payment.rb +7 -2
  76. data/app/models/spree/payment_capture_event.rb +2 -0
  77. data/app/models/spree/payment_connection_error.rb +3 -0
  78. data/app/models/spree/payment_method/check.rb +1 -1
  79. data/app/models/spree/payment_method/store_credit.rb +5 -5
  80. data/app/models/spree/payment_method.rb +59 -1
  81. data/app/models/spree/payment_response.rb +70 -0
  82. data/app/models/spree/payment_session.rb +109 -0
  83. data/app/models/spree/payment_sessions/bogus.rb +4 -0
  84. data/app/models/spree/payment_setup_session.rb +79 -0
  85. data/app/models/spree/payment_source.rb +2 -0
  86. data/app/models/spree/permission_sets/default_customer.rb +19 -5
  87. data/app/models/spree/permission_sets/product_display.rb +0 -2
  88. data/app/models/spree/permission_sets/product_management.rb +0 -2
  89. data/app/models/spree/policy.rb +2 -0
  90. data/app/models/spree/price.rb +26 -2
  91. data/app/models/spree/price_list.rb +2 -0
  92. data/app/models/spree/price_rule.rb +2 -0
  93. data/app/models/spree/price_rules/market_rule.rb +19 -0
  94. data/app/models/spree/product.rb +45 -101
  95. data/app/models/spree/promotion/rules/country.rb +1 -1
  96. data/app/models/spree/promotion.rb +5 -15
  97. data/app/models/spree/promotion_action.rb +2 -0
  98. data/app/models/spree/promotion_category.rb +2 -0
  99. data/app/models/spree/promotion_handler/coupon.rb +3 -3
  100. data/app/models/spree/promotion_rule.rb +2 -0
  101. data/app/models/spree/prototype.rb +2 -3
  102. data/app/models/spree/refund.rb +8 -2
  103. data/app/models/spree/refund_reason.rb +2 -0
  104. data/app/models/spree/reimbursement/credit.rb +2 -0
  105. data/app/models/spree/reimbursement.rb +2 -0
  106. data/app/models/spree/reimbursement_type.rb +2 -0
  107. data/app/models/spree/report.rb +3 -1
  108. data/app/models/spree/return_authorization.rb +2 -0
  109. data/app/models/spree/return_authorization_reason.rb +2 -0
  110. data/app/models/spree/return_item.rb +2 -0
  111. data/app/models/spree/role.rb +2 -0
  112. data/app/models/spree/shipment/emails.rb +1 -0
  113. data/app/models/spree/shipment.rb +11 -1
  114. data/app/models/spree/shipping_category.rb +5 -3
  115. data/app/models/spree/shipping_method.rb +2 -0
  116. data/app/models/spree/shipping_method_category.rb +2 -0
  117. data/app/models/spree/shipping_rate.rb +2 -0
  118. data/app/models/spree/state_change.rb +2 -0
  119. data/app/models/spree/stock_item.rb +2 -0
  120. data/app/models/spree/stock_location.rb +2 -0
  121. data/app/models/spree/stock_movement.rb +2 -0
  122. data/app/models/spree/stock_transfer.rb +2 -1
  123. data/app/models/spree/store.rb +111 -219
  124. data/app/models/spree/store_credit.rb +6 -0
  125. data/app/models/spree/store_credit_category.rb +2 -0
  126. data/app/models/spree/store_credit_event.rb +2 -0
  127. data/app/models/spree/store_credit_type.rb +2 -0
  128. data/app/models/spree/store_product.rb +2 -0
  129. data/app/models/spree/tax_category.rb +3 -11
  130. data/app/models/spree/tax_rate.rb +2 -0
  131. data/app/models/spree/taxon.rb +2 -15
  132. data/app/models/spree/taxon_rule.rb +2 -0
  133. data/app/models/spree/taxonomy.rb +2 -0
  134. data/app/models/spree/user_identity.rb +81 -0
  135. data/app/models/spree/variant.rb +15 -43
  136. data/app/models/spree/webhook_delivery.rb +2 -0
  137. data/app/models/spree/webhook_endpoint.rb +2 -0
  138. data/app/models/spree/wished_item.rb +15 -0
  139. data/app/models/spree/wishlist.rb +2 -8
  140. data/app/models/spree/zone.rb +3 -10
  141. data/app/presenters/spree/filters/price_presenter.rb +1 -0
  142. data/app/presenters/spree/filters/price_range_presenter.rb +1 -0
  143. data/app/presenters/spree/filters/quantified_price_range_presenter.rb +1 -0
  144. data/app/presenters/spree/product_summary_presenter.rb +1 -0
  145. data/app/services/spree/addresses/helper.rb +22 -3
  146. data/app/services/spree/cart/add_item.rb +8 -4
  147. data/app/services/spree/cart/associate.rb +19 -6
  148. data/app/services/spree/cart/create.rb +13 -2
  149. data/app/services/spree/checkout/select_shipping_method.rb +13 -1
  150. data/app/services/spree/classifications/reposition.rb +5 -0
  151. data/app/services/spree/imports/row_processors/customer.rb +70 -0
  152. data/app/services/spree/orders/approve.rb +5 -3
  153. data/app/services/spree/orders/cancel.rb +9 -4
  154. data/app/services/spree/products/duplicator.rb +0 -12
  155. data/app/services/spree/products/prepare_nested_attributes.rb +1 -13
  156. data/app/services/spree/sample_data/import_runner.rb +54 -0
  157. data/app/services/spree/sample_data/loader.rb +78 -0
  158. data/app/services/spree/seeds/admin_user.rb +2 -3
  159. data/app/services/spree/seeds/all.rb +1 -0
  160. data/app/services/spree/seeds/api_keys.rb +16 -0
  161. data/app/services/spree/seeds/stores.rb +2 -4
  162. data/app/sorters/spree/orders/sort.rb +4 -0
  163. data/app/subscribers/spree/product_metrics_subscriber.rb +4 -4
  164. data/config/brakeman.ignore +120 -0
  165. data/config/locales/en.yml +23 -21
  166. data/db/migrate/20210914000000_spree_four_three.rb +0 -38
  167. data/db/migrate/20210915064329_add_metadata_to_spree_multiple_tables.rb +0 -1
  168. data/db/migrate/20250923141900_create_spree_user_identities.rb +17 -0
  169. data/db/migrate/20260123000000_create_spree_api_keys.rb +19 -0
  170. data/db/migrate/20260131000000_add_thumbnail_id_to_spree_variants_and_products.rb +9 -0
  171. data/db/migrate/20260213000000_create_spree_payment_sessions.rb +27 -0
  172. data/db/migrate/20260218000000_create_spree_payment_setup_sessions.rb +24 -0
  173. data/db/migrate/20260220000000_create_spree_markets.rb +29 -0
  174. data/db/migrate/20260226000000_add_locale_to_spree_orders.rb +5 -0
  175. data/db/migrate/20260226100000_add_token_digest_to_spree_api_keys.rb +21 -0
  176. data/db/sample_data/customers.csv +21 -0
  177. data/db/sample_data/metafield_definitions.rb +7 -0
  178. data/db/sample_data/orders.rb +131 -0
  179. data/db/sample_data/payment_methods.rb +17 -0
  180. data/db/sample_data/products.csv +1083 -0
  181. data/db/sample_data/promotions.rb +8 -0
  182. data/db/sample_data/shipping_methods.rb +39 -0
  183. data/lib/generators/spree/authentication/devise/devise_generator.rb +2 -2
  184. data/lib/generators/spree/authentication/dummy/dummy_generator.rb +54 -0
  185. data/lib/generators/spree/authentication/dummy/templates/authentication_helpers.rb.tt +52 -0
  186. data/lib/generators/spree/authentication/dummy/templates/create_spree_admin_users.rb.tt +33 -0
  187. data/lib/generators/spree/cursor_rules/templates/spree_rules.mdc +1 -3
  188. data/lib/generators/spree/dummy/dummy_generator.rb +1 -1
  189. data/lib/spree/core/configuration.rb +1 -3
  190. data/lib/spree/core/controller_helpers/common.rb +6 -0
  191. data/lib/spree/core/controller_helpers/currency.rb +5 -0
  192. data/lib/spree/core/controller_helpers/order.rb +5 -1
  193. data/lib/spree/core/controller_helpers/store.rb +1 -1
  194. data/lib/spree/core/controller_helpers/strong_parameters.rb +1 -2
  195. data/lib/spree/core/dependencies.rb +3 -11
  196. data/lib/spree/core/engine.rb +17 -17
  197. data/lib/spree/core/pricing/context.rb +6 -3
  198. data/lib/spree/core/pricing/resolver.rb +1 -9
  199. data/lib/spree/core/version.rb +1 -1
  200. data/lib/spree/core.rb +14 -29
  201. data/lib/spree/database_type_utilities.rb +7 -0
  202. data/lib/spree/events.rb +17 -10
  203. data/lib/spree/money.rb +2 -9
  204. data/lib/spree/permitted_attributes.rb +20 -20
  205. data/lib/spree/testing_support/capybara_config.rb +2 -2
  206. data/lib/spree/testing_support/common_rake.rb +15 -4
  207. data/lib/spree/testing_support/factories/api_key_factory.rb +19 -0
  208. data/lib/spree/testing_support/factories/custom_domain_factory.rb +7 -5
  209. data/lib/spree/testing_support/factories/import_factory.rb +12 -0
  210. data/lib/spree/testing_support/factories/market_factory.rb +35 -0
  211. data/lib/spree/testing_support/factories/order_factory.rb +4 -1
  212. data/lib/spree/testing_support/factories/payment_method_factory.rb +3 -6
  213. data/lib/spree/testing_support/factories/payment_session_factory.rb +47 -0
  214. data/lib/spree/testing_support/factories/payment_setup_session_factory.rb +31 -0
  215. data/lib/spree/testing_support/factories/price_rule_factory.rb +10 -0
  216. data/lib/spree/testing_support/factories/product_factory.rb +0 -7
  217. data/lib/spree/testing_support/factories/prototype_factory.rb +0 -2
  218. data/lib/spree/testing_support/factories/user_identity_factory.rb +15 -0
  219. data/lib/spree/testing_support/store.rb +3 -2
  220. data/lib/spree/webhooks.rb +7 -7
  221. data/lib/tasks/core.rake +0 -265
  222. data/lib/tasks/images.rake +20 -0
  223. data/lib/tasks/markets.rake +40 -0
  224. data/lib/tasks/sample_data.rake +15 -0
  225. data/spec/fixtures/files/customers_import.csv +4 -0
  226. metadata +101 -154
  227. data/LICENSE.md +0 -57
  228. data/app/finders/spree/posts/find.rb +0 -137
  229. data/app/finders/spree/product_properties/find_available.rb +0 -20
  230. data/app/finders/spree/stores/find_current.rb +0 -28
  231. data/app/helpers/spree/mail_helper.rb +0 -27
  232. data/app/mailers/spree/test_mailer.rb +0 -8
  233. data/app/models/action_text/video_embed.rb +0 -13
  234. data/app/models/concerns/spree/has_one_link.rb +0 -42
  235. data/app/models/concerns/spree/linkable.rb +0 -9
  236. data/app/models/concerns/spree/previewable.rb +0 -17
  237. data/app/models/spree/custom_domain.rb +0 -59
  238. data/app/models/spree/data_feed/google.rb +0 -15
  239. data/app/models/spree/data_feed.rb +0 -40
  240. data/app/models/spree/gateway/bogus_simple.rb +0 -24
  241. data/app/models/spree/post.rb +0 -106
  242. data/app/models/spree/post_category.rb +0 -44
  243. data/app/models/spree/product_property.rb +0 -51
  244. data/app/models/spree/property.rb +0 -86
  245. data/app/models/spree/property_prototype.rb +0 -9
  246. data/app/models/spree/store_favicon_image.rb +0 -20
  247. data/app/models/spree/store_logo.rb +0 -4
  248. data/app/models/spree/store_mailer_logo.rb +0 -7
  249. data/app/models/spree/taxon_image/configuration/active_storage.rb +0 -26
  250. data/app/models/spree/taxon_image.rb +0 -20
  251. data/app/presenters/spree/filters/properties_presenter.rb +0 -23
  252. data/app/presenters/spree/filters/property_presenter.rb +0 -42
  253. data/app/serializers/spree/events/asset_serializer.rb +0 -22
  254. data/app/serializers/spree/events/base_serializer.rb +0 -61
  255. data/app/serializers/spree/events/customer_return_serializer.rb +0 -20
  256. data/app/serializers/spree/events/digital_link_serializer.rb +0 -20
  257. data/app/serializers/spree/events/digital_serializer.rb +0 -18
  258. data/app/serializers/spree/events/export_serializer.rb +0 -22
  259. data/app/serializers/spree/events/gift_card_batch_serializer.rb +0 -24
  260. data/app/serializers/spree/events/gift_card_serializer.rb +0 -29
  261. data/app/serializers/spree/events/image_serializer.rb +0 -9
  262. data/app/serializers/spree/events/import_row_serializer.rb +0 -23
  263. data/app/serializers/spree/events/import_serializer.rb +0 -24
  264. data/app/serializers/spree/events/invitation_serializer.rb +0 -28
  265. data/app/serializers/spree/events/line_item_serializer.rb +0 -31
  266. data/app/serializers/spree/events/newsletter_subscriber_serializer.rb +0 -21
  267. data/app/serializers/spree/events/order_serializer.rb +0 -39
  268. data/app/serializers/spree/events/payment_serializer.rb +0 -24
  269. data/app/serializers/spree/events/post_category_serializer.rb +0 -20
  270. data/app/serializers/spree/events/post_serializer.rb +0 -26
  271. data/app/serializers/spree/events/price_serializer.rb +0 -22
  272. data/app/serializers/spree/events/product_serializer.rb +0 -24
  273. data/app/serializers/spree/events/promotion_serializer.rb +0 -32
  274. data/app/serializers/spree/events/refund_serializer.rb +0 -23
  275. data/app/serializers/spree/events/reimbursement_serializer.rb +0 -22
  276. data/app/serializers/spree/events/report_serializer.rb +0 -23
  277. data/app/serializers/spree/events/return_authorization_serializer.rb +0 -22
  278. data/app/serializers/spree/events/return_item_serializer.rb +0 -27
  279. data/app/serializers/spree/events/shipment_serializer.rb +0 -24
  280. data/app/serializers/spree/events/stock_item_serializer.rb +0 -22
  281. data/app/serializers/spree/events/stock_movement_serializer.rb +0 -22
  282. data/app/serializers/spree/events/stock_transfer_serializer.rb +0 -22
  283. data/app/serializers/spree/events/store_credit_serializer.rb +0 -30
  284. data/app/serializers/spree/events/user_serializer.rb +0 -18
  285. data/app/serializers/spree/events/variant_serializer.rb +0 -34
  286. data/app/serializers/spree/events/wished_item_serializer.rb +0 -20
  287. data/app/serializers/spree/events/wishlist_serializer.rb +0 -22
  288. data/app/services/spree/data_feeds/google/optional_attributes.rb +0 -23
  289. data/app/services/spree/data_feeds/google/optional_sub_attributes.rb +0 -21
  290. data/app/services/spree/data_feeds/google/products_list.rb +0 -14
  291. data/app/services/spree/data_feeds/google/required_attributes.rb +0 -68
  292. data/app/services/spree/data_feeds/google/rss.rb +0 -109
  293. data/app/sorters/spree/posts/sort.rb +0 -40
  294. data/app/views/action_text/video_embeds/_thumbnail.html.erb +0 -1
  295. data/app/views/action_text/video_embeds/_video_embed.html.erb +0 -3
  296. data/app/views/layouts/action_text/contents/_content.html.erb +0 -3
  297. data/app/views/spree/test_mailer/test_email.html.erb +0 -40
  298. data/app/views/spree/test_mailer/test_email.text.erb +0 -4
  299. data/config/initializers/oembed.rb +0 -1
  300. data/db/migrate/20221229132350_create_spree_data_feed_settings.rb +0 -14
  301. data/db/migrate/20230109084253_create_product_property_translations.rb +0 -24
  302. data/db/migrate/20230109105943_create_property_translations.rb +0 -24
  303. data/db/migrate/20230415155958_rename_data_feed_settings_table.rb +0 -5
  304. data/db/migrate/20230415160828_rename_data_feed_table_columns.rb +0 -7
  305. data/db/migrate/20230415161226_add_indexes_to_data_feeds_table.rb +0 -5
  306. data/db/migrate/20230512094803_rename_data_feeds_column_provider_to_type.rb +0 -5
  307. data/db/migrate/20240914153106_add_display_on_to_spree_properties.rb +0 -5
  308. data/db/migrate/20240915144935_add_position_to_spree_properties.rb +0 -6
  309. data/db/migrate/20250121160028_create_spree_posts_and_spree_post_categories.rb +0 -33
  310. data/db/migrate/20250127083740_add_kind_to_spree_properties.rb +0 -5
  311. data/db/migrate/20250217171018_create_action_text_video_embeds.rb +0 -11
  312. data/db/migrate/20250305121657_remove_spree_posts_indices.rb +0 -7
  313. data/db/migrate/20250730154601_add_unique_index_on_spree_properties_name.rb +0 -24
  314. data/lib/spree/core/controller_helpers/search.rb +0 -17
  315. data/lib/spree/core/product_filters.rb +0 -204
  316. data/lib/spree/core/query_filters/comparable.rb +0 -46
  317. data/lib/spree/core/query_filters/date.rb +0 -8
  318. data/lib/spree/core/query_filters/number.rb +0 -8
  319. data/lib/spree/core/query_filters/text.rb +0 -32
  320. data/lib/spree/core/query_filters.rb +0 -11
  321. data/lib/spree/core/search/base.rb +0 -144
  322. data/lib/spree/testing_support/factories/favicon_image_factory.rb +0 -9
  323. data/lib/spree/testing_support/factories/google_data_feed_factory.rb +0 -7
  324. data/lib/spree/testing_support/factories/post_category_factory.rb +0 -7
  325. data/lib/spree/testing_support/factories/post_factory.rb +0 -22
  326. data/lib/spree/testing_support/factories/product_property_factory.rb +0 -7
  327. data/lib/spree/testing_support/factories/property_factory.rb +0 -28
  328. data/lib/spree/testing_support/factories/taxon_image_factory.rb +0 -9
  329. data/lib/spree/testing_support/flash.rb +0 -25
  330. data/lib/spree/testing_support/flatpickr_capybara.rb +0 -124
  331. data/lib/tasks/exchanges.rake +0 -66
data/lib/spree/core.rb CHANGED
@@ -11,13 +11,14 @@ require 'action_cable/engine'
11
11
  require 'mail'
12
12
  require 'action_mailer/railtie'
13
13
 
14
- require 'active_merchant'
14
+
15
15
  require 'acts_as_list'
16
16
  require 'acts-as-taggable-on'
17
17
  require 'awesome_nested_set'
18
18
  require 'cancan'
19
19
  require 'countries/global'
20
20
  require 'friendly_id'
21
+ require 'jwt'
21
22
  require 'monetize'
22
23
  require 'mobility'
23
24
  require 'name_of_person'
@@ -25,12 +26,12 @@ require 'paranoia'
25
26
  require 'ransack'
26
27
  require 'state_machines-activerecord'
27
28
  require 'active_storage_validations'
28
- require 'request_store'
29
29
  require 'wannabe_bool'
30
30
  require 'geocoder'
31
- require 'oembed'
31
+
32
32
  require 'safely_block'
33
33
  require 'ar_lazy_preload'
34
+ require 'sqids'
34
35
 
35
36
  # This is required because ActiveModel::Validations#invalid? conflicts with the
36
37
  # invalid state of a Payment. In the future this should be removed.
@@ -40,7 +41,7 @@ module Spree
40
41
  mattr_accessor :base_class, :user_class, :admin_user_class,
41
42
  :private_storage_service_name, :public_storage_service_name,
42
43
  :cdn_host, :root_domain, :searcher_class, :events_adapter_class, :queues,
43
- :google_places_api_key, :screenshot_api_token
44
+ :google_places_api_key
44
45
 
45
46
  def self.base_class(constantize: true)
46
47
  @@base_class ||= 'Spree::Base'
@@ -60,8 +61,6 @@ module Spree
60
61
  end
61
62
 
62
63
  def self.admin_user_class(constantize: true)
63
- @@admin_user_class ||= @@user_class
64
-
65
64
  if @@admin_user_class.is_a?(Class)
66
65
  raise 'Spree.admin_user_class MUST be a String or Symbol object, not a Class object.'
67
66
  elsif @@admin_user_class.is_a?(String) || @@admin_user_class.is_a?(Symbol)
@@ -109,18 +108,19 @@ module Spree
109
108
  themes: :default,
110
109
  addresses: :default,
111
110
  gift_cards: :default,
112
- webhooks: :default
111
+ webhooks: :default,
112
+ api_keys: :default
113
113
  )
114
114
  end
115
115
 
116
- def self.searcher_class(constantize: true)
117
- @@searcher_class ||= 'Spree::Core::Search::Base'
116
+ # @deprecated Spree.searcher_class is deprecated and will be removed in Spree 5.5.
117
+ def self.searcher_class=(value)
118
+ Spree::Deprecation.warn('Spree.searcher_class is deprecated and will be removed in Spree 5.5. Please remove it from your initializer.')
119
+ @@searcher_class = value
120
+ end
118
121
 
119
- if @@searcher_class.is_a?(Class)
120
- raise 'Spree.searcher_class MUST be a String or Symbol object, not a Class object.'
121
- elsif @@searcher_class.is_a?(String) || @@searcher_class.is_a?(Symbol)
122
- constantize ? @@searcher_class.to_s.constantize : @@searcher_class.to_s
123
- end
122
+ def self.searcher_class(constantize: true)
123
+ @@searcher_class
124
124
  end
125
125
 
126
126
  # Returns the events adapter class used for publishing and subscribing to events.
@@ -144,10 +144,6 @@ module Spree
144
144
  @@google_places_api_key
145
145
  end
146
146
 
147
- def self.screenshot_api_token
148
- @@screenshot_api_token
149
- end
150
-
151
147
  def self.always_use_translations?
152
148
  Spree::Config.always_use_translations
153
149
  end
@@ -246,14 +242,6 @@ module Spree
246
242
  Rails.application.config.spree.line_item_comparison_hooks = value
247
243
  end
248
244
 
249
- def self.data_feed_types
250
- Rails.application.config.spree.data_feed_types
251
- end
252
-
253
- def self.data_feed_types=(value)
254
- Rails.application.config.spree.data_feed_types = value
255
- end
256
-
257
245
  def self.export_types
258
246
  Rails.application.config.spree.export_types
259
247
  end
@@ -414,7 +402,6 @@ module Spree
414
402
  end
415
403
 
416
404
  module Core
417
- autoload :ProductFilters, 'spree/core/product_filters'
418
405
  autoload :TokenGenerator, 'spree/core/token_generator'
419
406
 
420
407
  class GatewayError < RuntimeError; end
@@ -441,11 +428,9 @@ require 'spree/webhooks'
441
428
 
442
429
  require 'spree/core/partials'
443
430
  require 'spree/core/importer'
444
- require 'spree/core/query_filters'
445
431
  require 'spree/core/controller_helpers/auth'
446
432
  require 'spree/core/controller_helpers/common'
447
433
  require 'spree/core/controller_helpers/order'
448
- require 'spree/core/controller_helpers/search'
449
434
  require 'spree/core/controller_helpers/store'
450
435
  require 'spree/core/controller_helpers/strong_parameters'
451
436
  require 'spree/core/controller_helpers/locale'
@@ -1,9 +1,16 @@
1
1
  module Spree
2
+ # @deprecated Use the integer constant directly instead, eg. `2_147_483_647` for 4-byte signed integer max.
3
+ # This module will be removed in Spree 5.5.
2
4
  module DatabaseTypeUtilities
3
5
  # Maximum value for a 4-byte signed integer (default database integer type)
4
6
  INTEGER_MAX = (2**31) - 1
5
7
 
6
8
  def self.maximum_value_for(data_type)
9
+ Spree::Deprecation.warn(
10
+ 'Spree::DatabaseTypeUtilities.maximum_value_for is deprecated and will be removed in Spree 5.5. ' \
11
+ 'Use the integer constant directly instead, eg. 2_147_483_647 for 4-byte signed integer max.'
12
+ )
13
+
7
14
  case data_type
8
15
  when :integer
9
16
  INTEGER_MAX
data/lib/spree/events.rb CHANGED
@@ -177,10 +177,11 @@ module Spree
177
177
  # Check if events are enabled
178
178
  #
179
179
  # Events can be temporarily disabled using Spree::Events.disable { ... }
180
+ # or globally with Spree::Events.disable!
180
181
  #
181
182
  # @return [Boolean]
182
183
  def enabled?
183
- !RequestStore.store[:spree_events_disabled]
184
+ !@globally_disabled && !Thread.current[:spree_events_disabled]
184
185
  end
185
186
 
186
187
  # Temporarily disable events within a block
@@ -195,18 +196,21 @@ module Spree
195
196
  # end
196
197
  #
197
198
  def disable
198
- previous = RequestStore.store[:spree_events_disabled]
199
- RequestStore.store[:spree_events_disabled] = true
199
+ previous = Thread.current[:spree_events_disabled]
200
+ Thread.current[:spree_events_disabled] = true
200
201
  yield
201
202
  ensure
202
- RequestStore.store[:spree_events_disabled] = previous
203
+ Thread.current[:spree_events_disabled] = previous
203
204
  end
204
205
 
205
206
  # Globally disable events
206
- # Useful for testing to disable events for the entire test suite
207
+ #
208
+ # Uses a class-level flag that is not affected by per-request cleanup.
209
+ # Useful for disabling events for the entire test suite.
210
+ #
207
211
  # @return [void]
208
212
  def disable!
209
- RequestStore.store[:spree_events_disabled] = true
213
+ @globally_disabled = true
210
214
  end
211
215
 
212
216
  # Temporarily enable events within a block
@@ -222,18 +226,21 @@ module Spree
222
226
  # end
223
227
  #
224
228
  def enable
225
- previous = RequestStore.store[:spree_events_disabled]
226
- RequestStore.store[:spree_events_disabled] = false
229
+ previous_global = @globally_disabled
230
+ previous_thread = Thread.current[:spree_events_disabled]
231
+ @globally_disabled = false
232
+ Thread.current[:spree_events_disabled] = false
227
233
  yield
228
234
  ensure
229
- RequestStore.store[:spree_events_disabled] = previous
235
+ @globally_disabled = previous_global
236
+ Thread.current[:spree_events_disabled] = previous_thread
230
237
  end
231
238
 
232
239
  # Globally enable events
233
240
  # Useful for testing
234
241
  # @return [void]
235
242
  def enable!
236
- RequestStore.store[:spree_events_disabled] = false
243
+ @globally_disabled = false
237
244
  end
238
245
  end
239
246
  end
data/lib/spree/money.rb CHANGED
@@ -51,17 +51,10 @@ module Spree
51
51
  # 1) prevent blank, breaking spaces
52
52
  # 2) prevent escaping of HTML character entities
53
53
  def to_html(opts = { html: true })
54
- # html option is deprecated and we need to fallback to html_wrap
55
- opts[:html_wrap] = opts[:html]
56
54
  opts.delete(:html)
57
55
 
58
- output = money.format(options.merge(opts))
59
- if opts[:html_wrap]
60
- output.gsub!(/<\/?[^>]*>/, '') # we don't want wrap every element in span
61
- output = output.sub(' ', '&nbsp;').html_safe
62
- end
63
-
64
- output
56
+ output = money.format(options.merge(opts).merge(html_wrap: false))
57
+ output.sub(' ', '&nbsp;').html_safe
65
58
  end
66
59
 
67
60
  def as_json(*)
@@ -2,6 +2,7 @@ module Spree
2
2
  module PermittedAttributes
3
3
  ATTRIBUTES = [
4
4
  :address_attributes,
5
+ :api_key_attributes,
5
6
  :asset_attributes,
6
7
  :checkout_attributes,
7
8
  :classification_attributes,
@@ -22,6 +23,7 @@ module Spree
22
23
  :inventory_unit_attributes,
23
24
  :invitation_attributes,
24
25
  :line_item_attributes,
26
+ :market_attributes,
25
27
  :menu_attributes,
26
28
  :menu_item_attributes,
27
29
  :metafield_attributes,
@@ -34,16 +36,14 @@ module Spree
34
36
  :page_section_attributes,
35
37
  :payment_attributes,
36
38
  :payment_method_attributes,
39
+ :payment_session_attributes,
40
+ :payment_setup_session_attributes,
37
41
  :policy_attributes,
38
- :post_attributes,
39
- :post_category_attributes,
40
42
  :price_list_attributes,
41
43
  :product_attributes,
42
44
  :promotion_attributes,
43
45
  :promotion_rule_attributes,
44
46
  :promotion_action_attributes,
45
- :product_properties_attributes,
46
- :property_attributes,
47
47
  :refund_attributes,
48
48
  :refund_reason_attributes,
49
49
  :reimbursement_attributes,
@@ -80,18 +80,20 @@ module Spree
80
80
 
81
81
  @@address_attributes = [
82
82
  :id, :firstname, :lastname, :first_name, :last_name,
83
- :address1, :address2, :city, :country_iso, :country_id, :state_id,
83
+ :address1, :address2, :city, :country_iso, :state_abbr, :country_id, :state_id,
84
84
  :zipcode, :phone, :state_name, :alternative_phone, :company,
85
85
  :user_id, :deleted_at, :label, :quick_checkout,
86
86
  { country: [:iso, :name, :iso3, :iso_name],
87
87
  state: [:name, :abbr] }
88
88
  ]
89
89
 
90
+ @@api_key_attributes = [:name, :key_type]
91
+
90
92
  @@asset_attributes = [:type, :viewable_id, :viewable_type, :attachment, :alt, :position]
91
93
 
92
94
  @@checkout_attributes = [
93
95
  :coupon_code, :email, :shipping_method_id, :special_instructions, :use_billing, :use_shipping,
94
- :user_id, :bill_address_id, :ship_address_id, :accept_marketing, :signup_for_an_account, :currency,
96
+ :user_id, :bill_address_id, :ship_address_id, :accept_marketing, :signup_for_an_account, :currency, :locale,
95
97
  :internal_note
96
98
  ]
97
99
 
@@ -134,7 +136,10 @@ module Spree
134
136
 
135
137
  @@invitation_attributes = [:email, :expires_at, :role_id]
136
138
 
137
- @@line_item_attributes = [:id, :variant_id, :quantity]
139
+ @@line_item_attributes = [:id, :variant_id, :quantity, { metadata: {} }]
140
+
141
+ @@market_attributes = [:name, :currency, :default_locale, :supported_locales,
142
+ :tax_inclusive, :default, :position, country_ids: []]
138
143
 
139
144
  @@menu_attributes = [:name, :locale, :location]
140
145
 
@@ -162,16 +167,14 @@ module Spree
162
167
 
163
168
  @@payment_method_attributes = [:name, :type, :description, :active, :display_on, :auto_capture, :position]
164
169
 
165
- @@policy_attributes = [:name, :slug, :body]
170
+ @@payment_session_attributes = [:amount, :payment_method_id, { external_data: {} }]
166
171
 
167
- @@post_attributes = [:title, :meta_title, :meta_description, :slug, :author_id, :post_category_id, :published_at, :content, :excerpt, :image, tag_list: []]
172
+ @@payment_setup_session_attributes = [:payment_method_id, { external_data: {} }]
168
173
 
169
- @@post_category_attributes = [:title, :slug, :description]
174
+ @@policy_attributes = [:name, :slug, :body]
170
175
 
171
176
  @@price_list_attributes = [:name, :description, :match_policy, :starts_at, :ends_at, :status, :position]
172
177
 
173
- @@product_properties_attributes = [:property_name, :property_id, :value, :position, :_destroy]
174
-
175
178
  @@product_attributes = [
176
179
  :name, :description, :available_on, :make_active_at, :discontinue_on, :permalink, :meta_description,
177
180
  :meta_keywords, :meta_title, :price, :sku, :deleted_at, :prototype_id,
@@ -197,8 +200,6 @@ module Spree
197
200
 
198
201
  @@promotion_action_attributes = [:type, :calculator_type, calculator_attributes: {}, promotion_action_line_items_attributes: [:id, :promotion_action_id, :variant_id, :quantity, :_destroy]]
199
202
 
200
- @@property_attributes = [:name, :presentation, :position, :kind, :display_on]
201
-
202
203
  @@refund_attributes = [:amount, :refund_reason_id]
203
204
 
204
205
  @@refund_reason_attributes = [:name, :active, :mutable]
@@ -262,19 +263,18 @@ module Spree
262
263
  stock_movements_attributes: [:variant_id, :quantity, :originator_id, :stock_item_id]]
263
264
 
264
265
  @@store_attributes = [:name, :url, :seo_title, :code, :meta_keywords,
265
- :meta_description, :default_currency, :mail_from_address,
266
+ :meta_description, :default_currency, :default_country_iso, :mail_from_address,
266
267
  :customer_support_email, :description, :address, :contact_phone,
267
- :supported_locales, :default_locale, :default_country_id, :supported_currencies,
268
- :new_order_notifications_email, :checkout_zone_id, :seo_robots,
269
- :preferred_timezone, :preferred_weight_unit, :preferred_unit_system,
268
+ :supported_locales, :default_locale, :supported_currencies,
269
+ :new_order_notifications_email, :seo_robots,
270
+ :preferred_admin_locale, :preferred_timezone, :preferred_weight_unit, :preferred_unit_system,
270
271
  :preferred_digital_asset_authorized_clicks, :preferred_digital_asset_authorized_days,
271
272
  :preferred_limit_digital_download_count, :preferred_limit_digital_download_days,
272
273
  :preferred_digital_asset_link_expire_time,
273
274
  :logo, :mailer_logo, :social_logo, :favicon_image,
274
- :import_products_from_store_id, :import_payment_methods_from_store_id,
275
275
  :checkout_message, :preferred_guest_checkout,
276
276
  :customer_terms_of_service, :customer_privacy_policy,
277
- :customer_returns_policy, :customer_shipping_policy, :default_country_iso]
277
+ :customer_returns_policy, :customer_shipping_policy]
278
278
 
279
279
  @@store_credit_attributes = %i[amount currency category_id memo]
280
280
 
@@ -1,7 +1,7 @@
1
1
  require 'capybara-screenshot/rspec'
2
2
 
3
3
  Capybara.configure do |config|
4
- config.save_path = ENV['CIRCLE_ARTIFACTS'] if ENV['CIRCLE_ARTIFACTS']
4
+ config.save_path = ENV['CI_ARTIFACTS'] if ENV['CI_ARTIFACTS']
5
5
  config.server = :puma
6
6
  config.default_driver = :rack_test
7
7
  config.javascript_driver = :selenium_chrome_headless
@@ -27,7 +27,7 @@ Capybara.register_driver :selenium_chrome_headless do |app|
27
27
  options.add_argument '--window-size=1920,1080'
28
28
  options.add_argument '--disable-search-engine-choice-screen'
29
29
 
30
- # Required for running in Docker containers (CircleCI)
30
+ # Required for running in CI containers
31
31
  options.add_argument '--no-sandbox'
32
32
  options.add_argument '--disable-dev-shm-usage'
33
33
 
@@ -4,14 +4,25 @@ require 'generators/spree/dummy_model/dummy_model_generator'
4
4
  desc 'Generates a dummy app for testing'
5
5
  namespace :common do
6
6
  task :test_app, [:authentication, :user_class, :admin_user_class, :css, :javascript, :install_admin, :install_storefront] do |_t, args|
7
- args.with_defaults(
7
+ # Support both Rake::TaskArguments (via invoke) and Hash (via execute)
8
+ # When using execute with a Hash, args IS the hash directly
9
+ defaults = {
8
10
  authentication: 'dummy',
9
11
  user_class: 'Spree::LegacyUser',
12
+ admin_user_class: 'Spree::LegacyAdminUser',
10
13
  install_storefront: false,
11
14
  install_admin: false,
12
15
  javascript: false,
13
16
  css: false
14
- )
17
+ }
18
+ # Rake::TaskArguments#with_defaults modifies in-place
19
+ # ActiveSupport adds Hash#with_defaults which returns a new hash, so check for Rake::TaskArguments specifically
20
+ if args.is_a?(Rake::TaskArguments)
21
+ args.with_defaults(defaults)
22
+ else
23
+ # Hash passed via execute - use reverse_merge! to merge defaults in place
24
+ args.reverse_merge!(defaults)
25
+ end
15
26
  require ENV['LIB_NAME'].to_s
16
27
 
17
28
  # Convert to booleans (supports both string and boolean values for backwards compatibility)
@@ -60,8 +71,8 @@ namespace :common do
60
71
  core_gems = %w[spree/core spree/api]
61
72
  root_gemfile = File.expand_path('../../../../Gemfile', __dir__)
62
73
  use_root_gemfile = core_gems.include?(ENV['LIB_NAME']) &&
63
- File.exist?(root_gemfile) &&
64
- File.exist?(File.expand_path('../../../../spree.gemspec', __dir__))
74
+ File.exist?(root_gemfile) &&
75
+ File.exist?(File.expand_path('../../../../spree.gemspec', __dir__))
65
76
  bundle_exec = use_root_gemfile ? "bundle exec --gemfile=#{root_gemfile}" : 'bundle exec'
66
77
  puts 'Running Spree install generator...'
67
78
  system("#{bundle_exec} rails g spree:install --force --auto-accept --migrate=false --seed=false --sample=false --user_class=#{args[:user_class]} --admin_user_class=#{args[:admin_user_class]} --authentication=#{args[:authentication]}")
@@ -0,0 +1,19 @@
1
+ FactoryBot.define do
2
+ factory :api_key, class: Spree::ApiKey do
3
+ name { FFaker::Lorem.word }
4
+ key_type { 'publishable' }
5
+ store
6
+
7
+ trait :publishable do
8
+ key_type { 'publishable' }
9
+ end
10
+
11
+ trait :secret do
12
+ key_type { 'secret' }
13
+ end
14
+
15
+ trait :revoked do
16
+ revoked_at { Time.current }
17
+ end
18
+ end
19
+ end
@@ -1,7 +1,9 @@
1
- FactoryBot.define do
2
- factory :custom_domain, class: Spree::CustomDomain do
3
- url { FFaker::Internet.domain_name }
4
- association :store, factory: :store
5
- default { true }
1
+ if defined?(Spree::CustomDomain)
2
+ FactoryBot.define do
3
+ factory :custom_domain, class: Spree::CustomDomain do
4
+ url { FFaker::Internet.domain_name }
5
+ association :store, factory: :store
6
+ default { true }
7
+ end
6
8
  end
7
9
  end
@@ -16,5 +16,17 @@ FactoryBot.define do
16
16
  )
17
17
  end
18
18
  end
19
+
20
+ factory :customer_import, class: 'Spree::Imports::Customers', parent: :import do
21
+ type { 'Spree::Imports::Customers' }
22
+
23
+ after(:create) do |import|
24
+ import.attachment.attach(
25
+ io: File.open(Spree::Core::Engine.root.join('spec', 'fixtures', 'files', 'customers_import.csv')),
26
+ filename: 'customers_import.csv',
27
+ content_type: 'text/csv'
28
+ )
29
+ end
30
+ end
19
31
  end
20
32
  end
@@ -0,0 +1,35 @@
1
+ FactoryBot.define do
2
+ factory :market, class: Spree::Market do
3
+ sequence(:name) { |n| "Market #{n}" }
4
+ currency { 'USD' }
5
+ default_locale { 'en' }
6
+ store
7
+ countries { [association(:country)] }
8
+
9
+ after(:build) do |market|
10
+ if market.countries.any?
11
+ zone = Spree::Zone.find_or_create_by!(name: 'Test Shipping Zone') do |z|
12
+ z.kind = 'country'
13
+ end
14
+ market.countries.each do |country|
15
+ zone.zone_members.find_or_create_by!(zoneable: country)
16
+ end
17
+ if zone.shipping_methods.empty?
18
+ shipping_category = Spree::ShippingCategory.first || FactoryBot.create(:shipping_category)
19
+ FactoryBot.create(:shipping_method, zones: [zone], shipping_categories: [shipping_category])
20
+ end
21
+ end
22
+ end
23
+
24
+ trait :default do
25
+ default { true }
26
+ end
27
+
28
+ trait :eu do
29
+ name { 'Europe' }
30
+ currency { 'EUR' }
31
+ default_locale { 'de' }
32
+ tax_inclusive { true }
33
+ end
34
+ end
35
+ end
@@ -5,6 +5,7 @@ FactoryBot.define do
5
5
  completed_at { nil }
6
6
  email { user&.email }
7
7
  currency { 'USD' }
8
+ locale { 'en' }
8
9
 
9
10
  transient do
10
11
  line_items_price { BigDecimal(10) }
@@ -75,8 +76,10 @@ FactoryBot.define do
75
76
  state { 'complete' }
76
77
 
77
78
  after(:create) do |order, evaluator|
78
- order.refresh_shipment_rates(evaluator.shipping_method_filter)
79
+ # Set completed_at before refreshing shipment rates so order.completed? returns true
80
+ # This prevents the shipping rate selection from recalculating order totals
79
81
  order.update_column(:completed_at, order.completed_at || Time.current)
82
+ order.refresh_shipment_rates(evaluator.shipping_method_filter)
80
83
  end
81
84
 
82
85
  factory :completed_order_with_pending_payment do
@@ -23,12 +23,7 @@ FactoryBot.define do
23
23
  name { 'Credit Card' }
24
24
  end
25
25
 
26
- # authorize.net was moved to spree_gateway.
27
- # Leaving this factory in place with bogus in case anyone is using it.
28
- factory :simple_credit_card_payment_method, parent: :payment_method, class: Spree::Gateway::BogusSimple do
29
- type { 'Spree::Gateway::BogusSimple' }
30
- name { 'Credit Card' }
31
- end
26
+ factory :simple_credit_card_payment_method, parent: :credit_card_payment_method
32
27
 
33
28
  factory :store_credit_payment_method, parent: :payment_method, class: Spree::PaymentMethod::StoreCredit do
34
29
  type { 'Spree::PaymentMethod::StoreCredit' }
@@ -42,4 +37,6 @@ FactoryBot.define do
42
37
  type { 'Spree::Gateway::CustomPaymentSourceMethod' }
43
38
  name { 'Custom' }
44
39
  end
40
+
41
+ factory :bogus_payment_method, parent: :credit_card_payment_method
45
42
  end
@@ -0,0 +1,47 @@
1
+ FactoryBot.define do
2
+ factory :payment_session, class: 'Spree::PaymentSession' do
3
+ order
4
+ payment_method { create(:credit_card_payment_method, stores: [order.store]) }
5
+ amount { order.total }
6
+ currency { order.currency }
7
+ status { 'pending' }
8
+ external_id { "ps_test_#{SecureRandom.hex(12)}" }
9
+ external_data { {} }
10
+
11
+ trait :processing do
12
+ status { 'processing' }
13
+ end
14
+
15
+ trait :completed do
16
+ status { 'completed' }
17
+ end
18
+
19
+ trait :failed do
20
+ status { 'failed' }
21
+ end
22
+
23
+ trait :canceled do
24
+ status { 'canceled' }
25
+ end
26
+
27
+ trait :expired do
28
+ status { 'expired' }
29
+ expires_at { 1.hour.ago }
30
+ end
31
+
32
+ trait :with_expiration do
33
+ expires_at { 24.hours.from_now }
34
+ end
35
+
36
+ trait :with_customer do
37
+ customer { order.user || create(:user) }
38
+ end
39
+
40
+ factory :bogus_payment_session, class: 'Spree::PaymentSessions::Bogus' do
41
+ type { 'Spree::PaymentSessions::Bogus' }
42
+ payment_method { create(:bogus_payment_method, stores: [order.store]) }
43
+ external_id { "bogus_#{SecureRandom.hex(12)}" }
44
+ external_data { { 'client_secret' => "bogus_secret_#{SecureRandom.hex(8)}" } }
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,31 @@
1
+ FactoryBot.define do
2
+ factory :payment_setup_session, class: 'Spree::PaymentSetupSession' do
3
+ customer { create(:user) }
4
+ payment_method { create(:credit_card_payment_method) }
5
+ status { 'pending' }
6
+ external_id { "seti_test_#{SecureRandom.hex(12)}" }
7
+ external_client_secret { "seti_secret_#{SecureRandom.hex(12)}" }
8
+ external_data { {} }
9
+
10
+ trait :processing do
11
+ status { 'processing' }
12
+ end
13
+
14
+ trait :completed do
15
+ status { 'completed' }
16
+ payment_source { create(:credit_card, user: customer) }
17
+ end
18
+
19
+ trait :failed do
20
+ status { 'failed' }
21
+ end
22
+
23
+ trait :canceled do
24
+ status { 'canceled' }
25
+ end
26
+
27
+ trait :expired do
28
+ status { 'expired' }
29
+ end
30
+ end
31
+ end
@@ -45,5 +45,15 @@ FactoryBot.define do
45
45
  customer_group_ids { [] }
46
46
  end
47
47
  end
48
+
49
+ factory :market_price_rule, class: Spree::PriceRules::MarketRule do
50
+ after(:build) do |rule, evaluator|
51
+ rule.preferred_market_ids = evaluator.market_ids if evaluator.respond_to?(:market_ids)
52
+ end
53
+
54
+ transient do
55
+ market_ids { [] }
56
+ end
57
+ end
48
58
  end
49
59
  end
@@ -50,13 +50,6 @@ FactoryBot.define do
50
50
  factory :product_with_option_types do
51
51
  after(:create) { |product| create(:product_option_type, product: product) }
52
52
  end
53
- factory :product_with_properties do
54
- after(:create) do |product|
55
- property = create(:property, :brand)
56
- create(:product_property, product: product, property: property, value: 'Epsilon')
57
- end
58
- end
59
-
60
53
  factory :digital_product do
61
54
  track_inventory { false }
62
55
  shipping_category { |r| Spree::ShippingCategory.digital || r.association(:digital_shipping_category) }
@@ -1,11 +1,9 @@
1
1
  FactoryBot.define do
2
2
  factory :prototype, class: Spree::Prototype do
3
3
  name { 'Baseball Cap' }
4
- properties { [build(:property)] }
5
4
  end
6
5
  factory :prototype_with_option_types, class: Spree::Prototype do
7
6
  name { 'Baseball Cap' }
8
- properties { [build(:property)] }
9
7
  option_types { [build(:option_type)] }
10
8
  end
11
9
  end