summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2022-01-10 18:14:07 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2022-01-10 18:14:07 +0000
commit20c68317f8d350b9e2f5004730dd27e6a7d406ce (patch)
tree630821e08a22a30b6abdf4c1092bdf518cc508dc
parent53716bea26fa76ac7176f51bbef672ffcdcd1ba4 (diff)
downloadgitlab-ce-20c68317f8d350b9e2f5004730dd27e6a7d406ce.tar.gz
Add latest changes from gitlab-org/gitlab@master
-rw-r--r--app/views/layouts/_init_auto_complete.html.haml2
-rw-r--r--lib/gitlab/background_migration/cleanup_concurrent_rename.rb14
-rw-r--r--lib/gitlab/background_migration/cleanup_concurrent_schema_change.rb56
-rw-r--r--lib/gitlab/background_migration/cleanup_concurrent_type_change.rb14
-rw-r--r--lib/gitlab/background_migration/copy_column.rb41
-rw-r--r--lib/gitlab/error_tracking/processor/sidekiq_processor.rb2
-rw-r--r--package.json3
-rw-r--r--spec/factories/integrations.rb2
-rw-r--r--spec/factories/usage_data.rb20
-rw-r--r--spec/features/merge_request/user_sees_merge_widget_spec.rb2
-rw-r--r--spec/features/profiles/chat_names_spec.rb2
-rw-r--r--spec/frontend/__helpers__/matchers/index.js1
-rw-r--r--spec/frontend/__helpers__/matchers/to_have_tracking_attributes.js35
-rw-r--r--spec/frontend/__helpers__/matchers/to_have_tracking_attributes_spec.js65
-rw-r--r--spec/frontend/packages_and_registries/infrastructure_registry/components/list/components/__snapshots__/packages_list_app_spec.js.snap8
-rw-r--r--spec/frontend/packages_and_registries/package_registry/pages/__snapshots__/list_spec.js.snap8
-rw-r--r--spec/frontend/pages/shared/nav/sidebar_tracking_spec.js36
-rw-r--r--spec/frontend/serverless/components/__snapshots__/empty_state_spec.js.snap8
-rw-r--r--spec/graphql/types/projects/service_type_spec.rb2
-rw-r--r--spec/helpers/auto_devops_helper_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/cleanup_concurrent_schema_change_spec.rb28
-rw-r--r--spec/lib/gitlab/error_tracking/processor/sidekiq_processor_spec.rb9
-rw-r--r--spec/lib/gitlab/import_export/fast_hash_serializer_spec.rb2
-rw-r--r--spec/lib/gitlab/import_export/project/relation_factory_spec.rb2
-rw-r--r--spec/lib/gitlab/integrations/sti_type_spec.rb12
-rw-r--r--spec/models/integration_spec.rb276
-rw-r--r--spec/models/project_spec.rb42
-rw-r--r--spec/services/chat_names/authorize_user_service_spec.rb6
-rw-r--r--spec/services/chat_names/find_user_service_spec.rb2
-rw-r--r--spec/support/import_export/export_file_helper.rb2
-rw-r--r--spec/workers/deployments/hooks_worker_spec.rb4
-rw-r--r--yarn.lock47
32 files changed, 376 insertions, 379 deletions
diff --git a/app/views/layouts/_init_auto_complete.html.haml b/app/views/layouts/_init_auto_complete.html.haml
index 509f5be8097..46d84d9f883 100644
--- a/app/views/layouts/_init_auto_complete.html.haml
+++ b/app/views/layouts/_init_auto_complete.html.haml
@@ -1,5 +1,5 @@
- object = @target_project || @project || @group
-- noteable_type = @noteable.class if @noteable.present?
+- noteable_type = @noteable_type || @noteable&.class
- datasources = autocomplete_data_sources(object, noteable_type)
diff --git a/lib/gitlab/background_migration/cleanup_concurrent_rename.rb b/lib/gitlab/background_migration/cleanup_concurrent_rename.rb
deleted file mode 100644
index d3f366f3480..00000000000
--- a/lib/gitlab/background_migration/cleanup_concurrent_rename.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module BackgroundMigration
- # Background migration for cleaning up a concurrent column rename.
- class CleanupConcurrentRename < CleanupConcurrentSchemaChange
- RESCHEDULE_DELAY = 10.minutes
-
- def cleanup_concurrent_schema_change(table, old_column, new_column)
- cleanup_concurrent_column_rename(table, old_column, new_column)
- end
- end
- end
-end
diff --git a/lib/gitlab/background_migration/cleanup_concurrent_schema_change.rb b/lib/gitlab/background_migration/cleanup_concurrent_schema_change.rb
deleted file mode 100644
index 91b50c1a493..00000000000
--- a/lib/gitlab/background_migration/cleanup_concurrent_schema_change.rb
+++ /dev/null
@@ -1,56 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module BackgroundMigration
- # Base class for background migration for rename/type changes.
- class CleanupConcurrentSchemaChange
- include Database::MigrationHelpers
-
- # table - The name of the table the migration is performed for.
- # old_column - The name of the old (to drop) column.
- # new_column - The name of the new column.
- def perform(table, old_column, new_column)
- return unless column_exists?(table, new_column) && column_exists?(table, old_column)
-
- rows_to_migrate = define_model_for(table)
- .where(new_column => nil)
- .where
- .not(old_column => nil)
-
- if rows_to_migrate.any?
- BackgroundMigrationWorker.perform_in(
- RESCHEDULE_DELAY,
- self.class.name,
- [table, old_column, new_column]
- )
- else
- cleanup_concurrent_schema_change(table, old_column, new_column)
- end
- end
-
- def cleanup_concurrent_schema_change(_table, _old_column, _new_column)
- raise NotImplementedError
- end
-
- # These methods are necessary so we can re-use the migration helpers in
- # this class.
- def connection
- ActiveRecord::Base.connection
- end
-
- def method_missing(name, *args, &block)
- connection.__send__(name, *args, &block) # rubocop: disable GitlabSecurity/PublicSend
- end
-
- def respond_to_missing?(*args)
- connection.respond_to?(*args) || super
- end
-
- def define_model_for(table)
- Class.new(ActiveRecord::Base) do
- self.table_name = table
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/background_migration/cleanup_concurrent_type_change.rb b/lib/gitlab/background_migration/cleanup_concurrent_type_change.rb
deleted file mode 100644
index 48411095dbb..00000000000
--- a/lib/gitlab/background_migration/cleanup_concurrent_type_change.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module BackgroundMigration
- # Background migration for cleaning up a concurrent column type changeb.
- class CleanupConcurrentTypeChange < CleanupConcurrentSchemaChange
- RESCHEDULE_DELAY = 10.minutes
-
- def cleanup_concurrent_schema_change(table, old_column, new_column)
- cleanup_concurrent_column_type_change(table, old_column)
- end
- end
- end
-end
diff --git a/lib/gitlab/background_migration/copy_column.rb b/lib/gitlab/background_migration/copy_column.rb
deleted file mode 100644
index ef70f37d5eb..00000000000
--- a/lib/gitlab/background_migration/copy_column.rb
+++ /dev/null
@@ -1,41 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module BackgroundMigration
- # CopyColumn is a simple (reusable) background migration that can be used to
- # update the value of a column based on the value of another column in the
- # same table.
- #
- # For this background migration to work the table that is migrated _has_ to
- # have an `id` column as the primary key.
- class CopyColumn
- # table - The name of the table that contains the columns.
- # copy_from - The column containing the data to copy.
- # copy_to - The column to copy the data to.
- # start_id - The start ID of the range of rows to update.
- # end_id - The end ID of the range of rows to update.
- def perform(table, copy_from, copy_to, start_id, end_id)
- return unless connection.column_exists?(table, copy_to)
-
- quoted_table = connection.quote_table_name(table)
- quoted_copy_from = connection.quote_column_name(copy_from)
- quoted_copy_to = connection.quote_column_name(copy_to)
-
- # We're using raw SQL here since this job may be frequently executed. As
- # a result dynamically defining models would lead to many unnecessary
- # schema information queries.
- connection.execute <<-SQL.strip_heredoc
- UPDATE #{quoted_table}
- SET #{quoted_copy_to} = #{quoted_copy_from}
- WHERE id BETWEEN #{start_id} AND #{end_id}
- AND #{quoted_copy_from} IS NOT NULL
- AND #{quoted_copy_to} IS NULL
- SQL
- end
-
- def connection
- ActiveRecord::Base.connection
- end
- end
- end
-end
diff --git a/lib/gitlab/error_tracking/processor/sidekiq_processor.rb b/lib/gitlab/error_tracking/processor/sidekiq_processor.rb
index 0d2f673d73c..cc8cfd827f1 100644
--- a/lib/gitlab/error_tracking/processor/sidekiq_processor.rb
+++ b/lib/gitlab/error_tracking/processor/sidekiq_processor.rb
@@ -53,6 +53,8 @@ module Gitlab
# 'args' in :job => from default error handler
job_holder = sidekiq.key?('args') ? sidekiq : sidekiq[:job]
+ return event unless job_holder
+
if job_holder['args']
job_holder['args'] = filter_arguments(job_holder['args'], job_holder['class']).to_a
end
diff --git a/package.json b/package.json
index 25e0dbdac6b..d50c5044998 100644
--- a/package.json
+++ b/package.json
@@ -57,7 +57,7 @@
"@gitlab/favicon-overlay": "2.0.0",
"@gitlab/svgs": "2.0.0",
"@gitlab/tributejs": "1.0.0",
- "@gitlab/ui": "32.50.0",
+ "@gitlab/ui": "32.51.3",
"@gitlab/visual-review-tools": "1.6.1",
"@rails/actioncable": "6.1.4-1",
"@rails/ujs": "6.1.4-1",
@@ -234,6 +234,7 @@
"istanbul-reports": "^3.0.0",
"jest": "^26.5.2",
"jest-canvas-mock": "^2.1.2",
+ "jest-diff": "^27.4.6",
"jest-environment-jsdom": "^26.5.2",
"jest-junit": "^12.0.0",
"jest-raw-loader": "^1.0.1",
diff --git a/spec/factories/integrations.rb b/spec/factories/integrations.rb
index 76415f82ed0..f3a00ac083a 100644
--- a/spec/factories/integrations.rb
+++ b/spec/factories/integrations.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
FactoryBot.define do
- factory :integration, aliases: [:service] do
+ factory :integration do
project
type { 'Integration' }
end
diff --git a/spec/factories/usage_data.rb b/spec/factories/usage_data.rb
index fc1f5d71f39..f00d1f8b808 100644
--- a/spec/factories/usage_data.rb
+++ b/spec/factories/usage_data.rb
@@ -19,16 +19,16 @@ FactoryBot.define do
create(:jira_import_state, :finished, project: projects[1], label: jira_label, imported_issues_count: 3)
create(:jira_import_state, :scheduled, project: projects[1], label: jira_label)
create(:prometheus_integration, project: projects[1])
- create(:service, project: projects[1], type: 'JenkinsService', active: true)
- create(:service, project: projects[0], type: 'SlackSlashCommandsService', active: true)
- create(:service, project: projects[1], type: 'SlackService', active: true)
- create(:service, project: projects[2], type: 'SlackService', active: true)
- create(:service, project: projects[2], type: 'MattermostService', active: false)
- create(:service, group: group, project: nil, type: 'MattermostService', active: true)
- mattermost_instance = create(:service, :instance, type: 'MattermostService', active: true)
- create(:service, project: projects[1], type: 'MattermostService', active: true, inherit_from_id: mattermost_instance.id)
- create(:service, group: group, project: nil, type: 'SlackService', active: true, inherit_from_id: mattermost_instance.id)
- create(:service, project: projects[2], type: 'CustomIssueTrackerService', active: true)
+ create(:integration, project: projects[1], type: 'JenkinsService', active: true)
+ create(:integration, project: projects[0], type: 'SlackSlashCommandsService', active: true)
+ create(:integration, project: projects[1], type: 'SlackService', active: true)
+ create(:integration, project: projects[2], type: 'SlackService', active: true)
+ create(:integration, project: projects[2], type: 'MattermostService', active: false)
+ create(:integration, group: group, project: nil, type: 'MattermostService', active: true)
+ mattermost_instance = create(:integration, :instance, type: 'MattermostService', active: true)
+ create(:integration, project: projects[1], type: 'MattermostService', active: true, inherit_from_id: mattermost_instance.id)
+ create(:integration, group: group, project: nil, type: 'SlackService', active: true, inherit_from_id: mattermost_instance.id)
+ create(:integration, project: projects[2], type: 'CustomIssueTrackerService', active: true)
create(:project_error_tracking_setting, project: projects[0])
create(:project_error_tracking_setting, project: projects[1], enabled: false)
alert_bot_issues = create_list(:incident, 2, project: projects[0], author: User.alert_bot)
diff --git a/spec/features/merge_request/user_sees_merge_widget_spec.rb b/spec/features/merge_request/user_sees_merge_widget_spec.rb
index 0117cf01e53..8761ee89463 100644
--- a/spec/features/merge_request/user_sees_merge_widget_spec.rb
+++ b/spec/features/merge_request/user_sees_merge_widget_spec.rb
@@ -96,7 +96,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
context 'view merge request with external CI service' do
before do
- create(:service, project: project,
+ create(:integration, project: project,
active: true,
type: 'DroneCiService',
category: 'ci')
diff --git a/spec/features/profiles/chat_names_spec.rb b/spec/features/profiles/chat_names_spec.rb
index 6270fa7347d..b392d8dfa8e 100644
--- a/spec/features/profiles/chat_names_spec.rb
+++ b/spec/features/profiles/chat_names_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe 'Profile > Chat' do
let(:user) { create(:user) }
- let(:integration) { create(:service) }
+ let(:integration) { create(:integration) }
before do
sign_in(user)
diff --git a/spec/frontend/__helpers__/matchers/index.js b/spec/frontend/__helpers__/matchers/index.js
index 4fcde89d421..76571bafb06 100644
--- a/spec/frontend/__helpers__/matchers/index.js
+++ b/spec/frontend/__helpers__/matchers/index.js
@@ -1,2 +1,3 @@
export * from './to_have_sprite_icon';
+export * from './to_have_tracking_attributes';
export * from './to_match_interpolated_text';
diff --git a/spec/frontend/__helpers__/matchers/to_have_tracking_attributes.js b/spec/frontend/__helpers__/matchers/to_have_tracking_attributes.js
new file mode 100644
index 00000000000..fd3f3aa042f
--- /dev/null
+++ b/spec/frontend/__helpers__/matchers/to_have_tracking_attributes.js
@@ -0,0 +1,35 @@
+import { diff } from 'jest-diff';
+import { isObject, mapValues, isEqual } from 'lodash';
+
+export const toHaveTrackingAttributes = (actual, obj) => {
+ if (!(actual instanceof Element)) {
+ return { actual, message: () => 'The received value must be an Element.', pass: false };
+ }
+
+ if (!isObject(obj)) {
+ return {
+ message: () => `The matching object must be an object. Found ${obj}.`,
+ pass: false,
+ };
+ }
+
+ const actualAttributes = mapValues(obj, (val, key) => actual.getAttribute(`data-track-${key}`));
+
+ const matcherPass = isEqual(actualAttributes, obj);
+
+ const failMessage = () => {
+ // We can match, but still fail because we're in a `expect...not.` context
+ if (matcherPass) {
+ return `Expected the element's tracking attributes not to match. Found that they matched ${JSON.stringify(
+ obj,
+ )}.`;
+ }
+
+ const objDiff = diff(actualAttributes, obj);
+ return `Expected the element's tracking attributes to match the given object. Diff:
+${objDiff}
+`;
+ };
+
+ return { actual, message: failMessage, pass: matcherPass };
+};
diff --git a/spec/frontend/__helpers__/matchers/to_have_tracking_attributes_spec.js b/spec/frontend/__helpers__/matchers/to_have_tracking_attributes_spec.js
new file mode 100644
index 00000000000..74073ed4063
--- /dev/null
+++ b/spec/frontend/__helpers__/matchers/to_have_tracking_attributes_spec.js
@@ -0,0 +1,65 @@
+import { diff } from 'jest-diff';
+
+describe('custom matcher toHaveTrackingAttributes', () => {
+ const createElementWithAttrs = (attributes) => {
+ const el = document.createElement('div');
+
+ Object.entries(attributes).forEach(([key, value]) => {
+ el.setAttribute(key, value);
+ });
+
+ return el;
+ };
+
+ it('blows up if actual is not an element', () => {
+ expect(() => {
+ expect({}).toHaveTrackingAttributes({});
+ }).toThrow('The received value must be an Element.');
+ });
+
+ it('blows up if expected is not an object', () => {
+ expect(() => {
+ expect(createElementWithAttrs({})).toHaveTrackingAttributes('foo');
+ }).toThrow('The matching object must be an object.');
+ });
+
+ it('prints diff when fails', () => {
+ const expectedDiff = diff({ label: 'foo' }, { label: 'a' });
+ expect(() => {
+ expect(createElementWithAttrs({ 'data-track-label': 'foo' })).toHaveTrackingAttributes({
+ label: 'a',
+ });
+ }).toThrow(
+ `Expected the element's tracking attributes to match the given object. Diff:\n${expectedDiff}\n`,
+ );
+ });
+
+ describe('positive assertions', () => {
+ it.each`
+ attrs | expected
+ ${{ 'data-track-label': 'foo' }} | ${{ label: 'foo' }}
+ ${{ 'data-track-label': 'foo' }} | ${{}}
+ ${{ 'data-track-label': 'foo', label: 'bar' }} | ${{ label: 'foo' }}
+ ${{ 'data-track-label': 'foo', 'data-track-extra': '123' }} | ${{ label: 'foo', extra: '123' }}
+ ${{ 'data-track-label': 'foo', 'data-track-extra': '123' }} | ${{ extra: '123' }}
+ ${{ label: 'foo', extra: '123', id: '7' }} | ${{}}
+ `('$expected matches element with attrs $attrs', ({ attrs, expected }) => {
+ expect(createElementWithAttrs(attrs)).toHaveTrackingAttributes(expected);
+ });
+ });
+
+ describe('negative assertions', () => {
+ it.each`
+ attrs | expected
+ ${{}} | ${{ label: 'foo' }}
+ ${{ label: 'foo' }} | ${{ label: 'foo' }}
+ ${{ 'data-track-label': 'bar', label: 'foo' }} | ${{ label: 'foo' }}
+ ${{ 'data-track-label': 'foo' }} | ${{ extra: '123' }}
+ ${{ 'data-track-label': 'foo', 'data-track-extra': '123' }} | ${{ label: 'foo', extra: '456' }}
+ ${{ 'data-track-label': 'foo', 'data-track-extra': '123' }} | ${{ label: 'foo', extra: '123', action: 'click' }}
+ ${{ label: 'foo', extra: '123', id: '7' }} | ${{ id: '7' }}
+ `('$expected does not match element with attrs $attrs', ({ attrs, expected }) => {
+ expect(createElementWithAttrs(attrs)).not.toHaveTrackingAttributes(expected);
+ });
+ });
+});
diff --git a/spec/frontend/packages_and_registries/infrastructure_registry/components/list/components/__snapshots__/packages_list_app_spec.js.snap b/spec/frontend/packages_and_registries/infrastructure_registry/components/list/components/__snapshots__/packages_list_app_spec.js.snap
index 99a7b8e427a..c5bafb82001 100644
--- a/spec/frontend/packages_and_registries/infrastructure_registry/components/list/components/__snapshots__/packages_list_app_spec.js.snap
+++ b/spec/frontend/packages_and_registries/infrastructure_registry/components/list/components/__snapshots__/packages_list_app_spec.js.snap
@@ -10,10 +10,10 @@ exports[`packages_list_app renders 1`] = `
<div>
<section
- class="row empty-state text-center"
+ class="gl-display-flex gl-flex-wrap empty-state gl-text-center gl-flex-direction-column"
>
<div
- class="col-12"
+ class="gl-max-w-full"
>
<div
class="svg-250 svg-content"
@@ -28,10 +28,10 @@ exports[`packages_list_app renders 1`] = `
</div>
<div
- class="col-12"
+ class="gl-max-w-full gl-m-auto"
>
<div
- class="text-content gl-mx-auto gl-my-0 gl-p-5"
+ class="gl-mx-auto gl-my-0 gl-p-5"
>
<h1
class="gl-font-size-h-display gl-line-height-36 h4"
diff --git a/spec/frontend/packages_and_registries/package_registry/pages/__snapshots__/list_spec.js.snap b/spec/frontend/packages_and_registries/package_registry/pages/__snapshots__/list_spec.js.snap
index dbe3c70c3cb..94d04c9892a 100644
--- a/spec/frontend/packages_and_registries/package_registry/pages/__snapshots__/list_spec.js.snap
+++ b/spec/frontend/packages_and_registries/package_registry/pages/__snapshots__/list_spec.js.snap
@@ -11,10 +11,10 @@ exports[`PackagesListApp renders 1`] = `
<div>
<section
- class="row empty-state text-center"
+ class="gl-display-flex gl-flex-wrap empty-state gl-text-center gl-flex-direction-column"
>
<div
- class="col-12"
+ class="gl-max-w-full"
>
<div
class="svg-250 svg-content"
@@ -29,10 +29,10 @@ exports[`PackagesListApp renders 1`] = `
</div>
<div
- class="col-12"
+ class="gl-max-w-full gl-m-auto"
>
<div
- class="text-content gl-mx-auto gl-my-0 gl-p-5"
+ class="gl-mx-auto gl-my-0 gl-p-5"
>
<h1
class="gl-font-size-h-display gl-line-height-36 h4"
diff --git a/spec/frontend/pages/shared/nav/sidebar_tracking_spec.js b/spec/frontend/pages/shared/nav/sidebar_tracking_spec.js
index 2c8eb8e459f..04f53e048ed 100644
--- a/spec/frontend/pages/shared/nav/sidebar_tracking_spec.js
+++ b/spec/frontend/pages/shared/nav/sidebar_tracking_spec.js
@@ -57,9 +57,9 @@ describe('~/pages/shared/nav/sidebar_tracking.js', () => {
menu.classList.add('is-over', 'is-showing-fly-out');
menuLink.click();
- expect(menu.dataset).toMatchObject({
- trackAction: 'click_menu',
- trackExtra: JSON.stringify({
+ expect(menu).toHaveTrackingAttributes({
+ action: 'click_menu',
+ extra: JSON.stringify({
sidebar_display: 'Expanded',
menu_display: 'Fly out',
}),
@@ -74,9 +74,9 @@ describe('~/pages/shared/nav/sidebar_tracking.js', () => {
submenuList.classList.add('fly-out-list');
menuLink.click();
- expect(menu.dataset).toMatchObject({
- trackAction: 'click_menu_item',
- trackExtra: JSON.stringify({
+ expect(menu).toHaveTrackingAttributes({
+ action: 'click_menu_item',
+ extra: JSON.stringify({
sidebar_display: 'Expanded',
menu_display: 'Fly out',
}),
@@ -92,9 +92,9 @@ describe('~/pages/shared/nav/sidebar_tracking.js', () => {
menu.classList.add('active');
menuLink.click();
- expect(menu.dataset).toMatchObject({
- trackAction: 'click_menu',
- trackExtra: JSON.stringify({
+ expect(menu).toHaveTrackingAttributes({
+ action: 'click_menu',
+ extra: JSON.stringify({
sidebar_display: 'Expanded',
menu_display: 'Expanded',
}),
@@ -108,9 +108,9 @@ describe('~/pages/shared/nav/sidebar_tracking.js', () => {
menu.classList.add('active');
menuLink.click();
- expect(menu.dataset).toMatchObject({
- trackAction: 'click_menu_item',
- trackExtra: JSON.stringify({
+ expect(menu).toHaveTrackingAttributes({
+ action: 'click_menu_item',
+ extra: JSON.stringify({
sidebar_display: 'Expanded',
menu_display: 'Expanded',
}),
@@ -131,9 +131,9 @@ describe('~/pages/shared/nav/sidebar_tracking.js', () => {
menu.classList.add('is-over', 'is-showing-fly-out');
menuLink.click();
- expect(menu.dataset).toMatchObject({
- trackAction: 'click_menu',
- trackExtra: JSON.stringify({
+ expect(menu).toHaveTrackingAttributes({
+ action: 'click_menu',
+ extra: JSON.stringify({
sidebar_display: 'Collapsed',
menu_display: 'Fly out',
}),
@@ -148,9 +148,9 @@ describe('~/pages/shared/nav/sidebar_tracking.js', () => {
submenuList.classList.add('fly-out-list');
menuLink.click();
- expect(menu.dataset).toMatchObject({
- trackAction: 'click_menu_item',
- trackExtra: JSON.stringify({
+ expect(menu).toHaveTrackingAttributes({
+ action: 'click_menu_item',
+ extra: JSON.stringify({
sidebar_display: 'Collapsed',
menu_display: 'Fly out',
}),
diff --git a/spec/frontend/serverless/components/__snapshots__/empty_state_spec.js.snap b/spec/frontend/serverless/components/__snapshots__/empty_state_spec.js.snap
index c25a8d4bb92..43a79b4373d 100644
--- a/spec/frontend/serverless/components/__snapshots__/empty_state_spec.js.snap
+++ b/spec/frontend/serverless/components/__snapshots__/empty_state_spec.js.snap
@@ -1,12 +1,12 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`EmptyStateComponent should render content 1`] = `
-"<section class=\\"row empty-state text-center\\">
- <div class=\\"col-12\\">
+"<section class=\\"gl-display-flex gl-flex-wrap empty-state gl-text-center gl-flex-direction-column\\">
+ <div class=\\"gl-max-w-full\\">
<div class=\\"svg-250 svg-content\\"><img src=\\"/image.svg\\" alt=\\"\\" role=\\"img\\" class=\\"gl-max-w-full\\"></div>
</div>
- <div class=\\"col-12\\">
- <div class=\\"text-content gl-mx-auto gl-my-0 gl-p-5\\">
+ <div class=\\"gl-max-w-full gl-m-auto\\">
+ <div class=\\"gl-mx-auto gl-my-0 gl-p-5\\">
<h1 class=\\"gl-font-size-h-display gl-line-height-36 h4\\">
Getting started with serverless
</h1>
diff --git a/spec/graphql/types/projects/service_type_spec.rb b/spec/graphql/types/projects/service_type_spec.rb
index cb09f1ca6cc..0bffdfd629d 100644
--- a/spec/graphql/types/projects/service_type_spec.rb
+++ b/spec/graphql/types/projects/service_type_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe Types::Projects::ServiceType do
describe ".resolve_type" do
it 'resolves the corresponding type for objects' do
expect(described_class.resolve_type(build(:jira_integration), {})).to eq(Types::Projects::Services::JiraServiceType)
- expect(described_class.resolve_type(build(:service), {})).to eq(Types::Projects::Services::BaseServiceType)
+ expect(described_class.resolve_type(build(:integration), {})).to eq(Types::Projects::Services::BaseServiceType)
expect(described_class.resolve_type(build(:drone_ci_integration), {})).to eq(Types::Projects::Services::BaseServiceType)
expect(described_class.resolve_type(build(:custom_issue_tracker_integration), {})).to eq(Types::Projects::Services::BaseServiceType)
end
diff --git a/spec/helpers/auto_devops_helper_spec.rb b/spec/helpers/auto_devops_helper_spec.rb
index 4f060a0ae3b..1083faa5e19 100644
--- a/spec/helpers/auto_devops_helper_spec.rb
+++ b/spec/helpers/auto_devops_helper_spec.rb
@@ -86,7 +86,7 @@ RSpec.describe AutoDevopsHelper do
context 'when another service is enabled' do
before do
- create(:service, project: project, category: :ci, active: true)
+ create(:integration, project: project, category: :ci, active: true)
end
it { is_expected.to eq(false) }
diff --git a/spec/lib/gitlab/background_migration/cleanup_concurrent_schema_change_spec.rb b/spec/lib/gitlab/background_migration/cleanup_concurrent_schema_change_spec.rb
deleted file mode 100644
index 2931b5e6dd3..00000000000
--- a/spec/lib/gitlab/background_migration/cleanup_concurrent_schema_change_spec.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# frozen_string_literal: true
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::CleanupConcurrentSchemaChange do
- describe '#perform' do
- it 'new column does not exist' do
- expect(subject).to receive(:column_exists?).with(:issues, :closed_at_timestamp).and_return(false)
- expect(subject).not_to receive(:column_exists?).with(:issues, :closed_at)
- expect(subject).not_to receive(:define_model_for)
-
- expect(subject.perform(:issues, :closed_at, :closed_at_timestamp)).to be_nil
- end
-
- it 'old column does not exist' do
- expect(subject).to receive(:column_exists?).with(:issues, :closed_at_timestamp).and_return(true)
- expect(subject).to receive(:column_exists?).with(:issues, :closed_at).and_return(false)
- expect(subject).not_to receive(:define_model_for)
-
- expect(subject.perform(:issues, :closed_at, :closed_at_timestamp)).to be_nil
- end
-
- it 'has both old and new columns' do
- expect(subject).to receive(:column_exists?).twice.and_return(true)
-
- expect { subject.perform('issues', :closed_at, :created_at) }.to raise_error(NotImplementedError)
- end
- end
-end
diff --git a/spec/lib/gitlab/error_tracking/processor/sidekiq_processor_spec.rb b/spec/lib/gitlab/error_tracking/processor/sidekiq_processor_spec.rb
index af5f11c9362..3febc10831a 100644
--- a/spec/lib/gitlab/error_tracking/processor/sidekiq_processor_spec.rb
+++ b/spec/lib/gitlab/error_tracking/processor/sidekiq_processor_spec.rb
@@ -178,5 +178,14 @@ RSpec.describe Gitlab::ErrorTracking::Processor::SidekiqProcessor do
expect(result_hash.dig(:extra, :sidekiq)).to be_nil
end
end
+
+ context 'when there is Sidekiq data but no job' do
+ let(:value) { { other: 'foo' } }
+ let(:wrapped_value) { { extra: { sidekiq: value } } }
+
+ it 'does nothing' do
+ expect(result_hash.dig(:extra, :sidekiq)).to eq(value)
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/import_export/fast_hash_serializer_spec.rb b/spec/lib/gitlab/import_export/fast_hash_serializer_spec.rb
index d5f31f235f5..adb613c3abc 100644
--- a/spec/lib/gitlab/import_export/fast_hash_serializer_spec.rb
+++ b/spec/lib/gitlab/import_export/fast_hash_serializer_spec.rb
@@ -258,7 +258,7 @@ RSpec.describe Gitlab::ImportExport::FastHashSerializer do
create(:resource_label_event, label: group_label, merge_request: merge_request)
create(:event, :created, target: milestone, project: project, author: user)
- create(:service, project: project, type: 'CustomIssueTrackerService', category: 'issue_tracker', properties: { one: 'value' })
+ create(:integration, project: project, type: 'CustomIssueTrackerService', category: 'issue_tracker', properties: { one: 'value' })
create(:project_custom_attribute, project: project)
create(:project_custom_attribute, project: project)
diff --git a/spec/lib/gitlab/import_export/project/relation_factory_spec.rb b/spec/lib/gitlab/import_export/project/relation_factory_spec.rb
index 80ba50976af..ea8b10675af 100644
--- a/spec/lib/gitlab/import_export/project/relation_factory_spec.rb
+++ b/spec/lib/gitlab/import_export/project/relation_factory_spec.rb
@@ -88,7 +88,7 @@ RSpec.describe Gitlab::ImportExport::Project::RelationFactory, :use_clean_rails_
end
context 'original service exists' do
- let(:service_id) { create(:service, project: project).id }
+ let(:service_id) { create(:integration, project: project).id }
it 'does not have the original service_id' do
expect(created_object.service_id).not_to eq(service_id)
diff --git a/spec/lib/gitlab/integrations/sti_type_spec.rb b/spec/lib/gitlab/integrations/sti_type_spec.rb
index 70b93d6a4b5..1205b74dc9d 100644
--- a/spec/lib/gitlab/integrations/sti_type_spec.rb
+++ b/spec/lib/gitlab/integrations/sti_type_spec.rb
@@ -46,11 +46,11 @@ RSpec.describe Gitlab::Integrations::StiType do
SQL
end
- let_it_be(:service) { create(:service) }
+ let_it_be(:integration) { create(:integration) }
it 'forms SQL UPDATE statements correctly' do
sql_statements = types.map do |type|
- record = ActiveRecord::QueryRecorder.new { service.update_column(:type, type) }
+ record = ActiveRecord::QueryRecorder.new { integration.update_column(:type, type) }
record.log.first
end
@@ -65,8 +65,6 @@ RSpec.describe Gitlab::Integrations::StiType do
SQL
end
- let(:service) { create(:service) }
-
it 'forms SQL DELETE statements correctly' do
sql_statements = types.map do |type|
record = ActiveRecord::QueryRecorder.new { Integration.delete_by(type: type) }
@@ -81,7 +79,7 @@ RSpec.describe Gitlab::Integrations::StiType do
describe '#deserialize' do
specify 'it deserializes type correctly', :aggregate_failures do
types.each do |type|
- service = create(:service, type: type)
+ service = create(:integration, type: type)
expect(service.type).to eq('AsanaService')
end
@@ -90,7 +88,7 @@ RSpec.describe Gitlab::Integrations::StiType do
describe '#cast' do
it 'casts type as model correctly', :aggregate_failures do
- create(:service, type: 'AsanaService')
+ create(:integration, type: 'AsanaService')
types.each do |type|
expect(Integration.find_by(type: type)).to be_kind_of(Integrations::Asana)
@@ -100,7 +98,7 @@ RSpec.describe Gitlab::Integrations::StiType do
describe '#changed?' do
it 'detects changes correctly', :aggregate_failures do
- service = create(:service, type: 'AsanaService')
+ service = create(:integration, type: 'AsanaService')
types.each do |type|
service.type = type
diff --git a/spec/models/integration_spec.rb b/spec/models/integration_spec.rb
index 50975674472..6e9dfb04057 100644
--- a/spec/models/integration_spec.rb
+++ b/spec/models/integration_spec.rb
@@ -33,28 +33,28 @@ RSpec.describe Integration do
end
with_them do
- it 'validates the service' do
- expect(build(:service, project_id: project_id, group_id: group_id, instance: instance).valid?).to eq(valid)
+ it 'validates the integration' do
+ expect(build(:integration, project_id: project_id, group_id: group_id, instance: instance).valid?).to eq(valid)
end
end
- context 'with existing services' do
+ context 'with existing integrations' do
before_all do
- create(:service, :instance)
- create(:service, project: project)
- create(:service, group: group, project: nil)
+ create(:integration, :instance)
+ create(:integration, project: project)
+ create(:integration, group: group, project: nil)
end
- it 'allows only one instance service per type' do
- expect(build(:service, :instance)).to be_invalid
+ it 'allows only one instance integration per type' do
+ expect(build(:integration, :instance)).to be_invalid
end
- it 'allows only one project service per type' do
- expect(build(:service, project: project)).to be_invalid
+ it 'allows only one project integration per type' do
+ expect(build(:integration, project: project)).to be_invalid
end
- it 'allows only one group service per type' do
- expect(build(:service, group: group, project: nil)).to be_invalid
+ it 'allows only one group integration per type' do
+ expect(build(:integration, group: group, project: nil)).to be_invalid
end
end
end
@@ -79,57 +79,57 @@ RSpec.describe Integration do
end
describe '.by_type' do
- let!(:service1) { create(:jira_integration) }
- let!(:service2) { create(:jira_integration) }
- let!(:service3) { create(:redmine_integration) }
+ let!(:integration1) { create(:jira_integration) }
+ let!(:integration2) { create(:jira_integration) }
+ let!(:integration3) { create(:redmine_integration) }
subject { described_class.by_type(type) }
context 'when type is "JiraService"' do
let(:type) { 'JiraService' }
- it { is_expected.to match_array([service1, service2]) }
+ it { is_expected.to match_array([integration1, integration2]) }
end
context 'when type is "RedmineService"' do
let(:type) { 'RedmineService' }
- it { is_expected.to match_array([service3]) }
+ it { is_expected.to match_array([integration3]) }
end
end
describe '.for_group' do
- let!(:service1) { create(:jira_integration, project_id: nil, group_id: group.id) }
- let!(:service2) { create(:jira_integration) }
+ let!(:integration1) { create(:jira_integration, project_id: nil, group_id: group.id) }
+ let!(:integration2) { create(:jira_integration) }
- it 'returns the right group service' do
- expect(described_class.for_group(group)).to match_array([service1])
+ it 'returns the right group integration' do
+ expect(described_class.for_group(group)).to match_array([integration1])
end
end
describe '.confidential_note_hooks' do
- it 'includes services where confidential_note_events is true' do
- create(:service, active: true, confidential_note_events: true)
+ it 'includes integrations where confidential_note_events is true' do
+ create(:integration, active: true, confidential_note_events: true)
expect(described_class.confidential_note_hooks.count).to eq 1
end
- it 'excludes services where confidential_note_events is false' do
- create(:service, active: true, confidential_note_events: false)
+ it 'excludes integrations where confidential_note_events is false' do
+ create(:integration, active: true, confidential_note_events: false)
expect(described_class.confidential_note_hooks.count).to eq 0
end
end
describe '.alert_hooks' do
- it 'includes services where alert_events is true' do
- create(:service, active: true, alert_events: true)
+ it 'includes integrations where alert_events is true' do
+ create(:integration, active: true, alert_events: true)
expect(described_class.alert_hooks.count).to eq 1
end
- it 'excludes services where alert_events is false' do
- create(:service, active: true, alert_events: false)
+ it 'excludes integrations where alert_events is false' do
+ create(:integration, active: true, alert_events: false)
expect(described_class.alert_hooks.count).to eq 0
end
@@ -137,35 +137,35 @@ RSpec.describe Integration do
end
describe '#operating?' do
- it 'is false when the service is not active' do
- expect(build(:service).operating?).to eq(false)
+ it 'is false when the integration is not active' do
+ expect(build(:integration).operating?).to eq(false)
end
- it 'is false when the service is not persisted' do
- expect(build(:service, active: true).operating?).to eq(false)
+ it 'is false when the integration is not persisted' do
+ expect(build(:integration, active: true).operating?).to eq(false)
end
- it 'is true when the service is active and persisted' do
- expect(create(:service, active: true).operating?).to eq(true)
+ it 'is true when the integration is active and persisted' do
+ expect(create(:integration, active: true).operating?).to eq(true)
end
end
describe '#testable?' do
context 'when integration is project-level' do
- subject { build(:service, project: project) }
+ subject { build(:integration, project: project) }
it { is_expected.to be_testable }
end
context 'when integration is not project-level' do
- subject { build(:service, project: nil) }
+ subject { build(:integration, project: nil) }
it { is_expected.not_to be_testable }
end
end
describe '#test' do
- let(:integration) { build(:service, project: project) }
+ let(:integration) { build(:integration, project: project) }
let(:data) { 'test' }
it 'calls #execute' do
@@ -186,32 +186,32 @@ RSpec.describe Integration do
end
describe '#project_level?' do
- it 'is true when service has a project' do
- expect(build(:service, project: project)).to be_project_level
+ it 'is true when integration has a project' do
+ expect(build(:integration, project: project)).to be_project_level
end
- it 'is false when service has no project' do
- expect(build(:service, project: nil)).not_to be_project_level
+ it 'is false when integration has no project' do
+ expect(build(:integration, project: nil)).not_to be_project_level
end
end
describe '#group_level?' do
- it 'is true when service has a group' do
- expect(build(:service, group: group)).to be_group_level
+ it 'is true when integration has a group' do
+ expect(build(:integration, group: group)).to be_group_level
end
- it 'is false when service has no group' do
- expect(build(:service, group: nil)).not_to be_group_level
+ it 'is false when integration has no group' do
+ expect(build(:integration, group: nil)).not_to be_group_level
end
end
describe '#instance_level?' do
- it 'is true when service has instance-level integration' do
- expect(build(:service, :instance)).to be_instance_level
+ it 'is true when integration has instance-level integration' do
+ expect(build(:integration, :instance)).to be_instance_level
end
- it 'is false when service does not have instance-level integration' do
- expect(build(:service, instance: false)).not_to be_instance_level
+ it 'is false when integration does not have instance-level integration' do
+ expect(build(:integration, instance: false)).not_to be_instance_level
end
end
@@ -231,19 +231,19 @@ RSpec.describe Integration do
end
describe '.find_or_initialize_all_non_project_specific' do
- shared_examples 'service instances' do
- it 'returns the available service instances' do
+ shared_examples 'integration instances' do
+ it 'returns the available integration instances' do
expect(Integration.find_or_initialize_all_non_project_specific(Integration.for_instance).map(&:to_param))
.to match_array(Integration.available_integration_names(include_project_specific: false))
end
- it 'does not create service instances' do
+ it 'does not create integration instances' do
expect { Integration.find_or_initialize_all_non_project_specific(Integration.for_instance) }
.not_to change(Integration, :count)
end
end
- it_behaves_like 'service instances'
+ it_behaves_like 'integration instances'
context 'with all existing instances' do
before do
@@ -252,15 +252,15 @@ RSpec.describe Integration do
)
end
- it_behaves_like 'service instances'
+ it_behaves_like 'integration instances'
- context 'with a previous existing service (MockCiService) and a new service (Asana)' do
+ context 'with a previous existing integration (MockCiService) and a new integration (Asana)' do
before do
Integration.insert({ type: 'MockCiService', instance: true })
Integration.delete_by(type: 'AsanaService', instance: true)
end
- it_behaves_like 'service instances'
+ it_behaves_like 'integration instances'
end
end
@@ -269,7 +269,7 @@ RSpec.describe Integration do
create(:jira_integration, :instance)
end
- it_behaves_like 'service instances'
+ it_behaves_like 'integration instances'
end
end
@@ -320,31 +320,31 @@ RSpec.describe Integration do
}
end
- shared_examples 'service creation from an integration' do
- it 'creates a correct service for a project integration' do
- service = described_class.build_from_integration(integration, project_id: project.id)
+ shared_examples 'integration creation from an integration' do
+ it 'creates a correct integration for a project integration' do
+ new_integration = described_class.build_from_integration(integration, project_id: project.id)
- expect(service).to be_active
- expect(service.url).to eq(url)
- expect(service.api_url).to eq(api_url)
- expect(service.username).to eq(username)
- expect(service.password).to eq(password)
- expect(service.instance).to eq(false)
- expect(service.project).to eq(project)
- expect(service.group).to eq(nil)
+ expect(new_integration).to be_active
+ expect(new_integration.url).to eq(url)
+ expect(new_integration.api_url).to eq(api_url)
+ expect(new_integration.username).to eq(username)
+ expect(new_integration.password).to eq(password)
+ expect(new_integration.instance).to eq(false)
+ expect(new_integration.project).to eq(project)
+ expect(new_integration.group).to eq(nil)
end
- it 'creates a correct service for a group integration' do
- service = described_class.build_from_integration(integration, group_id: group.id)
-
- expect(service).to be_active
- expect(service.url).to eq(url)
- expect(service.api_url).to eq(api_url)
- expect(service.username).to eq(username)
- expect(service.password).to eq(password)
- expect(service.instance).to eq(false)
- expect(service.project).to eq(nil)
- expect(service.group).to eq(group)
+ it 'creates a correct integration for a group integration' do
+ new_integration = described_class.build_from_integration(integration, group_id: group.id)
+
+ expect(new_integration).to be_active
+ expect(new_integration.url).to eq(url)
+ expect(new_integration.api_url).to eq(api_url)
+ expect(new_integration.username).to eq(username)
+ expect(new_integration.password).to eq(password)
+ expect(new_integration.instance).to eq(false)
+ expect(new_integration.project).to eq(nil)
+ expect(new_integration.group).to eq(group)
end
end
@@ -355,7 +355,7 @@ RSpec.describe Integration do
create(:jira_integration, :without_properties_callback, properties: properties.merge(additional: 'something'))
end
- it_behaves_like 'service creation from an integration'
+ it_behaves_like 'integration creation from an integration'
end
context 'when data are stored in separated fields' do
@@ -363,7 +363,7 @@ RSpec.describe Integration do
create(:jira_integration, data_params.merge(properties: {}))
end
- it_behaves_like 'service creation from an integration'
+ it_behaves_like 'integration creation from an integration'
end
context 'when data are stored in both properties and separated fields' do
@@ -374,7 +374,7 @@ RSpec.describe Integration do
end
end
- it_behaves_like 'service creation from an integration'
+ it_behaves_like 'integration creation from an integration'
end
end
end
@@ -565,17 +565,17 @@ RSpec.describe Integration do
end
describe '.integration_name_to_model' do
- it 'returns the model for the given service name' do
+ it 'returns the model for the given integration name' do
expect(described_class.integration_name_to_model('asana')).to eq(Integrations::Asana)
end
- it 'raises an error if service name is invalid' do
+ it 'raises an error if integration name is invalid' do
expect { described_class.integration_name_to_model('foo') }.to raise_exception(NameError, /uninitialized constant FooService/)
end
end
describe "{property}_changed?" do
- let(:service) do
+ let(:integration) do
Integrations::Bamboo.create!(
project: project,
properties: {
@@ -587,35 +587,35 @@ RSpec.describe Integration do
end
it "returns false when the property has not been assigned a new value" do
- service.username = "key_changed"
- expect(service.bamboo_url_changed?).to be_falsy
+ integration.username = "key_changed"
+ expect(integration.bamboo_url_changed?).to be_falsy
end
it "returns true when the property has been assigned a different value" do
- service.bamboo_url = "http://example.com"
- expect(service.bamboo_url_changed?).to be_truthy
+ integration.bamboo_url = "http://example.com"
+ expect(integration.bamboo_url_changed?).to be_truthy
end
it "returns true when the property has been assigned a different value twice" do
- service.bamboo_url = "http://example.com"
- service.bamboo_url = "http://example.com"
- expect(service.bamboo_url_changed?).to be_truthy
+ integration.bamboo_url = "http://example.com"
+ integration.bamboo_url = "http://example.com"
+ expect(integration.bamboo_url_changed?).to be_truthy
end
it "returns false when the property has been re-assigned the same value" do
- service.bamboo_url = 'http://gitlab.com'
- expect(service.bamboo_url_changed?).to be_falsy
+ integration.bamboo_url = 'http://gitlab.com'
+ expect(integration.bamboo_url_changed?).to be_falsy
end
it "returns false when the property has been assigned a new value then saved" do
- service.bamboo_url = 'http://example.com'
- service.save!
- expect(service.bamboo_url_changed?).to be_falsy
+ integration.bamboo_url = 'http://example.com'
+ integration.save!
+ expect(integration.bamboo_url_changed?).to be_falsy
end
end
describe "{property}_touched?" do
- let(:service) do
+ let(:integration) do
Integrations::Bamboo.create!(
project: project,
properties: {
@@ -627,35 +627,35 @@ RSpec.describe Integration do
end
it "returns false when the property has not been assigned a new value" do
- service.username = "key_changed"
- expect(service.bamboo_url_touched?).to be_falsy
+ integration.username = "key_changed"
+ expect(integration.bamboo_url_touched?).to be_falsy
end
it "returns true when the property has been assigned a different value" do
- service.bamboo_url = "http://example.com"
- expect(service.bamboo_url_touched?).to be_truthy
+ integration.bamboo_url = "http://example.com"
+ expect(integration.bamboo_url_touched?).to be_truthy
end
it "returns true when the property has been assigned a different value twice" do
- service.bamboo_url = "http://example.com"
- service.bamboo_url = "http://example.com"
- expect(service.bamboo_url_touched?).to be_truthy
+ integration.bamboo_url = "http://example.com"
+ integration.bamboo_url = "http://example.com"
+ expect(integration.bamboo_url_touched?).to be_truthy
end
it "returns true when the property has been re-assigned the same value" do
- service.bamboo_url = 'http://gitlab.com'
- expect(service.bamboo_url_touched?).to be_truthy
+ integration.bamboo_url = 'http://gitlab.com'
+ expect(integration.bamboo_url_touched?).to be_truthy
end
it "returns false when the property has been assigned a new value then saved" do
- service.bamboo_url = 'http://example.com'
- service.save!
- expect(service.bamboo_url_changed?).to be_falsy
+ integration.bamboo_url = 'http://example.com'
+ integration.save!
+ expect(integration.bamboo_url_changed?).to be_falsy
end
end
describe "{property}_was" do
- let(:service) do
+ let(:integration) do
Integrations::Bamboo.create!(
project: project,
properties: {
@@ -667,35 +667,35 @@ RSpec.describe Integration do
end
it "returns nil when the property has not been assigned a new value" do
- service.username = "key_changed"
- expect(service.bamboo_url_was).to be_nil
+ integration.username = "key_changed"
+ expect(integration.bamboo_url_was).to be_nil
end
it "returns the previous value when the property has been assigned a different value" do
- service.bamboo_url = "http://example.com"
- expect(service.bamboo_url_was).to eq('http://gitlab.com')
+ integration.bamboo_url = "http://example.com"
+ expect(integration.bamboo_url_was).to eq('http://gitlab.com')
end
it "returns initial value when the property has been re-assigned the same value" do
- service.bamboo_url = 'http://gitlab.com'
- expect(service.bamboo_url_was).to eq('http://gitlab.com')
+ integration.bamboo_url = 'http://gitlab.com'
+ expect(integration.bamboo_url_was).to eq('http://gitlab.com')
end
it "returns initial value when the property has been assigned multiple values" do
- service.bamboo_url = "http://example.com"
- service.bamboo_url = "http://example.org"
- expect(service.bamboo_url_was).to eq('http://gitlab.com')
+ integration.bamboo_url = "http://example.com"
+ integration.bamboo_url = "http://example.org"
+ expect(integration.bamboo_url_was).to eq('http://gitlab.com')
end
it "returns nil when the property has been assigned a new value then saved" do
- service.bamboo_url = 'http://example.com'
- service.save!
- expect(service.bamboo_url_was).to be_nil
+ integration.bamboo_url = 'http://example.com'
+ integration.save!
+ expect(integration.bamboo_url_was).to be_nil
end
end
- describe 'initialize service with no properties' do
- let(:service) do
+ describe 'initialize integration with no properties' do
+ let(:integration) do
Integrations::Bugzilla.create!(
project: project,
project_url: 'http://gitlab.example.com'
@@ -703,16 +703,16 @@ RSpec.describe Integration do
end
it 'does not raise error' do
- expect { service }.not_to raise_error
+ expect { integration }.not_to raise_error
end
it 'sets data correctly' do
- expect(service.data_fields.project_url).to eq('http://gitlab.example.com')
+ expect(integration.data_fields.project_url).to eq('http://gitlab.example.com')
end
end
describe '#api_field_names' do
- let(:fake_service) do
+ let(:fake_integration) do
Class.new(Integration) do
def fields
[
@@ -728,8 +728,8 @@ RSpec.describe Integration do
end
end
- let(:service) do
- fake_service.new(properties: [
+ let(:integration) do
+ fake_integration.new(properties: [
{ token: 'token-value' },
{ api_token: 'api_token-value' },
{ key: 'key-value' },
@@ -741,16 +741,16 @@ RSpec.describe Integration do
end
it 'filters out sensitive fields' do
- expect(service.api_field_names).to eq(['safe_field'])
+ expect(integration.api_field_names).to eq(['safe_field'])
end
end
context 'logging' do
- let(:service) { build(:service, project: project) }
+ let(:integration) { build(:integration, project: project) }
let(:test_message) { "test message" }
let(:arguments) do
{
- service_class: service.class.name,
+ service_class: integration.class.name,
project_path: project.full_path,
project_id: project.id,
message: test_message,
@@ -761,20 +761,20 @@ RSpec.describe Integration do
it 'logs info messages using json logger' do
expect(Gitlab::JsonLogger).to receive(:info).with(arguments)
- service.log_info(test_message, additional_argument: 'some argument')
+ integration.log_info(test_message, additional_argument: 'some argument')
end
it 'logs error messages using json logger' do
expect(Gitlab::JsonLogger).to receive(:error).with(arguments)
- service.log_error(test_message, additional_argument: 'some argument')
+ integration.log_error(test_message, additional_argument: 'some argument')
end
context 'when project is nil' do
let(:project) { nil }
let(:arguments) do
{
- service_class: service.class.name,
+ service_class: integration.class.name,
project_path: nil,
project_id: nil,
message: test_message,
@@ -785,7 +785,7 @@ RSpec.describe Integration do
it 'logs info messages using json logger' do
expect(Gitlab::JsonLogger).to receive(:info).with(arguments)
- service.log_info(test_message, additional_argument: 'some argument')
+ integration.log_info(test_message, additional_argument: 'some argument')
end
end
end
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index 77ee7d21f35..7781285f4f8 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -1359,51 +1359,51 @@ RSpec.describe Project, factory_default: :keep do
project.reload.has_external_issue_tracker
end
- it 'is false when external issue tracker service is not active' do
- create(:service, project: project, category: 'issue_tracker', active: false)
+ it 'is false when external issue tracker integration is not active' do
+ create(:integration, project: project, category: 'issue_tracker', active: false)
is_expected.to eq(false)
end
- it 'is false when other service is active' do
- create(:service, project: project, category: 'not_issue_tracker', active: true)
+ it 'is false when other integration is active' do
+ create(:integration, project: project, category: 'not_issue_tracker', active: true)
is_expected.to eq(false)
end
- context 'when there is an active external issue tracker service' do
- let!(:service) do
- create(:service, project: project, type: 'JiraService', category: 'issue_tracker', active: true)
+ context 'when there is an active external issue tracker integration' do
+ let!(:integration) do
+ create(:integration, project: project, type: 'JiraService', category: 'issue_tracker', active: true)
end
specify { is_expected.to eq(true) }
- it 'becomes false when external issue tracker service is destroyed' do
+ it 'becomes false when external issue tracker integration is destroyed' do
expect do
- Integration.find(service.id).delete
+ Integration.find(integration.id).delete
end.to change { subject }.to(false)
end
- it 'becomes false when external issue tracker service becomes inactive' do
+ it 'becomes false when external issue tracker integration becomes inactive' do
expect do
- service.update_column(:active, false)
+ integration.update_column(:active, false)
end.to change { subject }.to(false)
end
- context 'when there are two active external issue tracker services' do
- let_it_be(:second_service) do
- create(:service, project: project, type: 'CustomIssueTracker', category: 'issue_tracker', active: true)
+ context 'when there are two active external issue tracker integrations' do
+ let_it_be(:second_integration) do
+ create(:integration, project: project, type: 'CustomIssueTracker', category: 'issue_tracker', active: true)
end
- it 'does not become false when external issue tracker service is destroyed' do
+ it 'does not become false when external issue tracker integration is destroyed' do
expect do
- Integration.find(service.id).delete
+ Integration.find(integration.id).delete
end.not_to change { subject }
end
- it 'does not become false when external issue tracker service becomes inactive' do
+ it 'does not become false when external issue tracker integration becomes inactive' do
expect do
- service.update_column(:active, false)
+ integration.update_column(:active, false)
end.not_to change { subject }
end
end
@@ -1455,13 +1455,13 @@ RSpec.describe Project, factory_default: :keep do
specify { expect(has_external_wiki).to eq(true) }
- it 'becomes false if the external wiki service is destroyed' do
+ it 'becomes false if the external wiki integration is destroyed' do
expect do
Integration.find(integration.id).delete
end.to change { has_external_wiki }.to(false)
end
- it 'becomes false if the external wiki service becomes inactive' do
+ it 'becomes false if the external wiki integration becomes inactive' do
expect do
integration.update_column(:active, false)
end.to change { has_external_wiki }.to(false)
@@ -6836,7 +6836,7 @@ RSpec.describe Project, factory_default: :keep do
describe 'with integrations and chat names' do
subject { create(:project) }
- let(:integration) { create(:service, project: subject) }
+ let(:integration) { create(:integration, project: subject) }
before do
create_list(:chat_name, 5, integration: integration)
diff --git a/spec/services/chat_names/authorize_user_service_spec.rb b/spec/services/chat_names/authorize_user_service_spec.rb
index b0bb741564d..53d90c7f100 100644
--- a/spec/services/chat_names/authorize_user_service_spec.rb
+++ b/spec/services/chat_names/authorize_user_service_spec.rb
@@ -4,10 +4,10 @@ require 'spec_helper'
RSpec.describe ChatNames::AuthorizeUserService do
describe '#execute' do
- subject { described_class.new(service, params) }
-
+ let(:integration) { create(:integration) }
let(:result) { subject.execute }
- let(:service) { create(:service) }
+
+ subject { described_class.new(integration, params) }
context 'when all parameters are valid' do
let(:params) { { team_id: 'T0001', team_domain: 'myteam', user_id: 'U0001', user_name: 'user' } }
diff --git a/spec/services/chat_names/find_user_service_spec.rb b/spec/services/chat_names/find_user_service_spec.rb
index 9bbad09cd0d..4b0a1204558 100644
--- a/spec/services/chat_names/find_user_service_spec.rb
+++ b/spec/services/chat_names/find_user_service_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe ChatNames::FindUserService, :clean_gitlab_redis_shared_state do
describe '#execute' do
- let(:integration) { create(:service) }
+ let(:integration) { create(:integration) }
subject { described_class.new(integration, params).execute }
diff --git a/spec/support/import_export/export_file_helper.rb b/spec/support/import_export/export_file_helper.rb
index f862a9bc1a4..3134e5c32a3 100644
--- a/spec/support/import_export/export_file_helper.rb
+++ b/spec/support/import_export/export_file_helper.rb
@@ -44,7 +44,7 @@ module ExportFileHelper
create(:ci_trigger, project: project)
key = create(:deploy_key)
key.projects << project
- create(:service, project: project)
+ create(:integration, project: project)
create(:project_hook, project: project, token: 'token')
create(:protected_branch, project: project)
diff --git a/spec/workers/deployments/hooks_worker_spec.rb b/spec/workers/deployments/hooks_worker_spec.rb
index b4a91cff2ac..50ead66cfbf 100644
--- a/spec/workers/deployments/hooks_worker_spec.rb
+++ b/spec/workers/deployments/hooks_worker_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe Deployments::HooksWorker do
it 'executes project services for deployment_hooks' do
deployment = create(:deployment, :running)
project = deployment.project
- service = create(:service, type: 'SlackService', project: project, deployment_events: true, active: true)
+ service = create(:integration, type: 'SlackService', project: project, deployment_events: true, active: true)
expect(ProjectServiceWorker).to receive(:perform_async).with(service.id, an_instance_of(Hash))
@@ -23,7 +23,7 @@ RSpec.describe Deployments::HooksWorker do
it 'does not execute an inactive service' do
deployment = create(:deployment, :running)
project = deployment.project
- create(:service, type: 'SlackService', project: project, deployment_events: true, active: false)
+ create(:integration, type: 'SlackService', project: project, deployment_events: true, active: false)
expect(ProjectServiceWorker).not_to receive(:perform_async)
diff --git a/yarn.lock b/yarn.lock
index 25bc476b815..99fccec8925 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -924,10 +924,10 @@
resolved "https://registry.yarnpkg.com/@gitlab/tributejs/-/tributejs-1.0.0.tgz#672befa222aeffc83e7d799b0500a7a4418e59b8"
integrity sha512-nmKw1+hB6MHvlmPz63yPwVs1qQkycHwsKgxpEbzmky16Y6mL4EJMk3w1b8QlOAF/AIAzjCERPhe/R4MJiohbZw==
-"@gitlab/ui@32.50.0":
- version "32.50.0"
- resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-32.50.0.tgz#ac50617a8b84f78949e177f495ade276f8560679"
- integrity sha512-7wPEgbOn7M9hqzq5LZND5b8/OEajoFCjwaXzO42FBNJ+pb80JBsTg1Mu8dyXMGQP/SPcxO58BdQLUSjE0WER4w==
+"@gitlab/ui@32.51.3":
+ version "32.51.3"
+ resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-32.51.3.tgz#1ba4802a16ecf5465774f4083e5ec1ed6adc4579"
+ integrity sha512-PWC0FtpsW9SM3O935XPU2el/JtLtvHQCL9qblKCeR98eJNYmIpjrw45ow+01jsqpjufcUI49n4id/sYHq8b6og==
dependencies:
"@babel/standalone" "^7.0.0"
bootstrap-vue "2.20.1"
@@ -2395,6 +2395,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0:
dependencies:
color-convert "^2.0.1"
+ansi-styles@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b"
+ integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
+
anymatch@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
@@ -4778,6 +4783,11 @@ diff-sequences@^26.5.0:
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.5.0.tgz#ef766cf09d43ed40406611f11c6d8d9dd8b2fefd"
integrity sha512-ZXx86srb/iYy6jG71k++wBN9P9J05UNQ5hQHQd9MtMPvcqXPx/vKU69jfHV637D00Q2gSgPk2D+jSx3l1lDW/Q==
+diff-sequences@^27.4.0:
+ version "27.4.0"
+ resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.4.0.tgz#d783920ad8d06ec718a060d00196dfef25b132a5"
+ integrity sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==
+
diff@^3.4.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
@@ -7253,6 +7263,16 @@ jest-diff@^26.5.2:
jest-get-type "^26.3.0"
pretty-format "^26.5.2"
+jest-diff@^27.4.6:
+ version "27.4.6"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.4.6.tgz#93815774d2012a2cbb6cf23f84d48c7a2618f98d"
+ integrity sha512-zjaB0sh0Lb13VyPsd92V7HkqF6yKRH9vm33rwBt7rPYrpQvS1nCvlIy2pICbKta+ZjWngYLNn4cCK4nyZkjS/w==
+ dependencies:
+ chalk "^4.0.0"
+ diff-sequences "^27.4.0"
+ jest-get-type "^27.4.0"
+ pretty-format "^27.4.6"
+
jest-docblock@^26.0.0:
version "26.0.0"
resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5"
@@ -7301,6 +7321,11 @@ jest-get-type@^26.3.0:
resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0"
integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==
+jest-get-type@^27.4.0:
+ version "27.4.0"
+ resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.4.0.tgz#7503d2663fffa431638337b3998d39c5e928e9b5"
+ integrity sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==
+
jest-haste-map@^26.5.2:
version "26.5.2"
resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.5.2.tgz#a15008abfc502c18aa56e4919ed8c96304ceb23d"
@@ -9716,6 +9741,15 @@ pretty-format@^26.4.2, pretty-format@^26.5.2:
ansi-styles "^4.0.0"
react-is "^16.12.0"
+pretty-format@^27.4.6:
+ version "27.4.6"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.4.6.tgz#1b784d2f53c68db31797b2348fa39b49e31846b7"
+ integrity sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g==
+ dependencies:
+ ansi-regex "^5.0.1"
+ ansi-styles "^5.0.0"
+ react-is "^17.0.1"
+
pretty@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/pretty/-/pretty-2.0.0.tgz#adbc7960b7bbfe289a557dc5f737619a220d06a5"
@@ -10103,6 +10137,11 @@ react-is@^16.12.0:
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+react-is@^17.0.1:
+ version "17.0.2"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
+ integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
+
read-pkg-up@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"