Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
0978fc4c40
commit
f70958a893
|
@ -1,6 +1,6 @@
|
||||||
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
|
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
|
||||||
import { STLLoader } from 'three/examples/jsm/loaders/STLLoader';
|
import { STLLoader } from 'three/examples/jsm/loaders/STLLoader';
|
||||||
import * as THREE from 'three/build/three.module';
|
import * as THREE from 'three';
|
||||||
import MeshObject from './mesh_object';
|
import MeshObject from './mesh_object';
|
||||||
|
|
||||||
export default class Renderer {
|
export default class Renderer {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Matrix4, MeshLambertMaterial, Mesh } from 'three/build/three.module';
|
import { Matrix4, MeshLambertMaterial, Mesh } from 'three';
|
||||||
|
|
||||||
const defaultColor = 0xe24329;
|
const defaultColor = 0xe24329;
|
||||||
const materials = {
|
const materials = {
|
||||||
|
|
|
@ -247,8 +247,8 @@ export default {
|
||||||
},
|
},
|
||||||
defaultWorkItemTypes() {
|
defaultWorkItemTypes() {
|
||||||
return this.isWorkItemsEnabled
|
return this.isWorkItemsEnabled
|
||||||
? defaultWorkItemTypes.concat(WORK_ITEM_TYPE_ENUM_TASK)
|
? defaultWorkItemTypes
|
||||||
: defaultWorkItemTypes;
|
: defaultWorkItemTypes.filter((type) => type !== WORK_ITEM_TYPE_ENUM_TASK);
|
||||||
},
|
},
|
||||||
typeTokenOptions() {
|
typeTokenOptions() {
|
||||||
return this.isWorkItemsEnabled
|
return this.isWorkItemsEnabled
|
||||||
|
|
|
@ -12,6 +12,7 @@ import {
|
||||||
WORK_ITEM_TYPE_ENUM_INCIDENT,
|
WORK_ITEM_TYPE_ENUM_INCIDENT,
|
||||||
WORK_ITEM_TYPE_ENUM_ISSUE,
|
WORK_ITEM_TYPE_ENUM_ISSUE,
|
||||||
WORK_ITEM_TYPE_ENUM_TEST_CASE,
|
WORK_ITEM_TYPE_ENUM_TEST_CASE,
|
||||||
|
WORK_ITEM_TYPE_ENUM_TASK,
|
||||||
} from '~/work_items/constants';
|
} from '~/work_items/constants';
|
||||||
|
|
||||||
export const i18n = {
|
export const i18n = {
|
||||||
|
@ -151,10 +152,13 @@ export const TOKEN_TYPE_HEALTH = 'health_status';
|
||||||
|
|
||||||
export const TYPE_TOKEN_TASK_OPTION = { icon: 'task-done', title: 'task', value: 'task' };
|
export const TYPE_TOKEN_TASK_OPTION = { icon: 'task-done', title: 'task', value: 'task' };
|
||||||
|
|
||||||
|
// This should be consistent with Issue::TYPES_FOR_LIST in the backend
|
||||||
|
// https://gitlab.com/gitlab-org/gitlab/-/blob/1379c2d7bffe2a8d809f23ac5ef9b4114f789c07/app/models/issue.rb#L48
|
||||||
export const defaultWorkItemTypes = [
|
export const defaultWorkItemTypes = [
|
||||||
WORK_ITEM_TYPE_ENUM_ISSUE,
|
WORK_ITEM_TYPE_ENUM_ISSUE,
|
||||||
WORK_ITEM_TYPE_ENUM_INCIDENT,
|
WORK_ITEM_TYPE_ENUM_INCIDENT,
|
||||||
WORK_ITEM_TYPE_ENUM_TEST_CASE,
|
WORK_ITEM_TYPE_ENUM_TEST_CASE,
|
||||||
|
WORK_ITEM_TYPE_ENUM_TASK,
|
||||||
];
|
];
|
||||||
|
|
||||||
export const defaultTypeTokenOptions = [
|
export const defaultTypeTokenOptions = [
|
||||||
|
|
|
@ -59,9 +59,12 @@ module IssuableCollectionsAction
|
||||||
end
|
end
|
||||||
|
|
||||||
def finder_options
|
def finder_options
|
||||||
|
issue_types = Issue::TYPES_FOR_LIST
|
||||||
|
issue_types = issue_types.excluding('task') unless Feature.enabled?(:work_items)
|
||||||
|
|
||||||
super.merge(
|
super.merge(
|
||||||
non_archived: true,
|
non_archived: true,
|
||||||
issue_types: Issue::TYPES_FOR_LIST
|
issue_types: issue_types
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -405,6 +405,7 @@ class Projects::IssuesController < Projects::ApplicationController
|
||||||
options = super
|
options = super
|
||||||
|
|
||||||
options[:issue_types] = Issue::TYPES_FOR_LIST
|
options[:issue_types] = Issue::TYPES_FOR_LIST
|
||||||
|
options[:issue_types] = options[:issue_types].excluding('task') unless project.work_items_feature_flag_enabled?
|
||||||
|
|
||||||
if service_desk?
|
if service_desk?
|
||||||
options.reject! { |key| key == 'author_username' || key == 'author_id' }
|
options.reject! { |key| key == 'author_username' || key == 'author_id' }
|
||||||
|
|
|
@ -13,6 +13,10 @@ module GraphqlTriggers
|
||||||
GitlabSchema.subscriptions.trigger('issuableTitleUpdated', { issuable_id: issuable.to_gid }, issuable)
|
GitlabSchema.subscriptions.trigger('issuableTitleUpdated', { issuable_id: issuable.to_gid }, issuable)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.issuable_description_updated(issuable)
|
||||||
|
GitlabSchema.subscriptions.trigger('issuableDescriptionUpdated', { issuable_id: issuable.to_gid }, issuable)
|
||||||
|
end
|
||||||
|
|
||||||
def self.issuable_labels_updated(issuable)
|
def self.issuable_labels_updated(issuable)
|
||||||
GitlabSchema.subscriptions.trigger('issuableLabelsUpdated', { issuable_id: issuable.to_gid }, issuable)
|
GitlabSchema.subscriptions.trigger('issuableLabelsUpdated', { issuable_id: issuable.to_gid }, issuable)
|
||||||
end
|
end
|
||||||
|
|
|
@ -13,6 +13,9 @@ module Types
|
||||||
field :issuable_title_updated, subscription: Subscriptions::IssuableUpdated, null: true,
|
field :issuable_title_updated, subscription: Subscriptions::IssuableUpdated, null: true,
|
||||||
description: 'Triggered when the title of an issuable is updated.'
|
description: 'Triggered when the title of an issuable is updated.'
|
||||||
|
|
||||||
|
field :issuable_description_updated, subscription: Subscriptions::IssuableUpdated, null: true,
|
||||||
|
description: 'Triggered when the description of an issuable is updated.'
|
||||||
|
|
||||||
field :issuable_labels_updated, subscription: Subscriptions::IssuableUpdated, null: true,
|
field :issuable_labels_updated, subscription: Subscriptions::IssuableUpdated, null: true,
|
||||||
description: 'Triggered when the labels of an issuable are updated.'
|
description: 'Triggered when the labels of an issuable are updated.'
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ module Integrations
|
||||||
|
|
||||||
included do
|
included do
|
||||||
after_save :update_web_hook!, if: :activated?
|
after_save :update_web_hook!, if: :activated?
|
||||||
has_one :service_hook, inverse_of: :integration, foreign_key: :service_id
|
has_one :service_hook, inverse_of: :integration, foreign_key: :integration_id
|
||||||
end
|
end
|
||||||
|
|
||||||
# Return the URL to be used for the webhook.
|
# Return the URL to be used for the webhook.
|
||||||
|
|
|
@ -4,7 +4,7 @@ class ServiceHook < WebHook
|
||||||
include Presentable
|
include Presentable
|
||||||
extend ::Gitlab::Utils::Override
|
extend ::Gitlab::Utils::Override
|
||||||
|
|
||||||
belongs_to :integration, foreign_key: :service_id
|
belongs_to :integration
|
||||||
validates :integration, presence: true
|
validates :integration, presence: true
|
||||||
|
|
||||||
def execute(data, hook_name = 'service_hook')
|
def execute(data, hook_name = 'service_hook')
|
||||||
|
|
|
@ -40,10 +40,15 @@ class Issue < ApplicationRecord
|
||||||
|
|
||||||
SORTING_PREFERENCE_FIELD = :issues_sort
|
SORTING_PREFERENCE_FIELD = :issues_sort
|
||||||
|
|
||||||
# Types of issues that should be displayed on lists across the app
|
# Types of issues that should be displayed on issue lists across the app
|
||||||
# for example, project issues list, group issues list and issue boards.
|
# for example, project issues list, group issues list, and issues dashboard.
|
||||||
# Some issue types, like test cases, should be hidden by default.
|
#
|
||||||
TYPES_FOR_LIST = %w(issue incident).freeze
|
# This should be kept consistent with the enums used for the GraphQL issue list query in
|
||||||
|
# https://gitlab.com/gitlab-org/gitlab/-/blob/1379c2d7bffe2a8d809f23ac5ef9b4114f789c07/app/assets/javascripts/issues/list/constants.js#L154-158
|
||||||
|
TYPES_FOR_LIST = %w(issue incident test_case task).freeze
|
||||||
|
|
||||||
|
# Types of issues that should be displayed on issue board lists
|
||||||
|
TYPES_FOR_BOARD_LIST = %w(issue incident).freeze
|
||||||
|
|
||||||
belongs_to :project
|
belongs_to :project
|
||||||
belongs_to :namespace, inverse_of: :issues
|
belongs_to :namespace, inverse_of: :issues
|
||||||
|
|
|
@ -50,7 +50,7 @@ module Boards
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_issue_types
|
def set_issue_types
|
||||||
params[:issue_types] ||= Issue::TYPES_FOR_LIST
|
params[:issue_types] ||= Issue::TYPES_FOR_BOARD_LIST
|
||||||
end
|
end
|
||||||
|
|
||||||
def item_model
|
def item_model
|
||||||
|
|
|
@ -267,7 +267,13 @@ class IssuableBaseService < ::BaseProjectService
|
||||||
end
|
end
|
||||||
|
|
||||||
def after_update(issuable)
|
def after_update(issuable)
|
||||||
# To be overridden by subclasses
|
handle_description_updated(issuable) if Feature.enabled?(:broadcast_issuable_description_updated)
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle_description_updated(issuable)
|
||||||
|
return unless issuable.previous_changes.include?('description')
|
||||||
|
|
||||||
|
GraphqlTriggers.issuable_description_updated(issuable)
|
||||||
end
|
end
|
||||||
|
|
||||||
def update(issuable)
|
def update(issuable)
|
||||||
|
|
|
@ -72,6 +72,7 @@ module MergeRequests
|
||||||
end
|
end
|
||||||
|
|
||||||
def after_update(issuable)
|
def after_update(issuable)
|
||||||
|
super
|
||||||
issuable.cache_merge_request_closes_issues!(current_user)
|
issuable.cache_merge_request_closes_issues!(current_user)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
---
|
||||||
|
name: broadcast_issuable_description_updated
|
||||||
|
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/98458
|
||||||
|
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/375183
|
||||||
|
milestone: '15.5'
|
||||||
|
type: development
|
||||||
|
group: group::project management
|
||||||
|
default_enabled: false
|
|
@ -26,6 +26,11 @@ if log_deprecations?
|
||||||
Gitlab::DeprecationJsonLogger.info(message: warning.strip, source: 'ruby')
|
Gitlab::DeprecationJsonLogger.info(message: warning.strip, source: 'ruby')
|
||||||
# Returning :default means we continue emitting this to stderr as well.
|
# Returning :default means we continue emitting this to stderr as well.
|
||||||
:default
|
:default
|
||||||
|
end,
|
||||||
|
# This won't be needed when https://gitlab.com/gitlab-org/gitlab/-/issues/340602 is completed
|
||||||
|
/\A`Redis#exists\(key\)` will return an Integer in redis-rb 4\.3/ => lambda do |warning|
|
||||||
|
Gitlab::DeprecationJsonLogger.info(message: warning.strip, source: 'redis')
|
||||||
|
:default
|
||||||
end
|
end
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ Redis.raise_deprecations = true unless Rails.env.production?
|
||||||
# We cannot switch to the new behavior until we change all existing `redis.exists` calls to `redis.exists?`.
|
# We cannot switch to the new behavior until we change all existing `redis.exists` calls to `redis.exists?`.
|
||||||
# Some gems also need to be updated
|
# Some gems also need to be updated
|
||||||
# https://gitlab.com/gitlab-org/gitlab/-/issues/340602
|
# https://gitlab.com/gitlab-org/gitlab/-/issues/340602
|
||||||
Redis.instance_variable_set(:@exists_returns_integer, false)
|
Redis.instance_variable_set(:@exists_returns_integer, nil)
|
||||||
|
|
||||||
Redis::Client.prepend(Gitlab::Instrumentation::RedisInterceptor)
|
Redis::Client.prepend(Gitlab::Instrumentation::RedisInterceptor)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class CleanupWebHooksServiceId < Gitlab::Database::Migration[2.0]
|
||||||
|
disable_ddl_transaction!
|
||||||
|
|
||||||
|
def up
|
||||||
|
cleanup_concurrent_column_rename :web_hooks, :service_id, :integration_id
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
undo_cleanup_concurrent_column_rename :web_hooks, :service_id, :integration_id
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1 @@
|
||||||
|
681514d675382385f77cbcb5ec22038555670f95a35f1ced42554452718bd193
|
|
@ -22,40 +22,6 @@ RETURN NULL;
|
||||||
END
|
END
|
||||||
$$;
|
$$;
|
||||||
|
|
||||||
CREATE FUNCTION function_for_trigger_a645cee67576() RETURNS trigger
|
|
||||||
LANGUAGE plpgsql
|
|
||||||
AS $$
|
|
||||||
BEGIN
|
|
||||||
NEW."service_id" := NEW."integration_id";
|
|
||||||
RETURN NEW;
|
|
||||||
END
|
|
||||||
$$;
|
|
||||||
|
|
||||||
CREATE FUNCTION function_for_trigger_a87bcfdf0f0b() RETURNS trigger
|
|
||||||
LANGUAGE plpgsql
|
|
||||||
AS $$
|
|
||||||
BEGIN
|
|
||||||
IF NEW."service_id" IS NULL AND NEW."integration_id" IS NOT NULL THEN
|
|
||||||
NEW."service_id" = NEW."integration_id";
|
|
||||||
END IF;
|
|
||||||
|
|
||||||
IF NEW."integration_id" IS NULL AND NEW."service_id" IS NOT NULL THEN
|
|
||||||
NEW."integration_id" = NEW."service_id";
|
|
||||||
END IF;
|
|
||||||
|
|
||||||
RETURN NEW;
|
|
||||||
END
|
|
||||||
$$;
|
|
||||||
|
|
||||||
CREATE FUNCTION function_for_trigger_aca5c963d732() RETURNS trigger
|
|
||||||
LANGUAGE plpgsql
|
|
||||||
AS $$
|
|
||||||
BEGIN
|
|
||||||
NEW."integration_id" := NEW."service_id";
|
|
||||||
RETURN NEW;
|
|
||||||
END
|
|
||||||
$$;
|
|
||||||
|
|
||||||
CREATE FUNCTION gitlab_schema_prevent_write() RETURNS trigger
|
CREATE FUNCTION gitlab_schema_prevent_write() RETURNS trigger
|
||||||
LANGUAGE plpgsql
|
LANGUAGE plpgsql
|
||||||
AS $$
|
AS $$
|
||||||
|
@ -22935,7 +22901,6 @@ CREATE TABLE web_hooks (
|
||||||
created_at timestamp without time zone,
|
created_at timestamp without time zone,
|
||||||
updated_at timestamp without time zone,
|
updated_at timestamp without time zone,
|
||||||
type character varying DEFAULT 'ProjectHook'::character varying,
|
type character varying DEFAULT 'ProjectHook'::character varying,
|
||||||
service_id integer,
|
|
||||||
push_events boolean DEFAULT true NOT NULL,
|
push_events boolean DEFAULT true NOT NULL,
|
||||||
issues_events boolean DEFAULT false NOT NULL,
|
issues_events boolean DEFAULT false NOT NULL,
|
||||||
merge_requests_events boolean DEFAULT false NOT NULL,
|
merge_requests_events boolean DEFAULT false NOT NULL,
|
||||||
|
@ -30767,8 +30732,6 @@ CREATE INDEX index_web_hooks_on_project_id ON web_hooks USING btree (project_id)
|
||||||
|
|
||||||
CREATE INDEX index_web_hooks_on_project_id_recent_failures ON web_hooks USING btree (project_id, recent_failures);
|
CREATE INDEX index_web_hooks_on_project_id_recent_failures ON web_hooks USING btree (project_id, recent_failures);
|
||||||
|
|
||||||
CREATE INDEX index_web_hooks_on_service_id ON web_hooks USING btree (service_id);
|
|
||||||
|
|
||||||
CREATE INDEX index_web_hooks_on_type ON web_hooks USING btree (type);
|
CREATE INDEX index_web_hooks_on_type ON web_hooks USING btree (type);
|
||||||
|
|
||||||
CREATE UNIQUE INDEX index_webauthn_registrations_on_credential_xid ON webauthn_registrations USING btree (credential_xid);
|
CREATE UNIQUE INDEX index_webauthn_registrations_on_credential_xid ON webauthn_registrations USING btree (credential_xid);
|
||||||
|
@ -32241,12 +32204,6 @@ CREATE TRIGGER nullify_merge_request_metrics_build_data_on_update BEFORE UPDATE
|
||||||
|
|
||||||
CREATE TRIGGER projects_loose_fk_trigger AFTER DELETE ON projects REFERENCING OLD TABLE AS old_table FOR EACH STATEMENT EXECUTE FUNCTION insert_into_loose_foreign_keys_deleted_records();
|
CREATE TRIGGER projects_loose_fk_trigger AFTER DELETE ON projects REFERENCING OLD TABLE AS old_table FOR EACH STATEMENT EXECUTE FUNCTION insert_into_loose_foreign_keys_deleted_records();
|
||||||
|
|
||||||
CREATE TRIGGER trigger_a645cee67576 BEFORE UPDATE OF integration_id ON web_hooks FOR EACH ROW EXECUTE FUNCTION function_for_trigger_a645cee67576();
|
|
||||||
|
|
||||||
CREATE TRIGGER trigger_a87bcfdf0f0b BEFORE INSERT ON web_hooks FOR EACH ROW EXECUTE FUNCTION function_for_trigger_a87bcfdf0f0b();
|
|
||||||
|
|
||||||
CREATE TRIGGER trigger_aca5c963d732 BEFORE UPDATE OF service_id ON web_hooks FOR EACH ROW EXECUTE FUNCTION function_for_trigger_aca5c963d732();
|
|
||||||
|
|
||||||
CREATE TRIGGER trigger_delete_project_namespace_on_project_delete AFTER DELETE ON projects FOR EACH ROW WHEN ((old.project_namespace_id IS NOT NULL)) EXECUTE FUNCTION delete_associated_project_namespace();
|
CREATE TRIGGER trigger_delete_project_namespace_on_project_delete AFTER DELETE ON projects FOR EACH ROW WHEN ((old.project_namespace_id IS NOT NULL)) EXECUTE FUNCTION delete_associated_project_namespace();
|
||||||
|
|
||||||
CREATE TRIGGER trigger_has_external_issue_tracker_on_delete AFTER DELETE ON integrations FOR EACH ROW WHEN ((((old.category)::text = 'issue_tracker'::text) AND (old.active = true) AND (old.project_id IS NOT NULL))) EXECUTE FUNCTION set_has_external_issue_tracker();
|
CREATE TRIGGER trigger_has_external_issue_tracker_on_delete AFTER DELETE ON integrations FOR EACH ROW WHEN ((((old.category)::text = 'issue_tracker'::text) AND (old.active = true) AND (old.project_id IS NOT NULL))) EXECUTE FUNCTION set_has_external_issue_tracker();
|
||||||
|
@ -33050,9 +33007,6 @@ ALTER TABLE ONLY environments
|
||||||
ALTER TABLE ONLY ci_builds
|
ALTER TABLE ONLY ci_builds
|
||||||
ADD CONSTRAINT fk_d3130c9a7f FOREIGN KEY (commit_id) REFERENCES ci_pipelines(id) ON DELETE CASCADE;
|
ADD CONSTRAINT fk_d3130c9a7f FOREIGN KEY (commit_id) REFERENCES ci_pipelines(id) ON DELETE CASCADE;
|
||||||
|
|
||||||
ALTER TABLE ONLY web_hooks
|
|
||||||
ADD CONSTRAINT fk_d47999a98a FOREIGN KEY (service_id) REFERENCES integrations(id) ON DELETE CASCADE;
|
|
||||||
|
|
||||||
ALTER TABLE ONLY ci_sources_pipelines
|
ALTER TABLE ONLY ci_sources_pipelines
|
||||||
ADD CONSTRAINT fk_d4e29af7d7 FOREIGN KEY (source_pipeline_id) REFERENCES ci_pipelines(id) ON DELETE CASCADE;
|
ADD CONSTRAINT fk_d4e29af7d7 FOREIGN KEY (source_pipeline_id) REFERENCES ci_pipelines(id) ON DELETE CASCADE;
|
||||||
|
|
||||||
|
|
|
@ -108,7 +108,7 @@ module Gitlab
|
||||||
return self.loaded unless self.loaded.nil?
|
return self.loaded unless self.loaded.nil?
|
||||||
|
|
||||||
Gitlab::Redis::Cache.with do |redis|
|
Gitlab::Redis::Cache.with do |redis|
|
||||||
redis.exists(cache_key)
|
redis.exists?(cache_key) # rubocop:disable CodeReuse/ActiveRecord
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -140,7 +140,7 @@ module Gitlab
|
||||||
|
|
||||||
def being_watched?
|
def being_watched?
|
||||||
Gitlab::Redis::SharedState.with do |redis|
|
Gitlab::Redis::SharedState.with do |redis|
|
||||||
redis.exists(being_watched_cache_key)
|
redis.exists?(being_watched_cache_key) # rubocop:disable CodeReuse/ActiveRecord
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -118,7 +118,7 @@ module Gitlab
|
||||||
# Returns true if the key for this lease is set.
|
# Returns true if the key for this lease is set.
|
||||||
def exists?
|
def exists?
|
||||||
Gitlab::Redis::SharedState.with do |redis|
|
Gitlab::Redis::SharedState.with do |redis|
|
||||||
redis.exists(@redis_shared_state_key)
|
redis.exists?(@redis_shared_state_key) # rubocop:disable CodeReuse/ActiveRecord
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ module Gitlab
|
||||||
smembers, exists = with do |redis|
|
smembers, exists = with do |redis|
|
||||||
redis.multi do |multi|
|
redis.multi do |multi|
|
||||||
multi.smembers(full_key)
|
multi.smembers(full_key)
|
||||||
multi.exists(full_key)
|
multi.exists?(full_key) # rubocop:disable CodeReuse/ActiveRecord
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ module Gitlab
|
||||||
full_key = cache_key(key)
|
full_key = cache_key(key)
|
||||||
|
|
||||||
with do |redis|
|
with do |redis|
|
||||||
exists = redis.exists(full_key)
|
exists = redis.exists?(full_key) # rubocop:disable CodeReuse/ActiveRecord
|
||||||
write(key, yield) unless exists
|
write(key, yield) unless exists
|
||||||
|
|
||||||
redis.sscan_each(full_key, match: pattern)
|
redis.sscan_each(full_key, match: pattern)
|
||||||
|
|
|
@ -28,7 +28,7 @@ module Gitlab
|
||||||
end
|
end
|
||||||
|
|
||||||
def exist?(key)
|
def exist?(key)
|
||||||
with { |redis| redis.exists(cache_key(key)) }
|
with { |redis| redis.exists?(cache_key(key)) } # rubocop:disable CodeReuse/ActiveRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
def write(key, value)
|
def write(key, value)
|
||||||
|
@ -59,7 +59,7 @@ module Gitlab
|
||||||
with do |redis|
|
with do |redis|
|
||||||
redis.multi do |multi|
|
redis.multi do |multi|
|
||||||
multi.sismember(full_key, value)
|
multi.sismember(full_key, value)
|
||||||
multi.exists(full_key)
|
multi.exists?(full_key) # rubocop:disable CodeReuse/ActiveRecord
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -182,7 +182,7 @@ module Gitlab
|
||||||
|
|
||||||
def cancelled?(jid)
|
def cancelled?(jid)
|
||||||
::Gitlab::Redis::SharedState.with do |redis|
|
::Gitlab::Redis::SharedState.with do |redis|
|
||||||
redis.exists(self.class.cancel_job_key(jid))
|
redis.exists?(self.class.cancel_job_key(jid)) # rubocop:disable CodeReuse/ActiveRecord
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -35587,9 +35587,6 @@ msgstr ""
|
||||||
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
|
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "SecurityOrchestration|+%{count} more"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "SecurityOrchestration|, and %{count} more"
|
msgid "SecurityOrchestration|, and %{count} more"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
@ -4,11 +4,14 @@ require 'spec_helper'
|
||||||
|
|
||||||
RSpec.describe DashboardController do
|
RSpec.describe DashboardController do
|
||||||
context 'signed in' do
|
context 'signed in' do
|
||||||
let(:user) { create(:user) }
|
let_it_be(:user) { create(:user) }
|
||||||
let(:project) { create(:project) }
|
let_it_be(:project) { create(:project) }
|
||||||
|
|
||||||
|
before_all do
|
||||||
|
project.add_maintainer(user)
|
||||||
|
end
|
||||||
|
|
||||||
before do
|
before do
|
||||||
project.add_maintainer(user)
|
|
||||||
sign_in(user)
|
sign_in(user)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -30,6 +33,28 @@ RSpec.describe DashboardController do
|
||||||
end
|
end
|
||||||
|
|
||||||
it_behaves_like 'issuables requiring filter', :issues
|
it_behaves_like 'issuables requiring filter', :issues
|
||||||
|
|
||||||
|
it 'includes tasks in issue list' do
|
||||||
|
task = create(:work_item, :task, project: project, author: user)
|
||||||
|
|
||||||
|
get :issues, params: { author_id: user.id }
|
||||||
|
|
||||||
|
expect(assigns[:issues].map(&:id)).to include(task.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when work_items is disabled' do
|
||||||
|
before do
|
||||||
|
stub_feature_flags(work_items: false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'does not include tasks in issue list' do
|
||||||
|
task = create(:work_item, :task, project: project, author: user)
|
||||||
|
|
||||||
|
get :issues, params: { author_id: user.id }
|
||||||
|
|
||||||
|
expect(assigns[:issues].map(&:id)).not_to include(task.id)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'GET merge requests' do
|
describe 'GET merge requests' do
|
||||||
|
|
|
@ -1701,13 +1701,27 @@ RSpec.describe Projects::IssuesController do
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'allows CSV export' do
|
it 'allows CSV export' do
|
||||||
expect(IssuableExportCsvWorker).to receive(:perform_async).with(:issue, viewer.id, project.id, anything)
|
expect(IssuableExportCsvWorker).to receive(:perform_async)
|
||||||
|
.with(:issue, viewer.id, project.id, hash_including('issue_types' => Issue::TYPES_FOR_LIST))
|
||||||
|
|
||||||
request_csv
|
request_csv
|
||||||
|
|
||||||
expect(response).to redirect_to(project_issues_path(project))
|
expect(response).to redirect_to(project_issues_path(project))
|
||||||
expect(controller).to set_flash[:notice].to match(/\AYour CSV export has started/i)
|
expect(controller).to set_flash[:notice].to match(/\AYour CSV export has started/i)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when work_items is disabled' do
|
||||||
|
before do
|
||||||
|
stub_feature_flags(work_items: false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'does not include tasks in CSV export' do
|
||||||
|
expect(IssuableExportCsvWorker).to receive(:perform_async)
|
||||||
|
.with(:issue, viewer.id, project.id, hash_including('issue_types' => Issue::TYPES_FOR_LIST.excluding('task')))
|
||||||
|
|
||||||
|
request_csv
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when not logged in' do
|
context 'when not logged in' do
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { BoxGeometry } from 'three/build/three.module';
|
import { BoxGeometry } from 'three';
|
||||||
import MeshObject from '~/blob/3d_viewer/mesh_object';
|
import MeshObject from '~/blob/3d_viewer/mesh_object';
|
||||||
|
|
||||||
describe('Mesh object', () => {
|
describe('Mesh object', () => {
|
||||||
|
|
|
@ -32,6 +32,20 @@ RSpec.describe GraphqlTriggers do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '.issuable_description_updated' do
|
||||||
|
it 'triggers the issuableDescriptionUpdated subscription' do
|
||||||
|
work_item = create(:work_item)
|
||||||
|
|
||||||
|
expect(GitlabSchema.subscriptions).to receive(:trigger).with(
|
||||||
|
'issuableDescriptionUpdated',
|
||||||
|
{ issuable_id: work_item.to_gid },
|
||||||
|
work_item
|
||||||
|
).and_call_original
|
||||||
|
|
||||||
|
GraphqlTriggers.issuable_description_updated(work_item)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe '.issuable_labels_updated' do
|
describe '.issuable_labels_updated' do
|
||||||
it 'triggers the issuableLabelsUpdated subscription' do
|
it 'triggers the issuableLabelsUpdated subscription' do
|
||||||
project = create(:project)
|
project = create(:project)
|
||||||
|
|
|
@ -8,6 +8,7 @@ RSpec.describe GitlabSchema.types['Subscription'] do
|
||||||
issuable_assignees_updated
|
issuable_assignees_updated
|
||||||
issue_crm_contacts_updated
|
issue_crm_contacts_updated
|
||||||
issuable_title_updated
|
issuable_title_updated
|
||||||
|
issuable_description_updated
|
||||||
issuable_labels_updated
|
issuable_labels_updated
|
||||||
issuable_dates_updated
|
issuable_dates_updated
|
||||||
merge_request_reviewers_updated
|
merge_request_reviewers_updated
|
||||||
|
|
|
@ -86,6 +86,18 @@ RSpec.describe '0_log_deprecations' do
|
||||||
expect { warn('ABC gem is deprecated') }.to output.to_stderr
|
expect { warn('ABC gem is deprecated') }.to output.to_stderr
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'logs Redis exists_returns_integer deprecation message' do
|
||||||
|
msg = "`Redis#exists(key)` will return an Integer in redis-rb 4.3. `exists?` returns a boolean, you " \
|
||||||
|
"should use it instead. To opt-in to the new behavior now you can set Redis.exists_returns_integer = " \
|
||||||
|
"true. To disable this message and keep the current (boolean) behaviour of 'exists' you can set " \
|
||||||
|
"`Redis.exists_returns_integer = false`, but this option will be removed in 5.0.0. " \
|
||||||
|
"(#{::Kernel.caller(1, 1).first})\n"
|
||||||
|
|
||||||
|
expect(Gitlab::DeprecationJsonLogger).to receive(:info).with(message: msg.strip, source: 'redis')
|
||||||
|
|
||||||
|
expect { warn(msg) }.to output.to_stderr
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'Rails deprecations' do
|
describe 'Rails deprecations' do
|
||||||
|
|
|
@ -61,7 +61,7 @@ RSpec.describe Gitlab::AnonymousSession, :clean_gitlab_redis_sessions do
|
||||||
subject.cleanup_session_per_ip_count
|
subject.cleanup_session_per_ip_count
|
||||||
|
|
||||||
Gitlab::Redis::Sessions.with do |redis|
|
Gitlab::Redis::Sessions.with do |redis|
|
||||||
expect(redis.exists("session:lookup:ip:gitlab2:127.0.0.1")).to eq(false)
|
expect(redis.exists?("session:lookup:ip:gitlab2:127.0.0.1")).to eq(false)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -288,7 +288,7 @@ RSpec.describe Gitlab::Cache::Ci::ProjectPipelineStatus, :clean_gitlab_redis_cac
|
||||||
it 'deletes values from redis_cache' do
|
it 'deletes values from redis_cache' do
|
||||||
pipeline_status.delete_from_cache
|
pipeline_status.delete_from_cache
|
||||||
|
|
||||||
key_exists = Gitlab::Redis::Cache.with { |redis| redis.exists(cache_key) }
|
key_exists = Gitlab::Redis::Cache.with { |redis| redis.exists?(cache_key) }
|
||||||
|
|
||||||
expect(key_exists).to be_falsy
|
expect(key_exists).to be_falsy
|
||||||
end
|
end
|
||||||
|
|
|
@ -74,7 +74,7 @@ RSpec.describe Gitlab::Ci::Trace, :clean_gitlab_redis_shared_state, factory_defa
|
||||||
trace.being_watched!
|
trace.being_watched!
|
||||||
|
|
||||||
result = Gitlab::Redis::SharedState.with do |redis|
|
result = Gitlab::Redis::SharedState.with do |redis|
|
||||||
redis.exists(cache_key)
|
redis.exists?(cache_key)
|
||||||
end
|
end
|
||||||
|
|
||||||
expect(result).to eq(true)
|
expect(result).to eq(true)
|
||||||
|
|
|
@ -41,7 +41,7 @@ RSpec.describe Gitlab::ImportExport::Project::RelationFactory, :use_clean_rails_
|
||||||
context 'hook object' do
|
context 'hook object' do
|
||||||
let(:relation_sym) { :hooks }
|
let(:relation_sym) { :hooks }
|
||||||
let(:id) { 999 }
|
let(:id) { 999 }
|
||||||
let(:service_id) { 99 }
|
let(:integration_id) { 99 }
|
||||||
let(:original_project_id) { 8 }
|
let(:original_project_id) { 8 }
|
||||||
let(:token) { 'secret' }
|
let(:token) { 'secret' }
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ RSpec.describe Gitlab::ImportExport::Project::RelationFactory, :use_clean_rails_
|
||||||
'project_id' => original_project_id,
|
'project_id' => original_project_id,
|
||||||
'created_at' => '2016-08-12T09:41:03.462Z',
|
'created_at' => '2016-08-12T09:41:03.462Z',
|
||||||
'updated_at' => '2016-08-12T09:41:03.462Z',
|
'updated_at' => '2016-08-12T09:41:03.462Z',
|
||||||
'service_id' => service_id,
|
'integration_id' => integration_id,
|
||||||
'push_events' => true,
|
'push_events' => true,
|
||||||
'issues_events' => false,
|
'issues_events' => false,
|
||||||
'confidential_issues_events' => false,
|
'confidential_issues_events' => false,
|
||||||
|
@ -71,8 +71,8 @@ RSpec.describe Gitlab::ImportExport::Project::RelationFactory, :use_clean_rails_
|
||||||
expect(created_object.id).not_to eq(id)
|
expect(created_object.id).not_to eq(id)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'does not have the original service_id' do
|
it 'does not have the original integration_id' do
|
||||||
expect(created_object.service_id).not_to eq(service_id)
|
expect(created_object.integration_id).not_to eq(integration_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'does not have the original project_id' do
|
it 'does not have the original project_id' do
|
||||||
|
@ -88,10 +88,10 @@ RSpec.describe Gitlab::ImportExport::Project::RelationFactory, :use_clean_rails_
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'original service exists' do
|
context 'original service exists' do
|
||||||
let(:service_id) { create(:integration, project: project).id }
|
let(:integration_id) { create(:integration, project: project).id }
|
||||||
|
|
||||||
it 'does not have the original service_id' do
|
it 'does not have the original integration_id' do
|
||||||
expect(created_object.service_id).not_to eq(service_id)
|
expect(created_object.integration_id).not_to eq(integration_id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -302,7 +302,7 @@ RSpec.describe Gitlab::ImportExport::Project::RelationFactory, :use_clean_rails_
|
||||||
let(:relation_sym) { :hazardous_foo_model }
|
let(:relation_sym) { :hazardous_foo_model }
|
||||||
let(:relation_hash) do
|
let(:relation_hash) do
|
||||||
{
|
{
|
||||||
'service_id' => 99,
|
'integration_id' => 99,
|
||||||
'moved_to_id' => 99,
|
'moved_to_id' => 99,
|
||||||
'namespace_id' => 99,
|
'namespace_id' => 99,
|
||||||
'ci_id' => 99,
|
'ci_id' => 99,
|
||||||
|
@ -317,7 +317,7 @@ RSpec.describe Gitlab::ImportExport::Project::RelationFactory, :use_clean_rails_
|
||||||
before do
|
before do
|
||||||
stub_const('HazardousFooModel', Class.new(FooModel))
|
stub_const('HazardousFooModel', Class.new(FooModel))
|
||||||
HazardousFooModel.class_eval do
|
HazardousFooModel.class_eval do
|
||||||
attr_accessor :service_id, :moved_to_id, :namespace_id, :ci_id, :random_project_id, :random_id, :milestone_id, :project_id
|
attr_accessor :integration_id, :moved_to_id, :namespace_id, :ci_id, :random_project_id, :random_id, :milestone_id, :project_id
|
||||||
end
|
end
|
||||||
|
|
||||||
allow(HazardousFooModel).to receive(:reflect_on_association).and_return(nil)
|
allow(HazardousFooModel).to receive(:reflect_on_association).and_return(nil)
|
||||||
|
|
|
@ -11,7 +11,7 @@ RSpec.describe Gitlab::SidekiqStatus, :clean_gitlab_redis_queues, :clean_gitlab_
|
||||||
key = described_class.key_for('123')
|
key = described_class.key_for('123')
|
||||||
|
|
||||||
with_redis do |redis|
|
with_redis do |redis|
|
||||||
expect(redis.exists(key)).to eq(true)
|
expect(redis.exists?(key)).to eq(true)
|
||||||
expect(redis.ttl(key) > 0).to eq(true)
|
expect(redis.ttl(key) > 0).to eq(true)
|
||||||
expect(redis.get(key)).to eq('1')
|
expect(redis.get(key)).to eq('1')
|
||||||
end
|
end
|
||||||
|
@ -23,7 +23,7 @@ RSpec.describe Gitlab::SidekiqStatus, :clean_gitlab_redis_queues, :clean_gitlab_
|
||||||
key = described_class.key_for('123')
|
key = described_class.key_for('123')
|
||||||
|
|
||||||
with_redis do |redis|
|
with_redis do |redis|
|
||||||
expect(redis.exists(key)).to eq(true)
|
expect(redis.exists?(key)).to eq(true)
|
||||||
expect(redis.ttl(key) > described_class::DEFAULT_EXPIRATION).to eq(true)
|
expect(redis.ttl(key) > described_class::DEFAULT_EXPIRATION).to eq(true)
|
||||||
expect(redis.get(key)).to eq('1')
|
expect(redis.get(key)).to eq('1')
|
||||||
end
|
end
|
||||||
|
@ -35,7 +35,7 @@ RSpec.describe Gitlab::SidekiqStatus, :clean_gitlab_redis_queues, :clean_gitlab_
|
||||||
key = described_class.key_for('123')
|
key = described_class.key_for('123')
|
||||||
|
|
||||||
with_redis do |redis|
|
with_redis do |redis|
|
||||||
expect(redis.exists(key)).to eq(false)
|
expect(redis.exists?(key)).to eq(false)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -48,7 +48,7 @@ RSpec.describe Gitlab::SidekiqStatus, :clean_gitlab_redis_queues, :clean_gitlab_
|
||||||
key = described_class.key_for('123')
|
key = described_class.key_for('123')
|
||||||
|
|
||||||
with_redis do |redis|
|
with_redis do |redis|
|
||||||
expect(redis.exists(key)).to eq(false)
|
expect(redis.exists?(key)).to eq(false)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -211,15 +211,15 @@ RSpec.describe Ci::BuildTraceChunks::Redis, :clean_gitlab_redis_shared_state do
|
||||||
|
|
||||||
it 'deletes multiple data' do
|
it 'deletes multiple data' do
|
||||||
Gitlab::Redis::SharedState.with do |redis|
|
Gitlab::Redis::SharedState.with do |redis|
|
||||||
expect(redis.exists("gitlab:ci:trace:#{build.id}:chunks:0")).to be_truthy
|
expect(redis.exists?("gitlab:ci:trace:#{build.id}:chunks:0")).to eq(true)
|
||||||
expect(redis.exists("gitlab:ci:trace:#{build.id}:chunks:1")).to be_truthy
|
expect(redis.exists?("gitlab:ci:trace:#{build.id}:chunks:1")).to eq(true)
|
||||||
end
|
end
|
||||||
|
|
||||||
subject
|
subject
|
||||||
|
|
||||||
Gitlab::Redis::SharedState.with do |redis|
|
Gitlab::Redis::SharedState.with do |redis|
|
||||||
expect(redis.exists("gitlab:ci:trace:#{build.id}:chunks:0")).to be_falsy
|
expect(redis.exists?("gitlab:ci:trace:#{build.id}:chunks:0")).to eq(false)
|
||||||
expect(redis.exists("gitlab:ci:trace:#{build.id}:chunks:1")).to be_falsy
|
expect(redis.exists?("gitlab:ci:trace:#{build.id}:chunks:1")).to eq(false)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -73,8 +73,8 @@ RSpec.describe CounterAttribute, :counter_attribute, :clean_gitlab_redis_shared_
|
||||||
subject
|
subject
|
||||||
|
|
||||||
Gitlab::Redis::SharedState.with do |redis|
|
Gitlab::Redis::SharedState.with do |redis|
|
||||||
expect(redis.exists(increment_key)).to be_falsey
|
expect(redis.exists?(increment_key)).to eq(false)
|
||||||
expect(redis.exists(flushed_key)).to eq(flushed_key_present)
|
expect(redis.exists?(flushed_key)).to eq(flushed_key_present)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -495,6 +495,32 @@ RSpec.describe Issues::UpdateService, :mailer do
|
||||||
|
|
||||||
expect(note.note).to eq('changed the description')
|
expect(note.note).to eq('changed the description')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'triggers GraphQL description updated subscription' do
|
||||||
|
expect(GraphqlTriggers).to receive(:issuable_description_updated).with(issue).and_call_original
|
||||||
|
|
||||||
|
update_issue(description: 'Changed description')
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when broadcast_issuable_description_updated is disabled' do
|
||||||
|
before do
|
||||||
|
stub_feature_flags(broadcast_issuable_description_updated: false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'does not trigger GraphQL description updated subscription' do
|
||||||
|
expect(GraphqlTriggers).not_to receive(:issuable_description_updated)
|
||||||
|
|
||||||
|
update_issue(title: 'Changed title')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when decription is not changed' do
|
||||||
|
it 'does not trigger GraphQL description updated subscription' do
|
||||||
|
expect(GraphqlTriggers).not_to receive(:issuable_description_updated)
|
||||||
|
|
||||||
|
update_issue(title: 'Changed title')
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when issue turns confidential' do
|
context 'when issue turns confidential' do
|
||||||
|
|
|
@ -625,6 +625,32 @@ RSpec.describe MergeRequests::UpdateService, :mailer do
|
||||||
|
|
||||||
expect(Todo.count).to eq(2)
|
expect(Todo.count).to eq(2)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'triggers GraphQL description updated subscription' do
|
||||||
|
expect(GraphqlTriggers).to receive(:issuable_description_updated).with(merge_request).and_call_original
|
||||||
|
|
||||||
|
update_merge_request(description: 'updated description')
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when broadcast_issuable_description_updated is disabled' do
|
||||||
|
before do
|
||||||
|
stub_feature_flags(broadcast_issuable_description_updated: false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'does not trigger GraphQL description updated subscription' do
|
||||||
|
expect(GraphqlTriggers).not_to receive(:issuable_description_updated)
|
||||||
|
|
||||||
|
update_merge_request(description: 'updated description')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when decription is not changed' do
|
||||||
|
it 'does not trigger GraphQL description updated subscription' do
|
||||||
|
expect(GraphqlTriggers).not_to receive(:issuable_description_updated)
|
||||||
|
|
||||||
|
update_merge_request(title: 'updated title')
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when is reassigned' do
|
context 'when is reassigned' do
|
||||||
|
|
|
@ -88,6 +88,38 @@ RSpec.describe WorkItems::UpdateService do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when decription is changed' do
|
||||||
|
let(:opts) { { description: 'description changed' } }
|
||||||
|
|
||||||
|
it 'triggers GraphQL description updated subscription' do
|
||||||
|
expect(GraphqlTriggers).to receive(:issuable_description_updated).with(work_item).and_call_original
|
||||||
|
|
||||||
|
update_work_item
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when broadcast_issuable_description_updated is disabled' do
|
||||||
|
before do
|
||||||
|
stub_feature_flags(broadcast_issuable_description_updated: false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'does not trigger GraphQL description updated subscription' do
|
||||||
|
expect(GraphqlTriggers).not_to receive(:issuable_description_updated)
|
||||||
|
|
||||||
|
update_work_item
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when decription is not changed' do
|
||||||
|
let(:opts) { { title: 'title changed' } }
|
||||||
|
|
||||||
|
it 'does not trigger GraphQL description updated subscription' do
|
||||||
|
expect(GraphqlTriggers).not_to receive(:issuable_description_updated)
|
||||||
|
|
||||||
|
update_work_item
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context 'when updating state_event' do
|
context 'when updating state_event' do
|
||||||
context 'when state_event is close' do
|
context 'when state_event is close' do
|
||||||
let(:opts) { { state_event: 'close' } }
|
let(:opts) { { state_event: 'close' } }
|
||||||
|
|
|
@ -124,14 +124,14 @@ RSpec.shared_examples_for CounterAttribute do |counter_attributes|
|
||||||
|
|
||||||
it 'removes the increment entry from Redis' do
|
it 'removes the increment entry from Redis' do
|
||||||
Gitlab::Redis::SharedState.with do |redis|
|
Gitlab::Redis::SharedState.with do |redis|
|
||||||
key_exists = redis.exists(model.counter_key(incremented_attribute))
|
key_exists = redis.exists?(model.counter_key(incremented_attribute))
|
||||||
expect(key_exists).to be_truthy
|
expect(key_exists).to be_truthy
|
||||||
end
|
end
|
||||||
|
|
||||||
subject
|
subject
|
||||||
|
|
||||||
Gitlab::Redis::SharedState.with do |redis|
|
Gitlab::Redis::SharedState.with do |redis|
|
||||||
key_exists = redis.exists(model.counter_key(incremented_attribute))
|
key_exists = redis.exists?(model.counter_key(incremented_attribute))
|
||||||
expect(key_exists).to be_falsey
|
expect(key_exists).to be_falsey
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -162,7 +162,7 @@ RSpec.shared_examples_for CounterAttribute do |counter_attributes|
|
||||||
subject
|
subject
|
||||||
|
|
||||||
Gitlab::Redis::SharedState.with do |redis|
|
Gitlab::Redis::SharedState.with do |redis|
|
||||||
key_exists = redis.exists(model.counter_flushed_key(incremented_attribute))
|
key_exists = redis.exists?(model.counter_flushed_key(incremented_attribute))
|
||||||
expect(key_exists).to be_falsey
|
expect(key_exists).to be_falsey
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -208,7 +208,7 @@ RSpec.shared_examples_for CounterAttribute do |counter_attributes|
|
||||||
model.clear_counter!(attribute)
|
model.clear_counter!(attribute)
|
||||||
|
|
||||||
Gitlab::Redis::SharedState.with do |redis|
|
Gitlab::Redis::SharedState.with do |redis|
|
||||||
key_exists = redis.exists(model.counter_key(attribute))
|
key_exists = redis.exists?(model.counter_key(attribute))
|
||||||
expect(key_exists).to be_falsey
|
expect(key_exists).to be_falsey
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,7 +4,7 @@ RSpec.shared_examples Integrations::HasWebHook do
|
||||||
include AfterNextHelpers
|
include AfterNextHelpers
|
||||||
|
|
||||||
describe 'associations' do
|
describe 'associations' do
|
||||||
it { is_expected.to have_one(:service_hook).inverse_of(:integration).with_foreign_key(:service_id) }
|
it { is_expected.to have_one(:service_hook).inverse_of(:integration).with_foreign_key(:integration_id) }
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'callbacks' do
|
describe 'callbacks' do
|
||||||
|
|
Loading…
Reference in New Issue