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>2021-09-01 10:13:49 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2021-09-01 10:13:49 +0300
commitfb58d337f0b8b6f685c1e94a9327d8d12ebfbf81 (patch)
treea285b8beb8303a81a7af0db968822fa05595e529 /spec
parent3333112d46dd179a55295ebed754544a97b49b7f (diff)
Add latest changes from gitlab-org/gitlab@14-2-stable-ee
Diffstat (limited to 'spec')
-rw-r--r--spec/deprecation_toolkit_env.rb3
-rw-r--r--spec/frontend/blob_edit/edit_blob_spec.js11
-rw-r--r--spec/frontend/editor/source_editor_markdown_ext_spec.js32
-rw-r--r--spec/frontend/ide/components/repo_editor_spec.js7
-rw-r--r--spec/helpers/ide_helper_spec.rb6
-rw-r--r--spec/migrations/orphaned_invite_tokens_cleanup_spec.rb20
-rw-r--r--spec/migrations/reset_severity_levels_to_new_default_spec.rb33
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