diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-05-05 21:09:43 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-05-05 21:09:43 +0300 |
commit | 38ceebb9b3a541f8530b379d5b5ab5e13ffc58ed (patch) | |
tree | 7a0494f677459f96e6deda30da4069b7c038eca4 /spec | |
parent | 0d09054d162458364ce3fc431506c182e2a5fa4f (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
8 files changed, 390 insertions, 63 deletions
diff --git a/spec/frontend/alert_management/components/alert_management_detail_spec.js b/spec/frontend/alert_management/components/alert_management_detail_spec.js index 48cdb7027b1..994de8d4d39 100644 --- a/spec/frontend/alert_management/components/alert_management_detail_spec.js +++ b/spec/frontend/alert_management/components/alert_management_detail_spec.js @@ -30,5 +30,9 @@ describe('AlertDetails', () => { it('renders alert details', () => { expect(wrapper.find('[data-testid="startTimeItem"]').exists()).toBe(true); }); + + it('renders a status dropdown', () => { + expect(wrapper.find('[data-testid="statusDropdownItem"]').exists()).toBe(true); + }); }); }); diff --git a/spec/frontend/diffs/store/actions_spec.js b/spec/frontend/diffs/store/actions_spec.js index 2678c51b6f1..3b6021c8014 100644 --- a/spec/frontend/diffs/store/actions_spec.js +++ b/spec/frontend/diffs/store/actions_spec.js @@ -313,7 +313,7 @@ describe('DiffsStoreActions', () => { describe('fetchDiffFilesMeta', () => { it('should fetch diff meta information', done => { - const endpointMetadata = '/fetch/diffs_meta?'; + const endpointMetadata = '/fetch/diffs_meta'; const mock = new MockAdapter(axios); const data = { diff_files: [] }; const res = { data }; diff --git a/spec/frontend/lib/utils/url_utility_spec.js b/spec/frontend/lib/utils/url_utility_spec.js index 4960895890f..6cca245582e 100644 --- a/spec/frontend/lib/utils/url_utility_spec.js +++ b/spec/frontend/lib/utils/url_utility_spec.js @@ -91,36 +91,75 @@ describe('URL utility', () => { }); describe('mergeUrlParams', () => { + const { mergeUrlParams } = urlUtils; + it('adds w', () => { - expect(urlUtils.mergeUrlParams({ w: 1 }, '#frag')).toBe('?w=1#frag'); - expect(urlUtils.mergeUrlParams({ w: 1 }, '/path#frag')).toBe('/path?w=1#frag'); - expect(urlUtils.mergeUrlParams({ w: 1 }, 'https://host/path')).toBe('https://host/path?w=1'); - expect(urlUtils.mergeUrlParams({ w: 1 }, 'https://host/path#frag')).toBe( - 'https://host/path?w=1#frag', - ); + expect(mergeUrlParams({ w: 1 }, '#frag')).toBe('?w=1#frag'); + expect(mergeUrlParams({ w: 1 }, '')).toBe('?w=1'); + expect(mergeUrlParams({ w: 1 }, '/path#frag')).toBe('/path?w=1#frag'); + expect(mergeUrlParams({ w: 1 }, 'https://host/path')).toBe('https://host/path?w=1'); + expect(mergeUrlParams({ w: 1 }, 'https://host/path#frag')).toBe('https://host/path?w=1#frag'); + expect(mergeUrlParams({ w: 1 }, 'https://h/p?k1=v1#frag')).toBe('https://h/p?k1=v1&w=1#frag'); + expect(mergeUrlParams({ w: 'null' }, '')).toBe('?w=null'); + }); - expect(urlUtils.mergeUrlParams({ w: 1 }, 'https://h/p?k1=v1#frag')).toBe( - 'https://h/p?k1=v1&w=1#frag', - ); + it('adds multiple params', () => { + expect(mergeUrlParams({ a: 1, b: 2, c: 3 }, '#frag')).toBe('?a=1&b=2&c=3#frag'); }); it('updates w', () => { - expect(urlUtils.mergeUrlParams({ w: 1 }, '?k1=v1&w=0#frag')).toBe('?k1=v1&w=1#frag'); + expect(mergeUrlParams({ w: 2 }, '/path?w=1#frag')).toBe('/path?w=2#frag'); + expect(mergeUrlParams({ w: 2 }, 'https://host/path?w=1')).toBe('https://host/path?w=2'); }); - it('adds multiple params', () => { - expect(urlUtils.mergeUrlParams({ a: 1, b: 2, c: 3 }, '#frag')).toBe('?a=1&b=2&c=3#frag'); + it('removes null w', () => { + expect(mergeUrlParams({ w: null }, '?w=1#frag')).toBe('#frag'); + expect(mergeUrlParams({ w: null }, '/path?w=1#frag')).toBe('/path#frag'); + expect(mergeUrlParams({ w: null }, 'https://host/path?w=1')).toBe('https://host/path'); + expect(mergeUrlParams({ w: null }, 'https://host/path?w=1#frag')).toBe( + 'https://host/path#frag', + ); + expect(mergeUrlParams({ w: null }, 'https://h/p?k1=v1&w=1#frag')).toBe( + 'https://h/p?k1=v1#frag', + ); }); - it('adds and updates encoded params', () => { - expect(urlUtils.mergeUrlParams({ a: '&', q: '?' }, '?a=%23#frag')).toBe('?a=%26&q=%3F#frag'); + it('adds and updates encoded param values', () => { + expect(mergeUrlParams({ foo: '&', q: '?' }, '?foo=%23#frag')).toBe('?foo=%26&q=%3F#frag'); + expect(mergeUrlParams({ foo: 'a value' }, '')).toBe('?foo=a%20value'); + expect(mergeUrlParams({ foo: 'a value' }, '?foo=1')).toBe('?foo=a%20value'); + }); + + it('adds and updates encoded param names', () => { + expect(mergeUrlParams({ 'a name': 1 }, '')).toBe('?a%20name=1'); + expect(mergeUrlParams({ 'a name': 2 }, '?a%20name=1')).toBe('?a%20name=2'); + expect(mergeUrlParams({ 'a name': null }, '?a%20name=1')).toBe(''); }); it('treats "+" as "%20"', () => { - expect(urlUtils.mergeUrlParams({ ref: 'bogus' }, '?a=lorem+ipsum&ref=charlie')).toBe( + expect(mergeUrlParams({ ref: 'bogus' }, '?a=lorem+ipsum&ref=charlie')).toBe( '?a=lorem%20ipsum&ref=bogus', ); }); + + it('treats question marks and slashes as part of the query', () => { + expect(mergeUrlParams({ ending: '!' }, '?ending=?&foo=bar')).toBe('?ending=!&foo=bar'); + expect(mergeUrlParams({ ending: '!' }, 'https://host/path?ending=?&foo=bar')).toBe( + 'https://host/path?ending=!&foo=bar', + ); + expect(mergeUrlParams({ ending: '?' }, '?ending=!&foo=bar')).toBe('?ending=%3F&foo=bar'); + expect(mergeUrlParams({ ending: '?' }, 'https://host/path?ending=!&foo=bar')).toBe( + 'https://host/path?ending=%3F&foo=bar', + ); + expect(mergeUrlParams({ ending: '!', op: '+' }, '?ending=?&op=/')).toBe('?ending=!&op=%2B'); + expect(mergeUrlParams({ ending: '!', op: '+' }, 'https://host/path?ending=?&op=/')).toBe( + 'https://host/path?ending=!&op=%2B', + ); + expect(mergeUrlParams({ op: '+' }, '?op=/&foo=bar')).toBe('?op=%2B&foo=bar'); + expect(mergeUrlParams({ op: '+' }, 'https://host/path?op=/&foo=bar')).toBe( + 'https://host/path?op=%2B&foo=bar', + ); + }); }); describe('removeParams', () => { diff --git a/spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb b/spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb index 14657c88b18..94ef094e72c 100644 --- a/spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb +++ b/spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb @@ -177,6 +177,48 @@ describe Gitlab::BackgroundMigration::BackfillSnippetRepositories, :migration, s end end end + + context 'with invalid file names' do + using RSpec::Parameterized::TableSyntax + + where(:invalid_file_name, :converted_file_name) do + 'filename.js // with comment' | 'filename-js-with-comment' + '.git/hooks/pre-commit' | 'git-hooks-pre-commit' + 'https://gitlab.com' | 'https-gitlab-com' + 'html://web.title%mp4/mpg/mpeg.net' | 'html-web-title-mp4-mpg-mpeg-net' + '../../etc/passwd' | 'etc-passwd' + '.' | 'snippetfile1.txt' + end + + with_them do + let!(:snippet_with_invalid_path) { snippets.create(id: 4, type: 'PersonalSnippet', author_id: user.id, file_name: invalid_file_name, content: content) } + let!(:snippet_with_valid_path) { snippets.create(id: 5, type: 'PersonalSnippet', author_id: user.id, file_name: file_name, content: content) } + let(:ids) { [4, 5] } + + after do + raw_repository(snippet_with_invalid_path).remove + raw_repository(snippet_with_valid_path).remove + end + + it 'checks for file path errors when errors are raised' do + expect(service).to receive(:set_file_path_error).once.and_call_original + + subject + end + + it 'converts invalid filenames' do + subject + + expect(blob_at(snippet_with_invalid_path, converted_file_name)).to be + end + + it 'does not convert valid filenames on subsequent migrations' do + subject + + expect(blob_at(snippet_with_valid_path, file_name)).to be + end + end + end end def blob_at(snippet, path) diff --git a/spec/lib/gitlab/ci/parsers/accessibility/pa11y_spec.rb b/spec/lib/gitlab/ci/parsers/accessibility/pa11y_spec.rb new file mode 100644 index 00000000000..e0f1dc084d5 --- /dev/null +++ b/spec/lib/gitlab/ci/parsers/accessibility/pa11y_spec.rb @@ -0,0 +1,117 @@ +# frozen_string_literal: true + +require 'fast_spec_helper' + +describe Gitlab::Ci::Parsers::Accessibility::Pa11y do + describe '#parse!' do + subject { described_class.new.parse!(pa11y, accessibility_report) } + + let(:accessibility_report) { Gitlab::Ci::Reports::AccessibilityReports.new } + + context "when data is pa11y style JSON" do + context "when there are no URLs provided" do + let(:pa11y) do + { + "total": 1, + "passes": 0, + "errors": 0, + "results": { + "": [ + { + "message": "Protocol error (Page.navigate): Cannot navigate to invalid URL" + } + ] + } + }.to_json + end + + it "returns an accessibility report" do + expect { subject }.not_to raise_error + + expect(accessibility_report.errors_count).to eq(0) + expect(accessibility_report.passes_count).to eq(0) + expect(accessibility_report.scans_count).to eq(0) + expect(accessibility_report.urls).to be_empty + expect(accessibility_report.error_message).to eq("Empty URL detected in gl-accessibility.json") + end + end + + context "when there are no errors" do + let(:pa11y) do + { + "total": 1, + "passes": 1, + "errors": 0, + "results": { + "http://pa11y.org/": [] + } + }.to_json + end + + it "returns an accessibility report" do + expect { subject }.not_to raise_error + + expect(accessibility_report.urls['http://pa11y.org/']).to be_empty + expect(accessibility_report.errors_count).to eq(0) + expect(accessibility_report.passes_count).to eq(1) + expect(accessibility_report.scans_count).to eq(1) + end + end + + context "when there are errors" do + let(:pa11y) do + { + "total": 1, + "passes": 0, + "errors": 1, + "results": { + "https://about.gitlab.com/": [ + { + "code": "WCAG2AA.Principle4.Guideline4_1.4_1_2.H91.A.NoContent", + "type": "error", + "typeCode": 1, + "message": "Anchor element found with a valid href attribute, but no link content has been supplied.", + "context": "<a href=\"/\" class=\"navbar-brand animated\"><svg height=\"36\" viewBox=\"0 0 1...</a>", + "selector": "#main-nav > div:nth-child(1) > a", + "runner": "htmlcs", + "runnerExtras": {} + } + ] + } + }.to_json + end + + it "returns an accessibility report" do + expect { subject }.not_to raise_error + + expect(accessibility_report.errors_count).to eq(1) + expect(accessibility_report.passes_count).to eq(0) + expect(accessibility_report.scans_count).to eq(1) + expect(accessibility_report.urls['https://about.gitlab.com/']).to be_present + end + end + end + + context "when data is not a valid JSON string" do + let(:pa11y) do + { + "total": 1, + "passes": 1, + "errors": 0, + "results": { + "http://pa11y.org/": [] + } + } + end + + it "sets error_message" do + expect { subject }.not_to raise_error + + expect(accessibility_report.error_message).to include('Pa11y parsing failed') + expect(accessibility_report.errors_count).to eq(0) + expect(accessibility_report.passes_count).to eq(0) + expect(accessibility_report.scans_count).to eq(0) + end + end + end +end diff --git a/spec/lib/gitlab/ci/parsers_spec.rb b/spec/lib/gitlab/ci/parsers_spec.rb index addb8b8190f..0a266e7a206 100644 --- a/spec/lib/gitlab/ci/parsers_spec.rb +++ b/spec/lib/gitlab/ci/parsers_spec.rb @@ -22,6 +22,14 @@ describe Gitlab::Ci::Parsers do end end + context 'when file_type is accessibility' do + let(:file_type) { 'accessibility' } + + it 'fabricates the class' do + is_expected.to be_a(described_class::Accessibility::Pa11y) + end + end + context 'when file_type is terraform' do let(:file_type) { 'terraform' } diff --git a/spec/lib/gitlab/ci/reports/accessibility_reports_spec.rb b/spec/lib/gitlab/ci/reports/accessibility_reports_spec.rb index dc5e108f759..e7771ed15a4 100644 --- a/spec/lib/gitlab/ci/reports/accessibility_reports_spec.rb +++ b/spec/lib/gitlab/ci/reports/accessibility_reports_spec.rb @@ -4,37 +4,144 @@ require 'spec_helper' describe Gitlab::Ci::Reports::AccessibilityReports do let(:accessibility_report) { described_class.new } + let(:url) { 'https://gitlab.com' } + let(:data) do + [ + { + "code": "WCAG2AA.Principle4.Guideline4_1.4_1_2.H91.A.NoContent", + "type": "error", + "typeCode": 1, + "message": "Anchor element found with a valid href attribute, but no link content has been supplied.", + "context": "<a href=\"/customers/worldline\">\n<svg viewBox=\"0 0 509 89\" xmln...</a>", + "selector": "html > body > div:nth-child(9) > div:nth-child(2) > a:nth-child(17)", + "runner": "htmlcs", + "runnerExtras": {} + }, + { + "code": "WCAG2AA.Principle4.Guideline4_1.4_1_2.H91.A.NoContent", + "type": "error", + "typeCode": 1, + "message": "Anchor element found with a valid href attribute, but no link content has been supplied.", + "context": "<a href=\"/customers/equinix\">\n<svg xmlns=\"http://www.w3.org/...</a>", + "selector": "html > body > div:nth-child(9) > div:nth-child(2) > a:nth-child(18)", + "runner": "htmlcs", + "runnerExtras": {} + } + ] + end - describe '#add_url' do - subject { accessibility_report.add_url(url, data) } + describe '#scans_count' do + subject { accessibility_report.scans_count } + + context 'when data has errors' do + let(:different_url) { 'https://about.gitlab.com' } + + before do + accessibility_report.add_url(url, data) + accessibility_report.add_url(different_url, data) + end + + it 'returns the scans_count' do + expect(subject).to eq(2) + end + end + + context 'when data has no errors' do + before do + accessibility_report.add_url(url, []) + end + + it 'returns the scans_count' do + expect(subject).to eq(1) + end + end + + context 'when data has no url' do + before do + accessibility_report.add_url("", []) + end + + it 'returns the scans_count' do + expect(subject).to eq(0) + end + end + end + + describe '#passes_count' do + subject { accessibility_report.passes_count } + + context 'when data has errors' do + before do + accessibility_report.add_url(url, data) + end + + it 'returns the passes_count' do + expect(subject).to eq(0) + end + end + + context 'when data has no errors' do + before do + accessibility_report.add_url(url, []) + end + + it 'returns the passes_count' do + expect(subject).to eq(1) + end + end + + context 'when data has no url' do + before do + accessibility_report.add_url("", []) + end + + it 'returns the scans_count' do + expect(subject).to eq(0) + end + end + end + + describe '#errors_count' do + subject { accessibility_report.errors_count } context 'when data has errors' do - let(:url) { 'https://gitlab.com' } - let(:data) do - [ - { - "code": "WCAG2AA.Principle4.Guideline4_1.4_1_2.H91.A.NoContent", - "type": "error", - "typeCode": 1, - "message": "Anchor element found with a valid href attribute, but no link content has been supplied.", - "context": "<a href=\"/customers/worldline\">\n<svg viewBox=\"0 0 509 89\" xmln...</a>", - "selector": "html > body > div:nth-child(9) > div:nth-child(2) > a:nth-child(17)", - "runner": "htmlcs", - "runnerExtras": {} - }, - { - "code": "WCAG2AA.Principle4.Guideline4_1.4_1_2.H91.A.NoContent", - "type": "error", - "typeCode": 1, - "message": "Anchor element found with a valid href attribute, but no link content has been supplied.", - "context": "<a href=\"/customers/equinix\">\n<svg xmlns=\"http://www.w3.org/...</a>", - "selector": "html > body > div:nth-child(9) > div:nth-child(2) > a:nth-child(18)", - "runner": "htmlcs", - "runnerExtras": {} - } - ] + let(:different_url) { 'https://about.gitlab.com' } + + before do + accessibility_report.add_url(url, data) + accessibility_report.add_url(different_url, data) + end + + it 'returns the errors_count' do + expect(subject).to eq(4) + end + end + + context 'when data has no errors' do + before do + accessibility_report.add_url(url, []) + end + + it 'returns the errors_count' do + expect(subject).to eq(0) end + end + + context 'when data has no url' do + before do + accessibility_report.add_url("", []) + end + + it 'returns the errors_count' do + expect(subject).to eq(0) + end + end + end + describe '#add_url' do + subject { accessibility_report.add_url(url, data) } + + context 'when data has errors' do it 'adds urls and data to accessibility report' do expect { subject }.not_to raise_error @@ -44,7 +151,6 @@ describe Gitlab::Ci::Reports::AccessibilityReports do end context 'when data does not have errors' do - let(:url) { 'https://gitlab.com' } let(:data) { [] } it 'adds data to accessibility report' do @@ -59,10 +165,37 @@ describe Gitlab::Ci::Reports::AccessibilityReports do let(:url) { '' } let(:data) { [{ message: "Protocol error (Page.navigate): Cannot navigate to invalid URL" }] } - it 'do not add data to accessibility report' do + it 'sets error_message and decreases total' do expect { subject }.not_to raise_error - expect(accessibility_report.urls).to be_empty + expect(accessibility_report.scans_count).to eq(0) + expect(accessibility_report.error_message).to eq('Empty URL detected in gl-accessibility.json') + end + end + end + + describe '#set_error_message' do + let(:set_accessibility_error) { accessibility_report.set_error_message('error') } + + context 'when error is nil' do + it 'returns the error' do + expect(set_accessibility_error).to eq('error') + end + + it 'sets the error' do + set_accessibility_error + + expect(accessibility_report.error_message).to eq('error') + end + end + + context 'when a error has already been set' do + before do + accessibility_report.set_error_message('old error') + end + + it 'overwrites the existing message' do + expect { set_accessibility_error }.to change(accessibility_report, :error_message).from('old error').to('error') end end end diff --git a/spec/models/ci/job_artifact_spec.rb b/spec/models/ci/job_artifact_spec.rb index dd33d55d954..85264223862 100644 --- a/spec/models/ci/job_artifact_spec.rb +++ b/spec/models/ci/job_artifact_spec.rb @@ -19,24 +19,8 @@ describe Ci::JobArtifact do it_behaves_like 'having unique enum values' - context 'with update_project_statistics_after_commit enabled' do - before do - stub_feature_flags(update_project_statistics_after_commit: true) - end - - it_behaves_like 'UpdateProjectStatistics' do - subject { build(:ci_job_artifact, :archive, size: 107464) } - end - end - - context 'with update_project_statistics_after_commit disabled' do - before do - stub_feature_flags(update_project_statistics_after_commit: false) - end - - it_behaves_like 'UpdateProjectStatistics' do - subject { build(:ci_job_artifact, :archive, size: 107464) } - end + it_behaves_like 'UpdateProjectStatistics' do + subject { build(:ci_job_artifact, :archive, size: 107464) } end describe '.with_reports' do |