Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-06-03 03:07:18 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-06-03 03:07:18 +0300
commit77628d9c8306401a73ea3737d97ed479f3f08c0b (patch)
tree4bf136593a616e5003aec8d613beeda52e15bfb9 /spec
parentdf52f8c8af971b336f520e291da02e1ba6a1a9dd (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r--spec/controllers/projects_controller_spec.rb1
-rw-r--r--spec/frontend/fixtures/users.rb21
-rw-r--r--spec/frontend/pages/projects/shared/permissions/components/settings_panel_spec.js9
-rw-r--r--spec/helpers/projects_helper_spec.rb3
-rw-r--r--spec/rubocop/cop/migration/update_column_in_batches_spec.rb85
-rw-r--r--spec/serializers/profile/event_entity_spec.rb45
-rw-r--r--spec/support/shared_contexts/user_contribution_events_shared_context.rb135
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