diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 01036cce43f..80b9a1ac1bd 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -1,6 +1,6 @@ # This configuration was generated by # `rubocop --auto-gen-config` -# on 2023-05-08 16:13:11 UTC using RuboCop version 1.42.0. +# on 2025-04-10 14:33:02 UTC using RuboCop version 1.75.2. # The point is for the user to remove these configuration records # one by one as the offenses are removed from the code base. # Note that changes in the inspected code, or installation of new @@ -12,9 +12,9 @@ # Include: **/*.gemspec Gemspec/OrderedDependencies: Exclude: - - "core/solidus_core.gemspec" + - 'core/solidus_core.gemspec' -# Offense count: 95 +# Offense count: 161 # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: EnforcedStyle, IndentationWidth. # SupportedStyles: with_first_argument, with_fixed_indentation @@ -27,15 +27,15 @@ Layout/ArgumentAlignment: # SupportedStylesAlignWith: start_of_line, begin Layout/BeginEndAlignment: Exclude: - - "backend/app/controllers/spree/admin/orders_controller.rb" - - "core/app/models/spree/order.rb" - - "core/lib/spree/preferences/preferable_class_methods.rb" + - 'backend/app/controllers/spree/admin/orders_controller.rb' + - 'core/app/models/spree/order.rb' + - 'core/lib/spree/preferences/preferable_class_methods.rb' # Offense count: 1 # This cop supports safe autocorrection (--autocorrect). Layout/BlockEndNewline: Exclude: - - "core/spec/lib/spree/core/importer/order_spec.rb" + - 'core/spec/lib/spree/core/importer/order_spec.rb' # Offense count: 1 # This cop supports safe autocorrection (--autocorrect). @@ -43,15 +43,15 @@ Layout/BlockEndNewline: # SupportedStyles: case, end Layout/CaseIndentation: Exclude: - - "core/app/models/spree/payment/processing.rb" + - 'core/app/models/spree/payment/processing.rb' # Offense count: 1 # This cop supports safe autocorrection (--autocorrect). Layout/ClosingHeredocIndentation: Exclude: - - "core/solidus_core.gemspec" + - 'core/solidus_core.gemspec' -# Offense count: 86 +# Offense count: 94 # This cop supports safe autocorrection (--autocorrect). Layout/EmptyLineAfterGuardClause: Enabled: false @@ -60,42 +60,42 @@ Layout/EmptyLineAfterGuardClause: # This cop supports safe autocorrection (--autocorrect). Layout/EmptyLineAfterMagicComment: Exclude: - - "core/db/migrate/20200320144521_add_default_billng_flag_to_user_addresses.rb" - - "core/lib/spree/testing_support/flaky.rb" + - 'core/db/migrate/20200320144521_add_default_billng_flag_to_user_addresses.rb' + - 'core/lib/spree/testing_support/flaky.rb' # Offense count: 3 # This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EmptyLineBetweenMethodDefs, EmptyLineBetweenClassDefs, EmptyLineBetweenModuleDefs, AllowAdjacentOneLineDefs, NumberOfEmptyLines. +# Configuration parameters: EmptyLineBetweenMethodDefs, EmptyLineBetweenClassDefs, EmptyLineBetweenModuleDefs, DefLikeMacros, AllowAdjacentOneLineDefs, NumberOfEmptyLines. Layout/EmptyLineBetweenDefs: Exclude: - - "core/app/models/spree/order.rb" - - "core/db/migrate/20160420181916_migrate_credit_cards_to_wallet_payment_sources.rb" - - "core/spec/lib/spree/core/role_configuration_spec.rb" + - 'core/app/models/spree/order.rb' + - 'core/db/migrate/20160420181916_migrate_credit_cards_to_wallet_payment_sources.rb' + - 'core/spec/lib/spree/core/role_configuration_spec.rb' # Offense count: 4 # This cop supports safe autocorrection (--autocorrect). Layout/EmptyLines: Exclude: - - "backend/spec/features/admin/store_credit_reasons_spec.rb" - - "core/db/default/spree/store_credit.rb" - - "core/spec/models/spree/concerns/active_storage_adapter/attachment_spec.rb" - - "core/spec/models/spree/refund_spec.rb" + - 'backend/spec/features/admin/store_credit_reasons_spec.rb' + - 'core/db/default/spree/store_credit.rb' + - 'core/spec/models/spree/concerns/active_storage_adapter/attachment_spec.rb' + - 'core/spec/models/spree/refund_spec.rb' -# Offense count: 15 +# Offense count: 13 # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: AllowAliasSyntax, AllowedMethods. # AllowedMethods: alias_method, public, protected, private Layout/EmptyLinesAroundAttributeAccessor: Exclude: - - "core/app/models/spree/address/state_validator.rb" - - "core/app/models/spree/order_updater.rb" - - "core/app/models/spree/stock_quantities.rb" - - "core/app/models/spree/variant.rb" - - "core/lib/spree/app_configuration.rb" - - "core/lib/spree/preferences/configuration.rb" - - "core/spec/lib/spree/core/validators/email_spec.rb" - - "core/spec/models/spree/preferences/statically_configurable_spec.rb" - - "core/spec/models/spree/reimbursement_type/credit_spec.rb" + - 'core/app/models/spree/address/state_validator.rb' + - 'core/app/models/spree/order_updater.rb' + - 'core/app/models/spree/stock_quantities.rb' + - 'core/app/models/spree/variant.rb' + - 'core/lib/spree/app_configuration.rb' + - 'core/lib/spree/preferences/configuration.rb' + - 'core/spec/lib/spree/core/validators/email_spec.rb' + - 'core/spec/models/spree/preferences/statically_configurable_spec.rb' + - 'core/spec/models/spree/reimbursement_type/credit_spec.rb' # Offense count: 1 # This cop supports safe autocorrection (--autocorrect). @@ -103,17 +103,17 @@ Layout/EmptyLinesAroundAttributeAccessor: # SupportedStyles: empty_lines, no_empty_lines Layout/EmptyLinesAroundBlockBody: Exclude: - - "core/spec/models/spree/order/checkout_spec.rb" + - 'core/spec/models/spree/order/checkout_spec.rb' # Offense count: 4 # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: AllowForAlignment, AllowBeforeTrailingComments, ForceEqualSignAlignment. Layout/ExtraSpacing: Exclude: - - "api/spec/requests/jbuilder_cache_spec.rb" - - "api/spec/requests/spree/api/orders_spec.rb" - - "api/spec/requests/spree/api/taxons_spec.rb" - - "backend/spec/controllers/spree/admin/store_credits_controller_spec.rb" + - 'api/spec/requests/jbuilder_cache_spec.rb' + - 'api/spec/requests/spree/api/orders_spec.rb' + - 'api/spec/requests/spree/api/taxons_spec.rb' + - 'backend/spec/controllers/spree/admin/store_credits_controller_spec.rb' # Offense count: 2 # This cop supports safe autocorrection (--autocorrect). @@ -121,49 +121,49 @@ Layout/ExtraSpacing: # SupportedStyles: consistent, consistent_relative_to_receiver, special_for_inner_method_call, special_for_inner_method_call_in_parentheses Layout/FirstArgumentIndentation: Exclude: - - "core/app/models/spree/stock/availability_validator.rb" - - "core/app/models/spree/stock/inventory_validator.rb" + - 'core/app/models/spree/stock/availability_validator.rb' + - 'core/app/models/spree/stock/inventory_validator.rb' -# Offense count: 2 +# Offense count: 1 # This cop supports safe autocorrection (--autocorrect). Layout/HeredocIndentation: Exclude: - - "core/solidus_core.gemspec" + - 'core/solidus_core.gemspec' # Offense count: 1 # This cop supports safe autocorrection (--autocorrect). Layout/LeadingEmptyLines: Exclude: - - "api/spec/support/have_attributes_matcher.rb" + - 'api/spec/support/have_attributes_matcher.rb' -# Offense count: 10 +# Offense count: 5 # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: EnforcedStyle, IndentationWidth. # SupportedStyles: aligned, indented Layout/MultilineOperationIndentation: Exclude: - - "core/lib/spree/core/engine.rb" - - "core/lib/spree/core/importer/order.rb" - - "core/lib/spree/testing_support/factories/address_factory.rb" + - 'core/lib/spree/core/engine.rb' + - 'core/lib/spree/core/importer/order.rb' + - 'core/lib/spree/testing_support/factories/address_factory.rb' # Offense count: 3 # This cop supports safe autocorrection (--autocorrect). Layout/RescueEnsureAlignment: Exclude: - - "backend/app/controllers/spree/admin/orders_controller.rb" - - "core/app/models/spree/order.rb" + - 'backend/app/controllers/spree/admin/orders_controller.rb' + - 'core/app/models/spree/order.rb' -# Offense count: 6 +# Offense count: 4 # This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: AllowForAlignment, EnforcedStyleForExponentOperator. +# Configuration parameters: AllowForAlignment, EnforcedStyleForExponentOperator, EnforcedStyleForRationalLiterals. # SupportedStylesForExponentOperator: space, no_space +# SupportedStylesForRationalLiterals: space, no_space Layout/SpaceAroundOperators: Exclude: - - "api/spec/requests/spree/api/taxons_spec.rb" - - "backend/spec/features/admin/orders/order_details_spec.rb" - - "bin/__rspec" - - "bin/rspec" - - "core/spec/models/spree/order/number_generator_spec.rb" + - 'api/spec/requests/spree/api/taxons_spec.rb' + - 'backend/spec/features/admin/orders/order_details_spec.rb' + - 'bin/rspec' + - 'core/spec/models/spree/order/number_generator_spec.rb' # Offense count: 8 # This cop supports safe autocorrection (--autocorrect). @@ -172,11 +172,11 @@ Layout/SpaceAroundOperators: # SupportedStylesForEmptyBraces: space, no_space Layout/SpaceInsideBlockBraces: Exclude: - - "backend/spec/features/admin/orders/shipments_spec.rb" - - "core/lib/spree/migrations.rb" - - "core/spec/lib/spree/core/testing_support/factories/address_factory_spec.rb" - - "core/spec/lib/spree/preferences/preference_differentiator_spec.rb" - - "core/spec/models/spree/variant_spec.rb" + - 'backend/spec/features/admin/orders/shipments_spec.rb' + - 'core/lib/spree/migrations.rb' + - 'core/spec/lib/spree/core/testing_support/factories/address_factory_spec.rb' + - 'core/spec/lib/spree/preferences/preference_differentiator_spec.rb' + - 'core/spec/models/spree/variant_spec.rb' # Offense count: 1 # This cop supports safe autocorrection (--autocorrect). @@ -185,167 +185,130 @@ Layout/SpaceInsideBlockBraces: # SupportedStylesForEmptyBraces: space, no_space Layout/SpaceInsideHashLiteralBraces: Exclude: - - "api/spec/requests/spree/api/address_books_spec.rb" - -# Offense count: 1 -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforcedStyle. -# SupportedStyles: final_newline, final_blank_line -Layout/TrailingEmptyLines: - Exclude: - - "bin/rails" + - 'api/spec/requests/spree/api/address_books_spec.rb' # Offense count: 1 # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: AllowInHeredoc. Layout/TrailingWhitespace: Exclude: - - "core/lib/spree/core/stock_configuration.rb" + - 'core/lib/spree/core/stock_configuration.rb' -# Offense count: 3 +# Offense count: 2 # This cop supports safe autocorrection (--autocorrect). Lint/AmbiguousOperator: Exclude: - - "bin/__rspec" - - "bin/rails-application-template" - - "bin/rspec" + - 'bin/rails-application-template' + - 'bin/rspec' -# Offense count: 43 +# Offense count: 44 # Configuration parameters: AllowedMethods. # AllowedMethods: enums Lint/ConstantDefinitionInBlock: Enabled: false # Offense count: 1 -# This cop supports unsafe autocorrection (--autocorrect-all). -# Configuration parameters: AllowComments. +# This cop supports safe autocorrection (--autocorrect). +# Configuration parameters: AutoCorrect, AllowComments. Lint/EmptyConditionalBody: Exclude: - - "core/lib/spree/preferences/statically_configurable.rb" + - 'core/lib/spree/preferences/statically_configurable.rb' # Offense count: 1 # This cop supports safe autocorrection (--autocorrect). Lint/RedundantCopDisableDirective: Exclude: - - "Gemfile" + - 'Gemfile' -# Offense count: 4 +# Offense count: 1 Lint/ShadowingOuterLocalVariable: Exclude: - - "core/app/models/spree/order_inventory.rb" - - "core/lib/generators/solidus/install/install_generator.rb" + - 'core/lib/generators/solidus/install/install_generator.rb' -# Offense count: 3 +# Offense count: 2 # This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: IgnoreEmptyBlocks, AllowUnusedKeywordArguments. +# Configuration parameters: AutoCorrect, IgnoreEmptyBlocks, AllowUnusedKeywordArguments. Lint/UnusedBlockArgument: Exclude: - - "Rakefile" - - "core/spec/models/spree/order_spec.rb" - - "dev_tools/lib/solidus/pipeline_context.rb" - -# Offense count: 7 -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: AllowUnusedKeywordArguments, IgnoreEmptyMethods, IgnoreNotImplementedMethods. -Lint/UnusedMethodArgument: - Exclude: - -# Offense count: 1 -# Configuration parameters: MinNameLength, AllowNamesEndingInNumbers, AllowedNames, ForbiddenNames. -# AllowedNames: as, at, by, cc, db, id, if, in, io, ip, of, on, os, pp, to -Naming/MethodParameterName: - Exclude: + - 'core/spec/models/spree/order_spec.rb' # Offense count: 3 # This cop supports safe autocorrection (--autocorrect). Performance/RegexpMatch: Exclude: - - "core/app/models/spree/credit_card.rb" - - "core/spec/lib/search/variant_spec.rb" + - 'core/app/models/spree/credit_card.rb' + - 'core/spec/lib/search/variant_spec.rb' # Offense count: 1 # This cop supports safe autocorrection (--autocorrect). Performance/StringReplacement: Exclude: - - "core/lib/spree/testing_support/common_rake.rb" + - 'core/lib/spree/testing_support/common_rake.rb' # Offense count: 1 # This cop supports unsafe autocorrection (--autocorrect-all). Rails/ApplicationController: Exclude: - - "api/app/controllers/spree/api/base_controller.rb" + - 'api/app/controllers/spree/api/base_controller.rb' -# Offense count: 1 +# Offense count: 2 # This cop supports unsafe autocorrection (--autocorrect-all). Rails/ApplicationJob: Exclude: - - "legacy_promotions/app/jobs/spree/promotion_code_batch_job.rb" - - "promotions/app/jobs/solidus_promotions/promotion_code_batch_job.rb" + - 'legacy_promotions/app/jobs/spree/promotion_code_batch_job.rb' + - 'promotions/app/jobs/solidus_promotions/promotion_code_batch_job.rb' # Offense count: 1 # This cop supports unsafe autocorrection (--autocorrect-all). Rails/ApplicationMailer: Exclude: - - "core/app/mailers/spree/base_mailer.rb" + - 'core/app/mailers/spree/base_mailer.rb' # Offense count: 16 # This cop supports unsafe autocorrection (--autocorrect-all). Rails/ApplicationRecord: Exclude: - - "backend/spec/controllers/spree/admin/resource_controller_spec.rb" - - "core/app/models/spree/base.rb" - - "core/db/migrate/20160420181916_migrate_credit_cards_to_wallet_payment_sources.rb" - - "core/db/migrate/20170319191942_remove_order_id_from_inventory_units.rb" - - "core/db/migrate/20170412103617_transform_tax_rate_category_relation.rb" - - "core/db/migrate/20180322142651_add_amount_remaining_to_store_credit_events.rb" - - "core/db/migrate/20180710170104_create_spree_store_credit_reasons_table.rb" - - "legacy_promotions/db/migrate/20190106184413_remove_code_from_spree_promotions.rb" - - "core/spec/lib/calculated_adjustments_spec.rb" - - "core/spec/models/spree/validations/db_maximum_length_validator_spec.rb" - - "core/spec/models/spree/wallet_payment_source_spec.rb" - -# Offense count: 14 + - 'backend/spec/controllers/spree/admin/resource_controller_spec.rb' + - 'core/app/models/spree/base.rb' + - 'core/db/migrate/20160420181916_migrate_credit_cards_to_wallet_payment_sources.rb' + - 'core/db/migrate/20170319191942_remove_order_id_from_inventory_units.rb' + - 'core/db/migrate/20170412103617_transform_tax_rate_category_relation.rb' + - 'core/db/migrate/20180322142651_add_amount_remaining_to_store_credit_events.rb' + - 'core/db/migrate/20180710170104_create_spree_store_credit_reasons_table.rb' + - 'core/spec/lib/calculated_adjustments_spec.rb' + - 'core/spec/models/spree/validations/db_maximum_length_validator_spec.rb' + - 'core/spec/models/spree/wallet_payment_source_spec.rb' + - 'legacy_promotions/db/migrate/20190106184413_remove_code_from_spree_promotions.rb' + +# Offense count: 11 # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: NilOrEmpty, NotPresent, UnlessPresent. Rails/Blank: Exclude: - - "core/app/models/spree/credit_card.rb" - - "core/app/models/spree/line_item.rb" - - "core/app/models/spree/order.rb" - - "core/app/models/spree/order_contents.rb" - - "core/app/models/spree/reimbursement_type/exchange.rb" - - "core/app/models/spree/wallet_payment_source.rb" - - "core/app/models/spree/zone.rb" - - "core/lib/spree/core/importer/order.rb" - - "core/lib/spree/core/search/base.rb" + - 'core/app/models/spree/credit_card.rb' + - 'core/app/models/spree/line_item.rb' + - 'core/app/models/spree/order.rb' + - 'core/app/models/spree/reimbursement_type/exchange.rb' + - 'core/app/models/spree/wallet_payment_source.rb' + - 'core/app/models/spree/zone.rb' + - 'core/lib/spree/core/importer/order.rb' + - 'core/lib/spree/core/search/base.rb' # Offense count: 1 # This cop supports safe autocorrection (--autocorrect). Rails/ContentTag: Exclude: - - "core/app/helpers/spree/base_helper.rb" + - 'core/app/helpers/spree/base_helper.rb' # Offense count: 4 +# This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: EnforcedStyle, AllowToTime. # SupportedStyles: strict, flexible Rails/Date: Exclude: - - "api/spec/requests/spree/api/orders_spec.rb" - - "core/app/helpers/spree/products_helper.rb" - - "core/spec/models/spree/log_entry_spec.rb" - -# Offense count: 10 -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforceForPrefixed. -Rails/Delegate: - Exclude: - - "core/app/models/concerns/spree/active_storage_adapter.rb" - - "core/app/models/spree/image/paperclip_attachment.rb" - - "core/app/models/spree/order_inventory.rb" - - "core/app/models/spree/return_authorization.rb" - - "core/app/models/spree/stock/content_item.rb" - - "core/app/models/spree/stock/package.rb" - - "core/app/models/spree/taxon/paperclip_attachment.rb" + - 'api/spec/requests/spree/api/orders_spec.rb' + - 'core/app/helpers/spree/products_helper.rb' + - 'core/spec/models/spree/log_entry_spec.rb' # Offense count: 1 # This cop supports unsafe autocorrection (--autocorrect-all). @@ -355,16 +318,17 @@ Rails/Delegate: # AllowedReceivers: Gem::Specification, page Rails/DynamicFindBy: Exclude: - - "api/spec/requests/spree/api/variants_spec.rb" + - 'api/spec/requests/spree/api/variants_spec.rb' # Offense count: 4 +# This cop supports safe autocorrection (--autocorrect). # Configuration parameters: EnforcedStyle. # SupportedStyles: slashes, arguments Rails/FilePath: Exclude: - - "core/lib/spree/app_configuration.rb" - - "core/lib/spree/testing_support/dummy_app.rb" - - "sample/lib/spree/sample.rb" + - 'core/lib/spree/app_configuration.rb' + - 'core/lib/spree/testing_support/dummy_app.rb' + - 'sample/lib/spree/sample.rb' # Offense count: 15 # This cop supports safe autocorrection (--autocorrect). @@ -372,346 +336,321 @@ Rails/FilePath: # SupportedStyles: numeric, symbolic Rails/HttpStatus: Exclude: - - "api/app/controllers/spree/api/coupon_codes_controller.rb" - - "api/app/controllers/spree/api/inventory_units_controller.rb" - - "api/app/controllers/spree/api/option_types_controller.rb" - - "api/app/controllers/spree/api/option_values_controller.rb" - - "api/app/controllers/spree/api/payments_controller.rb" - - "api/app/controllers/spree/api/shipments_controller.rb" - - "api/app/controllers/spree/api/stock_items_controller.rb" - - "api/app/controllers/spree/api/users_controller.rb" - - "backend/app/controllers/spree/admin/locale_controller.rb" + - 'api/app/controllers/spree/api/coupon_codes_controller.rb' + - 'api/app/controllers/spree/api/inventory_units_controller.rb' + - 'api/app/controllers/spree/api/option_types_controller.rb' + - 'api/app/controllers/spree/api/option_values_controller.rb' + - 'api/app/controllers/spree/api/payments_controller.rb' + - 'api/app/controllers/spree/api/shipments_controller.rb' + - 'api/app/controllers/spree/api/stock_items_controller.rb' + - 'api/app/controllers/spree/api/users_controller.rb' + - 'backend/app/controllers/spree/admin/locale_controller.rb' # Offense count: 2 # This cop supports safe autocorrection (--autocorrect). Rails/IndexWith: Exclude: - - "core/lib/spree/core/search/variant.rb" - - "core/lib/spree/preferences/preferable.rb" + - 'core/lib/spree/core/search/variant.rb' + - 'core/lib/spree/preferences/preferable.rb' # Offense count: 9 Rails/OutputSafety: Exclude: - - "backend/app/helpers/spree/admin/navigation_helper.rb" - - "backend/config/initializers/form_builder.rb" - - "core/app/helpers/spree/base_helper.rb" - - "core/app/helpers/spree/checkout_helper.rb" - - "core/app/helpers/spree/products_helper.rb" - - "core/app/models/spree/money.rb" + - 'backend/app/helpers/spree/admin/navigation_helper.rb' + - 'backend/config/initializers/form_builder.rb' + - 'core/app/helpers/spree/base_helper.rb' + - 'core/app/helpers/spree/checkout_helper.rb' + - 'core/app/helpers/spree/products_helper.rb' + - 'core/app/models/spree/money.rb' -# Offense count: 10 +# Offense count: 9 # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: NotNilAndNotEmpty, NotBlank, UnlessBlank. Rails/Present: Exclude: - - "api/app/controllers/spree/api/shipments_controller.rb" - - "api/app/controllers/spree/api/taxonomies_controller.rb" - - "api/app/controllers/spree/api/taxons_controller.rb" - - "backend/app/helpers/spree/admin/stock_movements_helper.rb" - - "core/app/models/concerns/spree/ordered_property_value_list.rb" - - "core/app/models/spree/stock/availability_validator.rb" - - "core/lib/spree/core/search/base.rb" - - "core/spec/models/spree/stock/availability_validator_spec.rb" + - 'api/app/controllers/spree/api/shipments_controller.rb' + - 'api/app/controllers/spree/api/taxonomies_controller.rb' + - 'api/app/controllers/spree/api/taxons_controller.rb' + - 'backend/app/helpers/spree/admin/stock_movements_helper.rb' + - 'core/app/models/concerns/spree/ordered_property_value_list.rb' + - 'core/app/models/spree/stock/availability_validator.rb' + - 'core/lib/spree/core/search/base.rb' + - 'core/spec/models/spree/stock/availability_validator_spec.rb' # Offense count: 8 # This cop supports safe autocorrection (--autocorrect). Rails/RedundantForeignKey: Exclude: - - "core/app/models/spree/credit_card.rb" - - "core/app/models/spree/order.rb" - - "core/app/models/spree/return_item.rb" - - "core/app/models/spree/shipping_rate.rb" - - "core/app/models/spree/user_address.rb" - - "core/app/models/spree/wallet_payment_source.rb" + - 'core/app/models/spree/credit_card.rb' + - 'core/app/models/spree/order.rb' + - 'core/app/models/spree/return_item.rb' + - 'core/app/models/spree/shipping_rate.rb' + - 'core/app/models/spree/user_address.rb' + - 'core/app/models/spree/wallet_payment_source.rb' -# Offense count: 13 +# Offense count: 16 # This cop supports unsafe autocorrection (--autocorrect-all). Rails/ReflectionClassName: Exclude: - - "core/app/models/spree/credit_card.rb" - - "core/app/models/spree/order.rb" - - "legacy_promotions/app/models/spree/promotion/rules/user.rb" - - "legacy_promotions/app/models/spree/promotion_rule_user.rb" - - "core/app/models/spree/role_user.rb" - - "core/app/models/spree/store_credit.rb" - - "core/app/models/spree/user_address.rb" - - "core/app/models/spree/user_stock_location.rb" - - "core/app/models/spree/wallet_payment_source.rb" - - "promotions/app/models/solidus_promotions/condition_user.rb" - - "promotions/app/models/solidus_promotions/conditions/user.rb" - -# Offense count: 23 + - 'core/app/models/spree/credit_card.rb' + - 'core/app/models/spree/order.rb' + - 'core/app/models/spree/role_user.rb' + - 'core/app/models/spree/store_credit.rb' + - 'core/app/models/spree/user_address.rb' + - 'core/app/models/spree/user_group.rb' + - 'core/app/models/spree/user_stock_location.rb' + - 'core/app/models/spree/wallet_payment_source.rb' + - 'legacy_promotions/app/models/spree/promotion/rules/user.rb' + - 'legacy_promotions/app/models/spree/promotion_rule_user.rb' + - 'promotions/app/models/solidus_promotions/condition_user.rb' + - 'promotions/app/models/solidus_promotions/conditions/user.rb' + +# Offense count: 22 # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: ConvertTry. Rails/SafeNavigation: Exclude: - - "core/app/models/concerns/spree/user_methods.rb" - - "core/app/models/spree/order.rb" - - "core/app/models/spree/payment.rb" - - "core/app/models/spree/payment/processing.rb" - - "core/app/models/spree/role_user.rb" - - "core/app/models/spree/shipment.rb" - - "core/app/models/spree/taxon.rb" - - "core/app/models/spree/variant/pricing_options.rb" - - "core/app/models/spree/wallet.rb" - - "core/app/models/spree/wallet/default_payment_builder.rb" - - "core/spec/models/spree/variant/vat_price_generator_spec.rb" - -# Offense count: 43 + - 'core/app/models/concerns/spree/user_methods.rb' + - 'core/app/models/spree/order.rb' + - 'core/app/models/spree/payment.rb' + - 'core/app/models/spree/payment/processing.rb' + - 'core/app/models/spree/role_user.rb' + - 'core/app/models/spree/shipment.rb' + - 'core/app/models/spree/taxon.rb' + - 'core/app/models/spree/variant/pricing_options.rb' + - 'core/app/models/spree/wallet.rb' + - 'core/app/models/spree/wallet/default_payment_builder.rb' + - 'core/spec/models/spree/variant/vat_price_generator_spec.rb' + +# Offense count: 50 # Configuration parameters: ForbiddenMethods, AllowedMethods. # ForbiddenMethods: decrement!, decrement_counter, increment!, increment_counter, insert, insert!, insert_all, insert_all!, toggle!, touch, touch_all, update_all, update_attribute, update_column, update_columns, update_counters, upsert, upsert_all Rails/SkipsModelValidations: Enabled: false -# Offense count: 6 +# Offense count: 4 # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: EnforcedStyle. # SupportedStyles: strict, flexible Rails/TimeZone: Exclude: - - "api/spec/requests/spree/api/orders_spec.rb" - - "core/spec/helpers/base_helper_spec.rb" - - "core/spec/models/spree/order/outstanding_balance_integration_spec.rb" - - "core/spec/models/spree/tax/taxation_integration_spec.rb" + - 'api/spec/requests/spree/api/orders_spec.rb' + - 'core/spec/helpers/base_helper_spec.rb' + - 'core/spec/models/spree/order/outstanding_balance_integration_spec.rb' + - 'core/spec/models/spree/tax/taxation_integration_spec.rb' -# Offense count: 1 -Security/Open: - Exclude: - -# Offense count: 24 +# Offense count: 21 # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: EnforcedStyle. # SupportedStyles: separated, grouped Style/AccessorGrouping: Exclude: - - "backend/lib/spree/backend/action_callbacks.rb" - - "core/app/models/spree/legacy_user.rb" - - "core/app/models/spree/order.rb" - - "core/lib/generators/spree/dummy/dummy_generator.rb" - - "core/lib/spree/core/search/base.rb" - - "core/lib/spree/core/stock_configuration.rb" + - 'backend/lib/spree/backend/action_callbacks.rb' + - 'core/app/models/spree/legacy_user.rb' + - 'core/app/models/spree/order.rb' + - 'core/lib/generators/spree/dummy/dummy_generator.rb' + - 'core/lib/spree/core/search/base.rb' + - 'core/lib/spree/core/stock_configuration.rb' # Offense count: 1 # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: AllowOnConstant, AllowOnSelfClass. Style/CaseEquality: Exclude: - - "core/spec/models/spree/store_credit_spec.rb" - -# Offense count: 2 -# This cop supports unsafe autocorrection (--autocorrect-all). -Style/CaseLikeIf: - Exclude: - - "backend/spec/support/feature/order_feature_helper.rb" - - "core/lib/spree/core.rb" + - 'core/spec/models/spree/store_credit_spec.rb' # Offense count: 1 -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: AllowedMethods, AllowedPatterns, IgnoredMethods. +# This cop supports unsafe autocorrection (--autocorrect-all). +# Configuration parameters: AllowedMethods, AllowedPatterns. # AllowedMethods: ==, equal?, eql? Style/ClassEqualityComparison: Exclude: - - "core/lib/spree/core.rb" + - 'core/lib/spree/core.rb' -# Offense count: 8 +# Offense count: 6 # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: Keywords, RequireColon. # Keywords: TODO, FIXME, OPTIMIZE, HACK, REVIEW, NOTE Style/CommentAnnotation: Exclude: - - "api/app/controllers/spree/api/address_books_controller.rb" - - "backend/app/controllers/spree/admin/products_controller.rb" - - "backend/app/controllers/spree/admin/resource_controller.rb" - - "core/app/models/spree/payment_method/store_credit.rb" - - "core/lib/spree/testing_support/rake.rb" - - "core/spec/models/spree/variant/scopes_spec.rb" + - 'api/app/controllers/spree/api/address_books_controller.rb' + - 'backend/app/controllers/spree/admin/products_controller.rb' + - 'backend/app/controllers/spree/admin/resource_controller.rb' + - 'core/app/models/spree/payment_method/store_credit.rb' + - 'core/lib/spree/testing_support/rake.rb' + - 'core/spec/models/spree/variant/scopes_spec.rb' # Offense count: 2 # This cop supports safe autocorrection (--autocorrect). Style/ExplicitBlockArgument: Exclude: - - "api/app/controllers/spree/api/base_controller.rb" - - "backend/app/controllers/spree/admin/base_controller.rb" + - 'api/app/controllers/spree/api/base_controller.rb' + - 'backend/app/controllers/spree/admin/base_controller.rb' -# Offense count: 29 -# This cop supports unsafe autocorrection (--autocorrect-all). -# Configuration parameters: EnforcedStyle. -# SupportedStyles: always, always_true, never -Style/FrozenStringLiteralComment: - Enabled: false - -# Offense count: 13 +# Offense count: 18 # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: EnforcedStyle. # SupportedStyles: braces, no_braces Style/HashAsLastArrayItem: Exclude: - - "api/app/controllers/spree/api/base_controller.rb" - - "api/app/controllers/spree/api/orders_controller.rb" - - "api/spec/requests/spree/api/orders_spec.rb" - - "backend/app/controllers/spree/admin/products_controller.rb" - - "core/lib/spree/permitted_attributes.rb" + - 'api/app/controllers/spree/api/base_controller.rb' + - 'api/app/controllers/spree/api/orders_controller.rb' + - 'api/spec/requests/spree/api/orders_spec.rb' + - 'backend/app/controllers/spree/admin/products_controller.rb' + - 'core/lib/spree/permitted_attributes.rb' # Offense count: 3 # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: AllowedReceivers. +# AllowedReceivers: Thread.current Style/HashEachMethods: Exclude: - - "api/app/controllers/spree/api/orders_controller.rb" - - "core/app/models/spree/stock/differentiator.rb" - - "core/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb" + - 'api/app/controllers/spree/api/orders_controller.rb' + - 'core/app/models/spree/stock/differentiator.rb' + - 'core/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb' # Offense count: 2 # This cop supports safe autocorrection (--autocorrect). Style/KeywordParametersOrder: Exclude: - - "bin/build-ci" + - 'bin/build-ci' # Offense count: 1 Style/MixinUsage: Exclude: - - "bin/setup" - -# Offense count: 5 -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: AllowedMethods. -# AllowedMethods: be, be_a, be_an, be_between, be_falsey, be_kind_of, be_instance_of, be_truthy, be_within, eq, eql, end_with, include, match, raise_error, respond_to, start_with -Style/NestedParenthesizedCalls: - Exclude: - - "core/spec/generators/solidus/install/install_generator_spec.rb" + - 'bin/setup' # Offense count: 9 # Configuration parameters: AllowedMethods. # AllowedMethods: respond_to_missing? Style/OptionalBooleanParameter: Exclude: - - "api/app/controllers/spree/api/orders_controller.rb" - - "core/app/mailers/spree/order_mailer.rb" - - "core/app/mailers/spree/reimbursement_mailer.rb" - - "core/app/models/concerns/spree/user_address_book.rb" - - "core/app/models/spree/order.rb" - - "core/app/models/spree/simple_order_contents.rb" - - "core/app/models/spree/stock/estimator.rb" + - 'api/app/controllers/spree/api/orders_controller.rb' + - 'core/app/mailers/spree/order_mailer.rb' + - 'core/app/mailers/spree/reimbursement_mailer.rb' + - 'core/app/models/concerns/spree/user_address_book.rb' + - 'core/app/models/spree/order.rb' + - 'core/app/models/spree/simple_order_contents.rb' + - 'core/app/models/spree/stock/estimator.rb' -# Offense count: 4 +# Offense count: 3 # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: AllowSafeAssignment, AllowInMultilineConditions. Style/ParenthesesAroundCondition: Exclude: - - "core/lib/spree/testing_support/dummy_app.rb" - - "core/spec/models/spree/concerns/active_storage_adapter/attachment_spec.rb" - - "core/spec/rails_helper.rb" + - 'core/lib/spree/testing_support/dummy_app.rb' + - 'core/spec/models/spree/concerns/active_storage_adapter/attachment_spec.rb' + - 'core/spec/rails_helper.rb' -# Offense count: 2 +# Offense count: 1 # This cop supports safe autocorrection (--autocorrect). Style/RedundantAssignment: Exclude: - - "backend/app/controllers/spree/admin/stock_items_controller.rb" - - "core/lib/spree/core/search/base.rb" + - 'core/lib/spree/core/search/base.rb' -# Offense count: 5 +# Offense count: 2 # This cop supports safe autocorrection (--autocorrect). Style/RedundantBegin: Exclude: - - "core/app/models/spree/user_last_url_storer/rules/authentication_rule.rb" - - "core/spec/models/spree/stock/simple_coordinator_spec.rb" + - 'core/app/models/spree/user_last_url_storer/rules/authentication_rule.rb' + - 'core/spec/models/spree/stock/simple_coordinator_spec.rb' # Offense count: 2 # This cop supports safe autocorrection (--autocorrect). +# Configuration parameters: AllowedMethods. +# AllowedMethods: nonzero? Style/RedundantCondition: Exclude: - - "backend/app/controllers/spree/admin/reimbursements_controller.rb" - - "backend/app/controllers/spree/admin/resource_controller.rb" + - 'backend/app/controllers/spree/admin/reimbursements_controller.rb' + - 'backend/app/controllers/spree/admin/resource_controller.rb' # Offense count: 4 # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: SafeForConstants. Style/RedundantFetchBlock: Exclude: - - "core/spec/models/spree/preferences/scoped_store_spec.rb" - - "core/spec/models/spree/preferences/static_model_preferences_spec.rb" + - 'core/spec/models/spree/preferences/scoped_store_spec.rb' + - 'core/spec/models/spree/preferences/static_model_preferences_spec.rb' # Offense count: 5 # This cop supports safe autocorrection (--autocorrect). Style/RedundantFileExtensionInRequire: Exclude: - - "api/solidus_api.gemspec" - - "backend/solidus_backend.gemspec" - - "core/solidus_core.gemspec" - - "sample/solidus_sample.gemspec" - - "solidus.gemspec" + - 'api/solidus_api.gemspec' + - 'backend/solidus_backend.gemspec' + - 'core/solidus_core.gemspec' + - 'sample/solidus_sample.gemspec' + - 'solidus.gemspec' -# Offense count: 3 +# Offense count: 1 # This cop supports safe autocorrection (--autocorrect). Style/RedundantFreeze: Exclude: - - "bin/build-ci" - - "core/app/models/spree/payment/cancellation.rb" + - 'core/app/models/spree/payment/cancellation.rb' # Offense count: 1 # This cop supports unsafe autocorrection (--autocorrect-all). Style/RedundantInterpolation: Exclude: - - "core/lib/spree/testing_support/common_rake.rb" + - 'core/lib/spree/testing_support/common_rake.rb' # Offense count: 2 # This cop supports safe autocorrection (--autocorrect). Style/RedundantParentheses: Exclude: - - "bin/console" - - "core/lib/generators/spree/dummy/dummy_generator.rb" + - 'bin/console' + - 'core/lib/generators/spree/dummy/dummy_generator.rb' # Offense count: 3 # This cop supports safe autocorrection (--autocorrect). Style/RedundantRegexpEscape: Exclude: - - "core/lib/spree/testing_support/translations.rb" - - "core/spec/models/spree/calculator_spec.rb" + - 'core/lib/spree/testing_support/translations.rb' + - 'core/spec/models/spree/calculator_spec.rb' -# Offense count: 2 +# Offense count: 1 # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: AllowMultipleReturnValues. Style/RedundantReturn: Exclude: - - "core/lib/spree/preferences/store.rb" + - 'core/lib/spree/preferences/store.rb' -# Offense count: 2 +# Offense count: 1 # This cop supports safe autocorrection (--autocorrect). Style/RedundantSelf: Exclude: - - "core/app/models/spree/product.rb" + - 'core/app/models/spree/product.rb' # Offense count: 1 # This cop supports unsafe autocorrection (--autocorrect-all). Style/RedundantSort: Exclude: - - "core/lib/spree/testing_support/factories/state_factory.rb" + - 'core/lib/spree/testing_support/factories/state_factory.rb' -# Offense count: 21 +# Offense count: 30 # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: ConvertCodeThatCanStartToReturnNil, AllowedMethods, MaxChainLength. # AllowedMethods: present?, blank?, presence, try, try! Style/SafeNavigation: Enabled: false -# Offense count: 13 +# Offense count: 12 # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: Mode. Style/StringConcatenation: Exclude: - - "api/spec/spec_helper.rb" - - "bin/__rspec" - - "bin/rspec" - - "core/app/helpers/spree/base_helper.rb" - - "core/app/models/spree/credit_card.rb" - - "core/app/models/spree/variant.rb" - - "core/lib/spree/testing_support/capybara_ext.rb" - - "core/spec/models/spree/product_spec.rb" - - "core/spec/models/spree/variant_spec.rb" - - "sample/db/samples/assets.rb" + - 'api/spec/spec_helper.rb' + - 'bin/rspec' + - 'core/app/helpers/spree/base_helper.rb' + - 'core/app/models/spree/credit_card.rb' + - 'core/app/models/spree/variant.rb' + - 'core/lib/spree/testing_support/capybara_ext.rb' + - 'core/spec/models/spree/product_spec.rb' + - 'core/spec/models/spree/variant_spec.rb' + - 'sample/db/samples/assets.rb' # Offense count: 1 # This cop supports unsafe autocorrection (--autocorrect-all). Style/ZeroLengthPredicate: Exclude: - - "core/app/models/spree/fulfilment_changer.rb" + - 'core/app/models/spree/fulfilment_changer.rb' diff --git a/api/app/controllers/spree/api/users_controller.rb b/api/app/controllers/spree/api/users_controller.rb index d46c4737769..9a2b0e242be 100644 --- a/api/app/controllers/spree/api/users_controller.rb +++ b/api/app/controllers/spree/api/users_controller.rb @@ -31,6 +31,8 @@ def create @user = user_class.new(permitted_user_params) if @user.save + set_user_group if current_store&.enforce_group_upon_signup + respond_with(@user, status: 201, default_template: :show) else invalid_resource!(@user) @@ -86,4 +88,15 @@ def permitted_user_attributes super end end + + # Sets the user group for a user if they don't have one assigned + # This method checks if there's a user (@user) and if they don't have a user group on sign up + # If these conditions are met, it assigns the default cart user group from the current store + # If enforce_group_upon_signup is enabled on the store settings + def set_user_group + if @user && @user.user_group.nil? + user_group = current_store.default_cart_user_group + @user.update(user_group: user_group) if user_group + end + end end diff --git a/api/lib/spree/api_configuration.rb b/api/lib/spree/api_configuration.rb index 26f748243a9..5a88dc64ffe 100644 --- a/api/lib/spree/api_configuration.rb +++ b/api/lib/spree/api_configuration.rb @@ -118,7 +118,7 @@ class ApiConfiguration < Preferences::Configuration :id, :month, :year, :cc_type, :last_digits, :name ] - preference :user_attributes, :array, default: [:id, :email, :created_at, :updated_at, :customer_metadata] + preference :user_attributes, :array, default: [:id, :email, :user_group_id, :created_at, :updated_at, :customer_metadata] preference :property_attributes, :array, default: [:id, :name, :presentation] diff --git a/api/spec/requests/spree/api/users_spec.rb b/api/spec/requests/spree/api/users_spec.rb index e29bbe25ea9..180fe1ed219 100644 --- a/api/spec/requests/spree/api/users_spec.rb +++ b/api/spec/requests/spree/api/users_spec.rb @@ -6,7 +6,9 @@ module Spree::Api describe 'Users', type: :request do let(:user) { create(:user, spree_api_key: SecureRandom.hex) } let(:stranger) { create(:user, email: 'stranger@example.com') } - let(:attributes) { [:id, :email, :created_at, :updated_at, :customer_metadata] } + let(:attributes) { [:id, :email, :user_group_id, :created_at, :updated_at, :customer_metadata] } + let(:default_user_group) { create(:user_group) } + let(:store) { create(:store) } context "as a normal user" do it "can get own details" do @@ -155,6 +157,29 @@ module Spree::Api expect(json_response['count']).to eq 1 expect(json_response['users'].size).to eq 1 end + + it "assigns default user group upon creation if store enforces it" do + store.update(enforce_group_upon_signup: true, default_cart_user_group: default_user_group) + user_params = { + email: 'new@example.com', password: 'spree123', password_confirmation: 'spree123' + } + + post spree.api_users_path, params: { user: user_params, token: user.spree_api_key } + expect(json_response['email']).to eq 'new@example.com' + expect(json_response['user_group_id']).to eq default_user_group.id + end + + it "does not assign user group if store does not enforce it" do + store.update(enforce_group_upon_signup: false) + + user_params = { + email: 'new@example.com', password: 'spree123', password_confirmation: 'spree123' + } + + post spree.api_users_path, params: { user: user_params, token: user.spree_api_key } + expect(json_response['email']).to eq 'new@example.com' + expect(json_response['user_group_id']).to be_nil + end end context "as an admin" do diff --git a/backend/app/controllers/spree/admin/user_groups_controller.rb b/backend/app/controllers/spree/admin/user_groups_controller.rb new file mode 100644 index 00000000000..81cf1828579 --- /dev/null +++ b/backend/app/controllers/spree/admin/user_groups_controller.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +module Spree + module Admin + class UserGroupsController < ResourceController + end + end +end diff --git a/backend/app/controllers/spree/admin/users_controller.rb b/backend/app/controllers/spree/admin/users_controller.rb index 177827780af..a4acbb0dc9c 100644 --- a/backend/app/controllers/spree/admin/users_controller.rb +++ b/backend/app/controllers/spree/admin/users_controller.rb @@ -25,6 +25,7 @@ def create if @user.save set_roles set_stock_locations + set_user_group if current_store&.enforce_group_upon_signup flash[:success] = t('spree.created_successfully') redirect_to edit_admin_user_url(@user) @@ -111,6 +112,10 @@ def user_params attributes -= [:password, :password_confirmation] end + if can? :manage, Spree::UserGroup + attributes += [:user_group_id] + end + params.require(:user).permit(attributes) end @@ -153,6 +158,18 @@ def set_stock_locations Spree::StockLocation.accessible_by(current_ability).where(id: user_params[:stock_location_ids]) end end + + # Sets the user group for a user if they don't have one assigned + # This method checks if there's a user (@user) and if they don't have a user group on sign up + # If these conditions are met, it assigns the default cart user group from the current store + # If enforce_group_upon_signup is enabled on the store settings + # @return [void] + def set_user_group + if @user && @user.user_group.nil? + user_group = current_store.default_cart_user_group + @user.update(user_group: user_group) if user_group + end + end end end end diff --git a/backend/app/views/spree/admin/shared/users_sub_menu.html.erb b/backend/app/views/spree/admin/shared/users_sub_menu.html.erb new file mode 100644 index 00000000000..5121327cb3b --- /dev/null +++ b/backend/app/views/spree/admin/shared/users_sub_menu.html.erb @@ -0,0 +1,11 @@ +<% Spree.deprecator.warn "Using the #{@virtual_path.inspect} partial is deprecated, please use MenuItem#children instead." %> + + diff --git a/backend/app/views/spree/admin/stores/_form.html.erb b/backend/app/views/spree/admin/stores/_form.html.erb index 52cdaf346e8..26fce11f6ce 100644 --- a/backend/app/views/spree/admin/stores/_form.html.erb +++ b/backend/app/views/spree/admin/stores/_form.html.erb @@ -41,6 +41,20 @@ <%= f.error_message_on :reverse_charge_status %> <% end %> <% end %> + + <%= f.field_container :default_cart_user_group_id do %> + <%= f.label :default_cart_user_group_id %> + <%= f.collection_select :default_cart_user_group_id, Spree::UserGroup.all, :id, :group_name, { include_blank: true }, { class: 'custom-select' } %> + <%= f.error_message_on :default_cart_user_group_id %> + <% end %> + + <%= f.field_container :enforce_group_upon_signup, class: %w(checkbox) do %> + + <%= f.error_message_on :enforce_group_upon_signup %> + <% end %>
<%= f.field_container :url do %> diff --git a/backend/app/views/spree/admin/user_groups/_form.html.erb b/backend/app/views/spree/admin/user_groups/_form.html.erb new file mode 100644 index 00000000000..2ee861195bc --- /dev/null +++ b/backend/app/views/spree/admin/user_groups/_form.html.erb @@ -0,0 +1,9 @@ +
+
+ <%= f.field_container :group_name do %> + <%= f.label :group_name, class: 'required' %> + <%= f.text_field :group_name, class: 'fullwidth' %> + <%= error_message_on :user_group, :group_name %> + <% end %> +
+
diff --git a/backend/app/views/spree/admin/user_groups/edit.html.erb b/backend/app/views/spree/admin/user_groups/edit.html.erb new file mode 100644 index 00000000000..9f1795fdc94 --- /dev/null +++ b/backend/app/views/spree/admin/user_groups/edit.html.erb @@ -0,0 +1,24 @@ +<% admin_breadcrumb(link_to plural_resource_name(Spree::LegacyUser), spree.admin_users_path) %> +<% admin_breadcrumb(link_to plural_resource_name(Spree::UserGroup), spree.admin_user_groups_path) %> +<% admin_breadcrumb(@user_group.group_name) %> + +<% content_for :page_actions do %> +<% end %> + +
+ <%= render partial: 'spree/shared/error_messages', locals: { target: @user_group } %> +
+ +
+ <%= form_for [:admin, @user_group] do |f| %> +
+ <%= render partial: 'form', locals: { f: f } %> + +
+ +
+ <%= render partial: 'spree/admin/shared/edit_resource_links' %> +
+
+ <% end %> +
diff --git a/backend/app/views/spree/admin/user_groups/index.html.erb b/backend/app/views/spree/admin/user_groups/index.html.erb new file mode 100644 index 00000000000..717ac92c5cc --- /dev/null +++ b/backend/app/views/spree/admin/user_groups/index.html.erb @@ -0,0 +1,47 @@ +<% admin_breadcrumb(link_to plural_resource_name(Spree::LegacyUser), spree.admin_users_path) %> +<% admin_breadcrumb(plural_resource_name(Spree::UserGroup)) %> + +<% content_for :page_actions do %> + <% if can?(:create, Spree::UserGroup) %> +
  • + <%= link_to t('spree.new_user_group'), new_object_url, id: 'admin_new_user_group_link', class: 'btn btn-primary' %> +
  • + <% end %> +<% end %> + +<% if @user_groups.any? %> + + + + + + + + + + + + + <% @user_groups.each do |user_group| %> + + + + + <% end %> + +
    <%= Spree::UserGroup.human_attribute_name(:group_name) %>
    <%= link_to user_group.try(:group_name), edit_admin_user_group_path(user_group) %> + <% if can?(:update, user_group) %> + <%= link_to_edit user_group, no_text: true %> + <% end %> + + <% if can?(:destroy, user_group) %> + <%= link_to_delete user_group, no_text: true %> + <% end %> +
    +<% else %> +
    + <%= render 'spree/admin/shared/no_objects_found', + resource: Spree::UserGroup, + new_resource_url: new_object_url %> +
    +<% end %> diff --git a/backend/app/views/spree/admin/user_groups/new.html.erb b/backend/app/views/spree/admin/user_groups/new.html.erb new file mode 100644 index 00000000000..804aae7503b --- /dev/null +++ b/backend/app/views/spree/admin/user_groups/new.html.erb @@ -0,0 +1,24 @@ +<% admin_breadcrumb(link_to plural_resource_name(Spree::LegacyUser), spree.admin_users_path) %> +<% admin_breadcrumb(link_to plural_resource_name(Spree::UserGroup), spree.admin_user_groups_path) %> +<% admin_breadcrumb(t('spree.new_user_group')) %> + +<% content_for :page_actions do %> +<% end %> + +
    + <%= render partial: 'spree/shared/error_messages', locals: { target: @user_group } %> +
    + +
    + <%= form_for [:admin, @user_group] do |f| %> +
    + <%= render partial: 'form', locals: { f: f } %> + +
    + +
    + <%= render partial: 'spree/admin/shared/new_resource_links' %> +
    +
    + <% end %> +
    diff --git a/backend/app/views/spree/admin/users/_form.html.erb b/backend/app/views/spree/admin/users/_form.html.erb index 760d62a516c..9e29570363d 100644 --- a/backend/app/views/spree/admin/users/_form.html.erb +++ b/backend/app/views/spree/admin/users/_form.html.erb @@ -78,3 +78,16 @@ <% end %>
    + +<% if can?(:update, @user) && can?(:manage, :user_group) %> +
    + <%= t('spree.admin.user.user_group') %> +
    + <%= f.field_container :user_group_id do %> + <%= f.label :user_group_id, t('spree.admin.user.user_group') %> + <%= f.collection_select :user_group_id, Spree::UserGroup.all, :id, :group_name, { include_blank: true }, { class: 'custom-select' } %> + <%= f.error_message_on :user_group_id %> + <% end %> +
    +
    +<% end %> diff --git a/backend/config/routes.rb b/backend/config/routes.rb index a0fc0fad00e..656d822c730 100644 --- a/backend/config/routes.rb +++ b/backend/config/routes.rb @@ -16,6 +16,7 @@ resources :zones + resources :user_groups resources :tax_categories resources :products do diff --git a/backend/lib/spree/backend_configuration.rb b/backend/lib/spree/backend_configuration.rb index 5621fb4641a..690baa26838 100644 --- a/backend/lib/spree/backend_configuration.rb +++ b/backend/lib/spree/backend_configuration.rb @@ -234,8 +234,24 @@ def menu_items label: :users, icon: admin_updated_navbar ? 'ri-user-line' : 'user', match_path: %r{/(users|store_credits)}, + data_hook: :admin_users_sub_tabs, + partial: 'spree/admin/shared/users_sub_menu', condition: -> { Spree.user_class && can?(:admin, Spree.user_class) }, url: :admin_users_path, + children: [ + MenuItem.new( + label: :users, + condition: -> { Spree.user_class && can?(:admin, Spree.user_class) }, + url: :admin_users_path + ), + MenuItem.new( + label: :user_groups, + condition: -> { + can?(:admin, Spree::UserGroup) + }, + url: :admin_user_groups_path + ), + ] ), MenuItem.new( label: :settings, diff --git a/backend/spec/controllers/spree/admin/user_groups_controller_spec.rb b/backend/spec/controllers/spree/admin/user_groups_controller_spec.rb new file mode 100644 index 00000000000..43eba84391c --- /dev/null +++ b/backend/spec/controllers/spree/admin/user_groups_controller_spec.rb @@ -0,0 +1,131 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Spree::Admin::UserGroupsController, type: :controller do + stub_authorization! + + let(:user_group) { create(:user_group) } + + describe '#index' do + it 'retrieves all user groups and assigns them to the view' do + get :index + + expect(assigns(:user_groups)).to eq([user_group]) + end + end + + describe '#new' do + it 'prepares a new user group for the form' do + get :new + + expect(assigns(:user_group)).to be_a_new(Spree::UserGroup) + end + end + + describe '#edit' do + it 'loads the specified user group for editing' do + get :edit, params: { id: user_group.id } + + expect(assigns(:user_group)).to eq(user_group) + end + end + + describe '#create' do + context 'with valid params' do + let(:valid_attributes) { { group_name: 'New User Group' } } + + it 'saves a new user group to the database' do + expect { + post :create, params: { user_group: valid_attributes } + }.to change(Spree::UserGroup, :count).by(1) + end + + it 'makes the newly created user group available to the view' do + post :create, params: { user_group: valid_attributes } + + expect(assigns(:user_group)).to be_a(Spree::UserGroup) + expect(assigns(:user_group)).to be_persisted + end + + it 'redirects to the user groups list page' do + post :create, params: { user_group: valid_attributes } + + expect(response).to redirect_to(spree.admin_user_groups_path) + end + end + + context 'with invalid params' do + let(:invalid_attributes) { { group_name: nil } } + + it 'does not save the user group and prepares a new instance for the form' do + post :create, params: { user_group: invalid_attributes } + + expect(assigns(:user_group)).to be_a_new(Spree::UserGroup) + end + + it 'renders the "new" form again' do + post :create, params: { user_group: invalid_attributes } + + expect(response).to render_template('new') + end + end + end + + describe '#update' do + context 'with valid params' do + let(:new_attributes) { { group_name: 'Updated Group Name' } } + + it 'updates the user group with the provided attributes' do + put :update, params: { id: user_group.id, user_group: new_attributes } + + user_group.reload + + expect(user_group.group_name).to eq('Updated Group Name') + end + + it 'makes the updated user group available to the view' do + put :update, params: { id: user_group.id, user_group: new_attributes } + + expect(assigns(:user_group)).to eq(user_group) + end + + it 'redirects to the user groups list page' do + put :update, params: { id: user_group.id, user_group: new_attributes } + + expect(response).to redirect_to(spree.admin_user_groups_path) + end + end + + context 'with invalid params' do + let(:invalid_attributes) { { group_name: nil } } + + it 'does not update the user group and keeps the original instance' do + put :update, params: { id: user_group.id, user_group: invalid_attributes } + + expect(assigns(:user_group)).to eq(user_group) + end + + it 'renders the "edit" form again' do + put :update, params: { id: user_group.id, user_group: invalid_attributes } + + expect(response).to render_template('edit') + end + end + end + + describe '#destroy' do + it 'removes the user group from the database' do + user_group = create(:user_group) + expect { + delete :destroy, params: { id: user_group.id } + }.to change(Spree::UserGroup, :count).by(-1) + end + + it 'redirects to the user groups list page' do + delete :destroy, params: { id: user_group.id } + + expect(response).to redirect_to(spree.admin_user_groups_path) + end + end +end diff --git a/backend/spec/controllers/spree/admin/users_controller_spec.rb b/backend/spec/controllers/spree/admin/users_controller_spec.rb index c8ad0d41f61..9bb1d8b3eda 100644 --- a/backend/spec/controllers/spree/admin/users_controller_spec.rb +++ b/backend/spec/controllers/spree/admin/users_controller_spec.rb @@ -295,6 +295,37 @@ def user expect(user.stock_locations).to eq([location1]) end end + + context "When the user can manage user group" do + stub_authorization! do |_user| + can :manage, Spree.user_class + can :manage, Spree::UserGroup + end + + it "can create user with user group" do + user_group = Spree::UserGroup.create(group_name: "my_user_group") + + post :create, params: { user: { user_group_id: user_group } } + + expect(user.user_group).to eq(user_group) + end + end + + context "when the user is created and store enforce user group on sign up" do + stub_authorization! do |_user| + can :manage, Spree.user_class + can :manage, Spree::UserGroup + end + + it "can create user with user group" do + user_group = Spree::UserGroup.create(group_name: "my_user_group") + store = create(:store, default_cart_user_group: user_group, enforce_group_upon_signup: true) + + post :create, params: { user: { email: 'new_user@exapmle.com' } } + + expect(user.user_group).to eq(store.default_cart_user_group) + end + end end describe "#update" do @@ -479,6 +510,21 @@ def user expect(user.reload.stock_locations).to eq([location1]) end end + + context "When the user can manage user group" do + stub_authorization! do |_user| + can :manage, Spree.user_class + can :manage, Spree::UserGroup + end + + it "can update user with user group" do + user_group = Spree::UserGroup.create(group_name: "my_user_group") + + post :update, params: { id: user.id, user: { user_group_id: user_group } } + + expect(user.reload.user_group).to eq(user_group) + end + end end describe "#destroy" do diff --git a/backend/spec/features/admin/store_credits_spec.rb b/backend/spec/features/admin/store_credits_spec.rb index aa05612a028..afdf85184d0 100644 --- a/backend/spec/features/admin/store_credits_spec.rb +++ b/backend/spec/features/admin/store_credits_spec.rb @@ -17,7 +17,7 @@ describe "visiting the store credits page" do before do visit spree.admin_path - click_link "Users" + click_nav "Users" end it "should be on the store credits page" do @@ -37,7 +37,7 @@ describe "creating store credit" do before do visit spree.admin_path - click_link "Users" + click_nav "Users" click_link store_credit.user.email click_link "Store Credit" allow_any_instance_of(Spree::Admin::StoreCreditsController).to receive_messages(spree_current_user: admin_user) @@ -59,7 +59,7 @@ describe "displaying a store credit details page" do before do visit spree.admin_path - click_link "Users" + click_nav "Users" click_link store_credit.user.email click_link "Store Credit" page.find(".sc-table td.actions a.fa-edit").click @@ -111,7 +111,7 @@ before do visit spree.admin_path - click_link "Users" + click_nav "Users" click_link store_credit.user.email click_link "Store Credit" allow_any_instance_of(Spree::Admin::StoreCreditsController).to receive_messages(spree_current_user: admin_user) diff --git a/backend/spec/features/admin/stores_spec.rb b/backend/spec/features/admin/stores_spec.rb index 1ae571671b4..bdc8875d3af 100644 --- a/backend/spec/features/admin/stores_spec.rb +++ b/backend/spec/features/admin/stores_spec.rb @@ -5,6 +5,9 @@ describe 'Stores', type: :feature do stub_authorization! + let!(:user_group) { create :user_group, group_name: 'Default Group' } + let!(:new_user_group) { create :user_group, group_name: 'New Group' } + context 'when adding a store' do before { visit spree.new_admin_store_path } @@ -22,10 +25,25 @@ expect(@store.default_currency).to eq 'EUR' end + + it 'admin should be able to set the default_cart_user_group' do + expect(find('#store_default_cart_user_group_id').value).to eq '' + + fill_in 'store_name', with: 'Solidus Store' + fill_in 'store_code', with: 'solidus' + fill_in 'store_url', with: 'example.solidus.io' + fill_in 'store_mail_from_address', with: 'from@solidus.io' + select 'Default Group', from: 'store_default_cart_user_group_id' + click_button 'Create' + + @store = Spree::Store.last + + expect(@store.default_cart_user_group).to eq user_group + end end context 'when editing a store' do - let(:store) { create :store, default_currency: 'AUD' } + let(:store) { create :store, default_currency: 'AUD', default_cart_user_group: user_group } before { visit spree.edit_admin_store_path(store) } it 'admin should be able to change the default_currency' do @@ -33,5 +51,12 @@ click_button 'Update' expect(store.reload.default_currency).to eq 'EUR' end + + it 'admin should be able to change the default_cart_user_group' do + select 'New Group', from: 'store_default_cart_user_group_id' + click_button 'Update' + + expect(store.reload.default_cart_user_group).to eq new_user_group + end end end diff --git a/backend/spec/features/admin/user_group_spec.rb b/backend/spec/features/admin/user_group_spec.rb new file mode 100644 index 00000000000..962e2a490ce --- /dev/null +++ b/backend/spec/features/admin/user_group_spec.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe 'User Groups', type: :feature do + stub_authorization! + + let!(:user_group) { create :user_group, group_name: 'Default Group' } + + context 'when adding a user group' do + before { visit spree.new_admin_user_group_path } + + it 'admin should be able to create a user group' do + fill_in 'user_group_group_name', with: 'VIP Group' + click_button 'Create' + + @user_group = Spree::UserGroup.last + + expect(@user_group.group_name).to eq 'VIP Group' + end + end + + context 'when editing a user group' do + before { visit spree.edit_admin_user_group_path(user_group) } + + it 'admin should be able to change the group name' do + fill_in 'user_group_group_name', with: 'Updated Group' + click_button 'Update' + + expect(user_group.reload.group_name).to eq 'Updated Group' + end + end + + context 'when deleting a user group' do + before { visit spree.admin_user_groups_path } + + it 'admin should be able to delete a user group', js: true do + within("#spree_user_group_#{user_group.id}") do + accept_alert do + click_icon :trash + end + end + + expect(page).not_to have_content(user_group.group_name) + expect(Spree::UserGroup.exists?(user_group.id)).to be_falsey + end + end +end diff --git a/backend/spec/features/admin/users_spec.rb b/backend/spec/features/admin/users_spec.rb index 5fdcdbb568d..2e1ffd8ca0d 100644 --- a/backend/spec/features/admin/users_spec.rb +++ b/backend/spec/features/admin/users_spec.rb @@ -99,7 +99,7 @@ before do visit spree.admin_path - click_link 'Users' + click_nav 'Users' end context 'users index' do @@ -357,7 +357,7 @@ def always_invalid_email context 'if an user has placed orders' do before do visit spree.admin_path - click_link 'Users' + click_nav 'Users' end it "can't be deleted" do diff --git a/core/app/models/concerns/spree/user_methods.rb b/core/app/models/concerns/spree/user_methods.rb index 9218e26cd7a..950cc3a35c6 100644 --- a/core/app/models/concerns/spree/user_methods.rb +++ b/core/app/models/concerns/spree/user_methods.rb @@ -26,6 +26,8 @@ module UserMethods has_many :credit_cards, class_name: "Spree::CreditCard", foreign_key: :user_id has_many :wallet_payment_sources, foreign_key: 'user_id', class_name: 'Spree::WalletPaymentSource', inverse_of: :user + belongs_to :user_group, class_name: 'Spree::UserGroup', optional: true + after_create :auto_generate_spree_api_key before_destroy :check_for_deletion diff --git a/core/app/models/spree/store.rb b/core/app/models/spree/store.rb index fd5aef8289c..b0917bcbe0b 100644 --- a/core/app/models/spree/store.rb +++ b/core/app/models/spree/store.rb @@ -17,6 +17,8 @@ class Store < Spree::Base has_many :orders, class_name: "Spree::Order" + belongs_to :default_cart_user_group, class_name: 'Spree::UserGroup', optional: true + validates :code, presence: true, uniqueness: { allow_blank: true, case_sensitive: true } validates :name, presence: true validates :url, presence: true diff --git a/core/app/models/spree/user_group.rb b/core/app/models/spree/user_group.rb new file mode 100644 index 00000000000..89e69250cb2 --- /dev/null +++ b/core/app/models/spree/user_group.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +module Spree + class UserGroup < Spree::Base + has_many :users, class_name: Spree::UserClassHandle.new + has_one :store, class_name: 'Spree::Store', foreign_key: 'default_cart_user_group_id' + + validates :group_name, presence: true + end +end diff --git a/core/config/locales/en.yml b/core/config/locales/en.yml index 138ee452c9c..1864ac24615 100644 --- a/core/config/locales/en.yml +++ b/core/config/locales/en.yml @@ -359,6 +359,7 @@ en: cart_tax_country_iso: Tax Country for Empty Carts code: Slug default: Default + default_cart_user_group_id: Default User Group default_currency: Default Currency mail_from_address: Mail From Address meta_description: Meta Description @@ -757,6 +758,9 @@ en: spree/user: one: User other: Users + spree/user_group: + one: User Group + other: User Groups spree/variant: one: Variant other: Variants @@ -959,6 +963,7 @@ en: taxes: Taxes taxonomies: Taxonomies taxons: Taxons + user_groups: User Groups users: Users zones: Zones taxons: @@ -972,6 +977,7 @@ en: order_num: 'Order #' orders: Orders store_credit: Store Credit + user_group: User Group user_information: User Information users: edit: @@ -1528,6 +1534,7 @@ en: enable_mail_delivery: Enable Mail Delivery end: End ending_in: Ending in + enforce_group_upon_signup: Add all new users to Group error: error error_user_destroy_with_orders: Cannot delete a user with orders errors: @@ -1808,6 +1815,7 @@ en: new_taxonomy: New Taxonomy new_tracker: New Analytics Tracker new_user: New User + new_user_group: New User Group new_variant: New Variant new_zone: New Zone next: Next diff --git a/core/db/migrate/20250409082118_create_user_groups.rb b/core/db/migrate/20250409082118_create_user_groups.rb new file mode 100644 index 00000000000..ba9b069a6a1 --- /dev/null +++ b/core/db/migrate/20250409082118_create_user_groups.rb @@ -0,0 +1,9 @@ +class CreateUserGroups < ActiveRecord::Migration[7.0] + def change + create_table :spree_user_groups do |t| + t.string :group_name + + t.timestamps + end + end +end diff --git a/core/db/migrate/20250409082222_add_user_group_id_to_users.rb b/core/db/migrate/20250409082222_add_user_group_id_to_users.rb new file mode 100644 index 00000000000..4ee363e3aa6 --- /dev/null +++ b/core/db/migrate/20250409082222_add_user_group_id_to_users.rb @@ -0,0 +1,7 @@ +class AddUserGroupIdToUsers < ActiveRecord::Migration[7.0] + def change + change_table Spree.user_class.table_name do |t| + t.references :user_group, type: :integer, foreign_key: { to_table: :spree_user_groups } + end + end +end diff --git a/core/db/migrate/20250409082257_add_default_user_group_to_stores.rb b/core/db/migrate/20250409082257_add_default_user_group_to_stores.rb new file mode 100644 index 00000000000..90a1ceaafd7 --- /dev/null +++ b/core/db/migrate/20250409082257_add_default_user_group_to_stores.rb @@ -0,0 +1,8 @@ +class AddDefaultUserGroupToStores < ActiveRecord::Migration[7.0] + def change + change_table :spree_stores do |t| + t.references :default_cart_user_group, type: :integer, foreign_key: { to_table: :spree_user_groups } + t.boolean :enforce_group_upon_signup, default: false + end + end +end diff --git a/core/lib/spree/permitted_attributes.rb b/core/lib/spree/permitted_attributes.rb index bb7220e280f..6039b85a7e6 100644 --- a/core/lib/spree/permitted_attributes.rb +++ b/core/lib/spree/permitted_attributes.rb @@ -137,7 +137,7 @@ module PermittedAttributes # by changing a user with higher priveleges' email to one a lower-priveleged # admin owns. Creating a user with an email is handled separate at the # controller level. - @@user_attributes = [:password, :password_confirmation, customer_metadata: {}] + @@user_attributes = [:password, :password_confirmation, :user_group_id, customer_metadata: {}] @@variant_attributes = [ :name, :presentation, :cost_price, :lock_version, diff --git a/core/lib/spree/testing_support/factories/user_group_factory.rb b/core/lib/spree/testing_support/factories/user_group_factory.rb new file mode 100644 index 00000000000..224f841c407 --- /dev/null +++ b/core/lib/spree/testing_support/factories/user_group_factory.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :user_group, class: 'Spree::UserGroup' do + group_name { "Default User Group" } + end +end diff --git a/core/spec/models/spree/store_spec.rb b/core/spec/models/spree/store_spec.rb index 9bf552581d6..786e1f80f7e 100644 --- a/core/spec/models/spree/store_spec.rb +++ b/core/spec/models/spree/store_spec.rb @@ -50,6 +50,27 @@ end end + describe '#default_cart_user_group' do + subject { described_class.new(default_cart_user_group_id:) } + + context "when there is no default_cart_user_group set" do + let(:default_cart_user_group_id) { nil } + + it "responds with an empty default_cart_user_group" do + expect(subject.default_cart_user_group).to be_nil + end + end + + context "when there is a default_cart_user_group set" do + let(:user_group) { create(:user_group) } + let(:default_cart_user_group_id) { user_group.id } + + it "responds with a default_cart_user_group with that user group" do + expect(subject.default_cart_user_group).to eq(user_group) + end + end + end + describe '#available_locales' do let(:store) { described_class.new(available_locales: locales) } subject { store.available_locales } diff --git a/core/spec/models/spree/user_group_spec.rb b/core/spec/models/spree/user_group_spec.rb new file mode 100644 index 00000000000..63029c7c34c --- /dev/null +++ b/core/spec/models/spree/user_group_spec.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Spree::UserGroup, type: :model do + describe 'associations' do + it 'has many users' do + association = described_class.reflect_on_association(:users) + + expect(association.macro).to eq :has_many + expect(association.class_name).to eq Spree::UserClassHandle.new.to_s + end + + it 'has one store' do + association = described_class.reflect_on_association(:store) + + expect(association.macro).to eq :has_one + expect(association.class_name).to eq 'Spree::Store' + expect(association.options[:foreign_key]).to eq 'default_cart_user_group_id' + end + end + + describe 'validations' do + context 'when validating presence' do + it 'validates presence of group_name' do + user_group = Spree::UserGroup.new + user_group.valid? + + expect(user_group.errors[:group_name]).to include("can't be blank") + end + end + + context 'when creating a valid user group' do + it 'is valid with a group_name' do + user_group = Spree::UserGroup.new(group_name: 'Test Group') + + expect(user_group).to be_valid + end + end + end + + describe 'user group relations' do + let(:user_group) { create(:user_group) } + + context '#users' do + let(:user) { create(:user) } + + before do + user_group.users << user + end + + it 'returns the associated users' do + expect(user_group.users).to include(user) + end + end + + context '#store' do + let(:store) { create(:store, default_cart_user_group: user_group) } + + it 'returns the associated store' do + store.reload + user_group.reload + + expect(user_group.store).to eq(store) + end + end + end +end diff --git a/core/spec/models/spree/user_spec.rb b/core/spec/models/spree/user_spec.rb index 3b8b7dc6496..5365497dc8c 100644 --- a/core/spec/models/spree/user_spec.rb +++ b/core/spec/models/spree/user_spec.rb @@ -157,5 +157,26 @@ def load_orders expect(subject.display_average_order_value).to eq Spree::Money.new(value) end end + + describe "user_group" do + subject { described_class.new(user_group_id:) } + + context "when there is no user_group set" do + let(:user_group_id) { nil } + + it "responds with an empty user_group" do + expect(subject.user_group).to be_nil + end + end + + context "when there is a user_group set" do + let(:user_group) { create(:user_group) } + let(:user_group_id) { user_group.id } + + it "responds with a default_cart_user_group with that user group" do + expect(subject.user_group).to eq(user_group) + end + end + end end end