summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-02-25 00:09:12 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-02-25 00:09:12 +0000
commit0b881f91159cc97ccb7328a2e52977a60ea83fbe (patch)
treed6b683cb935112aee47121f46e3c5dc84de24f2c /spec
parent7671216b60e2796a050358ff808b4a0c2de3d22f (diff)
downloadgitlab-ce-0b881f91159cc97ccb7328a2e52977a60ea83fbe.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r--spec/factories/releases/link.rb1
-rw-r--r--spec/features/markdown/metrics_spec.rb51
-rw-r--r--spec/frontend/vue_shared/components/sidebar/labels_select/dropdown_title_spec.js31
-rw-r--r--spec/lib/gitlab/import_export/safe_model_attributes.yml1
-rw-r--r--spec/migrations/drop_activate_prometheus_services_background_jobs_spec.rb89
-rw-r--r--spec/models/releases/link_spec.rb45
-rw-r--r--spec/policies/project_snippet_policy_spec.rb48
-rw-r--r--spec/requests/api/deployments_spec.rb1
-rw-r--r--spec/support/helpers/metrics_dashboard_url_helpers.rb16
9 files changed, 218 insertions, 65 deletions
diff --git a/spec/factories/releases/link.rb b/spec/factories/releases/link.rb
index 82446dbdb69..001deeb71a0 100644
--- a/spec/factories/releases/link.rb
+++ b/spec/factories/releases/link.rb
@@ -5,5 +5,6 @@ FactoryBot.define do
release
sequence(:name) { |n| "release-18.#{n}.dmg" }
sequence(:url) { |n| "https://example.com/scrambled-url/app-#{n}.zip" }
+ sequence(:filepath) { |n| "/binaries/awesome-app-#{n}" }
end
end
diff --git a/spec/features/markdown/metrics_spec.rb b/spec/features/markdown/metrics_spec.rb
index 69e93268b57..81c6b6195c6 100644
--- a/spec/features/markdown/metrics_spec.rb
+++ b/spec/features/markdown/metrics_spec.rb
@@ -2,25 +2,32 @@
require 'spec_helper'
-describe 'Metrics rendering', :js, :use_clean_rails_memory_store_caching, :sidekiq_might_not_need_inline do
+describe 'Metrics rendering', :js, :use_clean_rails_memory_store_caching, :sidekiq_inline do
include PrometheusHelpers
include GrafanaApiHelpers
+ include MetricsDashboardUrlHelpers
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:prometheus_project) }
+ let_it_be(:environment) { create(:environment, project: project) }
- let(:user) { create(:user) }
- let(:project) { create(:prometheus_project) }
- let(: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) { metrics_project_environment_url(project, environment) }
+ let(:metrics_url) { urls.metrics_project_environment_url(project, environment) }
before do
- configure_host
+ clear_host_from_memoized_variables
+
+ allow(::Gitlab.config.gitlab)
+ .to receive(:url)
+ .and_return(urls.root_url.chomp('/'))
+
project.add_developer(user)
sign_in(user)
end
after do
- restore_host
+ clear_host_from_memoized_variables
end
context 'internal metrics embeds' do
@@ -38,7 +45,7 @@ describe 'Metrics rendering', :js, :use_clean_rails_memory_store_caching, :sidek
end
context 'when dashboard params are in included the url' do
- let(:metrics_url) { metrics_project_environment_url(project, environment, **chart_params) }
+ let(:metrics_url) { urls.metrics_project_environment_url(project, environment, **chart_params) }
let(:chart_params) do
{
@@ -81,32 +88,4 @@ describe 'Metrics rendering', :js, :use_clean_rails_memory_store_caching, :sidek
def import_common_metrics
::Gitlab::DatabaseImporters::CommonMetrics::Importer.new.execute
end
-
- def configure_host
- @original_default_host = default_url_options[:host]
- @original_gitlab_url = Gitlab.config.gitlab[:url]
-
- # Ensure we create a metrics url with the right host.
- # Configure host for route helpers in specs (also updates root_url):
- default_url_options[:host] = Capybara.server_host
-
- # Ensure we identify urls with the appropriate host.
- # Configure host to include port in app:
- Gitlab.config.gitlab[:url] = root_url.chomp('/')
-
- clear_host_from_memoized_variables
- end
-
- def restore_host
- default_url_options[:host] = @original_default_host
- Gitlab.config.gitlab[:url] = @original_gitlab_url
-
- clear_host_from_memoized_variables
- end
-
- def clear_host_from_memoized_variables
- [:metrics_regex, :grafana_regex].each do |method_name|
- Gitlab::Metrics::Dashboard::Url.clear_memoization(method_name)
- end
- end
end
diff --git a/spec/frontend/vue_shared/components/sidebar/labels_select/dropdown_title_spec.js b/spec/frontend/vue_shared/components/sidebar/labels_select/dropdown_title_spec.js
index 2fffb31acf5..5cbbb99eaef 100644
--- a/spec/frontend/vue_shared/components/sidebar/labels_select/dropdown_title_spec.js
+++ b/spec/frontend/vue_shared/components/sidebar/labels_select/dropdown_title_spec.js
@@ -1,39 +1,38 @@
-import Vue from 'vue';
-
-import mountComponent from 'helpers/vue_mount_component_helper';
+import { shallowMount } from '@vue/test-utils';
+import { GlLoadingIcon } from '@gitlab/ui';
import dropdownTitleComponent from '~/vue_shared/components/sidebar/labels_select/dropdown_title.vue';
-const createComponent = (canEdit = true) => {
- const Component = Vue.extend(dropdownTitleComponent);
-
- return mountComponent(Component, {
- canEdit,
+const createComponent = (canEdit = true) =>
+ shallowMount(dropdownTitleComponent, {
+ propsData: {
+ canEdit,
+ },
});
-};
describe('DropdownTitleComponent', () => {
- let vm;
+ let wrapper;
beforeEach(() => {
- vm = createComponent();
+ wrapper = createComponent();
});
afterEach(() => {
- vm.$destroy();
+ wrapper.destroy();
+ wrapper = null;
});
describe('template', () => {
it('renders title text', () => {
- expect(vm.$el.classList.contains('title', 'hide-collapsed')).toBe(true);
- expect(vm.$el.innerText.trim()).toContain('Labels');
+ expect(wrapper.vm.$el.classList.contains('title', 'hide-collapsed')).toBe(true);
+ expect(wrapper.vm.$el.innerText.trim()).toContain('Labels');
});
it('renders spinner icon element', () => {
- expect(vm.$el.querySelector('.fa-spinner.fa-spin.block-loading')).not.toBeNull();
+ expect(wrapper.find(GlLoadingIcon)).not.toBeNull();
});
it('renders `Edit` button element', () => {
- const editBtnEl = vm.$el.querySelector('button.edit-link.js-sidebar-dropdown-toggle');
+ const editBtnEl = wrapper.vm.$el.querySelector('button.edit-link.js-sidebar-dropdown-toggle');
expect(editBtnEl).not.toBeNull();
expect(editBtnEl.innerText.trim()).toBe('Edit');
diff --git a/spec/lib/gitlab/import_export/safe_model_attributes.yml b/spec/lib/gitlab/import_export/safe_model_attributes.yml
index 365b23e04e9..1d652f703b8 100644
--- a/spec/lib/gitlab/import_export/safe_model_attributes.yml
+++ b/spec/lib/gitlab/import_export/safe_model_attributes.yml
@@ -133,6 +133,7 @@ Releases::Link:
- id
- url
- name
+- filepath
- created_at
- updated_at
ProjectMember:
diff --git a/spec/migrations/drop_activate_prometheus_services_background_jobs_spec.rb b/spec/migrations/drop_activate_prometheus_services_background_jobs_spec.rb
new file mode 100644
index 00000000000..0e9a3418e29
--- /dev/null
+++ b/spec/migrations/drop_activate_prometheus_services_background_jobs_spec.rb
@@ -0,0 +1,89 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require Rails.root.join('db', 'migrate', '20200221144534_drop_activate_prometheus_services_background_jobs.rb')
+
+describe DropActivatePrometheusServicesBackgroundJobs, :sidekiq, :redis, :migration, schema: 2020_02_21_144534 do
+ subject(:migration) { described_class.new }
+
+ describe '#up' do
+ let(:retry_set) { Sidekiq::RetrySet.new }
+ let(:scheduled_set) { Sidekiq::ScheduledSet.new }
+
+ context 'there are only affected jobs on the queue' do
+ let(:payload) { { 'class' => ::BackgroundMigrationWorker, 'args' => [described_class::DROPPED_JOB_CLASS, 1] } }
+ let(:queue_payload) { payload.merge('queue' => described_class::QUEUE) }
+
+ it 'removes enqueued ActivatePrometheusServicesForSharedClusterApplications background jobs' do
+ Sidekiq::Testing.disable! do # https://github.com/mperham/sidekiq/wiki/testing#api Sidekiq's API does not have a testing mode
+ retry_set.schedule(1.hour.from_now, payload)
+ scheduled_set.schedule(1.hour.from_now, payload)
+ Sidekiq::Client.push(queue_payload)
+
+ expect { migration.up }.to change { Sidekiq::Queue.new(described_class::QUEUE).size }.from(1).to(0)
+ expect(retry_set.size).to eq(0)
+ expect(scheduled_set.size).to eq(0)
+ end
+ end
+ end
+
+ context "there aren't any affected jobs on the queue" do
+ let(:payload) { { 'class' => ::BackgroundMigrationWorker, 'args' => ['SomeOtherClass', 1] } }
+ let(:queue_payload) { payload.merge('queue' => described_class::QUEUE) }
+
+ it 'skips other enqueued jobs' do
+ Sidekiq::Testing.disable! do
+ retry_set.schedule(1.hour.from_now, payload)
+ scheduled_set.schedule(1.hour.from_now, payload)
+ Sidekiq::Client.push(queue_payload)
+
+ expect { migration.up }.not_to change { Sidekiq::Queue.new(described_class::QUEUE).size }
+ expect(retry_set.size).to eq(1)
+ expect(scheduled_set.size).to eq(1)
+ end
+ end
+ end
+
+ context "there are multiple types of jobs on the queue" do
+ let(:payload) { { 'class' => ::BackgroundMigrationWorker, 'args' => [described_class::DROPPED_JOB_CLASS, 1] } }
+ let(:queue_payload) { payload.merge('queue' => described_class::QUEUE) }
+
+ it 'skips other enqueued jobs' do
+ Sidekiq::Testing.disable! do
+ queue = Sidekiq::Queue.new(described_class::QUEUE)
+ # these jobs will be deleted
+ retry_set.schedule(1.hour.from_now, payload)
+ scheduled_set.schedule(1.hour.from_now, payload)
+ Sidekiq::Client.push(queue_payload)
+ # this jobs will be skipped
+ skipped_jobs_args = [['SomeOtherClass', 1], [described_class::DROPPED_JOB_CLASS, 'wrong id type'], [described_class::DROPPED_JOB_CLASS, 1, 'some wired argument']]
+ skipped_jobs_args.each do |args|
+ retry_set.schedule(1.hour.from_now, { 'class' => ::BackgroundMigrationWorker, 'args' => args })
+ scheduled_set.schedule(1.hour.from_now, { 'class' => ::BackgroundMigrationWorker, 'args' => args })
+ Sidekiq::Client.push('queue' => described_class::QUEUE, 'class' => ::BackgroundMigrationWorker, 'args' => args)
+ end
+
+ migration.up
+
+ expect(retry_set.size).to be 3
+ expect(scheduled_set.size).to be 3
+ expect(queue.size).to be 3
+ expect(queue.map(&:args)).to match_array skipped_jobs_args
+ expect(retry_set.map(&:args)).to match_array skipped_jobs_args
+ expect(scheduled_set.map(&:args)).to match_array skipped_jobs_args
+ end
+ end
+ end
+
+ context "other queues" do
+ it 'does not modify them' do
+ Sidekiq::Testing.disable! do
+ Sidekiq::Client.push('queue' => 'other', 'class' => ::BackgroundMigrationWorker, 'args' => ['SomeOtherClass', 1])
+ Sidekiq::Client.push('queue' => 'other', 'class' => ::BackgroundMigrationWorker, 'args' => [described_class::DROPPED_JOB_CLASS, 1])
+
+ expect { migration.up }.not_to change { Sidekiq::Queue.new('other').size }
+ end
+ end
+ end
+ end
+end
diff --git a/spec/models/releases/link_spec.rb b/spec/models/releases/link_spec.rb
index 4dd26c976cc..7533d1e6e5c 100644
--- a/spec/models/releases/link_spec.rb
+++ b/spec/models/releases/link_spec.rb
@@ -13,6 +13,7 @@ describe Releases::Link do
describe 'validation' do
it { is_expected.to validate_presence_of(:url) }
it { is_expected.to validate_presence_of(:name) }
+ it { is_expected.to validate_length_of(:filepath).is_at_most(128) }
context 'when url is invalid' do
let(:link) { build(:release_link, url: 'hoge') }
@@ -43,6 +44,16 @@ describe Releases::Link do
end
end
+ context 'when duplicate filepath is added to a release' do
+ let!(:link) { create(:release_link, filepath: '/binaries/gitlab-runner-linux-amd64', release: release) }
+
+ it 'raises an error' do
+ expect do
+ create(:release_link, filepath: '/binaries/gitlab-runner-linux-amd64', release: release)
+ end.to raise_error(ActiveRecord::RecordInvalid)
+ end
+ end
+
describe '.sorted' do
subject { described_class.sorted }
@@ -101,4 +112,38 @@ describe Releases::Link do
end
end
end
+
+ describe 'FILEPATH_REGEX with table' do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:link) { build(:release_link)}
+
+ where(:reason, :filepath, :result) do
+ 'cannot contain `//`' | '/https//www.example.com' | be_invalid
+ 'cannot start with `//`' | '//www.example.com' | be_invalid
+ 'cannot contain a `?`' | '/example.com/?stuff=true' | be_invalid
+ 'cannot contain a `:`' | '/example:5000' | be_invalid
+ 'cannot end in a `-`' | '/binaries/awesome-app.dmg-' | be_invalid
+ 'cannot end in a `.`' | '/binaries/awesome-app.dmg.' | be_invalid
+ 'cannot end in a `_`' | '/binaries/awesome-app.dmg_' | be_invalid
+ 'cannot start with a `.`' | '.binaries/awesome-app.dmg' | be_invalid
+ 'cannot start with a `-`' | '-binaries/awesome-app.dmg' | be_invalid
+ 'cannot start with a `_`' | '_binaries/awesome-app.dmg' | be_invalid
+ 'cannot start with a number' | '3binaries/awesome-app.dmg' | be_invalid
+ 'cannot start with a letter' | 'binaries/awesome-app.dmg' | be_invalid
+ 'cannot contain accents' | '/binarïes/âwésome-app.dmg' | be_invalid
+ 'can end in a character' | '/binaries/awesome-app.dmg' | be_valid
+ 'can end in a number' | '/binaries/awesome-app-1' | be_valid
+ 'can contain one or more dots, dashes or underscores' | '/sub_tr__ee.ex..ample-2--1/v99.com' | be_valid
+ 'can contain multiple non-sequential slashes' | '/example.com/path/to/file.exe' | be_valid
+ 'can be nil' | nil | be_valid
+ end
+
+ with_them do
+ specify do
+ link.filepath = filepath
+ expect(link).to result
+ end
+ end
+ end
end
diff --git a/spec/policies/project_snippet_policy_spec.rb b/spec/policies/project_snippet_policy_spec.rb
index b55d565a57c..c5077e119bc 100644
--- a/spec/policies/project_snippet_policy_spec.rb
+++ b/spec/policies/project_snippet_policy_spec.rb
@@ -20,28 +20,39 @@ describe ProjectSnippetPolicy do
subject { described_class.new(current_user, snippet) }
shared_examples 'regular user access rights' do
- context 'project team member (non guest)' do
- before do
- project.add_developer(current_user)
- end
+ context 'not snippet author' do
+ context 'project team member (non guest)' do
+ before do
+ project.add_developer(current_user)
+ end
- it do
- expect_allowed(:read_snippet, :create_note)
- expect_disallowed(*author_permissions)
+ it do
+ expect_allowed(:read_snippet, :create_note)
+ expect_disallowed(*author_permissions)
+ end
end
- end
- context 'project team member (guest)' do
- before do
- project.add_guest(current_user)
- end
+ context 'project team member (guest)' do
+ before do
+ project.add_guest(current_user)
+ end
- context 'not snippet author' do
it do
expect_allowed(:read_snippet, :create_note)
expect_disallowed(:admin_snippet)
end
end
+
+ context 'project team member (maintainer)' do
+ before do
+ project.add_maintainer(current_user)
+ end
+
+ it do
+ expect_allowed(:read_snippet, :create_note)
+ expect_allowed(*author_permissions)
+ end
+ end
end
context 'snippet author' do
@@ -69,6 +80,17 @@ describe ProjectSnippetPolicy do
end
end
+ context 'project team member (maintainer)' do
+ before do
+ project.add_maintainer(current_user)
+ end
+
+ it do
+ expect_allowed(:read_snippet, :create_note)
+ expect_allowed(*author_permissions)
+ end
+ end
+
context 'not a project member' do
it do
expect_allowed(:read_snippet, :create_note)
diff --git a/spec/requests/api/deployments_spec.rb b/spec/requests/api/deployments_spec.rb
index 663478942ae..b820b227fff 100644
--- a/spec/requests/api/deployments_spec.rb
+++ b/spec/requests/api/deployments_spec.rb
@@ -444,6 +444,7 @@ describe API::Deployments do
subject
expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to include_pagination_headers
expect(json_response.map { |d| d['id'] }).to contain_exactly(merge_request1.id, merge_request2.id)
end
diff --git a/spec/support/helpers/metrics_dashboard_url_helpers.rb b/spec/support/helpers/metrics_dashboard_url_helpers.rb
new file mode 100644
index 00000000000..5809f152e3e
--- /dev/null
+++ b/spec/support/helpers/metrics_dashboard_url_helpers.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+module MetricsDashboardUrlHelpers
+ # Using the url_helpers available in the test suite uses
+ # the sample host, but the urls generated may need to
+ # point to the configured host in the :js trait
+ def urls
+ ::Gitlab::Routing.url_helpers
+ end
+
+ def clear_host_from_memoized_variables
+ [:metrics_regex, :grafana_regex, :cluster_metrics, :alerts_regex].each do |method_name|
+ Gitlab::Metrics::Dashboard::Url.clear_memoization(method_name)
+ end
+ end
+end