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>2023-06-02 15:06:59 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-06-02 15:06:59 +0300
commite9570ea27e2dc549962b9b318af369e9363fd1c4 (patch)
tree1a6aabfa0b41df8f6400a7bbcabe0bdb54f10fe7 /spec
parent7e8ecb5c00aae3b7072a5b8ff2c53db03c0bc579 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r--spec/db/development/import_common_metrics_spec.rb15
-rw-r--r--spec/db/production/import_common_metrics_spec.rb15
-rw-r--r--spec/db/schema_spec.rb1
-rw-r--r--spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb19
-rw-r--r--spec/features/markdown/metrics_spec.rb244
-rw-r--r--spec/frontend/sidebar/components/assignees/sidebar_participant_spec.js30
-rw-r--r--spec/frontend/vue_merge_request_widget/components/states/mr_widget_unresolved_discussions_spec.js32
-rw-r--r--spec/initializers/net_http_patch_spec.rb2
-rw-r--r--spec/lib/gitlab/database_importers/common_metrics/importer_spec.rb122
-rw-r--r--spec/lib/gitlab/database_importers/common_metrics/prometheus_metric_spec.rb16
-rw-r--r--spec/requests/api/markdown_spec.rb14
-rw-r--r--spec/requests/api/project_job_token_scope_spec.rb126
-rw-r--r--spec/requests/well_known_routing_spec.rb13
-rw-r--r--spec/views/dashboard/projects/index.html.haml_spec.rb1
-rw-r--r--spec/views/shared/projects/_list.html.haml_spec.rb1
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