diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-06-02 15:06:59 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-06-02 15:06:59 +0300 |
commit | e9570ea27e2dc549962b9b318af369e9363fd1c4 (patch) | |
tree | 1a6aabfa0b41df8f6400a7bbcabe0bdb54f10fe7 /spec | |
parent | 7e8ecb5c00aae3b7072a5b8ff2c53db03c0bc579 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
15 files changed, 180 insertions, 471 deletions
diff --git a/spec/db/development/import_common_metrics_spec.rb b/spec/db/development/import_common_metrics_spec.rb deleted file mode 100644 index 396eae9293e..00000000000 --- a/spec/db/development/import_common_metrics_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe 'Import metrics on development seed' do - subject { load Rails.root.join('db', 'fixtures', 'development', '99_common_metrics.rb') } - - it "imports all prometheus metrics" do - expect(PrometheusMetric.common).to be_empty - - subject - - expect(PrometheusMetric.common).not_to be_empty - end -end diff --git a/spec/db/production/import_common_metrics_spec.rb b/spec/db/production/import_common_metrics_spec.rb deleted file mode 100644 index 1cc0c2fd77f..00000000000 --- a/spec/db/production/import_common_metrics_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe 'Import metrics on production seed' do - subject { load Rails.root.join('db', 'fixtures', 'production', '999_common_metrics.rb') } - - it "imports all prometheus metrics" do - expect(PrometheusMetric.common).to be_empty - - subject - - expect(PrometheusMetric.common).not_to be_empty - end -end diff --git a/spec/db/schema_spec.rb b/spec/db/schema_spec.rb index 686654bda30..b5e08c65823 100644 --- a/spec/db/schema_spec.rb +++ b/spec/db/schema_spec.rb @@ -206,7 +206,6 @@ RSpec.describe 'Database schema', feature_category: :database do 'Clusters::Cluster' => %w[platform_type provider_type], 'CommitStatus' => %w[failure_reason], 'GenericCommitStatus' => %w[failure_reason], - 'Gitlab::DatabaseImporters::CommonMetrics::PrometheusMetric' => %w[group], 'InternalId' => %w[usage], 'List' => %w[list_type], 'NotificationSetting' => %w[level], diff --git a/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb b/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb index c982052fc0e..7f6a044a575 100644 --- a/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb +++ b/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb @@ -20,7 +20,6 @@ RSpec.describe 'Resolving all open threads in a merge request from an issue', :j before do stub_feature_flags(moved_mr_sidebar: false) - stub_feature_flags(hide_create_issue_resolve_all: false) end describe 'as a user with access to the project' do @@ -45,7 +44,6 @@ RSpec.describe 'Resolving all open threads in a merge request from an issue', :j it 'hides the link for creating a new issue' do expect(page).not_to have_selector resolve_all_discussions_link_selector - expect(page).not_to have_content "Resolve all with new issue" end end @@ -67,6 +65,7 @@ RSpec.describe 'Resolving all open threads in a merge request from an issue', :j before do project.project_feature.update_attribute(:issues_access_level, ProjectFeature::DISABLED) visit project_merge_request_path(project, merge_request) + find('.discussions-counter .dropdown-toggle').click end it 'does not show a link to create a new issue' do @@ -82,22 +81,6 @@ RSpec.describe 'Resolving all open threads in a merge request from an issue', :j it 'shows a warning that the merge request contains unresolved threads' do expect(page).to have_content 'all threads must be resolved' end - - it 'has a link to resolve all threads by creating an issue' do - expect(page).to have_link 'Resolve all with new issue', href: new_project_issue_path(project, merge_request_to_resolve_discussions_of: merge_request.iid) - end - - context 'creating an issue for threads' do - before do - page.within '.mr-state-widget' do - page.click_link 'Resolve all with new issue', href: new_project_issue_path(project, merge_request_to_resolve_discussions_of: merge_request.iid) - - wait_for_all_requests - end - end - - it_behaves_like 'creating an issue for a thread' - end end end end diff --git a/spec/features/markdown/metrics_spec.rb b/spec/features/markdown/metrics_spec.rb deleted file mode 100644 index 1b68f78e993..00000000000 --- a/spec/features/markdown/metrics_spec.rb +++ /dev/null @@ -1,244 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe 'Metrics rendering', :js, :kubeclient, :use_clean_rails_memory_store_caching, :sidekiq_inline, feature_category: :metrics do - include PrometheusHelpers - include KubernetesHelpers - include GrafanaApiHelpers - include MetricsDashboardUrlHelpers - - let_it_be(:user) { create(:user) } - let_it_be(:project) { create(:project, :with_prometheus_integration) } - let_it_be(:environment) { create(:environment, project: project) } - - let(:issue) { create(:issue, project: project, description: description) } - let(:description) { "See [metrics dashboard](#{metrics_url}) for info." } - let(:metrics_url) { urls.metrics_project_environment_url(project, environment) } - - before do - stub_feature_flags(remove_monitor_metrics: false) - clear_host_from_memoized_variables - stub_gitlab_domain - - project.add_developer(user) - sign_in(user) - end - - after do - clear_host_from_memoized_variables - end - - shared_examples_for 'metrics dashboard unavailable' do - context 'when metrics dashboard feature is unavailable' do - before do - stub_feature_flags(remove_monitor_metrics: true) - end - - it 'shows no embedded metrics' do - visit project_issue_path(project, issue) - - expect(page).to have_no_css('div.prometheus-graph') - end - end - end - - context 'internal metrics embeds' do - before do - import_common_metrics - stub_any_prometheus_request_with_response - - allow(Prometheus::ProxyService).to receive(:new).and_call_original - end - - include_examples 'metrics dashboard unavailable' - - it 'shows embedded metrics' do - visit project_issue_path(project, issue) - - expect(page).to have_css('div.prometheus-graph') - expect(page).to have_text('Memory Usage (Total)') - expect(page).to have_text('Core Usage (Total)') - - # Ensure that the FE is calling the BE with expected params - expect(Prometheus::ProxyService) - .to have_received(:new) - .with(environment, 'GET', 'query_range', hash_including('start', 'end', 'step')) - .at_least(:once) - end - - context 'with remove_monitor_metrics flag enabled' do - before do - stub_feature_flags(remove_monitor_metrics: true) - end - - it 'does not show embedded metrics' do - visit project_issue_path(project, issue) - - expect(page).not_to have_css('div.prometheus-graph') - expect(page).not_to have_text('Memory Usage (Total)') - expect(page).not_to have_text('Core Usage (Total)') - end - end - - context 'when dashboard params are in included the url' do - let(:metrics_url) { urls.metrics_project_environment_url(project, environment, **chart_params) } - - let(:chart_params) do - { - group: 'System metrics (Kubernetes)', - title: 'Memory Usage (Pod average)', - y_label: 'Memory Used per Pod (MB)' - } - end - - it 'shows embedded metrics for the specific chart' do - visit project_issue_path(project, issue) - - expect(page).to have_css('div.prometheus-graph') - expect(page).to have_text(chart_params[:title]) - expect(page).to have_text(chart_params[:y_label]) - - # Ensure that the FE is calling the BE with expected params - expect(Prometheus::ProxyService) - .to have_received(:new) - .with(environment, 'GET', 'query_range', hash_including('start', 'end', 'step')) - .at_least(:once) - end - - context 'when two dashboard urls are included' do - let(:chart_params_2) do - { - group: 'System metrics (Kubernetes)', - title: 'Core Usage (Total)', - y_label: 'Total Cores' - } - end - - let(:metrics_url_2) { urls.metrics_project_environment_url(project, environment, **chart_params_2) } - let(:description) { "See [metrics dashboard](#{metrics_url}) for info. \n See [metrics dashboard](#{metrics_url_2}) for info." } - let(:issue) { create(:issue, project: project, description: description) } - - it 'shows embedded metrics for both urls' do - visit project_issue_path(project, issue) - - expect(page).to have_css('div.prometheus-graph') - expect(page).to have_text(chart_params[:title]) - expect(page).to have_text(chart_params[:y_label]) - expect(page).to have_text(chart_params_2[:title]) - expect(page).to have_text(chart_params_2[:y_label]) - - # Ensure that the FE is calling the BE with expected params - expect(Prometheus::ProxyService) - .to have_received(:new) - .with(environment, 'GET', 'query_range', hash_including('start', 'end', 'step')) - .at_least(:once) - end - end - end - end - - context 'grafana metrics embeds' do - let(:grafana_integration) { create(:grafana_integration, project: project) } - let(:grafana_base_url) { grafana_integration.grafana_url } - let(:metrics_url) { valid_grafana_dashboard_link(grafana_base_url) } - - before do - stub_dashboard_request(grafana_base_url) - stub_datasource_request(grafana_base_url) - stub_all_grafana_proxy_requests(grafana_base_url) - - allow(Grafana::ProxyService).to receive(:new).and_call_original - end - - include_examples 'metrics dashboard unavailable' - - it 'shows embedded metrics', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/402973' do - visit project_issue_path(project, issue) - - expect(page).to have_css('div.prometheus-graph') - expect(page).to have_text('Expired / Evicted') - expect(page).to have_text('expired - test-attribute-value') - - # Ensure that the FE is calling the BE with expected params - expect(Grafana::ProxyService) - .to have_received(:new) - .with(project, anything, anything, hash_including('query', 'start', 'end', 'step')) - .at_least(:once) - end - end - - context 'transient metrics embeds' do - let(:metrics_url) { urls.metrics_dashboard_project_environment_url(project, environment, embed_json: embed_json) } - let(:title) { 'Important Metrics' } - let(:embed_json) do - { - panel_groups: [{ - panels: [{ - type: 'area-chart', - title: title, - y_label: 'metric', - metrics: [{ - query_range: 'metric * 0.5 < 1' - }] - }] - }] - }.to_json - end - - before do - stub_any_prometheus_request_with_response - end - - include_examples 'metrics dashboard unavailable' - - it 'shows embedded metrics' do - visit project_issue_path(project, issue) - - expect(page).to have_css('div.prometheus-graph') - expect(page).to have_text(title) - end - end - - context 'for GitLab embedded cluster health metrics' do - before do - project.add_maintainer(user) - import_common_metrics - stub_any_prometheus_request_with_response - - allow(Prometheus::ProxyService).to receive(:new).and_call_original - - create(:clusters_integrations_prometheus, cluster: cluster) - stub_kubeclient_discover(cluster.platform.api_url) - stub_prometheus_request(/prometheus-prometheus-server/, body: prometheus_values_body) - stub_prometheus_request(%r{prometheus/api/v1}, body: prometheus_values_body) - end - - let_it_be(:cluster) { create(:cluster, :provided_by_gcp, :project, projects: [project], user: user) } - - let(:params) { [project.namespace.path, project.path, cluster.id] } - let(:query_params) { { group: 'Cluster Health', title: 'CPU Usage', y_label: 'CPU (cores)' } } - let(:metrics_url) { urls.namespace_project_cluster_url(*params, **query_params) } - let(:description) { "# Summary \n[](#{metrics_url})" } - - include_examples 'metrics dashboard unavailable' - - it 'shows embedded metrics' do - visit project_issue_path(project, issue) - - expect(page).to have_css('div.prometheus-graph') - expect(page).to have_text(query_params[:title]) - expect(page).to have_text(query_params[:y_label]) - expect(page).not_to have_text(metrics_url) - - expect(Prometheus::ProxyService) - .to have_received(:new) - .with(cluster, 'GET', 'query_range', hash_including('start', 'end', 'step')) - .at_least(:once) - end - end - - def import_common_metrics - ::Gitlab::DatabaseImporters::CommonMetrics::Importer.new.execute - end -end diff --git a/spec/frontend/sidebar/components/assignees/sidebar_participant_spec.js b/spec/frontend/sidebar/components/assignees/sidebar_participant_spec.js index 25a19b5808b..00fa0a8ae56 100644 --- a/spec/frontend/sidebar/components/assignees/sidebar_participant_spec.js +++ b/spec/frontend/sidebar/components/assignees/sidebar_participant_spec.js @@ -16,7 +16,12 @@ describe('Sidebar participant component', () => { const findAvatar = () => wrapper.findComponent(GlAvatarLabeled); const findIcon = () => wrapper.findComponent(GlIcon); - const createComponent = ({ status = null, issuableType = TYPE_ISSUE, canMerge = false } = {}) => { + const createComponent = ({ + status = null, + issuableType = TYPE_ISSUE, + canMerge = false, + selected = false, + } = {}) => { wrapper = shallowMount(SidebarParticipant, { propsData: { user: { @@ -25,6 +30,7 @@ describe('Sidebar participant component', () => { status, }, issuableType, + selected, }, stubs: { GlAvatarLabeled, @@ -52,13 +58,27 @@ describe('Sidebar participant component', () => { }); describe('when on merge request sidebar', () => { - it('when project member cannot merge', () => { - createComponent({ issuableType: TYPE_MERGE_REQUEST }); + describe('when project member cannot merge', () => { + it('renders a `cannot-merge` icon', () => { + createComponent({ issuableType: TYPE_MERGE_REQUEST }); - expect(findIcon().exists()).toBe(true); + expect(findIcon().exists()).toBe(true); + }); + + it('does not apply `gl-left-6!` class to an icon if participant is not selected', () => { + createComponent({ issuableType: TYPE_MERGE_REQUEST, canMerge: false }); + + expect(findIcon().classes('gl-left-6!')).toBe(false); + }); + + it('applies `gl-left-6!` class to an icon if participant is selected', () => { + createComponent({ issuableType: TYPE_MERGE_REQUEST, canMerge: false, selected: true }); + + expect(findIcon().classes('gl-left-6!')).toBe(true); + }); }); - it('when project member can merge', () => { + it('does not render an icon when project member can merge', () => { createComponent({ issuableType: TYPE_MERGE_REQUEST, canMerge: true }); expect(findIcon().exists()).toBe(false); diff --git a/spec/frontend/vue_merge_request_widget/components/states/mr_widget_unresolved_discussions_spec.js b/spec/frontend/vue_merge_request_widget/components/states/mr_widget_unresolved_discussions_spec.js index 19825318a4f..d36ad4983c6 100644 --- a/spec/frontend/vue_merge_request_widget/components/states/mr_widget_unresolved_discussions_spec.js +++ b/spec/frontend/vue_merge_request_widget/components/states/mr_widget_unresolved_discussions_spec.js @@ -4,19 +4,12 @@ import { removeBreakLine } from 'helpers/text_helper'; import notesEventHub from '~/notes/event_hub'; import UnresolvedDiscussions from '~/vue_merge_request_widget/components/states/unresolved_discussions.vue'; -function createComponent({ path = '', propsData = {}, provide = {} } = {}) { +function createComponent({ path = '' } = {}) { return mount(UnresolvedDiscussions, { propsData: { mr: { createIssueToResolveDiscussionsPath: path, }, - ...propsData, - }, - provide: { - glFeatures: { - hideCreateIssueResolveAll: false, - }, - ...provide, }, }); } @@ -46,11 +39,7 @@ describe('UnresolvedDiscussions', () => { expect(text).toContain('Merge blocked:'); expect(text).toContain('all threads must be resolved.'); - expect(wrapper.element.innerText).toContain('Resolve all with new issue'); expect(wrapper.element.innerText).toContain('Go to first unresolved thread'); - expect(wrapper.element.querySelector('.js-create-issue').getAttribute('href')).toEqual( - TEST_HOST, - ); }); }); @@ -60,26 +49,7 @@ describe('UnresolvedDiscussions', () => { expect(text).toContain('Merge blocked:'); expect(text).toContain('all threads must be resolved.'); - expect(wrapper.element.innerText).not.toContain('Resolve all with new issue'); expect(wrapper.element.innerText).toContain('Go to first unresolved thread'); - expect(wrapper.element.querySelector('.js-create-issue')).toEqual(null); - }); - }); - - describe('when `hideCreateIssueResolveAll` is enabled', () => { - beforeEach(() => { - wrapper = createComponent({ - path: TEST_HOST, - provide: { - glFeatures: { - hideCreateIssueResolveAll: true, - }, - }, - }); - }); - - it('do not show jump to first button', () => { - expect(wrapper.text()).not.toContain('Create issue to resolve all threads'); }); }); }); diff --git a/spec/initializers/net_http_patch_spec.rb b/spec/initializers/net_http_patch_spec.rb index 82f896e1fa7..b9f5299b58c 100644 --- a/spec/initializers/net_http_patch_spec.rb +++ b/spec/initializers/net_http_patch_spec.rb @@ -11,7 +11,7 @@ RSpec.describe 'Net::HTTP patch proxy user and password encoding' do before do # This file can be removed once Ruby 3.0 is no longer supported: # https://gitlab.com/gitlab-org/gitlab/-/issues/396223 - skip if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new(3.1) + skip if Gem::Version.new(Net::HTTP::VERSION) >= Gem::Version.new('0.2.0') end describe '#proxy_user' do diff --git a/spec/lib/gitlab/database_importers/common_metrics/importer_spec.rb b/spec/lib/gitlab/database_importers/common_metrics/importer_spec.rb deleted file mode 100644 index 1150de880b5..00000000000 --- a/spec/lib/gitlab/database_importers/common_metrics/importer_spec.rb +++ /dev/null @@ -1,122 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe Gitlab::DatabaseImporters::CommonMetrics::Importer do - subject { described_class.new } - - context "does import common_metrics.yml" do - let(:groups) { subject.content['panel_groups'] } - let(:panels) { groups.flat_map { |group| group['panels'] } } - let(:metrics) { panels.flat_map { |group| group['metrics'] } } - let(:metric_ids) { metrics.map { |metric| metric['id'] } } - - before do - subject.execute - end - - it "has the same amount of groups" do - expect(PrometheusMetric.common.group(:group).count.count).to eq(groups.count) - end - - it "has the same amount of panels" do - expect(PrometheusMetric.common.group(:group, :title).count.count).to eq(panels.count) - end - - it "has the same amount of metrics" do - expect(PrometheusMetric.common.count).to eq(metrics.count) - end - - it "does not have duplicate IDs" do - expect(metric_ids).to eq(metric_ids.uniq) - end - - it "imports all IDs" do - expect(PrometheusMetric.common.pluck(:identifier)).to contain_exactly(*metric_ids) - end - end - - context "does import common_metrics.yml" do - it "when executed from outside of the Rails.root" do - Dir.chdir(Dir.tmpdir) do - expect { subject.execute }.not_to raise_error - end - - expect(PrometheusMetric.common).not_to be_empty - end - end - - context 'does import properly all fields' do - let(:query_identifier) { 'response-metric' } - let(:dashboard) do - { - panel_groups: [{ - group: 'Response metrics (NGINX Ingress)', - panels: [{ - title: "Throughput", - y_label: "Requests / Sec", - metrics: [{ - id: query_identifier, - query_range: 'my-query', - unit: 'my-unit', - label: 'status code' - }] - }] - }] - } - end - - before do - expect(subject).to receive(:content) { dashboard.deep_stringify_keys } - end - - shared_examples 'stores metric' do - let(:metric) { PrometheusMetric.find_by(identifier: query_identifier) } - - it 'with all data' do - expect(metric.group).to eq('nginx_ingress') - expect(metric.title).to eq('Throughput') - expect(metric.y_label).to eq('Requests / Sec') - expect(metric.unit).to eq('my-unit') - expect(metric.legend).to eq('status code') - expect(metric.query).to eq('my-query') - end - end - - context 'if ID is missing' do - let(:query_identifier) {} - - it 'raises exception' do - expect { subject.execute }.to raise_error(Gitlab::DatabaseImporters::CommonMetrics::Importer::MissingQueryId) - end - end - - context 'for existing common metric with different ID' do - let!(:existing_metric) { create(:prometheus_metric, :common, identifier: 'my-existing-metric') } - - before do - subject.execute - end - - it_behaves_like 'stores metric' do - it 'and existing metric is not changed' do - expect(metric).not_to eq(existing_metric) - end - end - end - - context 'when metric with ID exists ' do - let!(:existing_metric) { create(:prometheus_metric, :common, identifier: 'response-metric') } - - before do - subject.execute - end - - it_behaves_like 'stores metric' do - it 'and existing metric is changed' do - expect(metric).to eq(existing_metric) - end - end - end - end -end diff --git a/spec/lib/gitlab/database_importers/common_metrics/prometheus_metric_spec.rb b/spec/lib/gitlab/database_importers/common_metrics/prometheus_metric_spec.rb deleted file mode 100644 index 98a8e144d16..00000000000 --- a/spec/lib/gitlab/database_importers/common_metrics/prometheus_metric_spec.rb +++ /dev/null @@ -1,16 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe Gitlab::DatabaseImporters::CommonMetrics::PrometheusMetric do - it 'group enum equals ::PrometheusMetric' do - expect(described_class.groups).to eq(::PrometheusMetric.groups) - end - - it '.group_titles equals ::PrometheusMetric' do - existing_group_titles = Enums::PrometheusMetric.group_details.transform_values do |value| - value[:group_title] - end - expect(Gitlab::DatabaseImporters::CommonMetrics::PrometheusMetricEnums.group_titles).to eq(existing_group_titles) - end -end diff --git a/spec/requests/api/markdown_spec.rb b/spec/requests/api/markdown_spec.rb index db5bbd610fc..8298d0bf150 100644 --- a/spec/requests/api/markdown_spec.rb +++ b/spec/requests/api/markdown_spec.rb @@ -5,13 +5,18 @@ require "spec_helper" RSpec.describe API::Markdown, feature_category: :team_planning do describe "POST /markdown" do let(:user) {} # No-op. It gets overwritten in the contexts below. + let(:token) {} # No-op. It gets overwritten in the contexts below. let(:disable_authenticate_markdown_api) { false } before do stub_commonmark_sourcepos_disabled stub_feature_flags(authenticate_markdown_api: false) if disable_authenticate_markdown_api - post api("/markdown", user), params: params + if token + post api("/markdown", personal_access_token: token), params: params + else + post api("/markdown", user), params: params + end end shared_examples "rendered markdown text without GFM" do @@ -85,6 +90,13 @@ RSpec.describe API::Markdown, feature_category: :team_planning do let(:issue_url) { "http://#{Gitlab.config.gitlab.host}/#{issue.project.namespace.path}/#{issue.project.path}/-/issues/#{issue.iid}" } let(:text) { ":tada: Hello world! :100: #{issue.to_reference}" } + context "when personal access token has only read_api scope" do + let(:token) { create(:personal_access_token, user: user, scopes: [:read_api]) } + let(:params) { { text: text } } + + it_behaves_like "rendered markdown text without GFM" + end + context "when not using gfm" do context "without project" do let(:params) { { text: text } } diff --git a/spec/requests/api/project_job_token_scope_spec.rb b/spec/requests/api/project_job_token_scope_spec.rb index b7ee1fe774f..06e28d57ca6 100644 --- a/spec/requests/api/project_job_token_scope_spec.rb +++ b/spec/requests/api/project_job_token_scope_spec.rb @@ -264,6 +264,132 @@ RSpec.describe API::ProjectJobTokenScope, feature_category: :secrets_management end end + describe "POST /projects/:id/job_token_scope/allowlist" do + let_it_be(:project) { create(:project, :public) } + let_it_be(:project_inbound_allowed) { create(:project, :public) } + let_it_be(:user) { create(:user) } + + let(:post_job_token_scope_allowlist_path) { "/projects/#{project.id}/job_token_scope/allowlist" } + + let(:post_job_token_scope_allowlist_params) do + { target_project_id: project_inbound_allowed.id } + end + + subject do + post api(post_job_token_scope_allowlist_path, user), params: post_job_token_scope_allowlist_params + end + + context 'when unauthenticated user (missing user)' do + context 'for public project' do + it 'does not return ci cd settings of job token' do + project.update!(visibility_level: Gitlab::VisibilityLevel::PUBLIC) + + post api(post_job_token_scope_allowlist_path) + + expect(response).to have_gitlab_http_status(:unauthorized) + end + end + end + + context 'when authenticated user as maintainer' do + before_all { project.add_maintainer(user) } + + it 'returns unauthorized and blank response when invalid auth credentials are given' do + invalid_personal_access_token = build(:personal_access_token, user: user) + + post api(post_job_token_scope_allowlist_path, user, personal_access_token: invalid_personal_access_token), + params: post_job_token_scope_allowlist_params + + expect(response).to have_gitlab_http_status(:unauthorized) + end + + it 'returns created and creates job token scope link' do + subject + + expect(response).to have_gitlab_http_status(:created) + expect(json_response).to be_present + expect(json_response).to include( + "target_project_id" => project_inbound_allowed.id, + "source_project_id" => project.id + ) + expect(json_response).not_to include "id", "direction" + end + + it 'returns bad_request and does not create an additional job token scope link' do + create( + :ci_job_token_project_scope_link, + source_project: project, + target_project: project_inbound_allowed, + direction: :inbound + ) + + subject + + expect(response).to have_gitlab_http_status(:bad_request) + end + + it 'returns bad_request when adding the source project' do + post api(post_job_token_scope_allowlist_path, user), params: { target_project_id: project.id } + + expect(response).to have_gitlab_http_status(:bad_request) + end + + it 'returns not_found when project for param `project_id` does not exist' do + post api(post_job_token_scope_allowlist_path, user), params: { target_project_id: non_existing_record_id } + + expect(response).to have_gitlab_http_status(:not_found) + end + + it 'returns :bad_request when parameter `project_id` missing' do + post api(post_job_token_scope_allowlist_path, user), params: {} + + expect(response).to have_gitlab_http_status(:bad_request) + end + + it 'returns :bad_request when parameter `project_id` is nil value' do + post api(post_job_token_scope_allowlist_path, user), params: { target_project_id: nil } + + expect(response).to have_gitlab_http_status(:bad_request) + end + + it 'returns :bad_request when parameter `project_id` is empty value' do + post api(post_job_token_scope_allowlist_path, user), params: { target_project_id: '' } + + expect(response).to have_gitlab_http_status(:bad_request) + end + + it 'returns :bad_request when parameter `project_id` is float value' do + post api(post_job_token_scope_allowlist_path, user), params: { target_project_id: 12.34 } + + expect(response).to have_gitlab_http_status(:bad_request) + end + end + + context 'when authenticated user as developer' do + before_all { project.add_developer(user) } + + context 'for private project' do + it 'returns forbidden and no ci cd settings' do + project.update!(visibility_level: Gitlab::VisibilityLevel::PRIVATE) + + subject + + expect(response).to have_gitlab_http_status(:forbidden) + end + end + + context 'for public project' do + it 'returns forbidden and no ci cd settings' do + project.update!(visibility_level: Gitlab::VisibilityLevel::PUBLIC) + + subject + + expect(response).to have_gitlab_http_status(:forbidden) + end + end + end + end + describe 'DELETE /projects/:id/job_token_scope/allowlist/:target_project_id' do let_it_be(:project) { create(:project, :public) } let_it_be(:target_project) { create(:project, :public) } diff --git a/spec/requests/well_known_routing_spec.rb b/spec/requests/well_known_routing_spec.rb new file mode 100644 index 00000000000..d4e77a06953 --- /dev/null +++ b/spec/requests/well_known_routing_spec.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'well-known URLs', feature_category: :system_access do + describe '/.well-known/change-password' do + it 'redirects to edit profile password path' do + get('/.well-known/change-password') + + expect(response).to redirect_to(edit_profile_password_path) + end + end +end diff --git a/spec/views/dashboard/projects/index.html.haml_spec.rb b/spec/views/dashboard/projects/index.html.haml_spec.rb index 72b5901d5e5..08e88e4bdcf 100644 --- a/spec/views/dashboard/projects/index.html.haml_spec.rb +++ b/spec/views/dashboard/projects/index.html.haml_spec.rb @@ -8,7 +8,6 @@ RSpec.describe 'dashboard/projects/index.html.haml' do before do allow(view).to receive(:limited_counter_with_delimiter) allow(view).to receive(:current_user).and_return(user) - allow(view).to receive(:project_list_cache_key) allow(view).to receive(:time_ago_with_tooltip) allow(view).to receive(:project_icon) assign(:projects, [build(:project, name: 'awesome stuff')]) diff --git a/spec/views/shared/projects/_list.html.haml_spec.rb b/spec/views/shared/projects/_list.html.haml_spec.rb index b7b4f97f2b6..1b6c4e00c97 100644 --- a/spec/views/shared/projects/_list.html.haml_spec.rb +++ b/spec/views/shared/projects/_list.html.haml_spec.rb @@ -7,7 +7,6 @@ RSpec.describe 'shared/projects/_list' do before do allow(view).to receive(:projects).and_return(projects) - allow(view).to receive(:project_list_cache_key).and_return('fake_cache_key') end context 'with projects' do |