spree_core 4.2.0.rc2 → 4.2.1

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 (120) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/spree.js +20 -0
  3. data/app/controllers/spree/base_controller.rb +2 -3
  4. data/app/controllers/spree/errors_controller.rb +11 -0
  5. data/app/finders/spree/addresses/find.rb +1 -12
  6. data/app/finders/spree/base_finder.rb +14 -0
  7. data/app/finders/spree/countries/find.rb +11 -3
  8. data/app/finders/spree/credit_cards/find.rb +2 -2
  9. data/app/finders/spree/orders/find_current.rb +2 -2
  10. data/app/finders/spree/products/find.rb +14 -3
  11. data/app/helpers/spree/base_helper.rb +3 -8
  12. data/app/helpers/spree/currency_helper.rb +34 -0
  13. data/app/helpers/spree/locale_helper.rb +31 -0
  14. data/app/helpers/spree/products_helper.rb +37 -12
  15. data/app/mailers/spree/base_mailer.rb +4 -4
  16. data/app/mailers/spree/order_mailer.rb +3 -3
  17. data/app/mailers/spree/reimbursement_mailer.rb +1 -1
  18. data/app/mailers/spree/shipment_mailer.rb +1 -1
  19. data/app/models/concerns/spree/default_price.rb +1 -5
  20. data/app/models/concerns/spree/product_scopes.rb +1 -1
  21. data/app/models/concerns/spree/user_methods.rb +2 -2
  22. data/app/models/concerns/spree/user_payment_source.rb +1 -1
  23. data/app/models/spree/ability.rb +45 -34
  24. data/app/models/spree/address.rb +4 -0
  25. data/app/models/spree/app_configuration.rb +2 -2
  26. data/app/models/spree/app_dependencies.rb +6 -2
  27. data/app/models/spree/base.rb +5 -0
  28. data/app/models/spree/credit_card.rb +4 -0
  29. data/app/models/spree/fulfilment_changer.rb +58 -16
  30. data/app/models/spree/image.rb +14 -14
  31. data/app/models/spree/inventory_unit.rb +2 -7
  32. data/app/models/spree/line_item.rb +7 -15
  33. data/app/models/spree/order.rb +1 -0
  34. data/app/models/spree/payment.rb +18 -4
  35. data/app/models/spree/payment/processing.rb +2 -2
  36. data/app/models/spree/payment_method.rb +3 -3
  37. data/app/models/spree/price.rb +2 -7
  38. data/app/models/spree/product.rb +41 -17
  39. data/app/models/spree/promotion/rules/option_value.rb +1 -1
  40. data/app/models/spree/promotion/rules/product.rb +2 -1
  41. data/app/models/spree/promotion/rules/user.rb +2 -1
  42. data/app/models/spree/refund.rb +2 -2
  43. data/app/models/spree/return_item/eligibility_validator/default.rb +0 -2
  44. data/app/models/spree/return_item/eligibility_validator/{r_m_a_required.rb → rma_required.rb} +0 -0
  45. data/app/models/spree/shipment.rb +1 -1
  46. data/app/models/spree/shipping_method.rb +1 -5
  47. data/app/models/spree/shipping_rate.rb +2 -11
  48. data/app/models/spree/stock/availability_validator.rb +3 -4
  49. data/app/models/spree/stock_item.rb +1 -5
  50. data/app/models/spree/store.rb +55 -2
  51. data/app/models/spree/store_credit.rb +1 -1
  52. data/app/models/spree/variant.rb +9 -16
  53. data/app/models/spree/zone.rb +13 -4
  54. data/app/paginators/spree/shared/paginate.rb +8 -1
  55. data/app/presenters/spree/variant_presenter.rb +2 -5
  56. data/app/services/spree/account/addresses/create.rb +6 -1
  57. data/app/services/spree/account/addresses/{base.rb → helper.rb} +1 -3
  58. data/app/services/spree/account/addresses/update.rb +6 -1
  59. data/app/services/spree/build_localized_redirect_url.rb +101 -0
  60. data/app/services/spree/cart/estimate_shipping_rates.rb +1 -1
  61. data/app/services/spree/compare_line_items.rb +4 -2
  62. data/app/sorters/spree/base_sorter.rb +35 -0
  63. data/app/sorters/spree/orders/sort.rb +1 -37
  64. data/app/sorters/spree/products/sort.rb +9 -32
  65. data/app/validators/email_validator.rb +1 -1
  66. data/app/views/spree/errors/forbidden.html.erb +0 -0
  67. data/app/views/spree/errors/unauthorized.html.erb +0 -0
  68. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +13 -2
  69. data/app/views/spree/shared/_purchased_items_table.html.erb +15 -6
  70. data/app/views/spree/shared/purchased_items_table/_adjustment.html.erb +2 -2
  71. data/app/views/spree/shared/purchased_items_table/_line_item.html.erb +2 -2
  72. data/config/initializers/inflections.rb +3 -0
  73. data/config/initializers/rails61_fixes.rb +3 -0
  74. data/config/locales/en.yml +31 -60
  75. data/config/routes.rb +2 -1
  76. data/db/default/spree/stores.rb +1 -0
  77. data/db/default/spree/zones.rb +4 -1
  78. data/db/migrate/20130326175857_add_stock_location_to_rma.rb +1 -1
  79. data/db/migrate/20191017121054_add_supported_currencies_to_store.rb +1 -0
  80. data/db/migrate/20201012091259_add_filterable_column_to_spree_option_types.rb +6 -2
  81. data/db/migrate/20201127084048_add_default_country_kind_to_spree_zones.rb +5 -0
  82. data/db/migrate/20210112193440_remove_contact_email_from_spree_stores.rb +5 -0
  83. data/db/migrate/20210114182625_create_spree_payment_methods_stores.rb +10 -0
  84. data/db/migrate/20210114220232_migrate_data_payment_methods_stores.rb +15 -0
  85. data/db/migrate/20210117112551_remove_store_id_from_spree_payment_methods.rb +5 -0
  86. data/db/migrate/20210120142527_ensure_default_locale_in_spree_stores.rb +5 -0
  87. data/db/migrate/20210205211040_add_supported_locales_to_spree_stores.rb +11 -0
  88. data/db/migrate/20210215202602_migrate_spree_i18n_globalize_config.rb +22 -0
  89. data/lib/generators/spree/install/install_generator.rb +9 -6
  90. data/lib/spree/core.rb +2 -1
  91. data/lib/spree/core/controller_helpers/auth.rb +3 -1
  92. data/lib/spree/core/controller_helpers/common.rb +6 -8
  93. data/lib/spree/core/controller_helpers/currency.rb +54 -0
  94. data/lib/spree/core/controller_helpers/locale.rb +58 -0
  95. data/lib/spree/core/controller_helpers/search.rb +1 -1
  96. data/lib/spree/core/controller_helpers/store.rb +4 -16
  97. data/lib/spree/core/product_filters.rb +3 -3
  98. data/lib/spree/core/version.rb +3 -1
  99. data/lib/spree/i18n.rb +17 -19
  100. data/lib/spree/permitted_attributes.rb +2 -2
  101. data/lib/spree/service_module.rb +8 -4
  102. data/lib/spree/testing_support/capybara_config.rb +1 -1
  103. data/lib/spree/testing_support/common_rake.rb +1 -1
  104. data/lib/spree/testing_support/controller_requests.rb +10 -10
  105. data/lib/spree/testing_support/factories/shipment_factory.rb +7 -9
  106. data/lib/spree/testing_support/factories/stock_location_factory.rb +2 -2
  107. data/lib/spree/testing_support/factories/store_factory.rb +1 -0
  108. data/lib/spree/testing_support/factories/zone_factory.rb +16 -13
  109. data/lib/spree/testing_support/flatpickr_capybara.rb +101 -0
  110. data/lib/spree/testing_support/locale_helpers.rb +78 -0
  111. data/lib/spree/testing_support/next_instance_of.rb +38 -0
  112. data/lib/spree/testing_support/order_walkthrough.rb +8 -3
  113. data/lib/spree/testing_support/rspec_retry_config.rb +10 -0
  114. data/spree_core.gemspec +5 -4
  115. metadata +71 -26
  116. data/lib/generators/spree/install/templates/config/initializers/spree_storefront.rb +0 -1
  117. data/lib/generators/spree/install/templates/config/spree_storefront.yml +0 -67
  118. data/lib/spree/core/controller_helpers/currency_helpers.rb +0 -15
  119. data/lib/spree/i18n/base.rb +0 -17
  120. data/lib/spree/i18n/initializer.rb +0 -1
@@ -15,7 +15,7 @@ namespace :common do
15
15
  Rails.env = 'test'
16
16
 
17
17
  Spree::DummyGenerator.start ["--lib_name=#{ENV['LIB_NAME']}", '--quiet']
18
- Spree::InstallGenerator.start ["--lib_name=#{ENV['LIB_NAME']}", '--auto-accept', '--migrate=false', '--seed=false', '--sample=false', '--quiet', '--copy_storefront=false', "--user_class=#{args[:user_class]}"]
18
+ Spree::InstallGenerator.start ["--lib_name=#{ENV['LIB_NAME']}", '--auto-accept', '--migrate=false', '--seed=false', '--sample=false', '--quiet', '--copy_storefront=false', '--install_storefront=false', "--user_class=#{args[:user_class]}"]
19
19
 
20
20
  puts 'Setting up dummy database...'
21
21
  system("bundle exec rake db:drop db:create > #{File::NULL}")
@@ -9,7 +9,7 @@ module Spree
9
9
 
10
10
  def spree_get(action, parameters = nil, session = nil, flash = nil)
11
11
  ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
12
- ControllerRequests#spree_get is deprecated and will be removed in Spree 4.1.
12
+ ControllerRequests#spree_get is deprecated and will be removed in Spree 5.0.
13
13
  Please use get, params: {}
14
14
  DEPRECATION
15
15
  process_spree_action(action, parameters, session, flash, 'GET')
@@ -18,7 +18,7 @@ module Spree
18
18
  # Executes a request simulating POST HTTP method and set/volley the response
19
19
  def spree_post(action, parameters = nil, session = nil, flash = nil)
20
20
  ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
21
- ControllerRequests#spree_post is deprecated and will be removed in Spree 4.1.
21
+ ControllerRequests#spree_post is deprecated and will be removed in Spree 5.0.
22
22
  Please use post, params: {}
23
23
  DEPRECATION
24
24
  process_spree_action(action, parameters, session, flash, 'POST')
@@ -27,7 +27,7 @@ module Spree
27
27
  # Executes a request simulating PUT HTTP method and set/volley the response
28
28
  def spree_put(action, parameters = nil, session = nil, flash = nil)
29
29
  ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
30
- ControllerRequests#spree_put is deprecated and will be removed in Spree 4.1.
30
+ ControllerRequests#spree_put is deprecated and will be removed in Spree 5.0.
31
31
  Please use put, params: {}
32
32
  DEPRECATION
33
33
  process_spree_action(action, parameters, session, flash, 'PUT')
@@ -36,7 +36,7 @@ module Spree
36
36
  # # Executes a request simulating PATCH HTTP method and set/volley the response
37
37
  def spree_patch(action, parameters = nil, session = nil, flash = nil)
38
38
  ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
39
- ControllerRequests#spree_patch is deprecated and will be removed in Spree 4.1.
39
+ ControllerRequests#spree_patch is deprecated and will be removed in Spree 5.0.
40
40
  Please use patch, params: {}
41
41
  DEPRECATION
42
42
  process_spree_action(action, parameters, session, flash, 'PATCH')
@@ -45,7 +45,7 @@ module Spree
45
45
  # Executes a request simulating DELETE HTTP method and set/volley the response
46
46
  def spree_delete(action, parameters = nil, session = nil, flash = nil)
47
47
  ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
48
- ControllerRequests#spree_delete is deprecated and will be removed in Spree 4.1.
48
+ ControllerRequests#spree_delete is deprecated and will be removed in Spree 5.0.
49
49
  Please use delete, params: {}
50
50
  DEPRECATION
51
51
  process_spree_action(action, parameters, session, flash, 'DELETE')
@@ -53,35 +53,35 @@ module Spree
53
53
 
54
54
  def spree_xhr_get(action, parameters = nil, session = nil, flash = nil)
55
55
  ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
56
- ControllerRequests#spree_xhr_get is deprecated and will be removed in Spree 4.1.
56
+ ControllerRequests#spree_xhr_get is deprecated and will be removed in Spree 5.0.
57
57
  DEPRECATION
58
58
  process_spree_xhr_action(action, parameters, session, flash, :get)
59
59
  end
60
60
 
61
61
  def spree_xhr_post(action, parameters = nil, session = nil, flash = nil)
62
62
  ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
63
- ControllerRequests#spree_xhr_post is deprecated and will be removed in Spree 4.1.
63
+ ControllerRequests#spree_xhr_post is deprecated and will be removed in Spree 5.0.
64
64
  DEPRECATION
65
65
  process_spree_xhr_action(action, parameters, session, flash, :post)
66
66
  end
67
67
 
68
68
  def spree_xhr_put(action, parameters = nil, session = nil, flash = nil)
69
69
  ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
70
- ControllerRequests#spree_xhr_put is deprecated and will be removed in Spree 4.1.
70
+ ControllerRequests#spree_xhr_put is deprecated and will be removed in Spree 5.0.
71
71
  DEPRECATION
72
72
  process_spree_xhr_action(action, parameters, session, flash, :put)
73
73
  end
74
74
 
75
75
  def spree_xhr_patch(action, parameters = nil, session = nil, flash = nil)
76
76
  ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
77
- ControllerRequests#spree_xhr_patch is deprecated and will be removed in Spree 4.1.
77
+ ControllerRequests#spree_xhr_patch is deprecated and will be removed in Spree 5.0.
78
78
  DEPRECATION
79
79
  process_spree_xhr_action(action, parameters, session, flash, :patch)
80
80
  end
81
81
 
82
82
  def spree_xhr_delete(action, parameters = nil, session = nil, flash = nil)
83
83
  ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
84
- ControllerRequests#spree_xhr_delete is deprecated and will be removed in Spree 4.1.
84
+ ControllerRequests#spree_xhr_delete is deprecated and will be removed in Spree 5.0.
85
85
  DEPRECATION
86
86
  process_spree_xhr_action(action, parameters, session, flash, :delete)
87
87
  end
@@ -8,15 +8,13 @@ FactoryBot.define do
8
8
 
9
9
  after(:create) do |shipment, _evalulator|
10
10
  shipment.add_shipping_method(create(:shipping_method), true)
11
-
12
- shipment.order.line_items.each do |line_item|
13
- line_item.quantity.times do
14
- shipment.inventory_units.create(
15
- order_id: shipment.order_id,
16
- variant_id: line_item.variant_id,
17
- line_item_id: line_item.id
18
- )
19
- end
11
+ shipment.order.line_items.map do |line_item|
12
+ shipment.inventory_units.create(
13
+ order_id: shipment.order_id,
14
+ variant_id: line_item.variant_id,
15
+ line_item_id: line_item.id,
16
+ quantity: line_item.quantity
17
+ )
20
18
  end
21
19
  end
22
20
  end
@@ -20,8 +20,8 @@ FactoryBot.define do
20
20
  product_1 = create(:product)
21
21
  product_2 = create(:product)
22
22
 
23
- stock_location.stock_items.where(variant_id: product_1.master.id).first.adjust_count_on_hand(10)
24
- stock_location.stock_items.where(variant_id: product_2.master.id).first.adjust_count_on_hand(20)
23
+ stock_location.stock_items.where(variant_id: product_1.master_id).first.adjust_count_on_hand(10)
24
+ stock_location.stock_items.where(variant_id: product_2.master_id).first.adjust_count_on_hand(20)
25
25
  end
26
26
  end
27
27
  end
@@ -8,6 +8,7 @@ FactoryBot.define do
8
8
  new_order_notifications_email { 'store-owner@example.com' }
9
9
  default_currency { 'USD' }
10
10
  supported_currencies { 'USD,EUR,GBP' }
11
+ default_locale { 'en' }
11
12
  facebook { 'spreecommerce' }
12
13
  twitter { 'spreecommerce' }
13
14
  instagram { 'spreecommerce' }
@@ -1,24 +1,27 @@
1
1
  FactoryBot.define do
2
- factory :global_zone, class: Spree::Zone do
3
- sequence(:name) { |n| "GlobalZone_#{n}" }
4
- description { generate(:random_string) }
5
- zone_members do |proxy|
6
- zone = proxy.instance_eval { @instance }
7
- Spree::Country.all.map do |c|
8
- Spree::ZoneMember.create(zoneable: c, zone: zone)
9
- end
10
- end
11
- end
12
-
13
2
  factory :zone, class: Spree::Zone do
14
3
  name { generate(:random_string) }
15
4
  description { generate(:random_string) }
16
5
 
17
6
  factory :zone_with_country do
7
+ kind { :country }
8
+
18
9
  zone_members do |proxy|
19
10
  zone = proxy.instance_eval { @instance }
20
- country = create(:country)
21
- [Spree::ZoneMember.create(zoneable: country, zone: zone)]
11
+
12
+ [Spree::ZoneMember.create(zoneable: create(:country), zone: zone)]
13
+ end
14
+
15
+ factory :global_zone, class: Spree::Zone do
16
+ sequence(:name) { |n| "GlobalZone_#{n}" }
17
+
18
+ zone_members do |proxy|
19
+ zone = proxy.instance_eval { @instance }
20
+
21
+ Spree::Country.all.map do |country|
22
+ Spree::ZoneMember.where(zoneable: country, zone: zone).first_or_create
23
+ end
24
+ end
22
25
  end
23
26
  end
24
27
  end
@@ -0,0 +1,101 @@
1
+ module Spree
2
+ module TestingSupport
3
+ module FlatpickrCapybara
4
+ def fill_in_date_manually(label_text, with:)
5
+ with_open_flatpickr(label_text) do |field|
6
+ fill_in field[:id], with: with
7
+ end
8
+ end
9
+
10
+ def fill_in_date_picker(label_text, with:)
11
+ within_open_flatpickr(label_text) do
12
+ within_flatpickr_months do
13
+ fill_in_flatpickr_year(with.split('-')[0])
14
+
15
+ select_flatpickr_month(with.split('-')[1])
16
+
17
+ click_on_flatpickr_day(with.split('-')[2])
18
+ end
19
+ end
20
+ end
21
+
22
+ def fill_in_date_time_picker(label_text, with:)
23
+ within_open_flatpickr(label_text) do
24
+ within_flatpickr_months do
25
+ fill_in_flatpickr_year(with.split('-')[0])
26
+
27
+ select_flatpickr_month(with.split('-')[1])
28
+
29
+ click_on_flatpickr_day(with.split('-')[2])
30
+ end
31
+
32
+ within_flatpickr_time do
33
+ select_flatpickr_hour(with.split('-')[3])
34
+
35
+ select_flatpickr_min(with.split('-')[4])
36
+ end
37
+ end
38
+ end
39
+
40
+ def fill_in_date_with_js(label_text, with:)
41
+ date_field = find("input[id='#{label_text}']")
42
+ script = "document.querySelector('#{date_field}').flatpickr().setDate('#{with}');"
43
+
44
+ page.execute_script(script)
45
+ end
46
+
47
+ private
48
+
49
+ def with_open_flatpickr(label_text)
50
+ field_label = find_field(id: label_text, type: :hidden)
51
+
52
+ date_field = field_label.sibling('.flatpickr-alt-input')
53
+ date_field.click # Open the widget
54
+
55
+ yield(date_field)
56
+
57
+ date_field.send_keys :tab # Close the date picker widget
58
+ end
59
+
60
+ def within_open_flatpickr(label_text)
61
+ with_open_flatpickr(label_text) do
62
+ within find(:xpath, "/html/body/div[contains(@class, 'flatpickr-calendar')]") { yield }
63
+ end
64
+ end
65
+
66
+ def within_flatpickr_months
67
+ within find('.flatpickr-months .flatpickr-month .flatpickr-current-month') { yield }
68
+ end
69
+
70
+ def within_flatpickr_time
71
+ within find('.flatpickr-time') { yield }
72
+ end
73
+
74
+ def select_flatpickr_month(month)
75
+ find("select.flatpickr-monthDropdown-months > option:nth-child(#{month.to_i})").select_option
76
+ end
77
+
78
+ def fill_in_flatpickr_year(year)
79
+ find('input.cur-year').set(year)
80
+ end
81
+
82
+ def click_on_flatpickr_day(day)
83
+ within_flatpickr_days do
84
+ find('span', text: day).click
85
+ end
86
+ end
87
+
88
+ def within_flatpickr_days
89
+ within find('.flatpickr-innerContainer > .flatpickr-rContainer > .flatpickr-days') { yield }
90
+ end
91
+
92
+ def select_flatpickr_hour(hour)
93
+ find('input.flatpickr-hour').set(hour)
94
+ end
95
+
96
+ def select_flatpickr_min(min)
97
+ find('input.flatpickr-minute').set(min)
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,78 @@
1
+ module Spree
2
+ module TestingSupport
3
+ module LocaleHelpers
4
+ # rubocop:disable Layout/ArgumentAlignment
5
+ def add_french_locales
6
+ I18n.backend.store_translations(:fr,
7
+ spree: {
8
+ added_to_cart: 'Ajouté au panier avec succès!',
9
+ continue_shopping: 'Continuer vos achats',
10
+ choose_currency: 'Choisir la devise',
11
+ internationalization: 'Internationalisation',
12
+ i18n: {
13
+ language: 'Langue',
14
+ this_file_language: 'Français (FR)'
15
+ },
16
+ cart_page: {
17
+ header: 'Votre panier',
18
+ empty_info: 'Votre panier est vide',
19
+ add_promo_code: 'AJOUTER UN CODE PROMOTIONNEL',
20
+ checkout: 'Passer la commande',
21
+ product: 'articles',
22
+ quantity: 'quantité',
23
+ title: 'Panier',
24
+ change_quantity: 'Changer la quantité',
25
+ remove_from_cart: 'Retirer du panier'
26
+ },
27
+ shopping_cart: 'Panier',
28
+ cart: 'Panier',
29
+ close: 'Fermer',
30
+ search: 'Rechercher',
31
+ home: 'Accueil',
32
+ nav_bar: {
33
+ admin_panel: "Panneau d'administration",
34
+ close_menu: 'Fermer le menu',
35
+ go_to_previous_menu: 'Vers le menu précédent',
36
+ show_menu: 'Afficher le menu',
37
+ show_search: 'Afficher la recherche',
38
+ show_user_menu: 'Afficher le menu utilisateur',
39
+ change_country: 'Changer de pays',
40
+ desktop: 'Navigation sur le bureau',
41
+ mobile: 'Navigation mobile'
42
+ },
43
+ login: 'Connexion',
44
+ logout: 'Se déconnecter',
45
+ sign_up: 'Enregistrer',
46
+ email: 'Courriel',
47
+ password: 'Mot de passe',
48
+ remember_me: 'Se souvenir de moi',
49
+ my_account: 'Mon compte',
50
+ my_orders: 'Mes commandes',
51
+ logged_in_succesfully: 'Connexion réussie'
52
+ })
53
+ end
54
+ # rubocop:enable Layout/ArgumentAlignment
55
+
56
+ def open_i18n_menu
57
+ find('#header #internationalization-button-desktop').click
58
+ expect(page).to have_selector('#internationalization-options-desktop')
59
+ end
60
+
61
+ def close_i18n_menu
62
+ find('#header #internationalization-button-desktop').click
63
+ expect(page).not_to have_selector('#internationalization-options-desktop')
64
+ end
65
+
66
+ def switch_to_currency(currency)
67
+ open_i18n_menu
68
+ select currency, from: 'switch_to_currency'
69
+ expect(page).to have_no_css '.turbolinks-progress-bar'
70
+ end
71
+
72
+ def switch_to_locale(locale)
73
+ open_i18n_menu
74
+ select locale, from: 'Language'
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,38 @@
1
+ # Helper services with prepended ServiceModule
2
+ # https://gitlab.com/gitlab-org/gitlab-foss/-/issues/33587
3
+ #
4
+ # ex:
5
+ # expect_next_instance_of(service_class) do |instance|
6
+ # expect(instance).to receive(:call)
7
+ # end
8
+
9
+ module NextInstanceOf
10
+ def expect_next_instance_of(klass, *new_args)
11
+ stub_new(expect(klass), *new_args) do |expectation|
12
+ yield(expectation)
13
+ end
14
+ end
15
+
16
+ def allow_next_instance_of(klass, *new_args)
17
+ stub_new(allow(klass), *new_args) do |allowance|
18
+ yield(allowance)
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def stub_new(target, *new_args)
25
+ receive_new = receive(:new)
26
+ receive_new.with(*new_args) if new_args.any?
27
+
28
+ target.to receive_new.and_wrap_original do |method, *original_args|
29
+ method.call(*original_args).tap do |instance|
30
+ yield(instance)
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ RSpec.configure do |config|
37
+ config.include NextInstanceOf
38
+ end
@@ -1,11 +1,16 @@
1
1
  class OrderWalkthrough
2
2
  def self.up_to(state)
3
- # A default store must exist to provide store settings
4
- store = Spree::Store.default || FactoryBot.create(:store, default: true)
3
+ store = if Spree::Store.exists?
4
+ # Ensure the default store is used
5
+ Spree::Store.default || FactoryBot.create(:store, default: true)
6
+ else
7
+ # Create a default store
8
+ FactoryBot.create(:store, default: true)
9
+ end
5
10
 
6
11
  # A payment method must exist for an order to proceed through the Address state
7
12
  unless Spree::PaymentMethod.exists?
8
- FactoryBot.create(:check_payment_method)
13
+ FactoryBot.create(:check_payment_method, stores: [store])
9
14
  end
10
15
 
11
16
  # Need to create a valid zone too...
@@ -0,0 +1,10 @@
1
+ require 'rspec/retry'
2
+
3
+ RSpec.configure do |config|
4
+ config.verbose_retry = true
5
+ config.display_try_failure_messages = true
6
+
7
+ config.around :each, type: :feature do |ex|
8
+ ex.run_with_retry retry: ENV.fetch('RSPEC_RETRY_RETRY_COUNT', 3).to_i
9
+ end
10
+ end
data/spree_core.gemspec CHANGED
@@ -28,9 +28,9 @@ Gem::Specification.new do |s|
28
28
 
29
29
  s.add_dependency 'activemerchant', '~> 1.67'
30
30
  s.add_dependency 'acts_as_list', '~> 0.8'
31
- s.add_dependency 'awesome_nested_set', '>= 3.1.4', '< 3.3.0'
31
+ s.add_dependency 'awesome_nested_set', '>= 3.3.1', '< 4.0'
32
32
  s.add_dependency 'carmen', '>= 1.0', '< 1.2'
33
- s.add_dependency 'cancancan', '~> 3.0'
33
+ s.add_dependency 'cancancan', '~> 3.2'
34
34
  s.add_dependency 'ffaker', '~> 2.9'
35
35
  s.add_dependency 'friendly_id', '>= 5.2.1', '< 5.5.0'
36
36
  s.add_dependency 'highline', '~> 2.0.0' # Necessary for the install generator
@@ -39,9 +39,10 @@ Gem::Specification.new do |s|
39
39
  s.add_dependency 'monetize', '~> 1.9'
40
40
  s.add_dependency 'paranoia', '~> 2.4.2'
41
41
  s.add_dependency 'premailer-rails'
42
- s.add_dependency 'rails', '~> 6.0.0'
43
- s.add_dependency 'ransack', '~> 2.3.0'
42
+ s.add_dependency 'rails', '>= 6.0', '< 6.2'
43
+ s.add_dependency 'ransack', '>= 2.3', '< 2.5'
44
44
  s.add_dependency 'responders'
45
+ s.add_dependency 'rexml'
45
46
  s.add_dependency 'state_machines-activerecord', '~> 0.6'
46
47
  s.add_dependency 'state_machines-activemodel', '~> 0.7'
47
48
  s.add_dependency 'stringex'