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>2022-05-26 06:09:21 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2022-05-26 06:09:21 +0300
commit47ef8c6c530ee1cac0e1046b098755ec949da894 (patch)
treed09c3d5598aad53c0f2c721ce237ff8b1db5f7ec /spec
parenteb90b0642d7949bfa03c8e9b5f39d211934fb0b5 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r--spec/models/project_spec.rb52
-rw-r--r--spec/models/protected_tag_spec.rb52
-rw-r--r--spec/requests/projects/issue_links_controller_spec.rb5
-rw-r--r--spec/serializers/linked_project_issue_entity_spec.rb16
4 files changed, 95 insertions, 30 deletions
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index 5e4ffeb8455..b1174d16adb 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -288,41 +288,35 @@ RSpec.describe Project, factory_default: :keep do
end
context 'updating a project' do
- shared_examples 'project update' do
- let_it_be(:project_namespace) { create(:project_namespace) }
- let_it_be(:project) { project_namespace.project }
+ let_it_be(:project_namespace) { create(:project_namespace) }
+ let_it_be(:project) { project_namespace.project }
- context 'when project namespace is not set' do
- before do
- project.update_column(:project_namespace_id, nil)
- project.reload
- end
+ context 'when project has an associated project namespace' do
+ # when FF is disabled creating a project does not create a project_namespace, so we create one
+ it 'project is INVALID when trying to remove project namespace' do
+ project.reload
+ # check that project actually has an associated project namespace
+ expect(project.project_namespace_id).to eq(project_namespace.id)
- it 'updates the project successfully' do
- # pre-check that project does not have a project namespace
- expect(project.project_namespace).to be_nil
+ expect do
+ project.update!(project_namespace_id: nil, path: 'hopefully-valid-path1')
+ end.to raise_error(ActiveRecord::RecordInvalid)
+ expect(project).to be_invalid
+ expect(project.errors.full_messages).to include("Project namespace can't be blank")
+ expect(project.reload.project_namespace).to be_in_sync_with_project(project)
+ end
- project.update!(path: 'hopefully-valid-path2')
+ context 'when same project is being updated in 2 instances' do
+ it 'syncs only changed attributes' do
+ project1 = Project.last
+ project2 = Project.last
- expect(project).to be_persisted
- expect(project).to be_valid
- expect(project.path).to eq('hopefully-valid-path2')
- expect(project.project_namespace).to be_nil
- end
- end
+ project_name = project1.name
+ project_path = project1.path
- context 'when project has an associated project namespace' do
- # when FF is disabled creating a project does not create a project_namespace, so we create one
- it 'project is INVALID when trying to remove project namespace' do
- project.reload
- # check that project actually has an associated project namespace
- expect(project.project_namespace_id).to eq(project_namespace.id)
+ project1.update!(name: project_name + "-1")
+ project2.update!(path: project_path + "-1")
- expect do
- project.update!(project_namespace_id: nil, path: 'hopefully-valid-path1')
- end.to raise_error(ActiveRecord::RecordInvalid)
- expect(project).to be_invalid
- expect(project.errors.full_messages).to include("Project namespace can't be blank")
expect(project.reload.project_namespace).to be_in_sync_with_project(project)
end
end
diff --git a/spec/models/protected_tag_spec.rb b/spec/models/protected_tag_spec.rb
index e5cee6f18cd..b97954c055d 100644
--- a/spec/models/protected_tag_spec.rb
+++ b/spec/models/protected_tag_spec.rb
@@ -11,4 +11,56 @@ RSpec.describe ProtectedTag do
it { is_expected.to validate_presence_of(:project) }
it { is_expected.to validate_presence_of(:name) }
end
+
+ describe '#protected?' do
+ let(:project) { create(:project, :repository) }
+
+ it 'returns true when the tag matches a protected tag via direct match' do
+ create(:protected_tag, project: project, name: 'foo')
+
+ expect(described_class.protected?(project, 'foo')).to eq(true)
+ end
+
+ it 'returns true when the tag matches a protected tag via wildcard match' do
+ create(:protected_tag, project: project, name: 'production/*')
+
+ expect(described_class.protected?(project, 'production/some-tag')).to eq(true)
+ end
+
+ it 'returns false when the tag does not match a protected tag via direct match' do
+ expect(described_class.protected?(project, 'foo')).to eq(false)
+ end
+
+ it 'returns false when the tag does not match a protected tag via wildcard match' do
+ create(:protected_tag, project: project, name: 'production/*')
+
+ expect(described_class.protected?(project, 'staging/some-tag')).to eq(false)
+ end
+
+ it 'returns false when tag name is nil' do
+ expect(described_class.protected?(project, nil)).to eq(false)
+ end
+
+ context 'with caching', :request_store do
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:protected_tag) { create(:protected_tag, project: project, name: 'foo') }
+
+ it 'correctly invalidates a cache' do
+ expect(described_class.protected?(project, 'foo')).to eq(true)
+ expect(described_class.protected?(project, 'bar')).to eq(false)
+
+ create(:protected_tag, project: project, name: 'bar')
+
+ expect(described_class.protected?(project, 'bar')).to eq(true)
+ end
+
+ it 'correctly uses the cached version' do
+ expect(project).to receive(:protected_tags).once.and_call_original
+
+ 2.times do
+ expect(described_class.protected?(project, protected_tag.name)).to eq(true)
+ end
+ end
+ end
+ end
end
diff --git a/spec/requests/projects/issue_links_controller_spec.rb b/spec/requests/projects/issue_links_controller_spec.rb
index 3447ff83ed8..81fd1adb1fd 100644
--- a/spec/requests/projects/issue_links_controller_spec.rb
+++ b/spec/requests/projects/issue_links_controller_spec.rb
@@ -32,7 +32,10 @@ RSpec.describe Projects::IssueLinksController do
get namespace_project_issue_links_path(issue_links_params)
expect(json_response.count).to eq(1)
- expect(json_response.first).to include('path' => project_work_items_path(issue_b.project, issue_b.id))
+ expect(json_response.first).to include(
+ 'path' => project_work_items_path(issue_b.project, issue_b.id),
+ 'type' => 'TASK'
+ )
end
end
end
diff --git a/spec/serializers/linked_project_issue_entity_spec.rb b/spec/serializers/linked_project_issue_entity_spec.rb
index b28b00bd8e1..c4646754f16 100644
--- a/spec/serializers/linked_project_issue_entity_spec.rb
+++ b/spec/serializers/linked_project_issue_entity_spec.rb
@@ -25,6 +25,22 @@ RSpec.describe LinkedProjectIssueEntity do
it { is_expected.to include(link_type: 'relates_to') }
end
+ describe 'type' do
+ it 'returns the issue type' do
+ expect(serialized_entity).to include(type: 'ISSUE')
+ end
+
+ context 'when related issue is a task' do
+ before do
+ related_issue.update!(issue_type: :task, work_item_type: WorkItems::Type.default_by_type(:task))
+ end
+
+ it 'returns a work item issue type' do
+ expect(serialized_entity).to include(type: 'TASK')
+ end
+ end
+ end
+
describe 'path' do
it 'returns an issue path' do
expect(serialized_entity).to include(path: project_issue_path(related_issue.project, related_issue.iid))