Files
gitlab-foss/spec/models/work_items/user_preference_spec.rb
2025-07-11 12:09:48 +00:00

127 lines
4.8 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
RSpec.describe WorkItems::UserPreference, type: :model, feature_category: :team_planning do
describe 'associations' do
it { is_expected.to belong_to(:user) }
it { is_expected.to belong_to(:namespace) }
it { is_expected.to belong_to(:work_item_type).class_name('WorkItems::Type').inverse_of(:user_preferences) }
end
describe 'validations' do
let_it_be(:namespace) { build_stubbed(:group) }
describe 'validate sort' do
let_it_be(:sorting_value) { 'due_date_asc' }
it 'is valid when the sorting value is available' do
preferences = described_class.new(namespace: namespace, sort: sorting_value)
expect(WorkItems::SortingKeys)
.to receive(:available?).with(sorting_value, widget_list: nil)
.and_return(true)
expect(preferences).to be_valid
end
it 'is not valid when the sorting value is not available' do
preferences = described_class.new(namespace: namespace, sort: sorting_value)
expect(WorkItems::SortingKeys)
.to receive(:available?).with(sorting_value, widget_list: nil)
.and_return(false)
expect(preferences).not_to be_valid
expect(preferences.errors.full_messages_for(:sort)).to include(
%(Sort value "#{sorting_value}" is not available on #{namespace.full_path})
)
end
it 'is not valid when the sorting value is not available for an existign work item type' do
work_item_type = WorkItems::Type.default_by_type(:incident)
preferences = described_class.new(
namespace: namespace,
work_item_type: work_item_type,
sort: sorting_value
)
expect(WorkItems::SortingKeys)
.to receive(:available?).with(
sorting_value,
widget_list: work_item_type.widget_classes(namespace)
).and_return(false)
expect(preferences).not_to be_valid
expect(preferences.errors.full_messages_for(:sort)).to include(<<~MESSAGE.squish)
Sort value "#{sorting_value}" is not available
on #{namespace.full_path} for work items type #{work_item_type.name}
MESSAGE
end
end
describe 'validate display_settings' do
before do
allow(WorkItems::SortingKeys).to receive(:available?).and_return(true)
end
it 'is valid with an empty display settings hash' do
preferences = described_class.new(namespace: namespace, display_settings: {})
expect(preferences).to be_valid
end
it 'is invalid with properties not defined in the schema' do
invalid_display_settings = { 'invalidProperty' => 'some_value' }
preferences = described_class.new(namespace: namespace, display_settings: invalid_display_settings)
expect(preferences).not_to be_valid
expect(preferences.errors[:display_settings]).to include('must be a valid json schema')
end
context 'with hiddenMetadataKeys property' do
it 'is valid with an empty hiddenMetadataKeys array' do
valid_display_settings = { 'hiddenMetadataKeys' => [] }
preferences = described_class.new(namespace: namespace, display_settings: valid_display_settings)
expect(preferences).to be_valid
end
it 'is valid with valid metadata keys in hiddenMetadataKeys' do
valid_display_settings = {
'hiddenMetadataKeys' => %w[assignee blocked blocking dates health labels milestone popularity weight
comments iteration status]
}
preferences = described_class.new(namespace: namespace, display_settings: valid_display_settings)
expect(preferences).to be_valid
expect(preferences.display_settings['hiddenMetadataKeys']).to contain_exactly('assignee', 'blocked',
'blocking', 'dates', 'health', 'labels', 'milestone', 'popularity', 'weight', 'comments', 'iteration',
'status')
end
it 'is valid with all available metadata keys' do
all_metadata_keys = %w[
assignee blocked blocking dates health
labels milestone popularity weight comments iteration status
]
valid_display_settings = { 'hiddenMetadataKeys' => all_metadata_keys }
preferences = described_class.new(namespace: namespace, display_settings: valid_display_settings)
expect(preferences).to be_valid
end
it 'is invalid with invalid metadata keys' do
invalid_display_settings = {
'hiddenMetadataKeys' => %w[assignee invalid_key]
}
preferences = described_class.new(namespace: namespace, display_settings: invalid_display_settings)
expect(preferences).not_to be_valid
expect(preferences.errors[:display_settings]).to include('must be a valid json schema')
end
end
end
end
end