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>2020-03-24 00:09:46 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-03-24 00:09:46 +0300
commit8a7aaf86831d2a556578ae558a4fcab8bb659b20 (patch)
tree61c2b55aa48ff8e853e546cd3009dfc5423279c8 /spec
parent967812838c7e7742729a4c7aeb9859f98a509622 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r--spec/features/issues/gfm_autocomplete_spec.rb20
-rw-r--r--spec/features/projects/files/user_uploads_files_spec.rb87
-rw-r--r--spec/features/projects/show/user_uploads_files_spec.rb36
-rw-r--r--spec/frontend/lib/utils/common_utils_spec.js35
-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.js1
-rw-r--r--spec/lib/gitlab/asciidoc/include_processor_spec.rb2
-rw-r--r--spec/services/snippets/create_service_spec.rb6
-rw-r--r--spec/services/snippets/update_service_spec.rb20
-rw-r--r--spec/support/shared_examples/features/project_upload_files_shared_examples.rb84
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