diff options
Diffstat (limited to 'spec/models/concerns/has_user_type_spec.rb')
-rw-r--r-- | spec/models/concerns/has_user_type_spec.rb | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/spec/models/concerns/has_user_type_spec.rb b/spec/models/concerns/has_user_type_spec.rb new file mode 100644 index 00000000000..f12eee414f9 --- /dev/null +++ b/spec/models/concerns/has_user_type_spec.rb @@ -0,0 +1,86 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe User do + specify 'types consistency checks', :aggregate_failures do + expect(described_class::USER_TYPES.keys) + .to match_array(%w[human ghost alert_bot project_bot support_bot service_user visual_review_bot migration_bot]) + expect(described_class::USER_TYPES).to include(*described_class::BOT_USER_TYPES) + expect(described_class::USER_TYPES).to include(*described_class::NON_INTERNAL_USER_TYPES) + expect(described_class::USER_TYPES).to include(*described_class::INTERNAL_USER_TYPES) + end + + describe 'scopes & predicates' do + User::USER_TYPES.keys.each do |type| + let_it_be(type) { create(:user, username: type, user_type: type) } + end + let(:bots) { User::BOT_USER_TYPES.map { |type| public_send(type) } } + let(:non_internal) { User::NON_INTERNAL_USER_TYPES.map { |type| public_send(type) } } + let(:everyone) { User::USER_TYPES.keys.map { |type| public_send(type) } } + + describe '.humans' do + it 'includes humans only' do + expect(described_class.humans).to match_array([human]) + end + end + + describe '.bots' do + it 'includes all bots' do + expect(described_class.bots).to match_array(bots) + end + end + + describe '.bots_without_project_bot' do + it 'includes all bots except project_bot' do + expect(described_class.bots_without_project_bot).to match_array(bots - [project_bot]) + end + end + + describe '.non_internal' do + it 'includes all non_internal users' do + expect(described_class.non_internal).to match_array(non_internal) + end + end + + describe '.without_ghosts' do + it 'includes everyone except ghosts' do + expect(described_class.without_ghosts).to match_array(everyone - [ghost]) + end + end + + describe '.without_project_bot' do + it 'includes everyone except project_bot' do + expect(described_class.without_project_bot).to match_array(everyone - [project_bot]) + end + end + + describe '#bot?' do + it 'is true for all bot user types and false for others' do + expect(bots).to all(be_bot) + + (everyone - bots).each do |user| + expect(user).not_to be_bot + end + end + end + + describe '#human?' do + it 'is true for humans only' do + expect(human).to be_human + expect(alert_bot).not_to be_human + expect(User.new).to be_human + end + end + + describe '#internal?' do + it 'is true for all internal user types and false for others' do + expect(everyone - non_internal).to all(be_internal) + + non_internal.each do |user| + expect(user).not_to be_internal + end + end + end + end +end |