Skip to content

Commit

Permalink
Introduce Customer and Admin Metadata Restriction Preference
Browse files Browse the repository at this point in the history
This configuration adds the ability to enable or disable metadata restrictions as needed.

Following configurations are possible:
- `meta_data_validation_enabled` : Enables or disables restrictions globally.
  • Loading branch information
JustShah committed Feb 13, 2025
1 parent 69736d3 commit 6a23bc0
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 26 deletions.
6 changes: 5 additions & 1 deletion core/app/models/concerns/spree/metadata.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,15 @@ module Metadata
attribute :customer_metadata, :json, default: {}
attribute :admin_metadata, :json, default: {}

validate :validate_metadata_limits
validate :validate_metadata_limits, if: :validate_metadata_enabled?
end

private

def validate_metadata_enabled?
Spree::Config.meta_data_validation_enabled
end

def validate_metadata_limits
%i[customer_metadata admin_metadata].each { |column| validate_metadata_column(column) }
end
Expand Down
8 changes: 8 additions & 0 deletions core/lib/spree/app_configuration.rb
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,14 @@ class AppConfiguration < Preferences::Configuration
# @return [Integer] Orders to show per-page in the admin (default: +15+)
preference :orders_per_page, :integer, default: 15

# @!attribute [rw] meta_data_validation_enabled
# @return [Boolean] Indicates whether validation for customer and admin metadata columns is enabled.
# When this is set to true, the following preferences will be used to validate the metadata:
# - The maximum number of keys that can be added to the metadata columns (meta_data_max_keys).
# - The maximum length of each key in the metadata columns (meta_data_max_key_length).
# - The maximum length of each value in the metadata columns (meta_data_max_value_length).
# (default: +true+)
preference :meta_data_validation_enabled, :boolean, default: true

# @!attribute [rw] meta_data_max_keys
# @return [Integer] Maximum keys that can be allocated in customer and admin metadata column (default: +6+)
Expand Down
86 changes: 61 additions & 25 deletions core/spec/models/spree/order_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2161,43 +2161,79 @@ def validate(line_item)

%w[customer_metadata admin_metadata].each do |metadata_type|
describe metadata_type.to_s do
it "does not allow more than 6 keys" do
subject.send("#{metadata_type}=", invalid_metadata_keys)
context "when metadata validation is enabled" do
before do
stub_spree_preferences(meta_data_validation_enabled: true)
end

expect(subject).not_to be_valid
expect(subject.errors[metadata_type.to_sym]).to include("must not have more than 6 keys")
end
it "does not allow more than 6 keys" do
subject.send("#{metadata_type}=", invalid_metadata_keys)

it "allow less than 6 keys" do
subject.send("#{metadata_type}=", valid_metadata_keys)
expect(subject).not_to be_valid
expect(subject.errors[metadata_type.to_sym]).to include("must not have more than 6 keys")
end

expect(subject).to be_valid
end
it "allows less than 6 keys" do
subject.send("#{metadata_type}=", valid_metadata_keys)

it "does not allow values longer than 256 characters" do
subject.send("#{metadata_type}=", oversized_value_metadata)
expect(subject).to be_valid
end

expect(subject).not_to be_valid
expect(subject.errors[metadata_type.to_sym]).to include("value for key 'product_details' exceeds 256 characters")
end
it "does not allow values longer than 256 characters" do
subject.send("#{metadata_type}=", oversized_value_metadata)

expect(subject).not_to be_valid
expect(subject.errors[metadata_type.to_sym]).to include("value for key 'product_details' exceeds 256 characters")
end

it "allow values shorter than 256 characters" do
subject.send("#{metadata_type}=", valid_value_metadata)
it "allows values shorter than 256 characters" do
subject.send("#{metadata_type}=", valid_value_metadata)

expect(subject).to be_valid
end
expect(subject).to be_valid
end

it "does not allow keys longer than 16 characters" do
subject.send("#{metadata_type}=", oversized_key_metadata)
it "does not allow keys longer than 16 characters" do
subject.send("#{metadata_type}=", oversized_key_metadata)

expect(subject).not_to be_valid
expect(subject.errors[metadata_type.to_sym]).to include("key 'company_details_for_products' exceeds 16 characters")
expect(subject).not_to be_valid
expect(subject.errors[metadata_type.to_sym]).to include("key 'company_details_for_products' exceeds 16 characters")
end

it "allows keys shorter than 16 characters" do
subject.send("#{metadata_type}=", valid_key_metadata)

expect(subject).to be_valid
end
end

it "allow keys shorter than 16 characters" do
subject.send("#{metadata_type}=", valid_key_metadata)
context "when metadata validation is disabled" do
before do
stub_spree_preferences(meta_data_validation_enabled: false)
end

it "does not validate the metadata" do
subject.send("#{metadata_type}=", invalid_metadata_keys)

expect(subject).to be_valid
end

it "allows more than 6 keys" do
subject.send("#{metadata_type}=", invalid_metadata_keys)

expect(subject).to be_valid
expect(subject).to be_valid
end

it "allows values longer than 256 characters" do
subject.send("#{metadata_type}=", oversized_value_metadata)

expect(subject).to be_valid
end

it "allows keys longer than 16 characters" do
subject.send("#{metadata_type}=", oversized_key_metadata)

expect(subject).to be_valid
end
end
end
end
Expand Down

0 comments on commit 6a23bc0

Please sign in to comment.