Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-01-31 21:09:11 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-01-31 21:09:11 +0300
commit0434f38ef1dce4fe640fe1e4542235746ceb943c (patch)
tree3affe5902c9da74441dfbf5069f76c023b5cd03a /spec
parentc27acb1d376f7127cd33eadcc8f5683ed55262bc (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r--spec/controllers/concerns/page_limiter_spec.rb20
-rw-r--r--spec/controllers/explore/projects_controller_spec.rb10
-rw-r--r--spec/features/projects/graph_spec.rb2
-rw-r--r--spec/features/projects/snippets/user_views_snippets_spec.rb97
-rw-r--r--spec/features/task_lists_spec.rb31
-rw-r--r--spec/frontend/projects/pipelines/charts/components/__snapshots__/statistics_list_spec.js.snap45
-rw-r--r--spec/frontend/projects/pipelines/charts/components/app_spec.js42
-rw-r--r--spec/frontend/projects/pipelines/charts/components/statistics_list_spec.js24
-rw-r--r--spec/frontend/projects/pipelines/charts/mock_data.js11
-rw-r--r--spec/lib/gitlab/alerting/notification_payload_parser_spec.rb134
-rw-r--r--spec/models/prometheus_metric_spec.rb3
-rw-r--r--spec/presenters/release_presenter_spec.rb16
12 files changed, 404 insertions, 31 deletions
diff --git a/spec/controllers/concerns/page_limiter_spec.rb b/spec/controllers/concerns/page_limiter_spec.rb
index 9ac94b7e740..287b62cb66c 100644
--- a/spec/controllers/concerns/page_limiter_spec.rb
+++ b/spec/controllers/concerns/page_limiter_spec.rb
@@ -71,19 +71,23 @@ describe PageLimiter do
describe "#default_page_out_of_bounds_response" do
subject { instance.send(:default_page_out_of_bounds_response) }
- after do
- subject
- end
-
it "returns a bad_request header" do
expect(instance).to receive(:head).with(:bad_request)
+
+ subject
end
end
describe "#record_page_limit_interception" do
subject { instance.send(:record_page_limit_interception) }
- it "records a metric counter" do
+ let(:counter) { double("counter", increment: true) }
+
+ before do
+ allow(Gitlab::Metrics).to receive(:counter) { counter }
+ end
+
+ it "creates a metric counter" do
expect(Gitlab::Metrics).to receive(:counter).with(
:gitlab_page_out_of_bounds,
controller: "explore/projects",
@@ -93,5 +97,11 @@ describe PageLimiter do
subject
end
+
+ it "increments the counter" do
+ expect(counter).to receive(:increment)
+
+ subject
+ end
end
end
diff --git a/spec/controllers/explore/projects_controller_spec.rb b/spec/controllers/explore/projects_controller_spec.rb
index 6f68de52845..c2cd29eb036 100644
--- a/spec/controllers/explore/projects_controller_spec.rb
+++ b/spec/controllers/explore/projects_controller_spec.rb
@@ -90,8 +90,12 @@ describe Explore::ProjectsController do
end
describe "metrics recording" do
- after do
- get endpoint, params: { page: page_limit + 1 }
+ subject { get endpoint, params: { page: page_limit + 1 } }
+
+ let(:counter) { double("counter", increment: true) }
+
+ before do
+ allow(Gitlab::Metrics).to receive(:counter) { counter }
end
it "records the interception" do
@@ -101,6 +105,8 @@ describe Explore::ProjectsController do
action: endpoint.to_s,
bot: false
)
+
+ subject
end
end
end
diff --git a/spec/features/projects/graph_spec.rb b/spec/features/projects/graph_spec.rb
index 5dabaf20952..7b5c731c34b 100644
--- a/spec/features/projects/graph_spec.rb
+++ b/spec/features/projects/graph_spec.rb
@@ -85,7 +85,7 @@ describe 'Project Graph', :js do
expect(page).to have_content 'Pipelines for last week'
expect(page).to have_content 'Pipelines for last month'
expect(page).to have_content 'Pipelines for last year'
- expect(page).to have_content 'Commit duration in minutes for last 30 commits'
+ expect(page).to have_content 'Duration for the last 30 commits'
end
end
end
diff --git a/spec/features/projects/snippets/user_views_snippets_spec.rb b/spec/features/projects/snippets/user_views_snippets_spec.rb
index 5739c9510a8..a02f7f8a8d2 100644
--- a/spec/features/projects/snippets/user_views_snippets_spec.rb
+++ b/spec/features/projects/snippets/user_views_snippets_spec.rb
@@ -3,32 +3,97 @@
require 'spec_helper'
describe 'Projects > Snippets > User views snippets' do
- let(:project) { create(:project) }
- let!(:project_snippet) { create(:project_snippet, project: project, author: user) }
- let!(:snippet) { create(:snippet, author: user) }
- let(:snippets) { [project_snippet, snippet] } # Used by the shared examples
+ let_it_be(:project) { create(:project) }
let(:user) { create(:user) }
- before do
- project.add_maintainer(user)
- sign_in(user)
-
+ def visit_project_snippets
visit(project_snippets_path(project))
end
- context 'pagination' do
+ context 'snippets list' do
+ let!(:project_snippet) { create(:project_snippet, project: project, author: user) }
+ let!(:snippet) { create(:snippet, author: user) }
+ let(:snippets) { [project_snippet, snippet] } # Used by the shared examples
+
before do
- create(:project_snippet, project: project, author: user)
- allow(Snippet).to receive(:default_per_page).and_return(1)
+ project.add_maintainer(user)
+ sign_in(user)
+ end
+
+ context 'pagination' do
+ before do
+ create(:project_snippet, project: project, author: user)
+ allow(Snippet).to receive(:default_per_page).and_return(1)
- visit project_snippets_path(project)
+ visit_project_snippets
+ end
+
+ it_behaves_like 'paginated snippets'
end
- it_behaves_like 'paginated snippets'
+ it 'shows snippets' do
+ visit_project_snippets
+
+ expect(page).to have_link(project_snippet.title, href: project_snippet_path(project, project_snippet))
+ expect(page).not_to have_content(snippet.title)
+ end
end
- it 'shows snippets' do
- expect(page).to have_link(project_snippet.title, href: project_snippet_path(project, project_snippet))
- expect(page).not_to have_content(snippet.title)
+ context 'when current user is a guest' do
+ before do
+ project.add_guest(user)
+ sign_in(user)
+ end
+
+ context 'when snippets list is empty' do
+ it 'hides New Snippet button' do
+ visit_project_snippets
+
+ page.within(find('.empty-state')) do
+ expect(page).not_to have_link('New snippet')
+ end
+ end
+ end
+
+ context 'when project has snippets' do
+ let!(:project_snippet) { create(:project_snippet, project: project, author: user) }
+
+ it 'hides New Snippet button' do
+ visit_project_snippets
+
+ page.within(find('.top-area')) do
+ expect(page).not_to have_link('New snippet')
+ end
+ end
+ end
+ end
+
+ context 'when current user is not a guest' do
+ before do
+ project.add_developer(user)
+ sign_in(user)
+ end
+
+ context 'when snippets list is empty' do
+ it 'shows New Snippet button' do
+ visit_project_snippets
+
+ page.within(find('.empty-state')) do
+ expect(page).to have_link('New snippet')
+ end
+ end
+ end
+
+ context 'when project has snippets' do
+ let!(:project_snippet) { create(:project_snippet, project: project, author: user) }
+
+ it 'shows New Snippet button' do
+ visit_project_snippets
+
+ page.within(find('.top-area')) do
+ expect(page).to have_link('New snippet')
+ end
+ end
+ end
end
end
diff --git a/spec/features/task_lists_spec.rb b/spec/features/task_lists_spec.rb
index bcd894a0d20..0d10f6aee3b 100644
--- a/spec/features/task_lists_spec.rb
+++ b/spec/features/task_lists_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
describe 'Task Lists' do
include Warden::Test::Helpers
- let(:project) { create(:project, :repository) }
+ let(:project) { create(:project, :public, :repository) }
let(:user) { create(:user) }
let(:user2) { create(:user) }
@@ -122,6 +122,7 @@ describe 'Task Lists' do
it 'provides a summary on Issues#index' do
visit project_issues_path(project)
+
expect(page).to have_content("2 of 6 tasks completed")
end
end
@@ -191,6 +192,7 @@ describe 'Task Lists' do
it 'is only editable by author', :js do
visit_issue(project, issue)
+
expect(page).to have_selector('.js-task-list-container')
gitlab_sign_out
@@ -237,10 +239,7 @@ describe 'Task Lists' do
visit project_merge_request_path(project, merge)
end
- describe 'multiple tasks' do
- let(:project) { create(:project, :repository) }
- let!(:merge) { create(:merge_request, :simple, description: markdown, author: user, source_project: project) }
-
+ shared_examples 'multiple tasks' do
it 'renders for description' do
visit_merge_request(project, merge)
@@ -261,23 +260,40 @@ describe 'Task Lists' do
expect(page).to have_selector('a.btn-close')
end
- it 'is only editable by author' do
+ it 'is only editable by author', :js do
visit_merge_request(project, merge)
+
expect(page).to have_selector('.js-task-list-container')
+ expect(page).to have_selector('li.task-list-item.enabled', count: 6)
logout(:user)
-
login_as(user2)
visit current_path
+
expect(page).not_to have_selector('.js-task-list-container')
+ expect(page).to have_selector('li.task-list-item.enabled', count: 0)
+ expect(page).to have_selector('li.task-list-item input[disabled]', count: 6)
end
+ end
+
+ context 'when merge request is open' do
+ let!(:merge) { create(:merge_request, :simple, description: markdown, author: user, source_project: project) }
+
+ it_behaves_like 'multiple tasks'
it 'provides a summary on MergeRequests#index' do
visit project_merge_requests_path(project)
+
expect(page).to have_content("2 of 6 tasks completed")
end
end
+ context 'when merge request is closed' do
+ let!(:merge) { create(:merge_request, :closed, :simple, description: markdown, author: user, source_project: project) }
+
+ it_behaves_like 'multiple tasks'
+ end
+
describe 'single incomplete task' do
let!(:merge) { create(:merge_request, :simple, description: singleIncompleteMarkdown, author: user, source_project: project) }
@@ -291,6 +307,7 @@ describe 'Task Lists' do
it 'provides a summary on MergeRequests#index' do
visit project_merge_requests_path(project)
+
expect(page).to have_content("0 of 1 task completed")
end
end
diff --git a/spec/frontend/projects/pipelines/charts/components/__snapshots__/statistics_list_spec.js.snap b/spec/frontend/projects/pipelines/charts/components/__snapshots__/statistics_list_spec.js.snap
new file mode 100644
index 00000000000..ff0351bd099
--- /dev/null
+++ b/spec/frontend/projects/pipelines/charts/components/__snapshots__/statistics_list_spec.js.snap
@@ -0,0 +1,45 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`StatisticsList matches the snapshot 1`] = `
+<ul>
+ <li>
+ <span>
+ Total:
+ </span>
+
+ <strong>
+ 4 pipelines
+ </strong>
+ </li>
+
+ <li>
+ <span>
+ Successful:
+ </span>
+
+ <strong>
+ 2 pipelines
+ </strong>
+ </li>
+
+ <li>
+ <span>
+ Failed:
+ </span>
+
+ <strong>
+ 2 pipelines
+ </strong>
+ </li>
+
+ <li>
+ <span>
+ Success ratio:
+ </span>
+
+ <strong>
+ 50%
+ </strong>
+ </li>
+</ul>
+`;
diff --git a/spec/frontend/projects/pipelines/charts/components/app_spec.js b/spec/frontend/projects/pipelines/charts/components/app_spec.js
new file mode 100644
index 00000000000..48ea333e2c3
--- /dev/null
+++ b/spec/frontend/projects/pipelines/charts/components/app_spec.js
@@ -0,0 +1,42 @@
+import { shallowMount } from '@vue/test-utils';
+import { GlColumnChart } from '@gitlab/ui/dist/charts';
+import Component from '~/projects/pipelines/charts/components/app';
+import StatisticsList from '~/projects/pipelines/charts/components/statistics_list';
+import { counts, timesChartData } from '../mock_data';
+
+describe('ProjectsPipelinesChartsApp', () => {
+ let wrapper;
+
+ beforeEach(() => {
+ wrapper = shallowMount(Component, {
+ propsData: {
+ counts,
+ timesChartData,
+ },
+ });
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ describe('overall statistics', () => {
+ it('displays the statistics list', () => {
+ const list = wrapper.find(StatisticsList);
+
+ expect(list.exists()).toBeTruthy();
+ expect(list.props('counts')).toBe(counts);
+ });
+
+ it('displays the commit duration chart', () => {
+ const chart = wrapper.find(GlColumnChart);
+
+ expect(chart.exists()).toBeTruthy();
+ expect(chart.props('yAxisTitle')).toBe('Minutes');
+ expect(chart.props('xAxisTitle')).toBe('Commit');
+ expect(chart.props('data')).toBe(wrapper.vm.timesChartTransformedData);
+ expect(chart.props('option')).toBe(wrapper.vm.$options.timesChartOptions);
+ });
+ });
+});
diff --git a/spec/frontend/projects/pipelines/charts/components/statistics_list_spec.js b/spec/frontend/projects/pipelines/charts/components/statistics_list_spec.js
new file mode 100644
index 00000000000..93130f22407
--- /dev/null
+++ b/spec/frontend/projects/pipelines/charts/components/statistics_list_spec.js
@@ -0,0 +1,24 @@
+import { shallowMount } from '@vue/test-utils';
+import Component from '~/projects/pipelines/charts/components/statistics_list';
+import { counts } from '../mock_data';
+
+describe('StatisticsList', () => {
+ let wrapper;
+
+ beforeEach(() => {
+ wrapper = shallowMount(Component, {
+ propsData: {
+ counts,
+ },
+ });
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ it('matches the snapshot', () => {
+ expect(wrapper.element).toMatchSnapshot();
+ });
+});
diff --git a/spec/frontend/projects/pipelines/charts/mock_data.js b/spec/frontend/projects/pipelines/charts/mock_data.js
new file mode 100644
index 00000000000..93e53125679
--- /dev/null
+++ b/spec/frontend/projects/pipelines/charts/mock_data.js
@@ -0,0 +1,11 @@
+export const counts = {
+ failed: 2,
+ success: 2,
+ total: 4,
+ successRatio: 50,
+};
+
+export const timesChartData = {
+ labels: ['as1234', 'kh423hy', 'ji56bvg', 'th23po'],
+ values: [5, 3, 7, 4],
+};
diff --git a/spec/lib/gitlab/alerting/notification_payload_parser_spec.rb b/spec/lib/gitlab/alerting/notification_payload_parser_spec.rb
new file mode 100644
index 00000000000..a38aea7b972
--- /dev/null
+++ b/spec/lib/gitlab/alerting/notification_payload_parser_spec.rb
@@ -0,0 +1,134 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+describe Gitlab::Alerting::NotificationPayloadParser do
+ describe '.call' do
+ let(:starts_at) { Time.current.change(usec: 0) }
+ let(:payload) do
+ {
+ 'title' => 'alert title',
+ 'start_time' => starts_at.rfc3339,
+ 'description' => 'Description',
+ 'monitoring_tool' => 'Monitoring tool name',
+ 'service' => 'Service',
+ 'hosts' => ['gitlab.com']
+ }
+ end
+
+ subject { described_class.call(payload) }
+
+ it 'returns Prometheus-like payload' do
+ is_expected.to eq(
+ {
+ 'annotations' => {
+ 'title' => 'alert title',
+ 'description' => 'Description',
+ 'monitoring_tool' => 'Monitoring tool name',
+ 'service' => 'Service',
+ 'hosts' => ['gitlab.com']
+ },
+ 'startsAt' => starts_at.rfc3339
+ }
+ )
+ end
+
+ context 'when title is blank' do
+ before do
+ payload[:title] = ''
+ end
+
+ it 'sets a predefined title' do
+ expect(subject.dig('annotations', 'title')).to eq('New: Incident')
+ end
+ end
+
+ context 'when hosts attribute is a string' do
+ before do
+ payload[:hosts] = 'gitlab.com'
+ end
+
+ it 'returns hosts as an array of one element' do
+ expect(subject.dig('annotations', 'hosts')).to eq(['gitlab.com'])
+ end
+ end
+
+ context 'when the time is in unsupported format' do
+ before do
+ payload[:start_time] = 'invalid/date/format'
+ end
+
+ it 'sets startsAt to a current time in RFC3339 format' do
+ expect(subject['startsAt']).to eq(starts_at.rfc3339)
+ end
+ end
+
+ context 'when payload is blank' do
+ let(:payload) { {} }
+
+ it 'returns default parameters' do
+ is_expected.to eq(
+ 'annotations' => { 'title' => 'New: Incident' },
+ 'startsAt' => starts_at.rfc3339
+ )
+ end
+ end
+
+ context 'when payload attributes have blank lines' do
+ let(:payload) do
+ {
+ 'title' => '',
+ 'start_time' => '',
+ 'description' => '',
+ 'monitoring_tool' => '',
+ 'service' => '',
+ 'hosts' => ['']
+ }
+ end
+
+ it 'returns default parameters' do
+ is_expected.to eq(
+ 'annotations' => { 'title' => 'New: Incident' },
+ 'startsAt' => starts_at.rfc3339
+ )
+ end
+ end
+
+ context 'when payload has secondary params' do
+ let(:payload) do
+ {
+ 'description' => 'Description',
+ 'additional' => {
+ 'params' => {
+ '1' => 'Some value 1',
+ '2' => 'Some value 2',
+ 'blank' => ''
+ }
+ }
+ }
+ end
+
+ it 'adds secondary params to annotations' do
+ is_expected.to eq(
+ 'annotations' => {
+ 'title' => 'New: Incident',
+ 'description' => 'Description',
+ 'additional.params.1' => 'Some value 1',
+ 'additional.params.2' => 'Some value 2'
+ },
+ 'startsAt' => starts_at.rfc3339
+ )
+ end
+ end
+
+ context 'when secondary params hash is too big' do
+ before do
+ allow(Gitlab::Utils::SafeInlineHash).to receive(:merge_keys!).and_raise(ArgumentError)
+ end
+
+ it 'catches and re-raises an error' do
+ expect { subject }.to raise_error Gitlab::Alerting::NotificationPayloadParser::BadPayloadError, 'The payload is too big'
+ end
+ end
+ end
+end
diff --git a/spec/models/prometheus_metric_spec.rb b/spec/models/prometheus_metric_spec.rb
index a123ff5a2a6..93abef063cb 100644
--- a/spec/models/prometheus_metric_spec.rb
+++ b/spec/models/prometheus_metric_spec.rb
@@ -67,6 +67,7 @@ describe PrometheusMetric do
it_behaves_like 'group_title', :business, 'Business metrics (Custom)'
it_behaves_like 'group_title', :response, 'Response metrics (Custom)'
it_behaves_like 'group_title', :system, 'System metrics (Custom)'
+ it_behaves_like 'group_title', :cluster_health, 'Cluster Health'
end
describe '#priority' do
@@ -82,6 +83,7 @@ describe PrometheusMetric do
:business | 0
:response | -5
:system | -10
+ :cluster_health | 10
end
with_them do
@@ -106,6 +108,7 @@ describe PrometheusMetric do
:business | %w()
:response | %w()
:system | %w()
+ :cluster_health | %w(container_memory_usage_bytes container_cpu_usage_seconds_total)
end
with_them do
diff --git a/spec/presenters/release_presenter_spec.rb b/spec/presenters/release_presenter_spec.rb
index 4c6142f2edb..82f312622ff 100644
--- a/spec/presenters/release_presenter_spec.rb
+++ b/spec/presenters/release_presenter_spec.rb
@@ -51,6 +51,22 @@ describe ReleasePresenter do
end
end
+ describe '#self_url' do
+ subject { presenter.self_url }
+
+ it 'returns its own url' do
+ is_expected.to match /#{project_release_url(project, release)}/
+ end
+
+ context 'when release_show_page feature flag is disabled' do
+ before do
+ stub_feature_flags(release_show_page: false)
+ end
+
+ it { is_expected.to be_nil }
+ end
+ end
+
describe '#merge_requests_url' do
subject { presenter.merge_requests_url }