This is recursive. It will be listed in level 3.
diff --git a/spec/frontend/vue_merge_request_widget/components/widget/dynamic_content_spec.js b/spec/frontend/vue_merge_request_widget/components/widget/dynamic_content_spec.js
index 2372448c518..b7753a58747 100644
--- a/spec/frontend/vue_merge_request_widget/components/widget/dynamic_content_spec.js
+++ b/spec/frontend/vue_merge_request_widget/components/widget/dynamic_content_spec.js
@@ -1,8 +1,6 @@
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import { EXTENSION_ICONS } from '~/vue_merge_request_widget/constants';
import DynamicContent from '~/vue_merge_request_widget/components/widget/dynamic_content.vue';
-import ContentHeader from '~/vue_merge_request_widget/components/widget/widget_content_header.vue';
-import ContentBody from '~/vue_merge_request_widget/components/widget/widget_content_body.vue';
describe('~/vue_merge_request_widget/components/widget/dynamic_content.vue', () => {
let wrapper;
@@ -14,8 +12,6 @@ describe('~/vue_merge_request_widget/components/widget/dynamic_content.vue', ()
...propsData,
},
stubs: {
- ContentHeader,
- ContentBody,
DynamicContent,
},
});
diff --git a/spec/frontend/vue_merge_request_widget/components/widget/widget_content_body_spec.js b/spec/frontend/vue_merge_request_widget/components/widget/widget_content_body_spec.js
deleted file mode 100644
index 2f3f99badd0..00000000000
--- a/spec/frontend/vue_merge_request_widget/components/widget/widget_content_body_spec.js
+++ /dev/null
@@ -1,39 +0,0 @@
-import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import WidgetContentBody from '~/vue_merge_request_widget/components/widget/widget_content_body.vue';
-import StatusIcon from '~/vue_merge_request_widget/components/widget/status_icon.vue';
-
-describe('~/vue_merge_request_widget/components/widget/widget_content_body.vue', () => {
- let wrapper;
-
- const findStatusIcon = () => wrapper.findComponent(StatusIcon);
-
- const createComponent = ({ propsData, slots } = {}) => {
- wrapper = shallowMountExtended(WidgetContentBody, {
- propsData: {
- widgetName: 'MyWidget',
- ...propsData,
- },
- slots,
- });
- };
-
- it('does not render the status icon when it is not provided', () => {
- createComponent();
- expect(findStatusIcon().exists()).toBe(false);
- });
-
- it('renders the status icon when provided', () => {
- createComponent({ propsData: { statusIconName: 'failed' } });
- expect(findStatusIcon().exists()).toBe(true);
- });
-
- it('renders the default slot', () => {
- createComponent({
- slots: {
- default: 'Hello world',
- },
- });
-
- expect(wrapper.findByText('Hello world').exists()).toBe(true);
- });
-});
diff --git a/spec/frontend/vue_merge_request_widget/components/widget/widget_content_header_spec.js b/spec/frontend/vue_merge_request_widget/components/widget/widget_content_header_spec.js
deleted file mode 100644
index 995d28e350c..00000000000
--- a/spec/frontend/vue_merge_request_widget/components/widget/widget_content_header_spec.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import WidgetContentHeader from '~/vue_merge_request_widget/components/widget/widget_content_header.vue';
-
-describe('~/vue_merge_request_widget/components/widget/widget_content_header.vue', () => {
- let wrapper;
-
- const createComponent = ({ propsData } = {}) => {
- wrapper = shallowMountExtended(WidgetContentHeader, {
- propsData: {
- widgetName: 'MyWidget',
- ...propsData,
- },
- });
- };
-
- it('renders an array of header and subheader', () => {
- createComponent({ propsData: { header: ['this is a header', 'this is a subheader'] } });
- expect(wrapper.findByText('this is a header').exists()).toBe(true);
- expect(wrapper.findByText('this is a subheader').exists()).toBe(true);
- });
-
- it('renders a string', () => {
- createComponent({ propsData: { header: 'this is a header' } });
- expect(wrapper.findByText('this is a header').exists()).toBe(true);
- });
-
- it('escapes html injection properly', () => {
- createComponent({ propsData: { header: '
this is a header' } });
- expect(wrapper.findByText('
this is a header').exists()).toBe(true);
- });
-});
diff --git a/spec/frontend/vue_merge_request_widget/components/widget/widget_content_row_spec.js b/spec/frontend/vue_merge_request_widget/components/widget/widget_content_row_spec.js
index 1cb8c7277d3..4c2578ff590 100644
--- a/spec/frontend/vue_merge_request_widget/components/widget/widget_content_row_spec.js
+++ b/spec/frontend/vue_merge_request_widget/components/widget/widget_content_row_spec.js
@@ -1,38 +1,63 @@
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import WidgetContentRow from '~/vue_merge_request_widget/components/widget/widget_content_row.vue';
-import WidgetContentBody from '~/vue_merge_request_widget/components/widget/widget_content_body.vue';
+import StatusIcon from '~/vue_merge_request_widget/components/widget/status_icon.vue';
describe('~/vue_merge_request_widget/components/widget/widget_content_row.vue', () => {
let wrapper;
- const findContentBody = () => wrapper.findComponent(WidgetContentBody);
+ const findStatusIcon = () => wrapper.findComponent(StatusIcon);
const createComponent = ({ propsData, slots } = {}) => {
wrapper = shallowMountExtended(WidgetContentRow, {
propsData: {
widgetName: 'MyWidget',
+ level: 2,
...propsData,
},
slots,
});
};
- it('renders slots properly', () => {
- createComponent({
- propsData: {
- statusIconName: 'success',
- level: 2,
- },
- slots: {
- header: '
this is a header',
- body: '
this is a body',
- },
+ describe('body', () => {
+ it('renders the status icon when provided', () => {
+ createComponent({ propsData: { statusIconName: 'failed' } });
+ expect(findStatusIcon().exists()).toBe(true);
});
- expect(wrapper.findByText('this is a header').exists()).toBe(true);
- expect(findContentBody().props()).toMatchObject({
- statusIconName: 'success',
- widgetName: 'MyWidget',
+ it('does not render the status icon when it is not provided', () => {
+ createComponent();
+ expect(findStatusIcon().exists()).toBe(false);
+ });
+
+ it('renders slots properly', () => {
+ createComponent({
+ propsData: {
+ statusIconName: 'success',
+ },
+ slots: {
+ body: '
this is a body',
+ },
+ });
+
+ expect(wrapper.findByText('this is a body').exists()).toBe(true);
+ });
+ });
+
+ describe('header', () => {
+ it('renders an array of header and subheader', () => {
+ createComponent({ propsData: { header: ['this is a header', 'this is a subheader'] } });
+ expect(wrapper.findByText('this is a header').exists()).toBe(true);
+ expect(wrapper.findByText('this is a subheader').exists()).toBe(true);
+ });
+
+ it('renders a string', () => {
+ createComponent({ propsData: { header: 'this is a header' } });
+ expect(wrapper.findByText('this is a header').exists()).toBe(true);
+ });
+
+ it('escapes html injection properly', () => {
+ createComponent({ propsData: { header: '
this is a header' } });
+ expect(wrapper.findByText('
this is a header').exists()).toBe(true);
});
});
});
diff --git a/spec/frontend/vue_shared/components/namespace_select/namespace_select_spec.js b/spec/frontend/vue_shared/components/namespace_select/namespace_select_deprecated_spec.js
similarity index 99%
rename from spec/frontend/vue_shared/components/namespace_select/namespace_select_spec.js
rename to spec/frontend/vue_shared/components/namespace_select/namespace_select_deprecated_spec.js
index 6003f2b4c48..d930ef63dad 100644
--- a/spec/frontend/vue_shared/components/namespace_select/namespace_select_spec.js
+++ b/spec/frontend/vue_shared/components/namespace_select/namespace_select_deprecated_spec.js
@@ -11,14 +11,14 @@ import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import NamespaceSelect, {
i18n,
EMPTY_NAMESPACE_ID,
-} from '~/vue_shared/components/namespace_select/namespace_select.vue';
+} from '~/vue_shared/components/namespace_select/namespace_select_deprecated.vue';
import { userNamespaces, groupNamespaces } from './mock_data';
const FLAT_NAMESPACES = [...userNamespaces, ...groupNamespaces];
const EMPTY_NAMESPACE_TITLE = 'Empty namespace TEST';
const EMPTY_NAMESPACE_ITEM = { id: EMPTY_NAMESPACE_ID, humanName: EMPTY_NAMESPACE_TITLE };
-describe('Namespace Select', () => {
+describe('NamespaceSelectDeprecated', () => {
let wrapper;
const createComponent = (props = {}) =>
diff --git a/spec/lib/gitlab/gitaly_client/repository_service_spec.rb b/spec/lib/gitlab/gitaly_client/repository_service_spec.rb
index 73322b25aae..58ace05b0d3 100644
--- a/spec/lib/gitlab/gitaly_client/repository_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/repository_service_spec.rb
@@ -343,4 +343,18 @@ RSpec.describe Gitlab::GitalyClient::RepositoryService do
expect(client.full_path).to eq(path)
end
end
+
+ describe "#find_license" do
+ it 'sends a find_license request with medium timeout' do
+ expect_any_instance_of(Gitaly::RepositoryService::Stub)
+ .to receive(:find_license) do |_service, _request, headers|
+ expect(headers[:deadline]).to be_between(
+ Gitlab::GitalyClient.fast_timeout.seconds.from_now.to_f,
+ Gitlab::GitalyClient.medium_timeout.seconds.from_now.to_f
+ )
+ end
+
+ client.find_license
+ end
+ end
end
diff --git a/spec/models/user_preference_spec.rb b/spec/models/user_preference_spec.rb
index 2492521c634..029667a60b0 100644
--- a/spec/models/user_preference_spec.rb
+++ b/spec/models/user_preference_spec.rb
@@ -10,20 +10,20 @@ RSpec.describe UserPreference do
using RSpec::Parameterized::TableSyntax
where(color: [
- '#000000',
- '#123456',
- '#abcdef',
- '#AbCdEf',
- '#ffffff',
- '#fFfFfF',
- '#000',
- '#123',
- '#abc',
- '#AbC',
- '#fff',
- '#fFf',
- ''
- ])
+ '#000000',
+ '#123456',
+ '#abcdef',
+ '#AbCdEf',
+ '#ffffff',
+ '#fFfFfF',
+ '#000',
+ '#123',
+ '#abc',
+ '#AbC',
+ '#fff',
+ '#fFf',
+ ''
+ ])
with_them do
it { is_expected.to allow_value(color).for(:diffs_deletion_color) }
@@ -31,14 +31,14 @@ RSpec.describe UserPreference do
end
where(color: [
- '#1',
- '#12',
- '#1234',
- '#12345',
- '#1234567',
- '123456',
- '#12345x'
- ])
+ '#1',
+ '#12',
+ '#1234',
+ '#12345',
+ '#1234567',
+ '123456',
+ '#12345x'
+ ])
with_them do
it { is_expected.not_to allow_value(color).for(:diffs_deletion_color) }
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 009f5ff8e5f..3b949bcfe65 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -7416,9 +7416,10 @@ RSpec.describe User do
let_it_be(:internal_user) { User.alert_bot.tap { |u| u.confirm } }
it 'does not return blocked or banned users' do
- expect(described_class.without_forbidden_states).to match_array([
- normal_user, admin_user, external_user, unconfirmed_user, omniauth_user, internal_user
- ])
+ expect(described_class.without_forbidden_states).to match_array(
+ [
+ normal_user, admin_user, external_user, unconfirmed_user, omniauth_user, internal_user
+ ])
end
end
diff --git a/spec/models/wiki_directory_spec.rb b/spec/models/wiki_directory_spec.rb
index 9b6cec99ddb..44c6f6c9c1a 100644
--- a/spec/models/wiki_directory_spec.rb
+++ b/spec/models/wiki_directory_spec.rb
@@ -24,31 +24,32 @@ RSpec.describe WikiDirectory do
[toplevel1, toplevel2, toplevel3, child1, child2, child3, grandchild1, grandchild2].sort_by(&:title)
)
- expect(entries).to match([
- toplevel1,
- a_kind_of(WikiDirectory).and(
- having_attributes(
- slug: 'parent1', entries: [
- child1,
- child2,
- a_kind_of(WikiDirectory).and(
- having_attributes(
- slug: 'parent1/subparent',
- entries: [grandchild1, grandchild2]
+ expect(entries).to match(
+ [
+ toplevel1,
+ a_kind_of(WikiDirectory).and(
+ having_attributes(
+ slug: 'parent1', entries: [
+ child1,
+ child2,
+ a_kind_of(WikiDirectory).and(
+ having_attributes(
+ slug: 'parent1/subparent',
+ entries: [grandchild1, grandchild2]
+ )
)
- )
- ]
- )
- ),
- a_kind_of(WikiDirectory).and(
- having_attributes(
- slug: 'parent2',
- entries: [child3]
- )
- ),
- toplevel2,
- toplevel3
- ])
+ ]
+ )
+ ),
+ a_kind_of(WikiDirectory).and(
+ having_attributes(
+ slug: 'parent2',
+ entries: [child3]
+ )
+ ),
+ toplevel2,
+ toplevel3
+ ])
end
end
diff --git a/spec/policies/concerns/crud_policy_helpers_spec.rb b/spec/policies/concerns/crud_policy_helpers_spec.rb
index 69bf9ad12d6..1e7b99178c3 100644
--- a/spec/policies/concerns/crud_policy_helpers_spec.rb
+++ b/spec/policies/concerns/crud_policy_helpers_spec.rb
@@ -17,34 +17,37 @@ RSpec.describe CrudPolicyHelpers do
describe '.create_read_update_admin_destroy' do
it 'returns an array of the appropriate abilites given a feature name' do
- expect(PolicyTestClass.create_read_update_admin_destroy(feature_name)).to eq([
- :read_foo,
- :create_foo,
- :update_foo,
- :admin_foo,
- :destroy_foo
- ])
+ expect(PolicyTestClass.create_read_update_admin_destroy(feature_name)).to eq(
+ [
+ :read_foo,
+ :create_foo,
+ :update_foo,
+ :admin_foo,
+ :destroy_foo
+ ])
end
end
describe '.create_update_admin_destroy' do
it 'returns an array of the appropriate abilites given a feature name' do
- expect(PolicyTestClass.create_update_admin_destroy(feature_name)).to eq([
- :create_foo,
- :update_foo,
- :admin_foo,
- :destroy_foo
- ])
+ expect(PolicyTestClass.create_update_admin_destroy(feature_name)).to eq(
+ [
+ :create_foo,
+ :update_foo,
+ :admin_foo,
+ :destroy_foo
+ ])
end
end
describe '.create_update_admin' do
it 'returns an array of the appropriate abilites given a feature name' do
- expect(PolicyTestClass.create_update_admin(feature_name)).to eq([
- :create_foo,
- :update_foo,
- :admin_foo
- ])
+ expect(PolicyTestClass.create_update_admin(feature_name)).to eq(
+ [
+ :create_foo,
+ :update_foo,
+ :admin_foo
+ ])
end
end
end
diff --git a/spec/presenters/ci/build_runner_presenter_spec.rb b/spec/presenters/ci/build_runner_presenter_spec.rb
index fe2d8f0f670..33d1bc104ce 100644
--- a/spec/presenters/ci/build_runner_presenter_spec.rb
+++ b/spec/presenters/ci/build_runner_presenter_spec.rb
@@ -383,10 +383,10 @@ RSpec.describe Ci::BuildRunnerPresenter do
it 'returns expanded and sorted variables' do
is_expected.to eq [
- { key: 'C', value: 'value', public: false, masked: false },
- { key: 'B', value: 'refB-value-$D', public: false, masked: false },
- { key: 'A', value: 'refA-refB-value-$D', public: false, masked: false }
- ]
+ { key: 'C', value: 'value', public: false, masked: false },
+ { key: 'B', value: 'refB-value-$D', public: false, masked: false },
+ { key: 'A', value: 'refA-refB-value-$D', public: false, masked: false }
+ ]
end
end
end
diff --git a/spec/requests/api/ci/jobs_spec.rb b/spec/requests/api/ci/jobs_spec.rb
index b8983e9632e..0e17db516f4 100644
--- a/spec/requests/api/ci/jobs_spec.rb
+++ b/spec/requests/api/ci/jobs_spec.rb
@@ -226,18 +226,19 @@ RSpec.describe API::Ci::Jobs do
expect(json_response.dig('user', 'username')).to eq(api_user.username)
expect(json_response.dig('user', 'roles_in_project')).to match_array %w(guest reporter developer)
expect(json_response).not_to include('environment')
- expect(json_response['allowed_agents']).to match_array([
- {
- 'id' => implicit_authorization.agent_id,
- 'config_project' => hash_including('id' => implicit_authorization.agent.project_id),
- 'configuration' => implicit_authorization.config
- },
- {
- 'id' => group_authorization.agent_id,
- 'config_project' => hash_including('id' => group_authorization.agent.project_id),
- 'configuration' => group_authorization.config
- }
- ])
+ expect(json_response['allowed_agents']).to match_array(
+ [
+ {
+ 'id' => implicit_authorization.agent_id,
+ 'config_project' => hash_including('id' => implicit_authorization.agent.project_id),
+ 'configuration' => implicit_authorization.config
+ },
+ {
+ 'id' => group_authorization.agent_id,
+ 'config_project' => hash_including('id' => group_authorization.agent.project_id),
+ 'configuration' => group_authorization.config
+ }
+ ])
end
end
diff --git a/spec/requests/api/ci/runner/jobs_request_post_spec.rb b/spec/requests/api/ci/runner/jobs_request_post_spec.rb
index b33b97f90d7..d4f734e7bdd 100644
--- a/spec/requests/api/ci/runner/jobs_request_post_spec.rb
+++ b/spec/requests/api/ci/runner/jobs_request_post_spec.rb
@@ -220,14 +220,15 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
expect(json_response['image']).to eq(
{ 'name' => 'image:1.0', 'entrypoint' => '/bin/sh', 'ports' => [], 'pull_policy' => nil }
)
- expect(json_response['services']).to eq([
- { 'name' => 'postgres', 'entrypoint' => nil, 'alias' => nil, 'command' => nil, 'ports' => [],
- 'variables' => nil, 'pull_policy' => nil },
- { 'name' => 'docker:stable-dind', 'entrypoint' => '/bin/sh', 'alias' => 'docker', 'command' => 'sleep 30',
- 'ports' => [], 'variables' => [], 'pull_policy' => nil },
- { 'name' => 'mysql:latest', 'entrypoint' => nil, 'alias' => nil, 'command' => nil, 'ports' => [],
- 'variables' => [{ 'key' => 'MYSQL_ROOT_PASSWORD', 'value' => 'root123.' }], 'pull_policy' => nil }
- ])
+ expect(json_response['services']).to eq(
+ [
+ { 'name' => 'postgres', 'entrypoint' => nil, 'alias' => nil, 'command' => nil, 'ports' => [],
+ 'variables' => nil, 'pull_policy' => nil },
+ { 'name' => 'docker:stable-dind', 'entrypoint' => '/bin/sh', 'alias' => 'docker', 'command' => 'sleep 30',
+ 'ports' => [], 'variables' => [], 'pull_policy' => nil },
+ { 'name' => 'mysql:latest', 'entrypoint' => nil, 'alias' => nil, 'command' => nil, 'ports' => [],
+ 'variables' => [{ 'key' => 'MYSQL_ROOT_PASSWORD', 'value' => 'root123.' }], 'pull_policy' => nil }
+ ])
expect(json_response['steps']).to eq(expected_steps)
expect(json_response['artifacts']).to eq(expected_artifacts)
expect(json_response['cache']).to match(expected_cache)
@@ -383,23 +384,24 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
expect(response).to have_gitlab_http_status(:created)
expect(response.headers).not_to have_key('X-GitLab-Last-Update')
- expect(json_response['steps']).to eq([
- {
- "name" => "script",
- "script" => ["make changelog | tee release_changelog.txt"],
- "timeout" => 3600,
- "when" => "on_success",
- "allow_failure" => false
- },
- {
- "name" => "release",
- "script" =>
- ["release-cli create --name \"Release $CI_COMMIT_SHA\" --description \"Created using the release-cli $EXTRA_DESCRIPTION\" --tag-name \"release-$CI_COMMIT_SHA\" --ref \"$CI_COMMIT_SHA\" --assets-link \"{\\\"url\\\":\\\"https://example.com/assets/1\\\",\\\"name\\\":\\\"asset1\\\"}\""],
- "timeout" => 3600,
- "when" => "on_success",
- "allow_failure" => false
- }
- ])
+ expect(json_response['steps']).to eq(
+ [
+ {
+ "name" => "script",
+ "script" => ["make changelog | tee release_changelog.txt"],
+ "timeout" => 3600,
+ "when" => "on_success",
+ "allow_failure" => false
+ },
+ {
+ "name" => "release",
+ "script" =>
+ ["release-cli create --name \"Release $CI_COMMIT_SHA\" --description \"Created using the release-cli $EXTRA_DESCRIPTION\" --tag-name \"release-$CI_COMMIT_SHA\" --ref \"$CI_COMMIT_SHA\" --assets-link \"{\\\"url\\\":\\\"https://example.com/assets/1\\\",\\\"name\\\":\\\"asset1\\\"}\""],
+ "timeout" => 3600,
+ "when" => "on_success",
+ "allow_failure" => false
+ }
+ ])
end
end
diff --git a/spec/requests/api/ci/runners_spec.rb b/spec/requests/api/ci/runners_spec.rb
index 85f38f1c446..69f26d3f257 100644
--- a/spec/requests/api/ci/runners_spec.rb
+++ b/spec/requests/api/ci/runners_spec.rb
@@ -918,10 +918,11 @@ RSpec.describe API::Ci::Runners do
create(:ci_build, :failed, runner: shared_runner, project: project_with_repo, pipeline: pipeline)
expect_next_instance_of(Repository) do |repo|
- expect(repo).to receive(:commits_by).with(oids: %w[
- 1a0b36b3cdad1d2ee32457c102a8c0b7056fa863
- c1c67abbaf91f624347bb3ae96eabe3a1b742478
- ]).once.and_call_original
+ expect(repo).to receive(:commits_by).with(oids:
+ %w[
+ 1a0b36b3cdad1d2ee32457c102a8c0b7056fa863
+ c1c67abbaf91f624347bb3ae96eabe3a1b742478
+ ]).once.and_call_original
end
get api("/runners/#{shared_runner.id}/jobs", admin), params: { per_page: 2, order_by: 'id', sort: 'desc' }
@@ -1124,27 +1125,24 @@ RSpec.describe API::Ci::Runners do
it 'returns all runners' do
get api("/groups/#{group.id}/runners", user)
- expect(json_response).to match_array([
- a_hash_including('description' => 'Group runner A', 'active' => true, 'paused' => false),
- a_hash_including('description' => 'Shared runner', 'active' => true, 'paused' => false)
- ])
+ expect(json_response).to match_array(
+ [
+ a_hash_including('description' => 'Group runner A', 'active' => true, 'paused' => false),
+ a_hash_including('description' => 'Shared runner', 'active' => true, 'paused' => false)
+ ])
end
context 'filter by type' do
it 'returns record when valid and present' do
get api("/groups/#{group.id}/runners?type=group_type", user)
- expect(json_response).to match_array([
- a_hash_including('description' => 'Group runner A')
- ])
+ expect(json_response).to match_array([a_hash_including('description' => 'Group runner A')])
end
it 'returns instance runners when instance_type is specified' do
get api("/groups/#{group.id}/runners?type=instance_type", user)
- expect(json_response).to match_array([
- a_hash_including('description' => 'Shared runner')
- ])
+ expect(json_response).to match_array([a_hash_including('description' => 'Shared runner')])
end
# TODO: Remove when REST API v5 is implemented (https://gitlab.com/gitlab-org/gitlab/-/issues/351466)
@@ -1167,18 +1165,14 @@ RSpec.describe API::Ci::Runners do
it 'returns runners by paused state' do
get api("/groups/#{group.id}/runners?paused=true", user)
- expect(json_response).to match_array([
- a_hash_including('description' => 'Inactive group runner')
- ])
+ expect(json_response).to match_array([a_hash_including('description' => 'Inactive group runner')])
end
context 'filter runners by status' do
it 'returns runners by valid status' do
get api("/groups/#{group.id}/runners?status=paused", user)
- expect(json_response).to match_array([
- a_hash_including('description' => 'Inactive group runner')
- ])
+ expect(json_response).to match_array([a_hash_including('description' => 'Inactive group runner')])
end
it 'does not filter by invalid status' do
@@ -1195,9 +1189,7 @@ RSpec.describe API::Ci::Runners do
get api("/groups/#{group.id}/runners?tag_list=tag1,tag2", user)
- expect(json_response).to match_array([
- a_hash_including('description' => 'Runner tagged with tag1 and tag2')
- ])
+ expect(json_response).to match_array([a_hash_including('description' => 'Runner tagged with tag1 and tag2')])
end
end
diff --git a/spec/requests/api/deploy_tokens_spec.rb b/spec/requests/api/deploy_tokens_spec.rb
index b5f8da1f327..e0296248a03 100644
--- a/spec/requests/api/deploy_tokens_spec.rb
+++ b/spec/requests/api/deploy_tokens_spec.rb
@@ -44,14 +44,15 @@ RSpec.describe API::DeployTokens do
token_ids = json_response.map { |token| token['id'] }
expect(response).to include_pagination_headers
expect(response).to match_response_schema('public_api/v4/deploy_tokens')
- expect(token_ids).to match_array([
- deploy_token.id,
- revoked_deploy_token.id,
- expired_deploy_token.id,
- group_deploy_token.id,
- revoked_group_deploy_token.id,
- expired_group_deploy_token.id
- ])
+ expect(token_ids).to match_array(
+ [
+ deploy_token.id,
+ revoked_deploy_token.id,
+ expired_deploy_token.id,
+ group_deploy_token.id,
+ revoked_group_deploy_token.id,
+ expired_group_deploy_token.id
+ ])
end
context 'and active=true' do
@@ -61,10 +62,11 @@ RSpec.describe API::DeployTokens do
token_ids = json_response.map { |token| token['id'] }
expect(response).to have_gitlab_http_status(:ok)
expect(response).to include_pagination_headers
- expect(token_ids).to match_array([
- deploy_token.id,
- group_deploy_token.id
- ])
+ expect(token_ids).to match_array(
+ [
+ deploy_token.id,
+ group_deploy_token.id
+ ])
end
end
end
@@ -110,11 +112,12 @@ RSpec.describe API::DeployTokens do
subject
token_ids = json_response.map { |token| token['id'] }
- expect(token_ids).to match_array([
- deploy_token.id,
- expired_deploy_token.id,
- revoked_deploy_token.id
- ])
+ expect(token_ids).to match_array(
+ [
+ deploy_token.id,
+ expired_deploy_token.id,
+ revoked_deploy_token.id
+ ])
end
context 'and active=true' do
diff --git a/spec/requests/api/graphql/ci/config_spec.rb b/spec/requests/api/graphql/ci/config_spec.rb
index 960fda80dd9..784019ee926 100644
--- a/spec/requests/api/graphql/ci/config_spec.rb
+++ b/spec/requests/api/graphql/ci/config_spec.rb
@@ -176,22 +176,22 @@ RSpec.describe 'Query.ciConfig' do
"jobs" =>
{
"nodes" => [
- {
- "name" => "docker",
- "groupName" => "docker",
- "stage" => "test",
- "script" => ["curl http://dockerhub/URL"],
- "beforeScript" => ["bundle install", "bundle exec rake db:create"],
- "afterScript" => ["echo 'run this after'"],
- "allowFailure" => true,
- "only" => { "refs" => %w[branches tags] },
- "when" => "manual",
- "except" => { "refs" => ["branches"] },
- "environment" => nil,
- "tags" => [],
- "needs" => { "nodes" => [{ "name" => "spinach" }, { "name" => "rspec 0 1" }] }
- }
- ]
+ {
+ "name" => "docker",
+ "groupName" => "docker",
+ "stage" => "test",
+ "script" => ["curl http://dockerhub/URL"],
+ "beforeScript" => ["bundle install", "bundle exec rake db:create"],
+ "afterScript" => ["echo 'run this after'"],
+ "allowFailure" => true,
+ "only" => { "refs" => %w[branches tags] },
+ "when" => "manual",
+ "except" => { "refs" => ["branches"] },
+ "environment" => nil,
+ "tags" => [],
+ "needs" => { "nodes" => [{ "name" => "spinach" }, { "name" => "rspec 0 1" }] }
+ }
+ ]
}
}
]
@@ -209,22 +209,22 @@ RSpec.describe 'Query.ciConfig' do
"jobs" =>
{
"nodes" => [
- {
- "name" => "deploy_job",
- "groupName" => "deploy_job",
- "stage" => "deploy",
- "script" => ["echo 'done'"],
- "beforeScript" => ["bundle install", "bundle exec rake db:create"],
- "afterScript" => ["echo 'run this after'"],
- "allowFailure" => false,
- "only" => { "refs" => %w[branches tags] },
- "when" => "on_success",
- "except" => nil,
- "environment" => "production",
- "tags" => [],
- "needs" => { "nodes" => [] }
- }
- ]
+ {
+ "name" => "deploy_job",
+ "groupName" => "deploy_job",
+ "stage" => "deploy",
+ "script" => ["echo 'done'"],
+ "beforeScript" => ["bundle install", "bundle exec rake db:create"],
+ "afterScript" => ["echo 'run this after'"],
+ "allowFailure" => false,
+ "only" => { "refs" => %w[branches tags] },
+ "when" => "on_success",
+ "except" => nil,
+ "environment" => "production",
+ "tags" => [],
+ "needs" => { "nodes" => [] }
+ }
+ ]
}
}
]
diff --git a/spec/requests/api/graphql/ci/jobs_spec.rb b/spec/requests/api/graphql/ci/jobs_spec.rb
index fa8fb1d54aa..47e3221c567 100644
--- a/spec/requests/api/graphql/ci/jobs_spec.rb
+++ b/spec/requests/api/graphql/ci/jobs_spec.rb
@@ -25,11 +25,12 @@ RSpec.describe 'Query.project.pipeline' do
let(:first_n) { var('Int') }
let(:query) do
- with_signature([first_n], wrap_fields(query_graphql_path([
- [:project, { full_path: project.full_path }],
- [:pipeline, { iid: pipeline.iid.to_s }],
- [:stages, { first: first_n }]
- ], stage_fields)))
+ with_signature([first_n], wrap_fields(query_graphql_path(
+ [
+ [:project, { full_path: project.full_path }],
+ [:pipeline, { iid: pipeline.iid.to_s }],
+ [:stages, { first: first_n }]
+ ], stage_fields)))
end
let(:stage_fields) do
diff --git a/spec/requests/api/graphql/mutations/uploads/delete_spec.rb b/spec/requests/api/graphql/mutations/uploads/delete_spec.rb
index f44bf179397..2d1b33cc086 100644
--- a/spec/requests/api/graphql/mutations/uploads/delete_spec.rb
+++ b/spec/requests/api/graphql/mutations/uploads/delete_spec.rb
@@ -47,10 +47,11 @@ RSpec.describe 'Delete an upload' do
expect(response).to have_gitlab_http_status(:success)
expect(mutation_response['upload']).to be_nil
- expect(mutation_response['errors']).to match_array([
- "The resource that you are attempting to access does not "\
- "exist or you don't have permission to perform this action."
- ])
+ expect(mutation_response['errors']).to match_array(
+ [
+ "The resource that you are attempting to access does not "\
+ "exist or you don't have permission to perform this action."
+ ])
end
end
end
diff --git a/spec/requests/api/graphql/project/cluster_agents_spec.rb b/spec/requests/api/graphql/project/cluster_agents_spec.rb
index a34df0ee6f4..bb716cf2849 100644
--- a/spec/requests/api/graphql/project/cluster_agents_spec.rb
+++ b/spec/requests/api/graphql/project/cluster_agents_spec.rb
@@ -61,11 +61,12 @@ RSpec.describe 'Project.cluster_agents' do
tokens = graphql_data_at(:project, :cluster_agents, :nodes, :tokens, :nodes)
- expect(tokens).to match([
- a_graphql_entity_for(token_3),
- a_graphql_entity_for(token_2),
- a_graphql_entity_for(token_1)
- ])
+ expect(tokens).to match(
+ [
+ a_graphql_entity_for(token_3),
+ a_graphql_entity_for(token_2),
+ a_graphql_entity_for(token_1)
+ ])
end
it 'does not suffer from N+1 performance issues' do
diff --git a/spec/requests/api/graphql/project/issue/designs/designs_spec.rb b/spec/requests/api/graphql/project/issue/designs/designs_spec.rb
index 02bc9457c07..965534654ea 100644
--- a/spec/requests/api/graphql/project/issue/designs/designs_spec.rb
+++ b/spec/requests/api/graphql/project/issue/designs/designs_spec.rb
@@ -245,9 +245,10 @@ RSpec.describe 'Getting designs related to an issue' do
end
it 'only returns one version record for the design (the original version)' do
- expect(version_nodes).to eq([
- [{ 'node' => { 'id' => global_id(version) } }]
- ])
+ expect(version_nodes).to eq(
+ [
+ [{ 'node' => { 'id' => global_id(version) } }]
+ ])
end
end
@@ -289,10 +290,11 @@ RSpec.describe 'Getting designs related to an issue' do
end
it 'returns the correct versions records for both designs' do
- expect(version_nodes).to eq([
- [{ 'node' => { 'id' => global_id(design.versions.first) } }],
- [{ 'node' => { 'id' => global_id(second_design.versions.first) } }]
- ])
+ expect(version_nodes).to eq(
+ [
+ [{ 'node' => { 'id' => global_id(design.versions.first) } }],
+ [{ 'node' => { 'id' => global_id(second_design.versions.first) } }]
+ ])
end
end
@@ -341,15 +343,16 @@ RSpec.describe 'Getting designs related to an issue' do
end
it 'returns all versions records for the designs' do
- expect(version_nodes).to eq([
+ expect(version_nodes).to eq(
[
- { 'node' => { 'id' => global_id(design.versions.first) } }
- ],
- [
- { 'node' => { 'id' => global_id(second_design.versions.second) } },
- { 'node' => { 'id' => global_id(second_design.versions.first) } }
- ]
- ])
+ [
+ { 'node' => { 'id' => global_id(design.versions.first) } }
+ ],
+ [
+ { 'node' => { 'id' => global_id(second_design.versions.second) } },
+ { 'node' => { 'id' => global_id(second_design.versions.first) } }
+ ]
+ ])
end
end
end
diff --git a/spec/requests/api/graphql/project/milestones_spec.rb b/spec/requests/api/graphql/project/milestones_spec.rb
index d1ee157fc74..a577c367fe5 100644
--- a/spec/requests/api/graphql/project/milestones_spec.rb
+++ b/spec/requests/api/graphql/project/milestones_spec.rb
@@ -25,9 +25,10 @@ RSpec.describe 'getting milestone listings nested in a project' do
graphql_query_for(
:project,
{ full_path: project.full_path },
- query_graphql_field(:milestones, search_params, [
- query_graphql_field(:nodes, nil, %i[id title])
- ])
+ query_graphql_field(:milestones, search_params,
+ [
+ query_graphql_field(:nodes, nil, %i[id title])
+ ])
)
end
diff --git a/spec/requests/api/graphql/project/work_items_spec.rb b/spec/requests/api/graphql/project/work_items_spec.rb
index 15520a2d88e..e82f6ad24a2 100644
--- a/spec/requests/api/graphql/project/work_items_spec.rb
+++ b/spec/requests/api/graphql/project/work_items_spec.rb
@@ -8,10 +8,19 @@ RSpec.describe 'getting a work item list for a project' do
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project, :repository, :public, group: group) }
let_it_be(:current_user) { create(:user) }
+ let_it_be(:label1) { create(:label, project: project) }
+ let_it_be(:label2) { create(:label, project: project) }
- let_it_be(:item1) { create(:work_item, project: project, discussion_locked: true, title: 'item1') }
+ let_it_be(:item1) { create(:work_item, project: project, discussion_locked: true, title: 'item1', labels: [label1]) }
let_it_be(:item2) do
- create(:work_item, project: project, title: 'item2', last_edited_by: current_user, last_edited_at: 1.day.ago)
+ create(
+ :work_item,
+ project: project,
+ title: 'item2',
+ last_edited_by: current_user,
+ last_edited_at: 1.day.ago,
+ labels: [label2]
+ )
end
let_it_be(:confidential_item) { create(:work_item, confidential: true, project: project, title: 'item3') }
@@ -40,7 +49,14 @@ RSpec.describe 'getting a work item list for a project' do
expect_graphql_errors_to_be_empty
- create_list(:work_item, 3, :task, :last_edited_by_user, last_edited_at: 1.week.ago, project: project)
+ create_list(
+ :work_item, 3,
+ :task,
+ :last_edited_by_user,
+ last_edited_at: 1.week.ago,
+ project: project,
+ labels: [label1, label2]
+ )
expect_graphql_errors_to_be_empty
expect { post_graphql(query, current_user: current_user) }.not_to exceed_query_limit(control)
@@ -74,6 +90,10 @@ RSpec.describe 'getting a work item list for a project' do
... on WorkItemWidgetHierarchy {
parent { id }
}
+ ... on WorkItemWidgetLabels {
+ labels { nodes { id } }
+ allowsScopedLabels
+ }
}
}
GRAPHQL
diff --git a/spec/requests/api/graphql/usage_trends_measurements_spec.rb b/spec/requests/api/graphql/usage_trends_measurements_spec.rb
index 69a3ed7e09c..78a4321f522 100644
--- a/spec/requests/api/graphql/usage_trends_measurements_spec.rb
+++ b/spec/requests/api/graphql/usage_trends_measurements_spec.rb
@@ -17,19 +17,25 @@ RSpec.describe 'UsageTrendsMeasurements' do
end
it 'returns measurement objects' do
- expect(graphql_data.dig('usageTrendsMeasurements', 'nodes')).to eq([
- { "count" => 10, 'identifier' => 'PROJECTS' },
- { "count" => 5, 'identifier' => 'PROJECTS' }
- ])
+ expect(graphql_data.dig('usageTrendsMeasurements', 'nodes')).to eq(
+ [
+ { "count" => 10, 'identifier' => 'PROJECTS' },
+ { "count" => 5, 'identifier' => 'PROJECTS' }
+ ])
end
context 'with recorded_at filters' do
- let(:arguments) { %(identifier: PROJECTS, recordedAfter: "#{15.days.ago.to_date}", recordedBefore: "#{5.days.ago.to_date}") }
+ let(:arguments) do
+ %(identifier: PROJECTS,
+ recordedAfter: "#{15.days.ago.to_date}",
+ recordedBefore: "#{5.days.ago.to_date}")
+ end
it 'returns filtered measurement objects' do
- expect(graphql_data.dig('usageTrendsMeasurements', 'nodes')).to eq([
- { "count" => 10, 'identifier' => 'PROJECTS' }
- ])
+ expect(graphql_data.dig('usageTrendsMeasurements', 'nodes')).to eq(
+ [
+ { "count" => 10, 'identifier' => 'PROJECTS' }
+ ])
end
end
end
diff --git a/spec/requests/api/graphql/work_item_spec.rb b/spec/requests/api/graphql/work_item_spec.rb
index e4bb4109c76..2105e479ed2 100644
--- a/spec/requests/api/graphql/work_item_spec.rb
+++ b/spec/requests/api/graphql/work_item_spec.rb
@@ -128,10 +128,11 @@ RSpec.describe 'Query.work_item(id)' do
hash_including(
'type' => 'HIERARCHY',
'parent' => nil,
- 'children' => { 'nodes' => match_array([
- hash_including('id' => child_link1.work_item.to_gid.to_s),
- hash_including('id' => child_link2.work_item.to_gid.to_s)
- ]) }
+ 'children' => { 'nodes' => match_array(
+ [
+ hash_including('id' => child_link1.work_item.to_gid.to_s),
+ hash_including('id' => child_link2.work_item.to_gid.to_s)
+ ]) }
)
)
)
@@ -161,9 +162,10 @@ RSpec.describe 'Query.work_item(id)' do
hash_including(
'type' => 'HIERARCHY',
'parent' => nil,
- 'children' => { 'nodes' => match_array([
- hash_including('id' => child_link1.work_item.to_gid.to_s)
- ]) }
+ 'children' => { 'nodes' => match_array(
+ [
+ hash_including('id' => child_link1.work_item.to_gid.to_s)
+ ]) }
)
)
)
diff --git a/spec/requests/api/issues/post_projects_issues_spec.rb b/spec/requests/api/issues/post_projects_issues_spec.rb
index 7c8994ad9ba..3883eb01391 100644
--- a/spec/requests/api/issues/post_projects_issues_spec.rb
+++ b/spec/requests/api/issues/post_projects_issues_spec.rb
@@ -274,9 +274,7 @@ RSpec.describe API::Issues do
post api("/projects/#{project.id}/issues", user),
params: { title: 'g' * 256 }
expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response['message']['title']).to eq([
- 'is too long (maximum is 255 characters)'
- ])
+ expect(json_response['message']['title']).to eq(['is too long (maximum is 255 characters)'])
end
context 'resolving discussions' do
diff --git a/spec/requests/api/issues/put_projects_issues_spec.rb b/spec/requests/api/issues/put_projects_issues_spec.rb
index 6ea77cc6578..d6c57b460e0 100644
--- a/spec/requests/api/issues/put_projects_issues_spec.rb
+++ b/spec/requests/api/issues/put_projects_issues_spec.rb
@@ -381,9 +381,7 @@ RSpec.describe API::Issues do
put api_for_user, params: { title: 'g' * 256 }
expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response['message']['title']).to eq([
- 'is too long (maximum is 255 characters)'
- ])
+ expect(json_response['message']['title']).to eq(['is too long (maximum is 255 characters)'])
end
end
diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb
index d90ff2c1bbe..39da84ed20a 100644
--- a/spec/requests/api/merge_requests_spec.rb
+++ b/spec/requests/api/merge_requests_spec.rb
@@ -119,10 +119,13 @@ RSpec.describe API::MergeRequests do
it 'returns an array of all merge_requests' do
get api(endpoint_path, user)
- expect_paginated_array_response([
- merge_request_merged.id, merge_request_locked.id,
- merge_request_closed.id, merge_request.id
- ])
+ expect_paginated_array_response(
+ [
+ merge_request_merged.id,
+ merge_request_locked.id,
+ merge_request_closed.id,
+ merge_request.id
+ ])
expect(json_response.last['title']).to eq(merge_request.title)
expect(json_response.last).to have_key('web_url')
@@ -172,10 +175,13 @@ RSpec.describe API::MergeRequests do
get api(path, user)
- expect_paginated_array_response([
- merge_request_merged.id, merge_request_locked.id,
- merge_request_closed.id, merge_request.id
- ])
+ expect_paginated_array_response(
+ [
+ merge_request_merged.id,
+ merge_request_locked.id,
+ merge_request_closed.id,
+ merge_request.id
+ ])
expect(json_response.last.keys).to match_array(%w(id iid title web_url created_at description project_id state updated_at))
expect(json_response.last['iid']).to eq(merge_request.iid)
expect(json_response.last['title']).to eq(merge_request.title)
@@ -190,10 +196,13 @@ RSpec.describe API::MergeRequests do
get api(path, user)
- expect_paginated_array_response([
- merge_request_merged.id, merge_request_locked.id,
- merge_request_closed.id, merge_request.id
- ])
+ expect_paginated_array_response(
+ [
+ merge_request_merged.id,
+ merge_request_locked.id,
+ merge_request_closed.id,
+ merge_request.id
+ ])
expect(json_response.last['title']).to eq(merge_request.title)
end
@@ -354,10 +363,13 @@ RSpec.describe API::MergeRequests do
get api(path, user)
- expect_paginated_array_response([
- merge_request.id, merge_request_closed.id,
- merge_request_locked.id, merge_request_merged.id
- ])
+ expect_paginated_array_response(
+ [
+ merge_request.id,
+ merge_request_closed.id,
+ merge_request_locked.id,
+ merge_request_merged.id
+ ])
response_dates = json_response.map { |merge_request| merge_request['created_at'] }
expect(response_dates).to eq(response_dates.sort)
end
@@ -367,10 +379,13 @@ RSpec.describe API::MergeRequests do
get api(path, user)
- expect_paginated_array_response([
- merge_request_merged.id, merge_request_locked.id,
- merge_request_closed.id, merge_request.id
- ])
+ expect_paginated_array_response(
+ [
+ merge_request_merged.id,
+ merge_request_locked.id,
+ merge_request_closed.id,
+ merge_request.id
+ ])
response_dates = json_response.map { |merge_request| merge_request['created_at'] }
expect(response_dates).to eq(response_dates.sort.reverse)
end
@@ -398,10 +413,13 @@ RSpec.describe API::MergeRequests do
get api(path, user)
- expect_paginated_array_response([
- merge_request.id, merge_request_locked.id,
- merge_request_merged.id, merge_request_closed.id
- ])
+ expect_paginated_array_response(
+ [
+ merge_request.id,
+ merge_request_locked.id,
+ merge_request_merged.id,
+ merge_request_closed.id
+ ])
response_dates = json_response.map { |merge_request| merge_request['updated_at'] }
expect(response_dates).to eq(response_dates.sort.reverse)
end
@@ -411,10 +429,13 @@ RSpec.describe API::MergeRequests do
get api(path, user)
- expect_paginated_array_response([
- merge_request.id, merge_request_closed.id,
- merge_request_locked.id, merge_request_merged.id
- ])
+ expect_paginated_array_response(
+ [
+ merge_request.id,
+ merge_request_closed.id,
+ merge_request_locked.id,
+ merge_request_merged.id
+ ])
response_dates = json_response.map { |merge_request| merge_request['created_at'] }
expect(response_dates).to eq(response_dates.sort)
end
diff --git a/spec/services/merge_requests/mark_reviewer_reviewed_service_spec.rb b/spec/services/merge_requests/mark_reviewer_reviewed_service_spec.rb
index 8669ec8d3ec..8437876c3cf 100644
--- a/spec/services/merge_requests/mark_reviewer_reviewed_service_spec.rb
+++ b/spec/services/merge_requests/mark_reviewer_reviewed_service_spec.rb
@@ -20,10 +20,8 @@ RSpec.describe MergeRequests::MarkReviewerReviewedService do
expect(result[:status]).to eq :error
end
- it 'does not trigger graphql subscription mergeRequestReviewersUpdated' do
- expect(GraphqlTriggers).not_to receive(:merge_request_reviewers_updated)
-
- result
+ it_behaves_like 'does not trigger GraphQL subscription mergeRequestReviewersUpdated' do
+ let(:action) { result }
end
end
@@ -49,10 +47,8 @@ RSpec.describe MergeRequests::MarkReviewerReviewedService do
expect(reviewer.state).to eq 'reviewed'
end
- it 'triggers graphql subscription mergeRequestReviewersUpdated' do
- expect(GraphqlTriggers).to receive(:merge_request_reviewers_updated).with(merge_request)
-
- result
+ it_behaves_like 'triggers GraphQL subscription mergeRequestReviewersUpdated' do
+ let(:action) { result }
end
end
end
diff --git a/spec/services/merge_requests/request_review_service_spec.rb b/spec/services/merge_requests/request_review_service_spec.rb
index 563f33b90f4..1d3f92b083f 100644
--- a/spec/services/merge_requests/request_review_service_spec.rb
+++ b/spec/services/merge_requests/request_review_service_spec.rb
@@ -30,10 +30,8 @@ RSpec.describe MergeRequests::RequestReviewService do
expect(result[:status]).to eq :error
end
- it 'does not trigger graphql subscription mergeRequestReviewersUpdated' do
- expect(GraphqlTriggers).not_to receive(:merge_request_reviewers_updated)
-
- result
+ it_behaves_like 'does not trigger GraphQL subscription mergeRequestReviewersUpdated' do
+ let(:action) { result }
end
end
@@ -73,10 +71,8 @@ RSpec.describe MergeRequests::RequestReviewService do
service.execute(merge_request, user)
end
- it 'triggers graphql subscription mergeRequestReviewersUpdated' do
- expect(GraphqlTriggers).to receive(:merge_request_reviewers_updated).with(merge_request)
-
- result
+ it_behaves_like 'triggers GraphQL subscription mergeRequestReviewersUpdated' do
+ let(:action) { result }
end
end
end
diff --git a/spec/services/merge_requests/update_reviewers_service_spec.rb b/spec/services/merge_requests/update_reviewers_service_spec.rb
index 96824ea6974..9f935e1cecf 100644
--- a/spec/services/merge_requests/update_reviewers_service_spec.rb
+++ b/spec/services/merge_requests/update_reviewers_service_spec.rb
@@ -128,10 +128,8 @@ RSpec.describe MergeRequests::UpdateReviewersService do
set_reviewers
end
- it 'triggers graphql subscription mergeRequestReviewersUpdated' do
- expect(GraphqlTriggers).to receive(:merge_request_reviewers_updated).with(merge_request)
-
- set_reviewers
+ it_behaves_like 'triggers GraphQL subscription mergeRequestReviewersUpdated' do
+ let(:action) { set_reviewers }
end
it 'calls MergeRequest::ResolveTodosService#async_execute' do
@@ -158,10 +156,8 @@ RSpec.describe MergeRequests::UpdateReviewersService do
context 'when reviewers did not change' do
let(:opts) { { reviewer_ids: merge_request.reviewer_ids } }
- it 'does not trigger graphql subscription mergeRequestReviewersUpdated' do
- expect(GraphqlTriggers).not_to receive(:merge_request_reviewers_updated)
-
- set_reviewers
+ it_behaves_like 'does not trigger GraphQL subscription mergeRequestReviewersUpdated' do
+ let(:action) { set_reviewers }
end
end
diff --git a/spec/services/merge_requests/update_service_spec.rb b/spec/services/merge_requests/update_service_spec.rb
index 93aeb3fc909..687065a6516 100644
--- a/spec/services/merge_requests/update_service_spec.rb
+++ b/spec/services/merge_requests/update_service_spec.rb
@@ -700,18 +700,14 @@ RSpec.describe MergeRequests::UpdateService, :mailer do
expect(user3.review_requested_open_merge_requests_count).to eq(0)
end
- it 'triggers graphql subscription mergeRequestReviewersUpdated' do
- expect(GraphqlTriggers).to receive(:merge_request_reviewers_updated).with(merge_request)
-
- update_merge_request({ reviewer_ids: [user2.id] })
+ it_behaves_like 'triggers GraphQL subscription mergeRequestReviewersUpdated' do
+ let(:action) { update_merge_request({ reviewer_ids: [user2.id] }) }
end
end
context 'when reviewers did not change' do
- it 'does not trigger graphql subscription mergeRequestReviewersUpdated' do
- expect(GraphqlTriggers).not_to receive(:merge_request_reviewers_updated)
-
- update_merge_request({ reviewer_ids: [merge_request.reviewer_ids] })
+ it_behaves_like 'does not trigger GraphQL subscription mergeRequestReviewersUpdated' do
+ let(:action) { update_merge_request({ reviewer_ids: [merge_request.reviewer_ids] }) }
end
end
diff --git a/spec/services/projects/update_service_spec.rb b/spec/services/projects/update_service_spec.rb
index 85d3e99109d..1a4bbfacb3f 100644
--- a/spec/services/projects/update_service_spec.rb
+++ b/spec/services/projects/update_service_spec.rb
@@ -11,10 +11,27 @@ RSpec.describe Projects::UpdateService do
create(:project, creator: user, namespace: user.namespace)
end
+ shared_examples 'publishing Projects::ProjectAttributesChangedEvent' do |params:, attributes:|
+ it "publishes Projects::ProjectAttributesChangedEvent" do
+ expect { update_project(project, user, params) }
+ .to publish_event(Projects::ProjectAttributesChangedEvent)
+ .with(
+ project_id: project.id,
+ namespace_id: project.namespace_id,
+ root_namespace_id: project.root_namespace.id,
+ attributes: attributes
+ )
+ end
+ end
+
describe '#execute' do
let(:admin) { create(:admin) }
context 'when changing visibility level' do
+ it_behaves_like 'publishing Projects::ProjectAttributesChangedEvent',
+ params: { visibility_level: Gitlab::VisibilityLevel::INTERNAL },
+ attributes: %w[updated_at visibility_level]
+
context 'when visibility_level changes to INTERNAL' do
it 'updates the project to internal' do
expect(TodosDestroyer::ProjectPrivateWorker).not_to receive(:perform_in)
@@ -349,6 +366,10 @@ RSpec.describe Projects::UpdateService do
end
context 'when archiving a project' do
+ it_behaves_like 'publishing Projects::ProjectAttributesChangedEvent',
+ params: { archived: true },
+ attributes: %w[updated_at archived]
+
it 'publishes a ProjectTransferedEvent' do
expect { update_project(project, user, archived: true) }
.to publish_event(Projects::ProjectArchivedEvent)
diff --git a/spec/support/shared_examples/services/reviewers_change_trigger_shared_examples.rb b/spec/support/shared_examples/services/reviewers_change_trigger_shared_examples.rb
new file mode 100644
index 00000000000..cc37ea0c6f0
--- /dev/null
+++ b/spec/support/shared_examples/services/reviewers_change_trigger_shared_examples.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'triggers GraphQL subscription mergeRequestReviewersUpdated' do
+ specify do
+ expect(GraphqlTriggers).to receive(:merge_request_reviewers_updated).with(merge_request)
+
+ action
+ end
+end
+
+RSpec.shared_examples 'does not trigger GraphQL subscription mergeRequestReviewersUpdated' do
+ specify do
+ expect(GraphqlTriggers).not_to receive(:merge_request_reviewers_updated)
+
+ action
+ end
+end
diff --git a/vendor/gems/attr_encrypted/test/active_record_test.rb b/vendor/gems/attr_encrypted/test/active_record_test.rb
index 133546b3ceb..4c903bc3cd8 100644
--- a/vendor/gems/attr_encrypted/test/active_record_test.rb
+++ b/vendor/gems/attr_encrypted/test/active_record_test.rb
@@ -80,6 +80,10 @@ class PersonWithProcMode < Person
attr_encrypted :credentials, key: SECRET_KEY, mode: Proc.new { :single_iv_and_salt }, insecure_mode: true
end
+class PersonWithInstanceAttribute < Person
+ attr_encrypted :age
+end
+
class Account < ActiveRecord::Base
ACCOUNT_ENCRYPTION_KEY = SecureRandom.urlsafe_base64(24)
attr_encrypted :password, key: :password_encryption_key
@@ -343,4 +347,22 @@ class ActiveRecordTest < Minitest::Test
refute_equal address.encrypted_zipcode, zipcode
assert_equal address.zipcode, zipcode
end
+
+ # See https://github.com/attr-encrypted/attr_encrypted/issues/332
+ def test_attribute_instance_methods_as_symbols_available_returns_false
+ assert_equal false, ActiveRecord::Base.__send__(:attribute_instance_methods_as_symbols_available?)
+ end
+
+ # See https://github.com/attr-encrypted/attr_encrypted/issues/332
+ def test_does_not_define_virtual_attributes
+ instance = Person.new
+
+ %w[
+ encrypted_age encrypted_age=
+ encrypted_age_iv encrypted_age_iv=
+ encrypted_age_salt encrypted_age_salt=
+ ].each do |method_name|
+ assert_equal false, instance.respond_to?(method_name), "should not define #{method_name}"
+ end
+ end
end