mirror of
https://gitlab.com/gitlab-org/gitlab-foss.git
synced 2025-07-29 12:00:32 +00:00
127 lines
4.8 KiB
Ruby
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
|