diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-02-18 18:08:51 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-02-18 18:08:51 +0300 |
commit | 163a7046ac76eb4109184e82ce0af911633e6626 (patch) | |
tree | 9f22bb438db435d518e8f5520b309c6319ae0bd8 /spec | |
parent | 0637ba1e6e9024f35b2cbf561d9002ec17350bb3 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
28 files changed, 496 insertions, 345 deletions
diff --git a/spec/controllers/users/terms_controller_spec.rb b/spec/controllers/users/terms_controller_spec.rb index e0bdec3df1d..99582652c39 100644 --- a/spec/controllers/users/terms_controller_spec.rb +++ b/spec/controllers/users/terms_controller_spec.rb @@ -4,7 +4,8 @@ require 'spec_helper' describe Users::TermsController do include TermsHelper - let(:user) { create(:user) } + + let_it_be(:user) { create(:user) } let(:term) { create(:term) } before do @@ -12,88 +13,145 @@ describe Users::TermsController do end describe 'GET #index' do - it 'redirects when no terms exist' do - get :index + context 'when a user is signed in' do + it 'redirects when no terms exist' do + get :index + + expect(response).to redirect_to(root_path) + end + + context 'when terms exist' do + before do + stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false') + term + end + + it 'shows terms when they exist' do + get :index + + expect(response).to have_gitlab_http_status(:success) + end + + it 'shows a message when the user already accepted the terms' do + accept_terms(user) + + get :index - expect(response).to have_gitlab_http_status(:redirect) + expect(controller).to set_flash.now[:notice].to(/already accepted/) + end + end end - context 'when terms exist' do + context 'when a user is not signed in' do before do - stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false') - term + sign_out user end - it 'shows terms when they exist' do - get :index + context 'when terms exist' do + before do + stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false') + term + end - expect(response).to have_gitlab_http_status(:success) - end + it 'returns success response' do + get :index - it 'shows a message when the user already accepted the terms' do - accept_terms(user) + expect(response).to have_gitlab_http_status(:success) + end + end - get :index + context 'when no terms exist' do + it 'redirects' do + get :index - expect(controller).to set_flash.now[:notice].to(/already accepted/) + expect(response).to redirect_to(root_path) + end end end end describe 'POST #accept' do - it 'saves that the user accepted the terms' do - post :accept, params: { id: term.id } + context 'when a user is signed in' do + it 'saves that the user accepted the terms' do + post :accept, params: { id: term.id } - agreement = user.term_agreements.find_by(term: term) + agreement = user.term_agreements.find_by(term: term) - expect(agreement.accepted).to eq(true) - end + expect(agreement.accepted).to eq(true) + end - it 'redirects to a path when specified' do - post :accept, params: { id: term.id, redirect: groups_path } + it 'redirects to a path when specified' do + post :accept, params: { id: term.id, redirect: groups_path } - expect(response).to redirect_to(groups_path) - end + expect(response).to redirect_to(groups_path) + end - it 'redirects to the referer when no redirect specified' do - request.env["HTTP_REFERER"] = groups_url + it 'redirects to the referer when no redirect specified' do + request.env["HTTP_REFERER"] = groups_url - post :accept, params: { id: term.id } + post :accept, params: { id: term.id } - expect(response).to redirect_to(groups_path) - end + expect(response).to redirect_to(groups_path) + end - context 'redirecting to another domain' do - it 'is prevented when passing a redirect param' do - post :accept, params: { id: term.id, redirect: '//example.com/random/path' } + context 'redirecting to another domain' do + it 'is prevented when passing a redirect param' do + post :accept, params: { id: term.id, redirect: '//example.com/random/path' } - expect(response).to redirect_to(root_path) + expect(response).to redirect_to(root_path) + end + + it 'is prevented when redirecting to the referer' do + request.env["HTTP_REFERER"] = 'http://example.com/and/a/path' + + post :accept, params: { id: term.id } + + expect(response).to redirect_to(root_path) + end end + end - it 'is prevented when redirecting to the referer' do - request.env["HTTP_REFERER"] = 'http://example.com/and/a/path' + context 'when a user is not signed in' do + before do + sign_out user + end + it 'redirects to login page' do post :accept, params: { id: term.id } - expect(response).to redirect_to(root_path) + expect(response).to redirect_to(new_user_session_path) end end end describe 'POST #decline' do - it 'stores that the user declined the terms' do - post :decline, params: { id: term.id } + context 'when a user is signed in' do + it 'stores that the user declined the terms' do + post :decline, params: { id: term.id } + + agreement = user.term_agreements.find_by(term: term) - agreement = user.term_agreements.find_by(term: term) + expect(agreement.accepted).to eq(false) + end - expect(agreement.accepted).to eq(false) + it 'signs out the user' do + post :decline, params: { id: term.id } + + expect(response).to redirect_to(root_path) + expect(assigns(:current_user)).to be_nil + end end - it 'signs out the user' do - post :decline, params: { id: term.id } + context 'when a user is not signed in' do + before do + sign_out user + end - expect(response).to redirect_to(root_path) - expect(assigns(:current_user)).to be_nil + it 'redirects to login page' do + post :decline, params: { id: term.id } + + expect(response).to redirect_to(new_user_session_path) + end end end end diff --git a/spec/graphql/features/authorization_spec.rb b/spec/graphql/features/authorization_spec.rb index 5ef1bced179..44f47e6c739 100644 --- a/spec/graphql/features/authorization_spec.rb +++ b/spec/graphql/features/authorization_spec.rb @@ -5,8 +5,7 @@ require 'spec_helper' describe 'Gitlab::Graphql::Authorization' do include GraphqlHelpers - set(:user) { create(:user) } - + let_it_be(:user) { create(:user) } let(:permission_single) { :foo } let(:permission_collection) { [:foo, :bar] } let(:test_object) { double(name: 'My name') } diff --git a/spec/graphql/resolvers/concerns/resolves_pipelines_spec.rb b/spec/graphql/resolvers/concerns/resolves_pipelines_spec.rb index b59561ebdd4..03ff1e11d85 100644 --- a/spec/graphql/resolvers/concerns/resolves_pipelines_spec.rb +++ b/spec/graphql/resolvers/concerns/resolves_pipelines_spec.rb @@ -17,11 +17,11 @@ describe ResolvesPipelines do let(:current_user) { create(:user) } - set(:project) { create(:project, :private) } - set(:pipeline) { create(:ci_pipeline, project: project) } - set(:failed_pipeline) { create(:ci_pipeline, :failed, project: project) } - set(:ref_pipeline) { create(:ci_pipeline, project: project, ref: 'awesome-feature') } - set(:sha_pipeline) { create(:ci_pipeline, project: project, sha: 'deadbeef') } + let_it_be(:project) { create(:project, :private) } + let_it_be(:pipeline) { create(:ci_pipeline, project: project) } + let_it_be(:failed_pipeline) { create(:ci_pipeline, :failed, project: project) } + let_it_be(:ref_pipeline) { create(:ci_pipeline, project: project, ref: 'awesome-feature') } + let_it_be(:sha_pipeline) { create(:ci_pipeline, project: project, sha: 'deadbeef') } before do project.add_developer(current_user) diff --git a/spec/graphql/resolvers/group_resolver_spec.rb b/spec/graphql/resolvers/group_resolver_spec.rb index 7dec9ac1aa5..70b1102d363 100644 --- a/spec/graphql/resolvers/group_resolver_spec.rb +++ b/spec/graphql/resolvers/group_resolver_spec.rb @@ -5,8 +5,8 @@ require 'spec_helper' describe Resolvers::GroupResolver do include GraphqlHelpers - set(:group1) { create(:group) } - set(:group2) { create(:group) } + let_it_be(:group1) { create(:group) } + let_it_be(:group2) { create(:group) } describe '#resolve' do it 'batch-resolves groups by full path' do diff --git a/spec/graphql/resolvers/issues_resolver_spec.rb b/spec/graphql/resolvers/issues_resolver_spec.rb index 9e75a6cad60..3fbb7280465 100644 --- a/spec/graphql/resolvers/issues_resolver_spec.rb +++ b/spec/graphql/resolvers/issues_resolver_spec.rb @@ -8,11 +8,11 @@ describe Resolvers::IssuesResolver do let(:current_user) { create(:user) } context "with a project" do - set(:project) { create(:project) } - set(:issue1) { create(:issue, project: project, state: :opened, created_at: 3.hours.ago, updated_at: 3.hours.ago) } - set(:issue2) { create(:issue, project: project, state: :closed, title: 'foo', created_at: 1.hour.ago, updated_at: 1.hour.ago, closed_at: 1.hour.ago) } - set(:label1) { create(:label, project: project) } - set(:label2) { create(:label, project: project) } + let_it_be(:project) { create(:project) } + let_it_be(:issue1) { create(:issue, project: project, state: :opened, created_at: 3.hours.ago, updated_at: 3.hours.ago) } + let_it_be(:issue2) { create(:issue, project: project, state: :closed, title: 'foo', created_at: 1.hour.ago, updated_at: 1.hour.ago, closed_at: 1.hour.ago) } + let_it_be(:label1) { create(:label, project: project) } + let_it_be(:label2) { create(:label, project: project) } before do project.add_developer(current_user) diff --git a/spec/graphql/resolvers/merge_request_pipelines_resolver_spec.rb b/spec/graphql/resolvers/merge_request_pipelines_resolver_spec.rb index b8bdfc36ba7..02c6409a9a6 100644 --- a/spec/graphql/resolvers/merge_request_pipelines_resolver_spec.rb +++ b/spec/graphql/resolvers/merge_request_pipelines_resolver_spec.rb @@ -5,8 +5,8 @@ require 'spec_helper' describe Resolvers::MergeRequestPipelinesResolver do include GraphqlHelpers - set(:merge_request) { create(:merge_request) } - set(:pipeline) do + let_it_be(:merge_request) { create(:merge_request) } + let_it_be(:pipeline) do create( :ci_pipeline, project: merge_request.source_project, @@ -14,8 +14,8 @@ describe Resolvers::MergeRequestPipelinesResolver do sha: merge_request.diff_head_sha ) end - set(:other_project_pipeline) { create(:ci_pipeline, project: merge_request.source_project) } - set(:other_pipeline) { create(:ci_pipeline) } + let_it_be(:other_project_pipeline) { create(:ci_pipeline, project: merge_request.source_project) } + let_it_be(:other_pipeline) { create(:ci_pipeline) } let(:current_user) { create(:user) } before do diff --git a/spec/graphql/resolvers/merge_requests_resolver_spec.rb b/spec/graphql/resolvers/merge_requests_resolver_spec.rb index fe167a6ae3e..0bd5043d855 100644 --- a/spec/graphql/resolvers/merge_requests_resolver_spec.rb +++ b/spec/graphql/resolvers/merge_requests_resolver_spec.rb @@ -5,16 +5,13 @@ require 'spec_helper' describe Resolvers::MergeRequestsResolver do include GraphqlHelpers - set(:project) { create(:project, :repository) } - set(:merge_request_1) { create(:merge_request, :simple, source_project: project, target_project: project) } - set(:merge_request_2) { create(:merge_request, :rebased, source_project: project, target_project: project) } - - set(:other_project) { create(:project, :repository) } - set(:other_merge_request) { create(:merge_request, source_project: other_project, target_project: other_project) } - + let_it_be(:project) { create(:project, :repository) } + let_it_be(:merge_request_1) { create(:merge_request, :simple, source_project: project, target_project: project) } + let_it_be(:merge_request_2) { create(:merge_request, :rebased, source_project: project, target_project: project) } + let_it_be(:other_project) { create(:project, :repository) } + let_it_be(:other_merge_request) { create(:merge_request, source_project: other_project, target_project: other_project) } let(:iid_1) { merge_request_1.iid } let(:iid_2) { merge_request_2.iid } - let(:other_iid) { other_merge_request.iid } describe '#resolve' do diff --git a/spec/graphql/resolvers/project_pipelines_resolver_spec.rb b/spec/graphql/resolvers/project_pipelines_resolver_spec.rb index f312a118c96..2a14796fdfa 100644 --- a/spec/graphql/resolvers/project_pipelines_resolver_spec.rb +++ b/spec/graphql/resolvers/project_pipelines_resolver_spec.rb @@ -5,9 +5,9 @@ require 'spec_helper' describe Resolvers::ProjectPipelinesResolver do include GraphqlHelpers - set(:project) { create(:project) } - set(:pipeline) { create(:ci_pipeline, project: project) } - set(:other_pipeline) { create(:ci_pipeline) } + let_it_be(:project) { create(:project) } + let_it_be(:pipeline) { create(:ci_pipeline, project: project) } + let_it_be(:other_pipeline) { create(:ci_pipeline) } let(:current_user) { create(:user) } before do diff --git a/spec/graphql/resolvers/project_resolver_spec.rb b/spec/graphql/resolvers/project_resolver_spec.rb index 860f8b4abb8..e9e38353156 100644 --- a/spec/graphql/resolvers/project_resolver_spec.rb +++ b/spec/graphql/resolvers/project_resolver_spec.rb @@ -5,10 +5,9 @@ require 'spec_helper' describe Resolvers::ProjectResolver do include GraphqlHelpers - set(:project1) { create(:project) } - set(:project2) { create(:project) } - - set(:other_project) { create(:project) } + let_it_be(:project1) { create(:project) } + let_it_be(:project2) { create(:project) } + let_it_be(:other_project) { create(:project) } describe '#resolve' do it 'batch-resolves projects by full path' do diff --git a/spec/helpers/auto_devops_helper_spec.rb b/spec/helpers/auto_devops_helper_spec.rb index 5d42a80aae3..d06548f1595 100644 --- a/spec/helpers/auto_devops_helper_spec.rb +++ b/spec/helpers/auto_devops_helper_spec.rb @@ -3,8 +3,8 @@ require 'spec_helper' describe AutoDevopsHelper do - set(:project) { create(:project) } - set(:user) { create(:user) } + let_it_be(:project, reload: true) { create(:project) } + let_it_be(:user) { create(:user) } describe '.show_auto_devops_callout?' do let(:allowed) { true } diff --git a/spec/helpers/boards_helper_spec.rb b/spec/helpers/boards_helper_spec.rb index 8a4446b7f59..e731b95586f 100644 --- a/spec/helpers/boards_helper_spec.rb +++ b/spec/helpers/boards_helper_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' describe BoardsHelper do - set(:project) { create(:project) } + let_it_be(:project) { create(:project) } describe '#build_issue_link_base' do context 'project board' do diff --git a/spec/helpers/environments_helper_spec.rb b/spec/helpers/environments_helper_spec.rb index b72fbc9fd3c..37713a04844 100644 --- a/spec/helpers/environments_helper_spec.rb +++ b/spec/helpers/environments_helper_spec.rb @@ -3,9 +3,9 @@ require 'spec_helper' describe EnvironmentsHelper do - set(:user) { create(:user) } - set(:project) { create(:project, :repository) } - set(:environment) { create(:environment, project: project) } + let_it_be(:user) { create(:user) } + let_it_be(:project, reload: true) { create(:project, :repository) } + let_it_be(:environment) { create(:environment, project: project) } describe '#metrics_data' do before do diff --git a/spec/helpers/labels_helper_spec.rb b/spec/helpers/labels_helper_spec.rb index 7ad554fd618..f5771405687 100644 --- a/spec/helpers/labels_helper_spec.rb +++ b/spec/helpers/labels_helper_spec.rb @@ -35,7 +35,7 @@ describe LabelsHelper do end context 'with a group label' do - set(:group) { create(:group) } + let_it_be(:group) { create(:group) } let(:label) { create(:group_label, group: group, title: 'bug') } context 'when asking for an issue link' do @@ -135,7 +135,7 @@ describe LabelsHelper do end describe 'create_label_title' do - set(:group) { create(:group) } + let_it_be(:group) { create(:group) } context 'with a group as subject' do it 'returns "Create group label"' do @@ -144,7 +144,7 @@ describe LabelsHelper do end context 'with a project as subject' do - set(:project) { create(:project, namespace: group) } + let_it_be(:project) { create(:project, namespace: group) } it 'returns "Create project label"' do expect(create_label_title(project)).to eq _('Create project label') @@ -159,7 +159,7 @@ describe LabelsHelper do end describe 'manage_labels_title' do - set(:group) { create(:group) } + let_it_be(:group) { create(:group) } context 'with a group as subject' do it 'returns "Manage group labels"' do @@ -168,7 +168,7 @@ describe LabelsHelper do end context 'with a project as subject' do - set(:project) { create(:project, namespace: group) } + let_it_be(:project) { create(:project, namespace: group) } it 'returns "Manage project labels"' do expect(manage_labels_title(project)).to eq _('Manage project labels') @@ -183,7 +183,7 @@ describe LabelsHelper do end describe 'view_labels_title' do - set(:group) { create(:group) } + let_it_be(:group) { create(:group) } context 'with a group as subject' do it 'returns "View group labels"' do @@ -192,7 +192,7 @@ describe LabelsHelper do end context 'with a project as subject' do - set(:project) { create(:project, namespace: group) } + let_it_be(:project) { create(:project, namespace: group) } it 'returns "View project labels"' do expect(view_labels_title(project)).to eq _('View project labels') diff --git a/spec/helpers/markup_helper_spec.rb b/spec/helpers/markup_helper_spec.rb index d7cc8afe9c5..3fb36e540b6 100644 --- a/spec/helpers/markup_helper_spec.rb +++ b/spec/helpers/markup_helper_spec.rb @@ -3,15 +3,15 @@ require 'spec_helper' describe MarkupHelper do - set(:project) { create(:project, :repository) } - set(:user) do + let_it_be(:project) { create(:project, :repository) } + let_it_be(:user) do user = create(:user, username: 'gfm') project.add_maintainer(user) user end - set(:issue) { create(:issue, project: project) } - set(:merge_request) { create(:merge_request, source_project: project, target_project: project) } - set(:snippet) { create(:project_snippet, project: project) } + let_it_be(:issue) { create(:issue, project: project) } + let_it_be(:merge_request) { create(:merge_request, source_project: project, target_project: project) } + let_it_be(:snippet) { create(:project_snippet, project: project) } let(:commit) { project.commit } before do @@ -45,8 +45,8 @@ describe MarkupHelper do describe "override default project" do let(:actual) { issue.to_reference } - set(:second_project) { create(:project, :public) } - set(:second_issue) { create(:issue, project: second_project) } + let_it_be(:second_project) { create(:project, :public) } + let_it_be(:second_issue) { create(:issue, project: second_project) } it 'links to the issue' do expected = urls.project_issue_path(second_project, second_issue) @@ -57,7 +57,7 @@ describe MarkupHelper do describe 'uploads' do let(:text) { "![ImageTest](/uploads/test.png)" } - set(:group) { create(:group) } + let_it_be(:group) { create(:group) } subject { helper.markdown(text) } @@ -79,7 +79,7 @@ describe MarkupHelper do end describe "with a group in the context" do - set(:project_in_group) { create(:project, group: group) } + let_it_be(:project_in_group) { create(:project, group: group) } before do helper.instance_variable_set(:@group, group) diff --git a/spec/helpers/projects/error_tracking_helper_spec.rb b/spec/helpers/projects/error_tracking_helper_spec.rb index 38a6ef6826b..008d749a002 100644 --- a/spec/helpers/projects/error_tracking_helper_spec.rb +++ b/spec/helpers/projects/error_tracking_helper_spec.rb @@ -5,8 +5,8 @@ require 'spec_helper' describe Projects::ErrorTrackingHelper do include Gitlab::Routing.url_helpers - set(:project) { create(:project) } - set(:current_user) { create(:user) } + let_it_be(:project, reload: true) { create(:project) } + let_it_be(:current_user) { create(:user) } describe '#error_tracking_data' do let(:can_enable_error_tracking) { true } diff --git a/spec/lib/gitlab/ci/templates/templates_spec.rb b/spec/lib/gitlab/ci/templates/templates_spec.rb index b52064b3036..bc3d5b89220 100644 --- a/spec/lib/gitlab/ci/templates/templates_spec.rb +++ b/spec/lib/gitlab/ci/templates/templates_spec.rb @@ -2,33 +2,43 @@ require 'spec_helper' -describe "CI YML Templates" do - using RSpec::Parameterized::TableSyntax - +describe 'CI YML Templates' do subject { Gitlab::Ci::YamlProcessor.new(content) } - where(:template_name) do - Gitlab::Template::GitlabCiYmlTemplate.all.map(&:full_name) - end - - with_them do - let(:content) do - <<~EOS - include: - - template: #{template_name} + let(:all_templates) { Gitlab::Template::GitlabCiYmlTemplate.all.map(&:full_name) } - concrete_build_implemented_by_a_user: - stage: test - script: do something - EOS + let(:disabled_templates) do + Gitlab::Template::GitlabCiYmlTemplate.disabled_templates.map do |template| + template + Gitlab::Template::GitlabCiYmlTemplate.extension end + end + + context 'included in a CI YAML configuration' do + using RSpec::Parameterized::TableSyntax - it 'is valid' do - expect { subject }.not_to raise_error + where(:template_name) do + all_templates - disabled_templates end - it 'require default stages to be included' do - expect(subject.stages).to include(*Gitlab::Ci::Config::Entry::Stages.default) + with_them do + let(:content) do + <<~EOS + include: + - template: #{template_name} + + concrete_build_implemented_by_a_user: + stage: test + script: do something + EOS + end + + it 'is valid' do + expect { subject }.not_to raise_error + end + + it 'require default stages to be included' do + expect(subject.stages).to include(*Gitlab::Ci::Config::Entry::Stages.default) + end end end end diff --git a/spec/lib/gitlab/template/finders/global_template_finder_spec.rb b/spec/lib/gitlab/template/finders/global_template_finder_spec.rb index 082ffa855b7..580da497944 100644 --- a/spec/lib/gitlab/template/finders/global_template_finder_spec.rb +++ b/spec/lib/gitlab/template/finders/global_template_finder_spec.rb @@ -15,23 +15,87 @@ describe Gitlab::Template::Finders::GlobalTemplateFinder do FileUtils.rm_rf(base_dir) end - subject(:finder) { described_class.new(base_dir, '', 'Foo' => '', 'Bar' => 'bar') } + subject(:finder) { described_class.new(base_dir, '', { 'General' => '', 'Bar' => 'Bar' }, exclusions: exclusions) } + + let(:exclusions) { [] } describe '.find' do - it 'finds a template in the Foo category' do - create_template!('test-template') + context 'with a non-prefixed General template' do + before do + create_template!('test-template') + end - expect(finder.find('test-template')).to be_present - end + it 'finds the template with no prefix' do + expect(finder.find('test-template')).to be_present + end + + it 'does not find a prefixed template' do + expect(finder.find('Bar/test-template')).to be_nil + end + + it 'does not permit path traversal requests' do + expect { finder.find('../foo') }.to raise_error(/Invalid path/) + end - it 'finds a template in the Bar category' do - create_template!('bar/test-template') + context 'while listed as an exclusion' do + let(:exclusions) { %w[test-template] } - expect(finder.find('test-template')).to be_present + it 'does not find the template without a prefix' do + expect(finder.find('test-template')).to be_nil + end + + it 'does not find the template with a prefix' do + expect(finder.find('Bar/test-template')).to be_nil + end + + it 'finds another prefixed template with the same name' do + create_template!('Bar/test-template') + + expect(finder.find('test-template')).to be_nil + expect(finder.find('Bar/test-template')).to be_present + end + end end - it 'does not permit path traversal requests' do - expect { finder.find('../foo') }.to raise_error(/Invalid path/) + context 'with a prefixed template' do + before do + create_template!('Bar/test-template') + end + + it 'finds the template with a prefix' do + expect(finder.find('Bar/test-template')).to be_present + end + + # NOTE: This spec fails, the template Bar/test-template is found + # See Gitlab issue: https://gitlab.com/gitlab-org/gitlab/issues/205719 + xit 'does not find the template without a prefix' do + expect(finder.find('test-template')).to be_nil + end + + it 'does not permit path traversal requests' do + expect { finder.find('../foo') }.to raise_error(/Invalid path/) + end + + context 'while listed as an exclusion' do + let(:exclusions) { %w[Bar/test-template] } + + it 'does not find the template with a prefix' do + expect(finder.find('Bar/test-template')).to be_nil + end + + # NOTE: This spec fails, the template Bar/test-template is found + # See Gitlab issue: https://gitlab.com/gitlab-org/gitlab/issues/205719 + xit 'does not find the template without a prefix' do + expect(finder.find('test-template')).to be_nil + end + + it 'finds another non-prefixed template with the same name' do + create_template!('Bar/test-template') + + expect(finder.find('test-template')).to be_present + expect(finder.find('Bar/test-template')).to be_nil + end + end end end end diff --git a/spec/mailers/emails/pages_domains_spec.rb b/spec/mailers/emails/pages_domains_spec.rb index e360e38256e..78887cef7ab 100644 --- a/spec/mailers/emails/pages_domains_spec.rb +++ b/spec/mailers/emails/pages_domains_spec.rb @@ -7,8 +7,8 @@ describe Emails::PagesDomains do include EmailSpec::Matchers include_context 'gitlab email notification' - set(:domain) { create(:pages_domain, project: project) } - set(:user) { project.creator } + let_it_be(:domain, reload: true) { create(:pages_domain, project: project) } + let_it_be(:user) { project.creator } shared_examples 'a pages domain email' do let(:recipient) { user } diff --git a/spec/mailers/emails/pipelines_spec.rb b/spec/mailers/emails/pipelines_spec.rb index ad1aa915fbb..9996bd9a6c4 100644 --- a/spec/mailers/emails/pipelines_spec.rb +++ b/spec/mailers/emails/pipelines_spec.rb @@ -6,7 +6,7 @@ require 'email_spec' describe Emails::Pipelines do include EmailSpec::Matchers - set(:project) { create(:project, :repository) } + let_it_be(:project) { create(:project, :repository) } shared_examples_for 'correct pipeline information' do it 'has a correct information' do diff --git a/spec/mailers/notify_spec.rb b/spec/mailers/notify_spec.rb index 19b15a6c6e2..f49abb24c44 100644 --- a/spec/mailers/notify_spec.rb +++ b/spec/mailers/notify_spec.rb @@ -13,11 +13,11 @@ describe Notify do let(:current_user_sanitized) { 'www_example_com' } - set(:user) { create(:user) } - set(:current_user) { create(:user, email: "current@email.com", name: 'www.example.com') } - set(:assignee) { create(:user, email: 'assignee@example.com', name: 'John Doe') } + let_it_be(:user) { create(:user) } + let_it_be(:current_user) { create(:user, email: "current@email.com", name: 'www.example.com') } + let_it_be(:assignee) { create(:user, email: 'assignee@example.com', name: 'John Doe') } - set(:merge_request) do + let_it_be(:merge_request) do create(:merge_request, source_project: project, target_project: project, author: current_user, @@ -25,7 +25,7 @@ describe Notify do description: 'Awesome description') end - set(:issue) do + let_it_be(:issue, reload: true) do create(:issue, author: current_user, assignees: [assignee], project: project, @@ -487,7 +487,7 @@ describe Notify do end describe 'that are unmergeable' do - set(:merge_request) do + let_it_be(:merge_request) do create(:merge_request, :conflict, source_project: project, target_project: project, @@ -568,7 +568,7 @@ describe Notify do end describe '#mail_thread' do - set(:mail_thread_note) { create(:note) } + let_it_be(:mail_thread_note) { create(:note) } let(:headers) do { @@ -638,9 +638,9 @@ describe Notify do let(:host) { Gitlab.config.gitlab.host } context 'in discussion' do - set(:first_note) { create(:discussion_note_on_issue, project: project) } - set(:second_note) { create(:discussion_note_on_issue, in_reply_to: first_note, project: project) } - set(:third_note) { create(:discussion_note_on_issue, in_reply_to: second_note, project: project) } + let_it_be(:first_note) { create(:discussion_note_on_issue, project: project) } + let_it_be(:second_note) { create(:discussion_note_on_issue, in_reply_to: first_note, project: project) } + let_it_be(:third_note) { create(:discussion_note_on_issue, in_reply_to: second_note, project: project) } subject { described_class.note_issue_email(recipient.id, third_note.id) } @@ -664,7 +664,7 @@ describe Notify do end context 'individual issue comments' do - set(:note) { create(:note_on_issue, project: project) } + let_it_be(:note) { create(:note_on_issue, project: project) } subject { described_class.note_issue_email(recipient.id, note.id) } diff --git a/spec/models/project_services/jira_service_spec.rb b/spec/models/project_services/jira_service_spec.rb index 832c19adf1d..c1e7a1c2875 100644 --- a/spec/models/project_services/jira_service_spec.rb +++ b/spec/models/project_services/jira_service_spec.rb @@ -489,7 +489,14 @@ describe JiraService do @jira_service.close_issue(resource, ExternalIssue.new('JIRA-123', project)) - expect(@jira_service).to have_received(:log_error).with("Issue transition failed", error: "Bad Request", client_url: "http://jira.example.com") + expect(@jira_service).to have_received(:log_error).with( + "Issue transition failed", + error: hash_including( + exception_class: 'StandardError', + exception_message: "Bad Request" + ), + client_url: "http://jira.example.com" + ) end it 'calls the api with jira_issue_transition_id' do diff --git a/spec/policies/application_setting/term_policy_spec.rb b/spec/policies/application_setting/term_policy_spec.rb index 21690d4b457..2b5b9758ec2 100644 --- a/spec/policies/application_setting/term_policy_spec.rb +++ b/spec/policies/application_setting/term_policy_spec.rb @@ -5,7 +5,7 @@ require 'spec_helper' describe ApplicationSetting::TermPolicy do include TermsHelper - set(:term) { create(:term) } + let_it_be(:term) { create(:term) } let(:user) { create(:user) } subject(:policy) { described_class.new(user, term) } diff --git a/spec/policies/ci/pipeline_schedule_policy_spec.rb b/spec/policies/ci/pipeline_schedule_policy_spec.rb index 700d7d1af0a..d503401f7cf 100644 --- a/spec/policies/ci/pipeline_schedule_policy_spec.rb +++ b/spec/policies/ci/pipeline_schedule_policy_spec.rb @@ -3,9 +3,9 @@ require 'spec_helper' describe Ci::PipelineSchedulePolicy, :models do - set(:user) { create(:user) } - set(:project) { create(:project, :repository) } - set(:pipeline_schedule) { create(:ci_pipeline_schedule, :nightly, project: project) } + let_it_be(:user) { create(:user) } + let_it_be(:project) { create(:project, :repository) } + let_it_be(:pipeline_schedule, reload: true) { create(:ci_pipeline_schedule, :nightly, project: project) } let(:policy) do described_class.new(user, pipeline_schedule) diff --git a/spec/policies/project_policy_spec.rb b/spec/policies/project_policy_spec.rb index 3b08726c75a..e1466ad2b73 100644 --- a/spec/policies/project_policy_spec.rb +++ b/spec/policies/project_policy_spec.rb @@ -5,12 +5,12 @@ require 'spec_helper' describe ProjectPolicy do include ExternalAuthorizationServiceHelpers include_context 'ProjectPolicy context' - set(:guest) { create(:user) } - set(:reporter) { create(:user) } - set(:developer) { create(:user) } - set(:maintainer) { create(:user) } - set(:owner) { create(:user) } - set(:admin) { create(:admin) } + let_it_be(:guest) { create(:user) } + let_it_be(:reporter) { create(:user) } + let_it_be(:developer) { create(:user) } + let_it_be(:maintainer) { create(:user) } + let_it_be(:owner) { create(:user) } + let_it_be(:admin) { create(:admin) } let(:project) { create(:project, :public, namespace: owner.namespace) } let(:base_guest_permissions) do diff --git a/spec/policies/resource_label_event_policy_spec.rb b/spec/policies/resource_label_event_policy_spec.rb index 799534d2b08..4db2390c818 100644 --- a/spec/policies/resource_label_event_policy_spec.rb +++ b/spec/policies/resource_label_event_policy_spec.rb @@ -3,10 +3,10 @@ require 'spec_helper' describe ResourceLabelEventPolicy do - set(:user) { create(:user) } - set(:project) { create(:project, :private) } - set(:issue) { create(:issue, project: project) } - set(:private_project) { create(:project, :private) } + let_it_be(:user) { create(:user) } + let_it_be(:project) { create(:project, :private) } + let_it_be(:issue) { create(:issue, project: project) } + let_it_be(:private_project) { create(:project, :private) } describe '#read_resource_label_event' do context 'with non-member user' do diff --git a/spec/requests/api/internal/base_spec.rb b/spec/requests/api/internal/base_spec.rb index 02dc2229769..c3b5f9ded21 100644 --- a/spec/requests/api/internal/base_spec.rb +++ b/spec/requests/api/internal/base_spec.rb @@ -811,6 +811,8 @@ describe API::Internal::Base do describe 'POST /internal/post_receive', :clean_gitlab_redis_shared_state do let(:identifier) { 'key-123' } + let(:branch_name) { 'feature' } + let(:push_options) { ['ci.skip', 'another push option'] } let(:valid_params) do { @@ -822,192 +824,33 @@ describe API::Internal::Base do } end - let(:branch_name) { 'feature' } - let(:changes) do "#{Gitlab::Git::BLANK_SHA} 570e7b2abdd848b95f2f578043fc23bd6f6fd24d refs/heads/#{branch_name}" end - let(:push_options) do - ['ci.skip', - 'another push option'] - end + subject { post api('/internal/post_receive'), params: valid_params } before do project.add_developer(user) allow_any_instance_of(Gitlab::Identifier).to receive(:identify).and_return(user) end - it 'enqueues a PostReceive worker job' do - expect(PostReceive).to receive(:perform_async) - .with(gl_repository, identifier, changes, { ci: { skip: true } }) - - post api('/internal/post_receive'), params: valid_params - end - - it 'decreases the reference counter and returns the result' do - expect(Gitlab::ReferenceCounter).to receive(:new).with(gl_repository) - .and_return(reference_counter) - expect(reference_counter).to receive(:decrease).and_return(true) - - post api('/internal/post_receive'), params: valid_params - - expect(json_response['reference_counter_decreased']).to be(true) - end - - it 'returns link to create new merge request' do - post api('/internal/post_receive'), params: valid_params - + it 'executes PostReceiveService' do message = <<~MESSAGE.strip To create a merge request for #{branch_name}, visit: http://#{Gitlab.config.gitlab.host}/#{project.full_path}/-/merge_requests/new?merge_request%5Bsource_branch%5D=#{branch_name} MESSAGE - expect(json_response['messages']).to include(build_basic_message(message)) - end - - it 'returns the link to an existing merge request when it exists' do - merge_request = create(:merge_request, source_project: project, source_branch: branch_name, target_branch: 'master') - - post api('/internal/post_receive'), params: valid_params - - message = <<~MESSAGE.strip - View merge request for feature: - #{project_merge_request_url(project, merge_request)} - MESSAGE - - expect(json_response['messages']).to include(build_basic_message(message)) - end - - it 'returns no merge request messages if printing_merge_request_link_enabled is false' do - project.update!(printing_merge_request_link_enabled: false) - - post api('/internal/post_receive'), params: valid_params - - expect(json_response['messages']).to be_blank - end - - it 'does not invoke MergeRequests::PushOptionsHandlerService' do - expect(MergeRequests::PushOptionsHandlerService).not_to receive(:new) + subject - post api('/internal/post_receive'), params: valid_params + expect(json_response).to eq({ + 'messages' => [{ 'message' => message, 'type' => 'basic' }], + 'reference_counter_decreased' => true + }) end it_behaves_like 'storing arguments in the application context' do let(:expected_params) { { user: user.username, project: project.full_path } } - - subject { post api('/internal/post_receive'), params: valid_params } - end - - context 'when there are merge_request push options' do - before do - valid_params[:push_options] = ['merge_request.create'] - end - - it 'invokes MergeRequests::PushOptionsHandlerService' do - expect(MergeRequests::PushOptionsHandlerService).to receive(:new) - - post api('/internal/post_receive'), params: valid_params - end - - it 'creates a new merge request' do - expect do - Sidekiq::Testing.fake! do - post api('/internal/post_receive'), params: valid_params - end - end.to change { MergeRequest.count }.by(1) - end - - it 'links to the newly created merge request' do - post api('/internal/post_receive'), params: valid_params - - message = <<~MESSAGE.strip - View merge request for #{branch_name}: - http://#{Gitlab.config.gitlab.host}/#{project.full_path}/-/merge_requests/1 - MESSAGE - - expect(json_response['messages']).to include(build_basic_message(message)) - end - - it 'adds errors on the service instance to warnings' do - expect_any_instance_of( - MergeRequests::PushOptionsHandlerService - ).to receive(:errors).at_least(:once).and_return(['my error']) - - post api('/internal/post_receive'), params: valid_params - - message = "WARNINGS:\nError encountered with push options 'merge_request.create': my error" - expect(json_response['messages']).to include(build_alert_message(message)) - end - - it 'adds ActiveRecord errors on invalid MergeRequest records to warnings' do - invalid_merge_request = MergeRequest.new - invalid_merge_request.errors.add(:base, 'my error') - - expect_any_instance_of( - MergeRequests::CreateService - ).to receive(:execute).and_return(invalid_merge_request) - - post api('/internal/post_receive'), params: valid_params - - message = "WARNINGS:\nError encountered with push options 'merge_request.create': my error" - expect(json_response['messages']).to include(build_alert_message(message)) - end - end - - context 'broadcast message exists' do - let!(:broadcast_message) { create(:broadcast_message, starts_at: 1.day.ago, ends_at: 1.day.from_now ) } - - it 'outputs a broadcast message' do - post api('/internal/post_receive'), params: valid_params - - expect(response).to have_gitlab_http_status(:ok) - expect(json_response['messages']).to include(build_alert_message(broadcast_message.message)) - end - end - - context 'broadcast message does not exist' do - it 'does not output a broadcast message' do - post api('/internal/post_receive'), params: valid_params - - expect(response).to have_gitlab_http_status(:ok) - expect(has_alert_messages?(json_response['messages'])).to be_falsey - end - end - - context 'nil broadcast message' do - it 'does not output a broadcast message' do - allow(BroadcastMessage).to receive(:current).and_return(nil) - - post api('/internal/post_receive'), params: valid_params - - expect(response).to have_gitlab_http_status(:ok) - expect(has_alert_messages?(json_response['messages'])).to be_falsey - end - end - - context 'with a redirected data' do - it 'returns redirected message on the response' do - project_moved = Gitlab::Checks::ProjectMoved.new(project, user, 'http', 'foo/baz') - project_moved.add_message - - post api('/internal/post_receive'), params: valid_params - - expect(response).to have_gitlab_http_status(:ok) - expect(json_response['messages']).to include(build_basic_message(project_moved.message)) - end - end - - context 'with new project data' do - it 'returns new project message on the response' do - project_created = Gitlab::Checks::ProjectCreated.new(project, user, 'http') - project_created.add_message - - post api('/internal/post_receive'), params: valid_params - - expect(response).to have_gitlab_http_status(:ok) - expect(json_response['messages']).to include(build_basic_message(project_created.message)) - end end context 'with an orphaned write deploy key' do @@ -1016,7 +859,7 @@ describe API::Internal::Base do expect(Gitlab::Checks::ProjectMoved).not_to receive(:fetch_message) - post api('/internal/post_receive'), params: valid_params + subject expect(response).to have_gitlab_http_status(:ok) end @@ -1030,7 +873,7 @@ describe API::Internal::Base do expect(Gitlab::Checks::ProjectMoved).not_to receive(:fetch_message) - post api('/internal/post_receive'), params: valid_params + subject expect(response).to have_gitlab_http_status(:ok) end @@ -1142,18 +985,4 @@ describe API::Internal::Base do } ) end - - def build_alert_message(message) - { 'type' => 'alert', 'message' => message } - end - - def build_basic_message(message) - { 'type' => 'basic', 'message' => message } - end - - def has_alert_messages?(messages) - messages.any? do |message| - message['type'] == 'alert' - end - end end diff --git a/spec/services/post_receive_service_spec.rb b/spec/services/post_receive_service_spec.rb new file mode 100644 index 00000000000..9b9200fd33e --- /dev/null +++ b/spec/services/post_receive_service_spec.rb @@ -0,0 +1,186 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe PostReceiveService do + include Gitlab::Routing + + let_it_be(:project) { create(:project, :repository, :wiki_repo) } + let_it_be(:user) { create(:user) } + + let(:identifier) { 'key-123' } + let(:gl_repository) { "project-#{project.id}" } + let(:branch_name) { 'feature' } + let(:secret_token) { Gitlab::Shell.secret_token } + let(:reference_counter) { double('ReferenceCounter') } + let(:push_options) { ['ci.skip', 'another push option'] } + + let(:changes) do + "#{Gitlab::Git::BLANK_SHA} 570e7b2abdd848b95f2f578043fc23bd6f6fd24d refs/heads/#{branch_name}" + end + + let(:params) do + { + gl_repository: gl_repository, + secret_token: secret_token, + identifier: identifier, + changes: changes, + push_options: push_options + } + end + + let(:response) { PostReceiveService.new(user, project, params).execute } + + subject { response.messages.as_json } + + it 'enqueues a PostReceive worker job' do + expect(PostReceive).to receive(:perform_async) + .with(gl_repository, identifier, changes, { ci: { skip: true } }) + + subject + end + + it 'decreases the reference counter and returns the result' do + expect(Gitlab::ReferenceCounter).to receive(:new).with(gl_repository) + .and_return(reference_counter) + expect(reference_counter).to receive(:decrease).and_return(true) + + expect(response.reference_counter_decreased).to be(true) + end + + it 'returns link to create new merge request' do + message = <<~MESSAGE.strip + To create a merge request for #{branch_name}, visit: + http://#{Gitlab.config.gitlab.host}/#{project.full_path}/-/merge_requests/new?merge_request%5Bsource_branch%5D=#{branch_name} + MESSAGE + + expect(subject).to include(build_basic_message(message)) + end + + it 'returns the link to an existing merge request when it exists' do + merge_request = create(:merge_request, source_project: project, source_branch: branch_name, target_branch: 'master') + message = <<~MESSAGE.strip + View merge request for feature: + #{project_merge_request_url(project, merge_request)} + MESSAGE + + expect(subject).to include(build_basic_message(message)) + end + + context 'when printing_merge_request_link_enabled is false' do + let(:project) { create(:project, printing_merge_request_link_enabled: false) } + + it 'returns no merge request messages' do + expect(subject).to be_blank + end + end + + it 'does not invoke MergeRequests::PushOptionsHandlerService' do + expect(MergeRequests::PushOptionsHandlerService).not_to receive(:new) + + subject + end + + context 'when there are merge_request push options' do + let(:params) { super().merge(push_options: ['merge_request.create']) } + + before do + project.add_developer(user) + end + + it 'invokes MergeRequests::PushOptionsHandlerService' do + expect(MergeRequests::PushOptionsHandlerService).to receive(:new).and_call_original + + subject + end + + it 'creates a new merge request' do + expect { Sidekiq::Testing.fake! { subject } }.to change(MergeRequest, :count).by(1) + end + + it 'links to the newly created merge request' do + message = <<~MESSAGE.strip + View merge request for #{branch_name}: + http://#{Gitlab.config.gitlab.host}/#{project.full_path}/-/merge_requests/1 + MESSAGE + + expect(subject).to include(build_basic_message(message)) + end + + it 'adds errors on the service instance to warnings' do + expect_any_instance_of( + MergeRequests::PushOptionsHandlerService + ).to receive(:errors).at_least(:once).and_return(['my error']) + + message = "WARNINGS:\nError encountered with push options 'merge_request.create': my error" + + expect(subject).to include(build_alert_message(message)) + end + + it 'adds ActiveRecord errors on invalid MergeRequest records to warnings' do + invalid_merge_request = MergeRequest.new + invalid_merge_request.errors.add(:base, 'my error') + message = "WARNINGS:\nError encountered with push options 'merge_request.create': my error" + + expect_any_instance_of( + MergeRequests::CreateService + ).to receive(:execute).and_return(invalid_merge_request) + + expect(subject).to include(build_alert_message(message)) + end + end + + context 'broadcast message exists' do + it 'outputs a broadcast message' do + broadcast_message = create(:broadcast_message, starts_at: 1.day.ago, ends_at: 1.day.from_now) + + expect(subject).to include(build_alert_message(broadcast_message.message)) + end + end + + context 'broadcast message does not exist' do + it 'does not output a broadcast message' do + expect(has_alert_messages?(subject)).to be_falsey + end + end + + context 'nil broadcast message' do + it 'does not output a broadcast message' do + allow(BroadcastMessage).to receive(:current).and_return(nil) + + expect(has_alert_messages?(subject)).to be_falsey + end + end + + context 'with a redirected data' do + it 'returns redirected message on the response' do + project_moved = Gitlab::Checks::ProjectMoved.new(project, user, 'http', 'foo/baz') + project_moved.add_message + + expect(subject).to include(build_basic_message(project_moved.message)) + end + end + + context 'with new project data' do + it 'returns new project message on the response' do + project_created = Gitlab::Checks::ProjectCreated.new(project, user, 'http') + project_created.add_message + + expect(subject).to include(build_basic_message(project_created.message)) + end + end + + def build_alert_message(message) + { 'type' => 'alert', 'message' => message } + end + + def build_basic_message(message) + { 'type' => 'basic', 'message' => message } + end + + def has_alert_messages?(messages) + messages.any? do |message| + message['type'] == 'alert' + end + end +end diff --git a/spec/support/shared_examples/lib/gitlab/background_migration/mentions_migration_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/background_migration/mentions_migration_shared_examples.rb index f90e1a1ebab..60c0ec45c71 100644 --- a/spec/support/shared_examples/lib/gitlab/background_migration/mentions_migration_shared_examples.rb +++ b/spec/support/shared_examples/lib/gitlab/background_migration/mentions_migration_shared_examples.rb @@ -26,16 +26,18 @@ shared_examples 'resource notes mentions migration' do |migration_class, resourc note1.becomes(Note).save! note2.becomes(Note).save! note3.becomes(Note).save! - # note4.becomes(Note).save(validate: false) + note4.becomes(Note).save! + note5.becomes(Note).save(validate: false) end it 'migrates mentions from note' do join = migration_class::JOIN conditions = migration_class::QUERY_CONDITIONS - # there are 4 notes for each noteable_type, but one does not have mentions and + # there are 5 notes for each noteable_type, but two do not have mentions and # another one's noteable_id points to an inexistent resource - expect(notes.where(noteable_type: resource_class.to_s).count).to eq 4 + expect(notes.where(noteable_type: resource_class.to_s).count).to eq 5 + expect(user_mentions.count).to eq 0 expect do subject.perform(resource_class.name, join, conditions, true, Note.minimum(:id), Note.maximum(:id)) |