diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-06-03 03:07:18 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-06-03 03:07:18 +0300 |
commit | 77628d9c8306401a73ea3737d97ed479f3f08c0b (patch) | |
tree | 4bf136593a616e5003aec8d613beeda52e15bfb9 /spec | |
parent | df52f8c8af971b336f520e291da02e1ba6a1a9dd (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
7 files changed, 251 insertions, 48 deletions
diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb index 8544ea8524d..c6bedcc95a7 100644 --- a/spec/controllers/projects_controller_spec.rb +++ b/spec/controllers/projects_controller_spec.rb @@ -985,6 +985,7 @@ RSpec.describe ProjectsController, feature_category: :groups_and_projects do releases_access_level monitor_access_level infrastructure_access_level + model_experiments_access_level ] end diff --git a/spec/frontend/fixtures/users.rb b/spec/frontend/fixtures/users.rb index fb028a2e055..90a6895af91 100644 --- a/spec/frontend/fixtures/users.rb +++ b/spec/frontend/fixtures/users.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Users (GraphQL fixtures)', feature_category: :user_profile do +RSpec.describe 'Users (JavaScript fixtures)', feature_category: :user_profile do include JavaScriptFixturesHelpers include ApiHelpers @@ -17,6 +17,25 @@ RSpec.describe 'Users (GraphQL fixtures)', feature_category: :user_profile do end end + describe UsersController, '(JavaScript fixtures)', type: :controller do + let_it_be(:group) { create(:group) } + let_it_be(:project) { create(:project_empty_repo, group: group) } + + include_context 'with user contribution events' + + before do + group.add_owner(user) + project.add_maintainer(user) + sign_in(user) + end + + it 'controller/users/activity.json' do + get :activity, params: { username: user.username, limit: 50 }, format: :json + + expect(response).to be_successful + end + end + describe GraphQL::Query, type: :request do include GraphqlHelpers diff --git a/spec/frontend/pages/projects/shared/permissions/components/settings_panel_spec.js b/spec/frontend/pages/projects/shared/permissions/components/settings_panel_spec.js index b6fb2c32cc0..16e23472eb9 100644 --- a/spec/frontend/pages/projects/shared/permissions/components/settings_panel_spec.js +++ b/spec/frontend/pages/projects/shared/permissions/components/settings_panel_spec.js @@ -132,6 +132,8 @@ describe('Settings Panel', () => { wrapper.findComponent({ ref: 'infrastructure-settings' }); const findReleasesSettings = () => wrapper.findComponent({ ref: 'environments-settings' }); const findMonitorSettings = () => wrapper.findComponent({ ref: 'monitor-settings' }); + const findModelExperimentsSettings = () => + wrapper.findComponent({ ref: 'model-experiments-settings' }); describe('Project Visibility', () => { it('should set the project visibility help path', () => { @@ -725,4 +727,11 @@ describe('Settings Panel', () => { ); }); }); + describe('Model experiments', () => { + it('shows model experiments toggle', () => { + wrapper = mountComponent({}); + + expect(findModelExperimentsSettings().exists()).toBe(true); + }); + }); }); diff --git a/spec/helpers/projects_helper_spec.rb b/spec/helpers/projects_helper_spec.rb index 9c4cfa3038f..75fb4b1d1e6 100644 --- a/spec/helpers/projects_helper_spec.rb +++ b/spec/helpers/projects_helper_spec.rb @@ -1044,7 +1044,8 @@ RSpec.describe ProjectsHelper, feature_category: :source_code_management do environmentsAccessLevel: project.project_feature.environments_access_level, featureFlagsAccessLevel: project.project_feature.feature_flags_access_level, releasesAccessLevel: project.project_feature.releases_access_level, - infrastructureAccessLevel: project.project_feature.infrastructure_access_level + infrastructureAccessLevel: project.project_feature.infrastructure_access_level, + modelExperimentsAccessLevel: project.project_feature.model_experiments_access_level ) end diff --git a/spec/rubocop/cop/migration/update_column_in_batches_spec.rb b/spec/rubocop/cop/migration/update_column_in_batches_spec.rb index 25381fc0281..131a9a2712b 100644 --- a/spec/rubocop/cop/migration/update_column_in_batches_spec.rb +++ b/spec/rubocop/cop/migration/update_column_in_batches_spec.rb @@ -4,50 +4,42 @@ require 'rubocop_spec_helper' require_relative '../../../../rubocop/cop/migration/update_column_in_batches' -RSpec.describe RuboCop::Cop::Migration::UpdateColumnInBatches do - let(:tmp_rails_root) { rails_root_join('tmp', 'rails_root') } +RSpec.describe RuboCop::Cop::Migration::UpdateColumnInBatches, feature_category: :database do + let(:tmp_rails_root) { Pathname.new(rails_root_join('tmp', 'rails_root')) } let(:migration_code) do - <<-END - def up - update_column_in_batches(:projects, :name, "foo") do |table, query| - query.where(table[:name].eq(nil)) + <<~RUBY + def up + update_column_in_batches(:projects, :name, "foo") do |table, query| + query.where(table[:name].eq(nil)) + end end - end - END + RUBY end + let(:spec_filepath) { 'spec/migrations/my_super_migration_spec.rb' } + before do + tmp_rails_root.mkpath allow(cop).to receive(:rails_root).and_return(tmp_rails_root) end + after do - FileUtils.rm_rf(tmp_rails_root) + tmp_rails_root.rmtree end - let(:spec_filepath) { File.join(tmp_rails_root, 'spec', 'migrations', 'my_super_migration_spec.rb') } - - context 'outside of a migration' do + context 'when outside of a migration' do it 'does not register any offenses' do expect_no_offenses(migration_code) end end - shared_context 'with a migration file' do + shared_examples 'a migration file with no spec file' do before do - FileUtils.mkdir_p(File.dirname(migration_filepath)) - @migration_file = File.new(migration_filepath, 'w+') + touch_file(migration_filepath) end - after do - @migration_file.close - end - end - - shared_examples 'a migration file with no spec file' do - include_context 'with a migration file' - - let(:relative_spec_filepath) { Pathname.new(spec_filepath).relative_path_from(tmp_rails_root) } it 'registers an offense when using update_column_in_batches' do - expect_offense(<<~RUBY, @migration_file) + expect_offense(<<~RUBY, tmp_rails_root.join(migration_filepath).to_path) def up update_column_in_batches(:projects, :name, "foo") do |table, query| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Migration running `update_column_in_batches` [...] @@ -59,14 +51,9 @@ RSpec.describe RuboCop::Cop::Migration::UpdateColumnInBatches do end shared_examples 'a migration file with a spec file' do - include_context 'with a migration file' - before do - FileUtils.mkdir_p(File.dirname(spec_filepath)) - @spec_file = File.new(spec_filepath, 'w+') - end - after do - @spec_file.close + touch_file(migration_filepath) + touch_file(spec_filepath) end it 'does not register any offenses' do @@ -75,34 +62,56 @@ RSpec.describe RuboCop::Cop::Migration::UpdateColumnInBatches do end context 'when in migration' do - let(:migration_filepath) { File.join(tmp_rails_root, 'db', 'migrate', '20121220064453_my_super_migration.rb') } + let(:migration_filepath) { 'db/migrate/20121220064453_my_super_migration.rb' } it_behaves_like 'a migration file with no spec file' it_behaves_like 'a migration file with a spec file' end context 'when in a post migration' do - let(:migration_filepath) { File.join(tmp_rails_root, 'db', 'post_migrate', '20121220064453_my_super_migration.rb') } + let(:migration_filepath) { 'db/post_migrate/20121220064453_my_super_migration.rb' } it_behaves_like 'a migration file with no spec file' it_behaves_like 'a migration file with a spec file' end - context 'EE migrations' do - let(:spec_filepath) { File.join(tmp_rails_root, 'ee', 'spec', 'migrations', 'my_super_migration_spec.rb') } + context 'for EE migrations' do + let(:spec_filepath) { 'ee/spec/migrations/my_super_migration_spec.rb' } context 'when in a migration' do - let(:migration_filepath) { File.join(tmp_rails_root, 'ee', 'db', 'migrate', '20121220064453_my_super_migration.rb') } + let(:migration_filepath) { 'ee/db/migrate/20121220064453_my_super_migration.rb' } it_behaves_like 'a migration file with no spec file' it_behaves_like 'a migration file with a spec file' end context 'when in a post migration' do - let(:migration_filepath) { File.join(tmp_rails_root, 'ee', 'db', 'post_migrate', '20121220064453_my_super_migration.rb') } + let(:migration_filepath) { 'ee/db/post_migrate/20121220064453_my_super_migration.rb' } it_behaves_like 'a migration file with no spec file' it_behaves_like 'a migration file with a spec file' end end + + describe '#external_dependency_checksum' do + subject { cop.external_dependency_checksum } + + before do + touch_file('spec/migrations/foo_spec.rb') + touch_file('spec/migrations/a/nested/bar_spec.rb') + touch_file('ee/spec/migrations/bar_spec.rb') + end + + # The computed SHA from sorted list of filenames above + it { is_expected.to eq('833525c0d9c95d066dbfc8d973153b44a1f8a42694b54de3aaa854cb9f72a6bd') } + end + + private + + def touch_file(path) + tmp_rails_root.join(path).tap do |full_path| + full_path.dirname.mkpath + full_path.write('') + end + end end diff --git a/spec/serializers/profile/event_entity_spec.rb b/spec/serializers/profile/event_entity_spec.rb index 1551fc76466..dbd748d3b11 100644 --- a/spec/serializers/profile/event_entity_spec.rb +++ b/spec/serializers/profile/event_entity_spec.rb @@ -7,6 +7,7 @@ RSpec.describe Profile::EventEntity, feature_category: :user_profile do let_it_be(:project) { build(:project_empty_repo, group: group) } let_it_be(:user) { create(:user) } # rubocop:disable RSpec/FactoryBot/AvoidCreate let_it_be(:merge_request) { create(:merge_request, source_project: project, target_project: project) } # rubocop:disable RSpec/FactoryBot/AvoidCreate + let_it_be(:note) { build(:note_on_merge_request, noteable: merge_request, project: project) } let(:target_user) { user } let(:event) { build(:event, :merged, author: user, project: project, target: merge_request) } @@ -24,7 +25,7 @@ RSpec.describe Profile::EventEntity, feature_category: :user_profile do expect(subject[:action]).to eq(event.action) expect(subject[:author][:id]).to eq(target_user.id) expect(subject[:author][:name]).to eq(target_user.name) - expect(subject[:author][:path]).to eq(target_user.username) + expect(subject[:author][:username]).to eq(target_user.username) end context 'for push events' do @@ -39,6 +40,8 @@ RSpec.describe Profile::EventEntity, feature_category: :user_profile do expect(subject[:ref][:count]).to eq(event.ref_count) expect(subject[:ref][:name]).to eq(event.ref_name) expect(subject[:ref][:path]).to be_nil + expect(subject[:ref][:is_new]).to be false + expect(subject[:ref][:is_removed]).to be false end shared_examples 'returns ref path' do @@ -90,19 +93,26 @@ RSpec.describe Profile::EventEntity, feature_category: :user_profile do end end - context 'with target' do - let_it_be(:note) { build(:note_on_merge_request, :with_attachment, noteable: merge_request, project: project) } + context 'for noteable events' do + let(:event) { build(:event, :commented, project: project, target: note, author: target_user) } + + it 'exposes noteable fields' do + expect(subject[:noteable][:type]).to eq(note.noteable_type) + expect(subject[:noteable][:reference_link_text]).to eq(note.noteable.reference_link_text) + expect(subject[:noteable][:web_url]).to be_present + expect(subject[:noteable][:first_line_in_markdown]).to be_present + end + end + context 'with target' do context 'when target does not responds to :reference_link_text' do let(:event) { build(:event, :commented, project: project, target: note, author: target_user) } it 'exposes target fields' do expect(subject[:target]).not_to include(:reference_link_text) - expect(subject[:target][:target_type]).to eq(note.class.to_s) - expect(subject[:target][:target_url]).to be_present + expect(subject[:target][:type]).to eq(note.class.to_s) + expect(subject[:target][:web_url]).to be_present expect(subject[:target][:title]).to eq(note.title) - expect(subject[:target][:first_line_in_markdown]).to be_present - expect(subject[:target][:attachment][:url]).to eq(note.attachment.url) end end @@ -111,6 +121,25 @@ RSpec.describe Profile::EventEntity, feature_category: :user_profile do expect(subject[:target][:reference_link_text]).to eq(merge_request.reference_link_text) end end + + context 'when target is a wiki page' do + let(:event) { build(:wiki_page_event, :created, project: project, author: target_user) } + + it 'exposes web_url' do + expect(subject[:target][:web_url]).to be_present + end + end + + context 'when target is a work item' do + let(:incident) { create(:work_item, :incident, author: target_user, project: project) } # rubocop:disable RSpec/FactoryBot/AvoidCreate + let(:event) do + build(:event, :created, :for_work_item, author: target_user, project: project, target: incident) + end + + it 'exposes `issue_type`' do + expect(subject[:target][:issue_type]).to eq('incident') + end + end end context 'with resource parent' do @@ -134,7 +163,7 @@ RSpec.describe Profile::EventEntity, feature_category: :user_profile do expect(subject[:action]).to eq('private') expect(subject[:author][:id]).to eq(target_user.id) expect(subject[:author][:name]).to eq(target_user.name) - expect(subject[:author][:path]).to eq(target_user.username) + expect(subject[:author][:username]).to eq(target_user.username) is_expected.not_to include(:ref, :commit, :target, :resource_parent) end diff --git a/spec/support/shared_contexts/user_contribution_events_shared_context.rb b/spec/support/shared_contexts/user_contribution_events_shared_context.rb new file mode 100644 index 00000000000..681c2f0d811 --- /dev/null +++ b/spec/support/shared_contexts/user_contribution_events_shared_context.rb @@ -0,0 +1,135 @@ +# frozen_string_literal: true + +# See https://docs.gitlab.com/ee/user/profile/contributions_calendar.html#user-contribution-events +# rubocop:disable RSpec/MultipleMemoizedHelpers +RSpec.shared_context 'with user contribution events' do + # targets + + # issue + let_it_be(:issue) { create(:issue, project: project) } + + # merge requeest + let_it_be(:merge_request) { create(:merge_request, source_project: project, target_project: project) } + + # milestone + let_it_be(:milestone) { create(:milestone, project: project) } + + # note + let_it_be(:note_on_issue) { create(:note_on_issue, noteable: issue, project: project) } + + # design + let_it_be(:design) { create(:design, project: project, issue: issue, author: user) } + + # work item + let_it_be(:incident) { create(:work_item, :incident, author: user, project: project) } + let_it_be(:test_case) { create(:work_item, :test_case, author: user, project: project) } + let_it_be(:requirement) { create(:work_item, :requirement, author: user, project: project) } + let_it_be(:task) { create(:work_item, :task, author: user, project: project) } + + # events + + # approved + let_it_be(:approved_merge_request_event) do + create(:event, :approved, author: user, project: project, target: merge_request) + end + + # closed + let_it_be(:closed_issue_event) { create(:event, :closed, author: user, project: project, target: issue) } + let_it_be(:closed_milestone_event) { create(:event, :closed, author: user, project: project, target: milestone) } + let_it_be(:closed_incident_event) { create(:event, :closed, author: user, project: project, target: incident) } + let_it_be(:closed_test_case_event) { create(:event, :closed, author: user, project: project, target: test_case) } + let_it_be(:closed_merge_request_event) do + create(:event, :closed, author: user, project: project, target: merge_request) + end + + # commented + let_it_be(:commented_event) do + create(:event, :commented, author: user, project: project, target: note_on_issue) + end + + # created + let_it_be(:created_issue_event) { create(:event, :created, author: user, project: project, target: issue) } + let_it_be(:created_milestone_event) { create(:event, :created, author: user, project: project, target: milestone) } + let_it_be(:created_design_event) { create(:design_event, project: project, author: user) } + let_it_be(:created_project_event) { create(:event, :created, project: project, author: user) } + let_it_be(:created_wiki_page_event) { create(:wiki_page_event, :created, project: project, author: user) } + let_it_be(:created_incident_event) do + create(:event, :created, :for_work_item, author: user, project: project, target: incident) + end + + let_it_be(:created_test_case_event) do + create(:event, :created, :for_work_item, author: user, project: project, target: test_case) + end + + let_it_be(:created_requirement_event) do + create(:event, :created, :for_work_item, author: user, project: project, target: requirement) + end + + let_it_be(:created_task_event) do + create(:event, :created, :for_work_item, author: user, project: project, target: task) + end + + let_it_be(:created_merge_request_event) do + create(:event, :created, author: user, project: project, target: merge_request) + end + + # destroyed + let_it_be(:destroyed_design_event) { create(:event, :destroyed, project: project, author: user, target: design) } + let_it_be(:destroyed_wiki_page_event) { create(:wiki_page_event, :destroyed, project: project, author: user) } + let_it_be(:destroyed_milestone_event) do + create(:event, :destroyed, author: user, project: project, target: milestone) + end + + # expired + let_it_be(:expired_event) { create(:event, :expired, project: project, author: user) } + + # joined + let_it_be(:joined_event) { create(:event, :joined, project: project, author: user) } + + # left + let_it_be(:left_event) { create(:event, :left, project: project, author: user) } + + # merged + let_it_be(:merged_merge_request_event) do + create(:event, :merged, author: user, project: project, target: merge_request) + end + + # pushed + let_it_be(:push_event_payload_pushed) do + event = create(:push_event, project: project, author: user) + create(:push_event_payload, event: event) + event + end + + let_it_be(:push_event_payload_created) do + event = create(:push_event, project: project, author: user) + create(:push_event_payload, event: event, action: :created) + event + end + + let_it_be(:push_event_payload_removed) do + event = create(:push_event, project: project, author: user) + create(:push_event_payload, event: event, action: :removed) + event + end + + let_it_be(:bulk_push_event) do + event = create(:push_event, project: project, author: user) + create(:push_event_payload, event: event, commit_count: 5, commit_from: '83c6aa31482b9076531ed3a880e75627fd6b335c') + event + end + + # reopened + let_it_be(:reopened_issue_event) { create(:event, :reopened, author: user, project: project, target: issue) } + let_it_be(:reopened_milestone_event) { create(:event, :reopened, author: user, project: project, target: milestone) } + let_it_be(:reopened_incident_event) { create(:event, :reopened, author: user, project: project, target: incident) } + let_it_be(:reopened_test_case_event) { create(:event, :reopened, author: user, project: project, target: test_case) } + let_it_be(:reopened_merge_request_event) do + create(:event, :reopened, author: user, project: project, target: merge_request) + end + + # updated + let_it_be(:updated_wiki_page_event) { create(:wiki_page_event, :updated, project: project, author: user) } + let_it_be(:updated_design_event) { create(:event, :updated, project: project, author: user, target: design) } +end +# rubocop:enable RSpec/MultipleMemoizedHelpers |