diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-09-11 15:08:30 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-09-11 15:08:30 +0000 |
commit | 3d6d338697a186496eecffc43a389106bfd60527 (patch) | |
tree | fdb1ac5ba6a449bb65eed73e9c65bc7d56be16dc /spec | |
parent | 0eaa82ad61d2fda42b2dd5cf58cc08654b2d69ef (diff) | |
download | gitlab-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.rb | 54 | ||||
-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.rb | 2 | ||||
-rw-r--r-- | spec/frontend/projects/settings_service_desk/components/service_desk_root_spec.js | 2 | ||||
-rw-r--r-- | spec/frontend/projects/settings_service_desk/components/service_desk_setting_spec.js | 2 | ||||
-rw-r--r-- | spec/frontend/vue_shared/components/file_finder/index_spec.js | 6 | ||||
-rw-r--r-- | spec/lib/gitlab/import_export/all_models.yml | 1 | ||||
-rw-r--r-- | spec/lib/gitlab/import_export/safe_model_attributes.yml | 1 | ||||
-rw-r--r-- | spec/models/merge_request_spec.rb | 26 | ||||
-rw-r--r-- | spec/models/resource_iteration_event_spec.rb | 17 | ||||
-rw-r--r-- | spec/models/snippet_spec.rb | 183 | ||||
-rw-r--r-- | spec/services/merge_requests/cleanup_refs_service_spec.rb | 34 |
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 |