diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-09-01 07:13:49 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-09-01 07:13:49 +0000 |
commit | fb58d337f0b8b6f685c1e94a9327d8d12ebfbf81 (patch) | |
tree | a285b8beb8303a81a7af0db968822fa05595e529 /spec | |
parent | 3333112d46dd179a55295ebed754544a97b49b7f (diff) | |
download | gitlab-ce-fb58d337f0b8b6f685c1e94a9327d8d12ebfbf81.tar.gz |
Add latest changes from gitlab-org/gitlab@14-2-stable-ee
Diffstat (limited to 'spec')
-rw-r--r-- | spec/deprecation_toolkit_env.rb | 3 | ||||
-rw-r--r-- | spec/frontend/blob_edit/edit_blob_spec.js | 11 | ||||
-rw-r--r-- | spec/frontend/editor/source_editor_markdown_ext_spec.js | 32 | ||||
-rw-r--r-- | spec/frontend/ide/components/repo_editor_spec.js | 7 | ||||
-rw-r--r-- | spec/helpers/ide_helper_spec.rb | 6 | ||||
-rw-r--r-- | spec/migrations/orphaned_invite_tokens_cleanup_spec.rb | 20 | ||||
-rw-r--r-- | spec/migrations/reset_severity_levels_to_new_default_spec.rb | 33 |
7 files changed, 84 insertions, 28 deletions
diff --git a/spec/deprecation_toolkit_env.rb b/spec/deprecation_toolkit_env.rb index b95a8c599bf..f4db2c30094 100644 --- a/spec/deprecation_toolkit_env.rb +++ b/spec/deprecation_toolkit_env.rb @@ -56,9 +56,12 @@ module DeprecationToolkitEnv # In this case, we recommend to add a silence together with an issue to patch or update # the dependency causing the problem. # See https://gitlab.com/gitlab-org/gitlab/-/commit/aea37f506bbe036378998916d374966c031bf347#note_647515736 + # + # - ruby/lib/grpc/generic/interceptors.rb: https://gitlab.com/gitlab-org/gitlab/-/issues/339305 def self.allowed_kwarg_warning_paths %w[ actionpack-6.1.3.2/lib/action_dispatch/routing/route_set.rb + ruby/lib/grpc/generic/interceptors.rb ] end diff --git a/spec/frontend/blob_edit/edit_blob_spec.js b/spec/frontend/blob_edit/edit_blob_spec.js index 2be72ded0a2..ebef0656750 100644 --- a/spec/frontend/blob_edit/edit_blob_spec.js +++ b/spec/frontend/blob_edit/edit_blob_spec.js @@ -8,6 +8,8 @@ jest.mock('~/editor/source_editor'); jest.mock('~/editor/extensions/source_editor_markdown_ext'); jest.mock('~/editor/extensions/source_editor_file_template_ext'); +const PREVIEW_MARKDOWN_PATH = '/foo/bar/preview_markdown'; + describe('Blob Editing', () => { const useMock = jest.fn(); const mockInstance = { @@ -34,6 +36,7 @@ describe('Blob Editing', () => { const editorInst = (isMarkdown) => { return new EditBlob({ isMarkdown, + previewMarkdownPath: PREVIEW_MARKDOWN_PATH, }); }; @@ -44,6 +47,7 @@ describe('Blob Editing', () => { it('loads FileTemplateExtension by default', async () => { await initEditor(); + expect(useMock).toHaveBeenCalledWith(expect.any(FileTemplateExtension)); expect(FileTemplateExtension).toHaveBeenCalledTimes(1); }); @@ -55,9 +59,12 @@ describe('Blob Editing', () => { it('loads MarkdownExtension only for the markdown files', async () => { await initEditor(true); - expect(useMock).toHaveBeenCalledTimes(2); - expect(FileTemplateExtension).toHaveBeenCalledTimes(1); + expect(useMock).toHaveBeenCalledWith(expect.any(EditorMarkdownExtension)); expect(EditorMarkdownExtension).toHaveBeenCalledTimes(1); + expect(EditorMarkdownExtension).toHaveBeenCalledWith({ + instance: mockInstance, + previewMarkdownPath: PREVIEW_MARKDOWN_PATH, + }); }); }); diff --git a/spec/frontend/editor/source_editor_markdown_ext_spec.js b/spec/frontend/editor/source_editor_markdown_ext_spec.js index 48ccc10e486..245c6c28d31 100644 --- a/spec/frontend/editor/source_editor_markdown_ext_spec.js +++ b/spec/frontend/editor/source_editor_markdown_ext_spec.js @@ -23,7 +23,7 @@ describe('Markdown Extension for Source Editor', () => { let editorEl; let panelSpy; let mockAxios; - const projectPath = 'fooGroup/barProj'; + const previewMarkdownPath = '/gitlab/fooGroup/barProj/preview_markdown'; const firstLine = 'This is a'; const secondLine = 'multiline'; const thirdLine = 'string with some **markup**'; @@ -57,7 +57,7 @@ describe('Markdown Extension for Source Editor', () => { blobPath: markdownPath, blobContent: text, }); - editor.use(new EditorMarkdownExtension({ instance, projectPath })); + editor.use(new EditorMarkdownExtension({ instance, previewMarkdownPath })); panelSpy = jest.spyOn(EditorMarkdownExtension, 'togglePreviewPanel'); }); @@ -74,7 +74,7 @@ describe('Markdown Extension for Source Editor', () => { shown: false, modelChangeListener: undefined, }); - expect(instance.projectPath).toBe(projectPath); + expect(instance.previewMarkdownPath).toBe(previewMarkdownPath); }); describe('model language changes listener', () => { @@ -223,34 +223,24 @@ describe('Markdown Extension for Source Editor', () => { }); describe('fetchPreview', () => { - const group = 'foo'; - const project = 'bar'; - const setData = (path, g, p) => { - instance.projectPath = path; - document.body.setAttribute('data-group', g); - document.body.setAttribute('data-project', p); - }; const fetchPreview = async () => { instance.fetchPreview(); await waitForPromises(); }; + let previewMarkdownSpy; + beforeEach(() => { - mockAxios.onPost().reply(200, { body: responseData }); + previewMarkdownSpy = jest.fn().mockImplementation(() => [200, { body: responseData }]); + mockAxios.onPost(previewMarkdownPath).replyOnce((req) => previewMarkdownSpy(req)); }); - it('correctly fetches preview based on projectPath', async () => { - setData(projectPath, group, project); + it('correctly fetches preview based on previewMarkdownPath', async () => { await fetchPreview(); - expect(mockAxios.history.post[0].url).toBe(`/${projectPath}/preview_markdown`); - expect(mockAxios.history.post[0].data).toEqual(JSON.stringify({ text })); - }); - it('correctly fetches preview based on group and project data attributes', async () => { - setData(undefined, group, project); - await fetchPreview(); - expect(mockAxios.history.post[0].url).toBe(`/${group}/${project}/preview_markdown`); - expect(mockAxios.history.post[0].data).toEqual(JSON.stringify({ text })); + expect(previewMarkdownSpy).toHaveBeenCalledWith( + expect.objectContaining({ data: JSON.stringify({ text }) }), + ); }); it('puts the fetched content into the preview DOM element', async () => { diff --git a/spec/frontend/ide/components/repo_editor_spec.js b/spec/frontend/ide/components/repo_editor_spec.js index b2254de706c..47bcfb59a5f 100644 --- a/spec/frontend/ide/components/repo_editor_spec.js +++ b/spec/frontend/ide/components/repo_editor_spec.js @@ -24,6 +24,8 @@ import axios from '~/lib/utils/axios_utils'; import ContentViewer from '~/vue_shared/components/content_viewer/content_viewer.vue'; import { file } from '../helpers'; +const PREVIEW_MARKDOWN_PATH = '/foo/bar/preview_markdown'; + const defaultFileProps = { ...file('file.txt'), content: 'hello world', @@ -77,6 +79,7 @@ const prepareStore = (state, activeFile) => { entries: { [activeFile.path]: activeFile, }, + previewMarkdownPath: PREVIEW_MARKDOWN_PATH, }; const storeOptions = createStoreOptions(); return new Vuex.Store({ @@ -278,10 +281,10 @@ describe('RepoEditor', () => { async ({ activeFile, viewer, shouldHaveMarkdownExtension } = {}) => { await createComponent({ state: { viewer }, activeFile }); if (shouldHaveMarkdownExtension) { - expect(vm.editor.projectPath).toBe(vm.currentProjectId); + expect(vm.editor.previewMarkdownPath).toBe(PREVIEW_MARKDOWN_PATH); expect(vm.editor.togglePreview).toBeDefined(); } else { - expect(vm.editor.projectPath).toBeUndefined(); + expect(vm.editor.previewMarkdownPath).toBeUndefined(); expect(vm.editor.togglePreview).toBeUndefined(); } }, diff --git a/spec/helpers/ide_helper_spec.rb b/spec/helpers/ide_helper_spec.rb index d34358e49c0..503ad3ad66d 100644 --- a/spec/helpers/ide_helper_spec.rb +++ b/spec/helpers/ide_helper_spec.rb @@ -18,7 +18,8 @@ RSpec.describe IdeHelper do 'file-path' => nil, 'merge-request' => nil, 'fork-info' => nil, - 'project' => nil + 'project' => nil, + 'preview-markdown-path' => nil ) end end @@ -41,7 +42,8 @@ RSpec.describe IdeHelper do 'file-path' => 'foo/bar', 'merge-request' => '1', 'fork-info' => fork_info.to_json, - 'project' => serialized_project + 'project' => serialized_project, + 'preview-markdown-path' => Gitlab::Routing.url_helpers.preview_markdown_project_path(project) ) end end diff --git a/spec/migrations/orphaned_invite_tokens_cleanup_spec.rb b/spec/migrations/orphaned_invite_tokens_cleanup_spec.rb index 889c04700c7..be5e7756514 100644 --- a/spec/migrations/orphaned_invite_tokens_cleanup_spec.rb +++ b/spec/migrations/orphaned_invite_tokens_cleanup_spec.rb @@ -16,7 +16,7 @@ RSpec.describe OrphanedInviteTokensCleanup, :migration do table(:members).create!(defaults.merge(extra_attributes)) end - describe '#up', :aggregate_failures do + shared_examples 'removes orphaned invite tokens' do it 'removes invite tokens for accepted records with invite_accepted_at < created_at' do record1 = create_member(invite_token: 'foo', invite_accepted_at: 1.day.ago, created_at: 1.hour.ago) record2 = create_member(invite_token: 'foo2', invite_accepted_at: nil, created_at: 1.hour.ago) @@ -29,4 +29,22 @@ RSpec.describe OrphanedInviteTokensCleanup, :migration do expect(table(:members).find(record3.id).invite_token).to eq 'foo3' end end + + describe '#up', :aggregate_failures do + it_behaves_like 'removes orphaned invite tokens' + end + + context 'when there is a mix of timestamptz and timestamp types' do + around do |example| + ActiveRecord::Base.connection.execute "ALTER TABLE members alter created_at type timestamp with time zone" + + example.run + + ActiveRecord::Base.connection.execute "ALTER TABLE members alter created_at type timestamp without time zone" + end + + describe '#up', :aggregate_failures do + it_behaves_like 'removes orphaned invite tokens' + end + end end diff --git a/spec/migrations/reset_severity_levels_to_new_default_spec.rb b/spec/migrations/reset_severity_levels_to_new_default_spec.rb new file mode 100644 index 00000000000..18dc001db16 --- /dev/null +++ b/spec/migrations/reset_severity_levels_to_new_default_spec.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +require 'spec_helper' + +require_migration! + +RSpec.describe ResetSeverityLevelsToNewDefault do + let(:approval_project_rules) { table(:approval_project_rules) } + let(:projects) { table(:projects)} + let(:namespaces) { table(:namespaces)} + let(:namespace) { namespaces.create!(name: 'namespace', path: 'namespace')} + let(:project) { projects.create!(name: 'project', path: 'project', namespace_id: namespace.id)} + let(:approval_project_rule) { approval_project_rules.create!(name: 'rule', project_id: project.id, severity_levels: severity_levels) } + + context 'without having all severity levels selected' do + let(:severity_levels) { ['high'] } + + it 'does not change severity_levels' do + expect(approval_project_rule.severity_levels).to eq(severity_levels) + expect { migrate! }.not_to change { approval_project_rule.reload.severity_levels } + end + end + + context 'with all scanners selected' do + let(:severity_levels) { ::Enums::Vulnerability::SEVERITY_LEVELS.keys } + let(:default_levels) { %w(unknown high critical) } + + it 'changes severity_levels to the default value' do + expect(approval_project_rule.severity_levels).to eq(severity_levels) + expect { migrate! }.to change {approval_project_rule.reload.severity_levels}.from(severity_levels).to(default_levels) + end + end +end |