diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-03-24 00:09:46 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-03-24 00:09:46 +0300 |
commit | 8a7aaf86831d2a556578ae558a4fcab8bb659b20 (patch) | |
tree | 61c2b55aa48ff8e853e546cd3009dfc5423279c8 /spec | |
parent | 967812838c7e7742729a4c7aeb9859f98a509622 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r-- | spec/features/issues/gfm_autocomplete_spec.rb | 20 | ||||
-rw-r--r-- | spec/features/projects/files/user_uploads_files_spec.rb | 87 | ||||
-rw-r--r-- | spec/features/projects/show/user_uploads_files_spec.rb | 36 | ||||
-rw-r--r-- | spec/frontend/lib/utils/common_utils_spec.js | 35 | ||||
-rw-r--r-- | spec/frontend/profile/account/components/delete_account_modal_spec.js (renamed from spec/javascripts/profile/account/components/delete_account_modal_spec.js) | 13 | ||||
-rw-r--r-- | spec/frontend/profile/account/components/update_username_spec.js (renamed from spec/javascripts/profile/account/components/update_username_spec.js) | 9 | ||||
-rw-r--r-- | spec/javascripts/vue_shared/components/project_selector/project_selector_spec.js | 1 | ||||
-rw-r--r-- | spec/lib/gitlab/asciidoc/include_processor_spec.rb | 2 | ||||
-rw-r--r-- | spec/services/snippets/create_service_spec.rb | 6 | ||||
-rw-r--r-- | spec/services/snippets/update_service_spec.rb | 20 | ||||
-rw-r--r-- | spec/support/shared_examples/features/project_upload_files_shared_examples.rb | 84 |
11 files changed, 190 insertions, 123 deletions
diff --git a/spec/features/issues/gfm_autocomplete_spec.rb b/spec/features/issues/gfm_autocomplete_spec.rb index b7ec445a7aa..501a2d347d1 100644 --- a/spec/features/issues/gfm_autocomplete_spec.rb +++ b/spec/features/issues/gfm_autocomplete_spec.rb @@ -284,16 +284,17 @@ describe 'GFM autocomplete', :js do context 'assignees' do let(:issue_assignee) { create(:issue, project: project) } + let(:unassigned_user) { create(:user) } before do issue_assignee.update(assignees: [user]) - visit project_issue_path(project, issue_assignee) - - wait_for_requests + project.add_maintainer(unassigned_user) end it 'lists users who are currently not assigned to the issue when using /assign' do + visit project_issue_path(project, issue_assignee) + note = find('#note-body') page.within '.timeline-content-form' do note.native.send_keys('/as') @@ -305,6 +306,19 @@ describe 'GFM autocomplete', :js do wait_for_requests expect(find('#at-view-users .atwho-view-ul')).not_to have_content(user.username) + expect(find('#at-view-users .atwho-view-ul')).to have_content(unassigned_user.username) + end + + it 'shows dropdown on new issue form' do + visit new_project_issue_path(project) + + textarea = find('#issue_description') + textarea.native.send_keys('/ass') + find('.atwho-view li', text: '/assign') + textarea.native.send_keys(:tab) + + expect(find('#at-view-users .atwho-view-ul')).to have_content(unassigned_user.username) + expect(find('#at-view-users .atwho-view-ul')).to have_content(user.username) end end diff --git a/spec/features/projects/files/user_uploads_files_spec.rb b/spec/features/projects/files/user_uploads_files_spec.rb index 35a3835ff12..8a20c1387a3 100644 --- a/spec/features/projects/files/user_uploads_files_spec.rb +++ b/spec/features/projects/files/user_uploads_files_spec.rb @@ -5,103 +5,32 @@ require 'spec_helper' describe 'Projects > Files > User uploads files' do include DropzoneHelper - let(:fork_message) do - "You're not allowed to make changes to this project directly. "\ - "A fork of this project has been created that you can make changes in, so you can submit a merge request." - end let(:user) { create(:user) } let(:project) { create(:project, :repository, name: 'Shop', creator: user) } let(:project2) { create(:project, :repository, name: 'Another Project', path: 'another-project') } - let(:project_tree_path_root_ref) { project_tree_path(project, project.repository.root_ref) } - let(:project2_tree_path_root_ref) { project_tree_path(project2, project2.repository.root_ref) } before do project.add_maintainer(user) sign_in(user) end - context 'when an user has write access' do + context 'when a user has write access' do before do - visit(project_tree_path_root_ref) + visit(project_tree_path(project)) end - it 'uploads and commit a new text file', :js do - find('.add-to-tree').click - click_link('Upload file') - drop_in_dropzone(File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt')) - - page.within('#modal-upload-blob') do - fill_in(:commit_message, with: 'New commit message') - end - - fill_in(:branch_name, with: 'new_branch_name', visible: true) - click_button('Upload file') - - expect(page).to have_content('New commit message') - expect(current_path).to eq(project_new_merge_request_path(project)) + include_examples 'it uploads and commit a new text file' - click_link('Changes') - find("a[data-action='diffs']", text: 'Changes').click - - wait_for_requests - - expect(page).to have_content('Lorem ipsum dolor sit amet') - expect(page).to have_content('Sed ut perspiciatis unde omnis') - end - - it 'uploads and commit a new image file', :js do - find('.add-to-tree').click - click_link('Upload file') - drop_in_dropzone(File.join(Rails.root, 'spec', 'fixtures', 'logo_sample.svg')) - - page.within('#modal-upload-blob') do - fill_in(:commit_message, with: 'New commit message') - fill_in(:branch_name, with: 'new_branch_name', visible: true) - click_button('Upload file') - end - - wait_for_all_requests - - visit(project_blob_path(project, 'new_branch_name/logo_sample.svg')) - - expect(page).to have_css('.file-content img') - end + include_examples 'it uploads and commit a new image file' end - context 'when an user does not have write access' do + context 'when a user does not have write access' do before do project2.add_reporter(user) - visit(project2_tree_path_root_ref) - end - - it 'uploads and commit a new file to a forked project', :js, :sidekiq_might_not_need_inline do - find('.add-to-tree').click - click_link('Upload file') - - expect(page).to have_content(fork_message) - - find('.add-to-tree').click - click_link('Upload file') - drop_in_dropzone(File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt')) - - page.within('#modal-upload-blob') do - fill_in(:commit_message, with: 'New commit message') - end - - click_button('Upload file') - expect(page).to have_content('New commit message') - - fork = user.fork_of(project2.reload) - - expect(current_path).to eq(project_new_merge_request_path(fork)) - - find("a[data-action='diffs']", text: 'Changes').click - - wait_for_requests - - expect(page).to have_content('Lorem ipsum dolor sit amet') - expect(page).to have_content('Sed ut perspiciatis unde omnis') + visit(project_tree_path(project2)) end + + include_examples 'it uploads and commit a new file to a forked project' end end diff --git a/spec/features/projects/show/user_uploads_files_spec.rb b/spec/features/projects/show/user_uploads_files_spec.rb new file mode 100644 index 00000000000..e279cdf92da --- /dev/null +++ b/spec/features/projects/show/user_uploads_files_spec.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe 'Projects > Show > User uploads files' do + include DropzoneHelper + + let(:user) { create(:user) } + let(:project) { create(:project, :repository, name: 'Shop', creator: user) } + let(:project2) { create(:project, :repository, name: 'Another Project', path: 'another-project') } + + before do + project.add_maintainer(user) + sign_in(user) + end + + context 'when a user has write access' do + before do + visit(project_path(project)) + end + + include_examples 'it uploads and commit a new text file' + + include_examples 'it uploads and commit a new image file' + end + + context 'when a user does not have write access' do + before do + project2.add_reporter(user) + + visit(project_path(project2)) + end + + include_examples 'it uploads and commit a new file to a forked project' + end +end diff --git a/spec/frontend/lib/utils/common_utils_spec.js b/spec/frontend/lib/utils/common_utils_spec.js index 6ba8f58086a..1edfda30fec 100644 --- a/spec/frontend/lib/utils/common_utils_spec.js +++ b/spec/frontend/lib/utils/common_utils_spec.js @@ -359,31 +359,16 @@ describe('common_utils', () => { }); describe('parseBoolean', () => { - const { parseBoolean } = commonUtils; - - it('returns true for "true"', () => { - expect(parseBoolean('true')).toEqual(true); - }); - - it('returns false for "false"', () => { - expect(parseBoolean('false')).toEqual(false); - }); - - it('returns false for "something"', () => { - expect(parseBoolean('something')).toEqual(false); - }); - - it('returns false for null', () => { - expect(parseBoolean(null)).toEqual(false); - }); - - it('is idempotent', () => { - const input = ['true', 'false', 'something', null]; - input.forEach(value => { - const result = parseBoolean(value); - - expect(parseBoolean(result)).toBe(result); - }); + it.each` + input | expected + ${'true'} | ${true} + ${'false'} | ${false} + ${'something'} | ${false} + ${null} | ${false} + ${true} | ${true} + ${false} | ${false} + `('returns $expected for $input', ({ input, expected }) => { + expect(commonUtils.parseBoolean(input)).toBe(expected); }); }); diff --git a/spec/javascripts/profile/account/components/delete_account_modal_spec.js b/spec/frontend/profile/account/components/delete_account_modal_spec.js index e2c557d79a9..4da82152818 100644 --- a/spec/javascripts/profile/account/components/delete_account_modal_spec.js +++ b/spec/frontend/profile/account/components/delete_account_modal_spec.js @@ -1,10 +1,11 @@ import Vue from 'vue'; -import mountComponent from 'spec/helpers/vue_mount_component_helper'; +import { TEST_HOST } from 'helpers/test_constants'; +import mountComponent from 'helpers/vue_mount_component_helper'; import deleteAccountModal from '~/profile/account/components/delete_account_modal.vue'; describe('DeleteAccountModal component', () => { - const actionUrl = `${gl.TEST_HOST}/delete/user`; + const actionUrl = `${TEST_HOST}/delete/user`; const username = 'hasnoname'; let Component; let vm; @@ -43,7 +44,7 @@ describe('DeleteAccountModal component', () => { it('does not accept empty password', done => { const { form, input, submitButton } = findElements(); - spyOn(form, 'submit'); + jest.spyOn(form, 'submit').mockImplementation(() => {}); input.value = ''; input.dispatchEvent(new Event('input')); @@ -61,7 +62,7 @@ describe('DeleteAccountModal component', () => { it('submits form with password', done => { const { form, input, submitButton } = findElements(); - spyOn(form, 'submit'); + jest.spyOn(form, 'submit').mockImplementation(() => {}); input.value = 'anything'; input.dispatchEvent(new Event('input')); @@ -95,7 +96,7 @@ describe('DeleteAccountModal component', () => { it('does not accept wrong username', done => { const { form, input, submitButton } = findElements(); - spyOn(form, 'submit'); + jest.spyOn(form, 'submit').mockImplementation(() => {}); input.value = 'this is wrong'; input.dispatchEvent(new Event('input')); @@ -113,7 +114,7 @@ describe('DeleteAccountModal component', () => { it('submits form with correct username', done => { const { form, input, submitButton } = findElements(); - spyOn(form, 'submit'); + jest.spyOn(form, 'submit').mockImplementation(() => {}); input.value = username; input.dispatchEvent(new Event('input')); diff --git a/spec/javascripts/profile/account/components/update_username_spec.js b/spec/frontend/profile/account/components/update_username_spec.js index 902e00b85fd..be39a7f4d80 100644 --- a/spec/javascripts/profile/account/components/update_username_spec.js +++ b/spec/frontend/profile/account/components/update_username_spec.js @@ -1,13 +1,14 @@ import Vue from 'vue'; import MockAdapter from 'axios-mock-adapter'; -import mountComponent from 'spec/helpers/vue_mount_component_helper'; +import { TEST_HOST } from 'helpers/test_constants'; +import mountComponent from 'helpers/vue_mount_component_helper'; import axios from '~/lib/utils/axios_utils'; import updateUsername from '~/profile/account/components/update_username.vue'; describe('UpdateUsername component', () => { - const rootUrl = gl.TEST_HOST; - const actionUrl = `${gl.TEST_HOST}/update/username`; + const rootUrl = TEST_HOST; + const actionUrl = `${TEST_HOST}/update/username`; const username = 'hasnoname'; const newUsername = 'new_username'; let Component; @@ -106,7 +107,7 @@ describe('UpdateUsername component', () => { const { confirmModalBtn } = findElements(); axiosMock.onPut(actionUrl).replyOnce(() => [200, { message: 'Username changed' }]); - spyOn(axios, 'put').and.callThrough(); + jest.spyOn(axios, 'put'); vm.newUsername = newUsername; diff --git a/spec/javascripts/vue_shared/components/project_selector/project_selector_spec.js b/spec/javascripts/vue_shared/components/project_selector/project_selector_spec.js index 178df54b465..5d995f06abb 100644 --- a/spec/javascripts/vue_shared/components/project_selector/project_selector_spec.js +++ b/spec/javascripts/vue_shared/components/project_selector/project_selector_spec.js @@ -22,6 +22,7 @@ describe('ProjectSelector component', () => { beforeEach(() => { jasmine.clock().install(); + jasmine.clock().mockDate(); wrapper = mount(Vue.extend(ProjectSelector), { localVue, diff --git a/spec/lib/gitlab/asciidoc/include_processor_spec.rb b/spec/lib/gitlab/asciidoc/include_processor_spec.rb index 72fa05939ae..2781319567c 100644 --- a/spec/lib/gitlab/asciidoc/include_processor_spec.rb +++ b/spec/lib/gitlab/asciidoc/include_processor_spec.rb @@ -35,7 +35,7 @@ describe Gitlab::Asciidoc::IncludeProcessor do expect(processor.send(:include_allowed?, 'foo.adoc', reader)).to be_truthy end - it 'allows the Nth + 1 include' do + it 'allows the Nth include' do (max_includes - 1).times { processor.send(:read_blob, ref, 'a.adoc') } expect(processor.send(:include_allowed?, 'foo.adoc', reader)).to be_truthy diff --git a/spec/services/snippets/create_service_spec.rb b/spec/services/snippets/create_service_spec.rb index 26c80ee05b3..4cf574ed567 100644 --- a/spec/services/snippets/create_service_spec.rb +++ b/spec/services/snippets/create_service_spec.rb @@ -199,6 +199,12 @@ describe Snippets::CreateService do expect(SnippetRepository.count).to be_zero end + it 'logs the error' do + expect(Gitlab::AppLogger).to receive(:error).with('foobar') + + subject + end + it 'returns the error' do response = subject diff --git a/spec/services/snippets/update_service_spec.rb b/spec/services/snippets/update_service_spec.rb index 3605d3f76da..03dc857c666 100644 --- a/spec/services/snippets/update_service_spec.rb +++ b/spec/services/snippets/update_service_spec.rb @@ -167,13 +167,23 @@ describe Snippets::UpdateService do expect(blob.data).to eq(options[:content]) end - it 'returns error when the commit action fails' do - allow(snippet.snippet_repository).to receive(:multi_files_action).and_raise(SnippetRepository::CommitError) + context 'when an error is raised' do + before do + allow(snippet.snippet_repository).to receive(:multi_files_action).and_raise(SnippetRepository::CommitError, 'foobar') + end - response = subject + it 'logs the error' do + expect(Gitlab::AppLogger).to receive(:error).with('foobar') - expect(response).to be_error - expect(response.payload[:snippet].errors.full_messages).to eq ['Repository Error updating the snippet'] + subject + end + + it 'returns error with generic error message' do + response = subject + + expect(response).to be_error + expect(response.payload[:snippet].errors.full_messages).to eq ['Repository Error updating the snippet'] + end end it 'returns error if snippet does not have a snippet_repository' do diff --git a/spec/support/shared_examples/features/project_upload_files_shared_examples.rb b/spec/support/shared_examples/features/project_upload_files_shared_examples.rb new file mode 100644 index 00000000000..25203fa3182 --- /dev/null +++ b/spec/support/shared_examples/features/project_upload_files_shared_examples.rb @@ -0,0 +1,84 @@ +# frozen_string_literal: true + +RSpec.shared_examples 'it uploads and commit a new text file' do + it 'uploads and commit a new text file', :js do + find('.add-to-tree').click + click_link('Upload file') + drop_in_dropzone(File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt')) + + page.within('#modal-upload-blob') do + fill_in(:commit_message, with: 'New commit message') + end + + fill_in(:branch_name, with: 'upload_text', visible: true) + click_button('Upload file') + + expect(page).to have_content('New commit message') + expect(current_path).to eq(project_new_merge_request_path(project)) + + click_link('Changes') + find("a[data-action='diffs']", text: 'Changes').click + + wait_for_requests + + expect(page).to have_content('Lorem ipsum dolor sit amet') + expect(page).to have_content('Sed ut perspiciatis unde omnis') + end +end + +RSpec.shared_examples 'it uploads and commit a new image file' do + it 'uploads and commit a new image file', :js do + find('.add-to-tree').click + click_link('Upload file') + drop_in_dropzone(File.join(Rails.root, 'spec', 'fixtures', 'logo_sample.svg')) + + page.within('#modal-upload-blob') do + fill_in(:commit_message, with: 'New commit message') + fill_in(:branch_name, with: 'upload_image', visible: true) + click_button('Upload file') + end + + wait_for_all_requests + + visit(project_blob_path(project, 'upload_image/logo_sample.svg')) + + expect(page).to have_css('.file-content img') + end +end + +RSpec.shared_examples 'it uploads and commit a new file to a forked project' do + let(:fork_message) do + "You're not allowed to make changes to this project directly. "\ + "A fork of this project has been created that you can make changes in, so you can submit a merge request." + end + + it 'uploads and commit a new file to a forked project', :js, :sidekiq_might_not_need_inline do + find('.add-to-tree').click + click_link('Upload file') + + expect(page).to have_content(fork_message) + + find('.add-to-tree').click + click_link('Upload file') + drop_in_dropzone(File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt')) + + page.within('#modal-upload-blob') do + fill_in(:commit_message, with: 'New commit message') + end + + click_button('Upload file') + + expect(page).to have_content('New commit message') + + fork = user.fork_of(project2.reload) + + expect(current_path).to eq(project_new_merge_request_path(fork)) + + find("a[data-action='diffs']", text: 'Changes').click + + wait_for_requests + + expect(page).to have_content('Lorem ipsum dolor sit amet') + expect(page).to have_content('Sed ut perspiciatis unde omnis') + end +end |