summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-09-11 15:08:30 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-09-11 15:08:30 +0000
commit3d6d338697a186496eecffc43a389106bfd60527 (patch)
treefdb1ac5ba6a449bb65eed73e9c65bc7d56be16dc /spec
parent0eaa82ad61d2fda42b2dd5cf58cc08654b2d69ef (diff)
downloadgitlab-ce-3d6d338697a186496eecffc43a389106bfd60527.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r--spec/controllers/projects/snippets_controller_spec.rb54
-rw-r--r--spec/factories/metrics/users_starred_dashboards.rb (renamed from spec/factories/metrics/users_starred_dasboards.rb)0
-rw-r--r--spec/features/admin/admin_users_spec.rb2
-rw-r--r--spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js2
-rw-r--r--spec/frontend/projects/settings_service_desk/components/service_desk_setting_spec.js2
-rw-r--r--spec/frontend/vue_shared/components/file_finder/index_spec.js6
-rw-r--r--spec/lib/gitlab/import_export/all_models.yml1
-rw-r--r--spec/lib/gitlab/import_export/safe_model_attributes.yml1
-rw-r--r--spec/models/merge_request_spec.rb26
-rw-r--r--spec/models/resource_iteration_event_spec.rb17
-rw-r--r--spec/models/snippet_spec.rb183
-rw-r--r--spec/services/merge_requests/cleanup_refs_service_spec.rb34
12 files changed, 168 insertions, 160 deletions
diff --git a/spec/controllers/projects/snippets_controller_spec.rb b/spec/controllers/projects/snippets_controller_spec.rb
index 9c864c413f2..d0e412dfdb8 100644
--- a/spec/controllers/projects/snippets_controller_spec.rb
+++ b/spec/controllers/projects/snippets_controller_spec.rb
@@ -6,12 +6,12 @@ RSpec.describe Projects::SnippetsController do
include Gitlab::Routing
let_it_be(:user) { create(:user) }
- let_it_be(:user2) { create(:user) }
- let(:project) { create(:project_empty_repo, :public) }
+ let_it_be(:other_user) { create(:user) }
+ let_it_be(:project) { create(:project_empty_repo, :public) }
before do
project.add_maintainer(user)
- project.add_maintainer(user2)
+ project.add_developer(other_user)
end
describe 'GET #index' do
@@ -47,7 +47,7 @@ RSpec.describe Projects::SnippetsController do
end
context 'when the project snippet is private' do
- let!(:project_snippet) { create(:project_snippet, :private, project: project, author: user) }
+ let_it_be(:project_snippet) { create(:project_snippet, :private, project: project, author: user) }
context 'when anonymous' do
it 'does not include the private snippet' do
@@ -59,11 +59,9 @@ RSpec.describe Projects::SnippetsController do
end
context 'when signed in as the author' do
- before do
+ it 'renders the snippet' do
sign_in(user)
- end
- it 'renders the snippet' do
subject
expect(assigns(:snippets)).to include(project_snippet)
@@ -72,11 +70,9 @@ RSpec.describe Projects::SnippetsController do
end
context 'when signed in as a project member' do
- before do
- sign_in(user2)
- end
-
it 'renders the snippet' do
+ sign_in(other_user)
+
subject
expect(assigns(:snippets)).to include(project_snippet)
@@ -171,7 +167,6 @@ RSpec.describe Projects::SnippetsController do
end
describe 'PUT #update' do
- let(:project) { create :project, :public }
let(:visibility_level) { Snippet::PUBLIC }
let(:snippet) { create :project_snippet, author: user, project: project, visibility_level: visibility_level }
@@ -297,7 +292,7 @@ RSpec.describe Projects::SnippetsController do
end
describe 'POST #mark_as_spam' do
- let(:snippet) { create(:project_snippet, :private, project: project, author: user) }
+ let_it_be(:snippet) { create(:project_snippet, :private, project: project, author: user) }
before do
allow_next_instance_of(Spam::AkismetService) do |instance|
@@ -345,7 +340,7 @@ RSpec.describe Projects::SnippetsController do
%w[show raw].each do |action|
describe "GET ##{action}" do
context 'when the project snippet is private' do
- let(:project_snippet) { create(:project_snippet, :private, :repository, project: project, author: user) }
+ let_it_be(:project_snippet) { create(:project_snippet, :private, :repository, project: project, author: user) }
subject { get action, params: { namespace_id: project.namespace, project_id: project, id: project_snippet.to_param } }
@@ -367,7 +362,7 @@ RSpec.describe Projects::SnippetsController do
context 'when signed in as a project member' do
before do
- sign_in(user2)
+ sign_in(other_user)
end
it_behaves_like 'successful response'
@@ -480,9 +475,8 @@ RSpec.describe Projects::SnippetsController do
subject { get :raw, params: params }
context 'when repository is empty' do
- let(:content) { "first line\r\nsecond line\r\nthird line" }
- let(:formatted_content) { content.gsub(/\r\n/, "\n") }
- let(:project_snippet) do
+ let_it_be(:content) { "first line\r\nsecond line\r\nthird line" }
+ let_it_be(:project_snippet) do
create(
:project_snippet, :public, :empty_repo,
project: project,
@@ -491,6 +485,8 @@ RSpec.describe Projects::SnippetsController do
)
end
+ let(:formatted_content) { content.gsub(/\r\n/, "\n") }
+
context 'CRLF line ending' do
before do
allow_next_instance_of(Blob) do |instance|
@@ -517,7 +513,7 @@ RSpec.describe Projects::SnippetsController do
end
context 'when repository is not empty' do
- let(:project_snippet) do
+ let_it_be(:project_snippet) do
create(
:project_snippet, :public, :repository,
project: project,
@@ -539,7 +535,7 @@ RSpec.describe Projects::SnippetsController do
end
describe 'DELETE #destroy' do
- let!(:snippet) { create(:project_snippet, :private, project: project, author: user) }
+ let_it_be(:snippet) { create(:project_snippet, :private, project: project, author: user) }
let(:params) do
{
@@ -549,20 +545,22 @@ RSpec.describe Projects::SnippetsController do
}
end
+ subject { delete :destroy, params: params }
+
context 'when current user has ability to destroy the snippet' do
before do
sign_in(user)
end
it 'removes the snippet' do
- delete :destroy, params: params
+ subject
expect { snippet.reload }.to raise_error(ActiveRecord::RecordNotFound)
end
context 'when snippet is succesfuly destroyed' do
it 'redirects to the project snippets page' do
- delete :destroy, params: params
+ subject
expect(response).to redirect_to(project_snippets_path(project))
end
@@ -575,7 +573,7 @@ RSpec.describe Projects::SnippetsController do
end
it 'renders the snippet page with errors' do
- delete :destroy, params: params
+ subject
expect(flash[:alert]).to eq('Failed to remove snippet.')
expect(response).to redirect_to(project_snippet_path(project, snippet))
@@ -584,14 +582,10 @@ RSpec.describe Projects::SnippetsController do
end
context 'when current_user does not have ability to destroy the snippet' do
- let(:another_user) { create(:user) }
-
- before do
- sign_in(another_user)
- end
-
it 'responds with status 404' do
- delete :destroy, params: params
+ sign_in(other_user)
+
+ subject
expect(response).to have_gitlab_http_status(:not_found)
end
diff --git a/spec/factories/metrics/users_starred_dasboards.rb b/spec/factories/metrics/users_starred_dashboards.rb
index 06fe7735e9a..06fe7735e9a 100644
--- a/spec/factories/metrics/users_starred_dasboards.rb
+++ b/spec/factories/metrics/users_starred_dashboards.rb
diff --git a/spec/features/admin/admin_users_spec.rb b/spec/features/admin/admin_users_spec.rb
index 55c92fa353e..a37210d2acc 100644
--- a/spec/features/admin/admin_users_spec.rb
+++ b/spec/features/admin/admin_users_spec.rb
@@ -537,7 +537,7 @@ RSpec.describe "Admin::Users" do
it 'allows group membership to be revoked', :js do
page.within(first('.group_member')) do
- accept_confirm { find('.btn-remove').click }
+ accept_confirm { find('.btn[data-testid="remove-user"]').click }
end
wait_for_requests
diff --git a/spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js b/spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js
index 4c873bdfd60..0f3b699f6b2 100644
--- a/spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js
+++ b/spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js
@@ -195,7 +195,7 @@ describe('ServiceDeskRoot', () => {
.$nextTick()
.then(waitForPromises)
.then(() => {
- expect(wrapper.html()).toContain('Template was successfully saved.');
+ expect(wrapper.html()).toContain('Changes were successfully made.');
});
});
diff --git a/spec/frontend/projects/settings_service_desk/components/service_desk_setting_spec.js b/spec/frontend/projects/settings_service_desk/components/service_desk_setting_spec.js
index 2ea0957b347..cb46751f66a 100644
--- a/spec/frontend/projects/settings_service_desk/components/service_desk_setting_spec.js
+++ b/spec/frontend/projects/settings_service_desk/components/service_desk_setting_spec.js
@@ -163,7 +163,7 @@ describe('ServiceDeskSetting', () => {
},
});
- expect(wrapper.find('button.btn-success').text()).toContain('Save template');
+ expect(wrapper.find('button.btn-success').text()).toContain('Save changes');
});
it('emits a save event with the chosen template when the save button is clicked', () => {
diff --git a/spec/frontend/vue_shared/components/file_finder/index_spec.js b/spec/frontend/vue_shared/components/file_finder/index_spec.js
index 43208568ac1..a68af2d1828 100644
--- a/spec/frontend/vue_shared/components/file_finder/index_spec.js
+++ b/spec/frontend/vue_shared/components/file_finder/index_spec.js
@@ -84,7 +84,7 @@ describe('File finder item spec', () => {
waitForPromises()
.then(() => {
- vm.$el.querySelector('.dropdown-input-clear').click();
+ vm.clearSearchInput();
})
.then(waitForPromises)
.then(() => {
@@ -94,13 +94,13 @@ describe('File finder item spec', () => {
.catch(done.fail);
});
- it('clear button focues search input', done => {
+ it('clear button focuses search input', done => {
jest.spyOn(vm.$refs.searchInput, 'focus').mockImplementation(() => {});
vm.searchText = 'index';
waitForPromises()
.then(() => {
- vm.$el.querySelector('.dropdown-input-clear').click();
+ vm.clearSearchInput();
})
.then(waitForPromises)
.then(() => {
diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml
index d6cfadd39bf..bfdc6c959d3 100644
--- a/spec/lib/gitlab/import_export/all_models.yml
+++ b/spec/lib/gitlab/import_export/all_models.yml
@@ -130,6 +130,7 @@ merge_requests:
- resource_label_events
- resource_milestone_events
- resource_state_events
+- resource_iteration_events
- label_links
- labels
- last_edited_by
diff --git a/spec/lib/gitlab/import_export/safe_model_attributes.yml b/spec/lib/gitlab/import_export/safe_model_attributes.yml
index a108bc94da5..5ca7c5b7a91 100644
--- a/spec/lib/gitlab/import_export/safe_model_attributes.yml
+++ b/spec/lib/gitlab/import_export/safe_model_attributes.yml
@@ -206,6 +206,7 @@ MergeRequest:
- head_pipeline_id
- discussion_locked
- allow_maintainer_to_push
+- merge_ref_sha
MergeRequestDiff:
- id
- state
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index cbc54b5d20f..98f709a0610 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -4278,4 +4278,30 @@ RSpec.describe MergeRequest, factory_default: :keep do
expect(merge_request.allows_reviewers?).to be(true)
end
end
+
+ describe '#merge_ref_head' do
+ let(:merge_request) { create(:merge_request) }
+
+ context 'when merge_ref_sha is not present' do
+ let!(:result) do
+ MergeRequests::MergeToRefService
+ .new(merge_request.project, merge_request.author)
+ .execute(merge_request)
+ end
+
+ it 'returns the commit based on merge ref path' do
+ expect(merge_request.merge_ref_head.id).to eq(result[:commit_id])
+ end
+ end
+
+ context 'when merge_ref_sha is present' do
+ before do
+ merge_request.update!(merge_ref_sha: merge_request.project.repository.commit.id)
+ end
+
+ it 'returns the commit based on cached merge_ref_sha' do
+ expect(merge_request.merge_ref_head.id).to eq(merge_request.merge_ref_sha)
+ end
+ end
+ end
end
diff --git a/spec/models/resource_iteration_event_spec.rb b/spec/models/resource_iteration_event_spec.rb
deleted file mode 100644
index fe1310d7bf1..00000000000
--- a/spec/models/resource_iteration_event_spec.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe ResourceIterationEvent, type: :model do
- it_behaves_like 'a resource event'
- it_behaves_like 'a resource event for issues'
- it_behaves_like 'a resource event for merge requests'
-
- it_behaves_like 'having unique enum values'
- it_behaves_like 'timebox resource event validations'
- it_behaves_like 'timebox resource event actions'
-
- describe 'associations' do
- it { is_expected.to belong_to(:iteration) }
- end
-end
diff --git a/spec/models/snippet_spec.rb b/spec/models/snippet_spec.rb
index 248957a43e0..79116a8a7df 100644
--- a/spec/models/snippet_spec.rb
+++ b/spec/models/snippet_spec.rb
@@ -133,10 +133,10 @@ RSpec.describe Snippet do
end
describe '#file_name' do
- let(:project) { create(:project) }
+ let(:snippet) { build(:snippet, file_name: file_name) }
context 'file_name is nil' do
- let(:snippet) { create(:snippet, project: project, file_name: nil) }
+ let(:file_name) { nil }
it 'returns an empty string' do
expect(snippet.file_name).to eq ''
@@ -144,10 +144,10 @@ RSpec.describe Snippet do
end
context 'file_name is not nil' do
- let(:snippet) { create(:snippet, project: project, file_name: 'foo.txt') }
+ let(:file_name) { 'foo.txt' }
it 'returns the file_name' do
- expect(snippet.file_name).to eq 'foo.txt'
+ expect(snippet.file_name).to eq file_name
end
end
end
@@ -161,7 +161,7 @@ RSpec.describe Snippet do
end
describe '.search' do
- let(:snippet) { create(:snippet, title: 'test snippet', description: 'description') }
+ let_it_be(:snippet) { create(:snippet, title: 'test snippet', description: 'description') }
it 'returns snippets with a matching title' do
expect(described_class.search(snippet.title)).to eq([snippet])
@@ -219,25 +219,23 @@ RSpec.describe Snippet do
end
describe '.with_optional_visibility' do
+ let_it_be(:public_snippet) { create(:snippet, :public) }
+ let_it_be(:private_snippet) { create(:snippet, :private) }
+
context 'when a visibility level is provided' do
it 'returns snippets with the given visibility' do
- create(:snippet, :private)
-
- snippet = create(:snippet, :public)
snippets = described_class
.with_optional_visibility(Gitlab::VisibilityLevel::PUBLIC)
- expect(snippets).to eq([snippet])
+ expect(snippets).to eq([public_snippet])
end
end
context 'when a visibility level is not provided' do
it 'returns all snippets' do
- snippet1 = create(:snippet, :public)
- snippet2 = create(:snippet, :private)
snippets = described_class.with_optional_visibility
- expect(snippets).to include(snippet1, snippet2)
+ expect(snippets).to include(public_snippet, private_snippet)
end
end
end
@@ -254,12 +252,13 @@ RSpec.describe Snippet do
end
describe '.only_include_projects_visible_to' do
- let!(:project1) { create(:project, :public) }
- let!(:project2) { create(:project, :internal) }
- let!(:project3) { create(:project, :private) }
- let!(:snippet1) { create(:project_snippet, project: project1) }
- let!(:snippet2) { create(:project_snippet, project: project2) }
- let!(:snippet3) { create(:project_snippet, project: project3) }
+ let_it_be(:author) { create(:user) }
+ let_it_be(:project1) { create(:project_empty_repo, :public, namespace: author.namespace) }
+ let_it_be(:project2) { create(:project_empty_repo, :internal, namespace: author.namespace) }
+ let_it_be(:project3) { create(:project_empty_repo, :private, namespace: author.namespace) }
+ let_it_be(:snippet1) { create(:project_snippet, project: project1, author: author) }
+ let_it_be(:snippet2) { create(:project_snippet, project: project2, author: author) }
+ let_it_be(:snippet3) { create(:project_snippet, project: project3, author: author) }
context 'when a user is provided' do
it 'returns snippets visible to the user' do
@@ -283,55 +282,47 @@ RSpec.describe Snippet do
end
describe 'only_include_projects_with_snippets_enabled' do
- context 'when the include_private option is enabled' do
- it 'includes snippets for projects with snippets set to private' do
- project = create(:project)
+ let_it_be(:project, reload: true) { create(:project_empty_repo) }
+ let_it_be(:snippet) { create(:project_snippet, project: project) }
- project.project_feature
- .update(snippets_access_level: ProjectFeature::PRIVATE)
-
- snippet = create(:project_snippet, project: project)
-
- snippets = described_class
- .only_include_projects_with_snippets_enabled(include_private: true)
+ let(:access_level) { ProjectFeature::ENABLED }
- expect(snippets).to eq([snippet])
- end
+ before do
+ project.project_feature.update(snippets_access_level: access_level)
end
- context 'when the include_private option is not enabled' do
- it 'does not include snippets for projects that have snippets set to private' do
- project = create(:project)
+ it 'includes snippets for projects with snippets enabled' do
+ snippets = described_class.only_include_projects_with_snippets_enabled
- project.project_feature
- .update(snippets_access_level: ProjectFeature::PRIVATE)
+ expect(snippets).to eq([snippet])
+ end
- create(:project_snippet, project: project)
+ context 'when snippet_access_level is private' do
+ let(:access_level) { ProjectFeature::PRIVATE }
- snippets = described_class.only_include_projects_with_snippets_enabled
+ context 'when the include_private option is enabled' do
+ it 'includes snippets for projects with snippets set to private' do
+ snippets = described_class.only_include_projects_with_snippets_enabled(include_private: true)
- expect(snippets).to be_empty
+ expect(snippets).to eq([snippet])
+ end
end
- end
-
- it 'includes snippets for projects with snippets enabled' do
- project = create(:project)
- project.project_feature
- .update(snippets_access_level: ProjectFeature::ENABLED)
+ context 'when the include_private option is not enabled' do
+ it 'does not include snippets for projects that have snippets set to private' do
+ snippets = described_class.only_include_projects_with_snippets_enabled
- snippet = create(:project_snippet, project: project)
- snippets = described_class.only_include_projects_with_snippets_enabled
-
- expect(snippets).to eq([snippet])
+ expect(snippets).to be_empty
+ end
+ end
end
end
describe '.only_include_authorized_projects' do
it 'only includes snippets for projects the user is authorized to see' do
user = create(:user)
- project1 = create(:project, :private)
- project2 = create(:project, :private)
+ project1 = create(:project_empty_repo, :private)
+ project2 = create(:project_empty_repo, :private)
project1.team.add_developer(user)
@@ -345,43 +336,34 @@ RSpec.describe Snippet do
end
describe '.for_project_with_user' do
- context 'when a user is provided' do
- it 'returns an empty collection if the user can not view the snippets' do
- project = create(:project, :private)
- user = create(:user)
+ let_it_be(:public_project) { create(:project_empty_repo, :public) }
+ let_it_be(:private_project) { create(:project_empty_repo, :private) }
- project.project_feature
- .update(snippets_access_level: ProjectFeature::ENABLED)
+ context 'when a user is provided' do
+ let_it_be(:user) { create(:user) }
- create(:project_snippet, :public, project: project)
+ it 'returns an empty collection if the user can not view the snippets' do
+ create(:project_snippet, :public, project: private_project)
- expect(described_class.for_project_with_user(project, user)).to be_empty
+ expect(described_class.for_project_with_user(private_project, user)).to be_empty
end
it 'returns the snippets if the user is a member of the project' do
- project = create(:project, :private)
- user = create(:user)
- snippet = create(:project_snippet, project: project)
+ snippet = create(:project_snippet, project: private_project)
- project.team.add_developer(user)
+ private_project.team.add_developer(user)
- snippets = described_class.for_project_with_user(project, user)
+ snippets = described_class.for_project_with_user(private_project, user)
expect(snippets).to eq([snippet])
end
it 'returns public snippets for a public project the user is not a member of' do
- project = create(:project, :public)
-
- project.project_feature
- .update(snippets_access_level: ProjectFeature::ENABLED)
-
- user = create(:user)
- snippet = create(:project_snippet, :public, project: project)
+ snippet = create(:project_snippet, :public, project: public_project)
- create(:project_snippet, :private, project: project)
+ create(:project_snippet, :private, project: public_project)
- snippets = described_class.for_project_with_user(project, user)
+ snippets = described_class.for_project_with_user(public_project, user)
expect(snippets).to eq([snippet])
end
@@ -389,26 +371,17 @@ RSpec.describe Snippet do
context 'when a user is not provided' do
it 'returns an empty collection for a private project' do
- project = create(:project, :private)
+ create(:project_snippet, :public, project: private_project)
- project.project_feature
- .update(snippets_access_level: ProjectFeature::ENABLED)
-
- create(:project_snippet, :public, project: project)
-
- expect(described_class.for_project_with_user(project)).to be_empty
+ expect(described_class.for_project_with_user(private_project)).to be_empty
end
it 'returns public snippets for a public project' do
- project = create(:project, :public)
- snippet = create(:project_snippet, :public, project: project)
-
- project.project_feature
- .update(snippets_access_level: ProjectFeature::PUBLIC)
+ snippet = create(:project_snippet, :public, project: public_project)
- create(:project_snippet, :private, project: project)
+ create(:project_snippet, :private, project: public_project)
- snippets = described_class.for_project_with_user(project)
+ snippets = described_class.for_project_with_user(public_project)
expect(snippets).to eq([snippet])
end
@@ -430,34 +403,30 @@ RSpec.describe Snippet do
end
describe '#participants' do
- let(:project) { create(:project, :public) }
- let(:snippet) { create(:snippet, content: 'foo', project: project) }
+ let_it_be(:project) { create(:project, :public) }
+ let_it_be(:snippet) { create(:snippet, content: 'foo', project: project) }
- let!(:note1) do
+ let_it_be(:note1) do
create(:note_on_project_snippet,
noteable: snippet,
project: project,
note: 'a')
end
- let!(:note2) do
+ let_it_be(:note2) do
create(:note_on_project_snippet,
noteable: snippet,
project: project,
note: 'b')
end
- it 'includes the snippet author' do
- expect(snippet.participants).to include(snippet.author)
- end
-
- it 'includes the note authors' do
- expect(snippet.participants).to include(note1.author, note2.author)
+ it 'includes the snippet author and note authors' do
+ expect(snippet.participants).to include(snippet.author, note1.author, note2.author)
end
end
describe '#check_for_spam' do
- let(:snippet) { create :snippet, visibility_level: visibility_level }
+ let(:snippet) { create(:snippet, visibility_level: visibility_level) }
subject do
snippet.assign_attributes(title: title)
@@ -500,7 +469,7 @@ RSpec.describe Snippet do
end
describe '#blob' do
- let(:snippet) { create(:snippet) }
+ let(:snippet) { build(:snippet) }
it 'returns a blob representing the snippet data' do
blob = snippet.blob
@@ -514,6 +483,14 @@ RSpec.describe Snippet do
describe '#blobs' do
let(:snippet) { create(:snippet) }
+ it 'returns a blob representing the snippet data' do
+ blob = snippet.blob
+
+ expect(blob).to be_a(Blob)
+ expect(blob.path).to eq(snippet.file_name)
+ expect(blob.data).to eq(snippet.content)
+ end
+
context 'when repository does not exist' do
it 'returns empty array' do
expect(snippet.blobs).to be_empty
@@ -527,14 +504,6 @@ RSpec.describe Snippet do
expect(snippet.blobs).to all(be_a(Blob))
end
end
-
- it 'returns a blob representing the snippet data' do
- blob = snippet.blob
-
- expect(blob).to be_a(Blob)
- expect(blob.path).to eq(snippet.file_name)
- expect(blob.data).to eq(snippet.content)
- end
end
describe '#to_json' do
@@ -554,7 +523,7 @@ RSpec.describe Snippet do
end
describe '#storage' do
- let(:snippet) { create(:snippet) }
+ let(:snippet) { build(:snippet, id: 1) }
it "stores snippet in #{Storage::Hashed::SNIPPET_REPOSITORY_PATH_PREFIX} dir" do
expect(snippet.storage.disk_path).to start_with Storage::Hashed::SNIPPET_REPOSITORY_PATH_PREFIX
diff --git a/spec/services/merge_requests/cleanup_refs_service_spec.rb b/spec/services/merge_requests/cleanup_refs_service_spec.rb
index fcd41fdca0f..b38ccee4aa0 100644
--- a/spec/services/merge_requests/cleanup_refs_service_spec.rb
+++ b/spec/services/merge_requests/cleanup_refs_service_spec.rb
@@ -35,6 +35,36 @@ RSpec.describe MergeRequests::CleanupRefsService do
end
end
+ context 'when merge request has merge ref' do
+ before do
+ MergeRequests::MergeToRefService
+ .new(merge_request.project, merge_request.author)
+ .execute(merge_request)
+ end
+
+ it 'caches merge ref sha and deletes merge ref' do
+ old_merge_ref_head = merge_request.merge_ref_head
+
+ aggregate_failures do
+ expect(result[:status]).to eq(:success)
+ expect(kept_around?(old_merge_ref_head)).to be_truthy
+ expect(merge_request.reload.merge_ref_sha).to eq(old_merge_ref_head.id)
+ expect(ref_exists?(merge_request.merge_ref_path)).to be_falsy
+ end
+ end
+
+ context 'when merge ref sha cannot be cached' do
+ before do
+ allow(merge_request)
+ .to receive(:update_column)
+ .with(:merge_ref_sha, merge_request.merge_ref_head.id)
+ .and_return(false)
+ end
+
+ it_behaves_like 'service that does not clean up merge request refs'
+ end
+ end
+
context 'when keep around ref cannot be created' do
before do
allow_next_instance_of(Gitlab::Git::KeepAround) do |keep_around|
@@ -109,4 +139,8 @@ RSpec.describe MergeRequests::CleanupRefsService do
def ref_head
merge_request.project.repository.commit(merge_request.ref_path)
end
+
+ def ref_exists?(ref)
+ merge_request.project.repository.ref_exists?(ref)
+ end
end