Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2022-05-26 12:08:11 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2022-05-26 12:08:11 +0300
commit026a5e91019666751e54629b91ebbdefec95c5bc (patch)
treef755e5ba388b0fed37faf7647ef841c58dbe5f6b /spec
parent864dae0d98424b463501c21eda1b633c14956fa9 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r--spec/controllers/admin/clusters_controller_spec.rb57
-rw-r--r--spec/controllers/groups/clusters_controller_spec.rb136
-rw-r--r--spec/controllers/projects/clusters_controller_spec.rb144
-rw-r--r--spec/controllers/projects/commits_controller_spec.rb8
-rw-r--r--spec/controllers/projects/settings/ci_cd_controller_spec.rb13
-rw-r--r--spec/db/migration_spec.rb2
-rw-r--r--spec/features/clusters/cluster_detail_page_spec.rb14
-rw-r--r--spec/graphql/types/work_item_type_spec.rb13
-rw-r--r--spec/graphql/types/work_items/widget_interface_spec.rb29
-rw-r--r--spec/graphql/types/work_items/widget_type_enum_spec.rb13
-rw-r--r--spec/graphql/types/work_items/widgets/description_type_spec.rb11
-rw-r--r--spec/lib/gitlab/graphql/markdown_field_spec.rb28
-rw-r--r--spec/models/user_spec.rb10
-rw-r--r--spec/models/work_item_spec.rb6
-rw-r--r--spec/models/work_items/type_spec.rb8
-rw-r--r--spec/models/work_items/widgets/base_spec.rb19
-rw-r--r--spec/models/work_items/widgets/description_spec.rb25
-rw-r--r--spec/requests/api/graphql/work_item_spec.rb30
18 files changed, 186 insertions, 380 deletions
diff --git a/spec/controllers/admin/clusters_controller_spec.rb b/spec/controllers/admin/clusters_controller_spec.rb
index ca2b50b529c..c432adb6ae3 100644
--- a/spec/controllers/admin/clusters_controller_spec.rb
+++ b/spec/controllers/admin/clusters_controller_spec.rb
@@ -210,63 +210,6 @@ RSpec.describe Admin::ClustersController do
end
end
- describe 'POST authorize AWS role for EKS cluster' do
- let!(:role) { create(:aws_role, user: admin) }
-
- let(:role_arn) { 'arn:new-role' }
- let(:params) do
- {
- cluster: {
- role_arn: role_arn
- }
- }
- end
-
- def go
- post :authorize_aws_role, params: params
- end
-
- include_examples ':certificate_based_clusters feature flag controller responses' do
- let(:subject) { go }
- end
-
- before do
- allow(Clusters::Aws::FetchCredentialsService).to receive(:new)
- .and_return(double(execute: double))
- end
-
- it 'updates the associated role with the supplied ARN' do
- go
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(role.reload.role_arn).to eq(role_arn)
- end
-
- context 'supplied role is invalid' do
- let(:role_arn) { 'invalid-role' }
-
- it 'does not update the associated role' do
- expect { go }.not_to change { role.role_arn }
-
- expect(response).to have_gitlab_http_status(:unprocessable_entity)
- end
- end
-
- describe 'security' do
- before do
- allow_next_instance_of(Clusters::Aws::AuthorizeRoleService) do |service|
- response = double(status: :ok, body: double)
-
- allow(service).to receive(:execute).and_return(response)
- end
- end
-
- it { expect { go }.to be_allowed_for(:admin) }
- it { expect { go }.to be_denied_for(:user) }
- it { expect { go }.to be_denied_for(:external) }
- end
- end
-
describe 'DELETE clear cluster cache' do
let(:cluster) { create(:cluster, :instance) }
let!(:kubernetes_namespace) do
diff --git a/spec/controllers/groups/clusters_controller_spec.rb b/spec/controllers/groups/clusters_controller_spec.rb
index 4b82c5ceb1c..eb3fe4bc330 100644
--- a/spec/controllers/groups/clusters_controller_spec.rb
+++ b/spec/controllers/groups/clusters_controller_spec.rb
@@ -262,142 +262,6 @@ RSpec.describe Groups::ClustersController do
end
end
- describe 'POST #create_aws' do
- let(:params) do
- {
- cluster: {
- name: 'new-cluster',
- provider_aws_attributes: {
- key_name: 'key',
- role_arn: 'arn:role',
- region: 'region',
- vpc_id: 'vpc',
- instance_type: 'instance type',
- num_nodes: 3,
- security_group_id: 'security group',
- subnet_ids: %w(subnet1 subnet2)
- }
- }
- }
- end
-
- def post_create_aws
- post :create_aws, params: params.merge(group_id: group)
- end
-
- include_examples ':certificate_based_clusters feature flag controller responses' do
- let(:subject) { post_create_aws }
- end
-
- it 'creates a new cluster' do
- expect(ClusterProvisionWorker).to receive(:perform_async)
- expect { post_create_aws }.to change { Clusters::Cluster.count }
- .and change { Clusters::Providers::Aws.count }
-
- cluster = group.clusters.first
-
- expect(response).to have_gitlab_http_status(:created)
- expect(response.location).to eq(group_cluster_path(group, cluster))
- expect(cluster).to be_aws
- expect(cluster).to be_kubernetes
- end
-
- context 'params are invalid' do
- let(:params) do
- {
- cluster: { name: '' }
- }
- end
-
- it 'does not create a cluster' do
- expect { post_create_aws }.not_to change { Clusters::Cluster.count }
-
- expect(response).to have_gitlab_http_status(:unprocessable_entity)
- expect(response.media_type).to eq('application/json')
- expect(response.body).to include('is invalid')
- end
- end
-
- describe 'security' do
- before do
- allow(WaitForClusterCreationWorker).to receive(:perform_in)
- end
-
- it('is allowed for admin when admin mode is enabled', :enable_admin_mode) { expect { post_create_aws }.to be_allowed_for(:admin) }
- it('is denied for admin when admin mode is disabled') { expect { post_create_aws }.to be_denied_for(:admin) }
- it { expect { post_create_aws }.to be_allowed_for(:owner).of(group) }
- it { expect { post_create_aws }.to be_allowed_for(:maintainer).of(group) }
- it { expect { post_create_aws }.to be_denied_for(:developer).of(group) }
- it { expect { post_create_aws }.to be_denied_for(:reporter).of(group) }
- it { expect { post_create_aws }.to be_denied_for(:guest).of(group) }
- it { expect { post_create_aws }.to be_denied_for(:user) }
- it { expect { post_create_aws }.to be_denied_for(:external) }
- end
- end
-
- describe 'POST authorize AWS role for EKS cluster' do
- let!(:role) { create(:aws_role, user: user) }
-
- let(:role_arn) { 'arn:new-role' }
- let(:params) do
- {
- cluster: {
- role_arn: role_arn
- }
- }
- end
-
- def go
- post :authorize_aws_role, params: params.merge(group_id: group)
- end
-
- include_examples ':certificate_based_clusters feature flag controller responses' do
- let(:subject) { go }
- end
-
- before do
- allow(Clusters::Aws::FetchCredentialsService).to receive(:new)
- .and_return(double(execute: double))
- end
-
- it 'updates the associated role with the supplied ARN' do
- go
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(role.reload.role_arn).to eq(role_arn)
- end
-
- context 'supplied role is invalid' do
- let(:role_arn) { 'invalid-role' }
-
- it 'does not update the associated role' do
- expect { go }.not_to change { role.role_arn }
-
- expect(response).to have_gitlab_http_status(:unprocessable_entity)
- end
- end
-
- describe 'security' do
- before do
- allow_next_instance_of(Clusters::Aws::AuthorizeRoleService) do |service|
- response = double(status: :ok, body: double)
-
- allow(service).to receive(:execute).and_return(response)
- end
- end
-
- it('is allowed for admin when admin mode is enabled', :enable_admin_mode) { expect { go }.to be_allowed_for(:admin) }
- it('is denied for admin when admin mode is disabled') { expect { go }.to be_denied_for(:admin) }
- it { expect { go }.to be_allowed_for(:owner).of(group) }
- it { expect { go }.to be_allowed_for(:maintainer).of(group) }
- it { expect { go }.to be_denied_for(:developer).of(group) }
- it { expect { go }.to be_denied_for(:reporter).of(group) }
- it { expect { go }.to be_denied_for(:guest).of(group) }
- it { expect { go }.to be_denied_for(:user) }
- it { expect { go }.to be_denied_for(:external) }
- end
- end
-
describe 'DELETE clear cluster cache' do
let(:cluster) { create(:cluster, :group, groups: [group]) }
let!(:kubernetes_namespace) do
diff --git a/spec/controllers/projects/clusters_controller_spec.rb b/spec/controllers/projects/clusters_controller_spec.rb
index 01420e30d24..d45ea268e64 100644
--- a/spec/controllers/projects/clusters_controller_spec.rb
+++ b/spec/controllers/projects/clusters_controller_spec.rb
@@ -272,150 +272,6 @@ RSpec.describe Projects::ClustersController do
end
end
- describe 'POST #create_aws' do
- let(:params) do
- {
- cluster: {
- name: 'new-cluster',
- provider_aws_attributes: {
- key_name: 'key',
- role_arn: 'arn:role',
- region: 'region',
- vpc_id: 'vpc',
- instance_type: 'instance type',
- num_nodes: 3,
- security_group_id: 'security group',
- subnet_ids: %w(subnet1 subnet2)
- }
- }
- }
- end
-
- def post_create_aws
- post :create_aws, params: params.merge(namespace_id: project.namespace, project_id: project)
- end
-
- include_examples ':certificate_based_clusters feature flag controller responses' do
- let(:subject) { post_create_aws }
- end
-
- it 'creates a new cluster' do
- expect(ClusterProvisionWorker).to receive(:perform_async)
- expect { post_create_aws }.to change { Clusters::Cluster.count }
- .and change { Clusters::Providers::Aws.count }
-
- cluster = project.clusters.first
-
- expect(response).to have_gitlab_http_status(:created)
- expect(response.location).to eq(project_cluster_path(project, cluster))
- expect(cluster).to be_aws
- expect(cluster).to be_kubernetes
- end
-
- context 'params are invalid' do
- let(:params) do
- {
- cluster: { name: '' }
- }
- end
-
- it 'does not create a cluster' do
- expect { post_create_aws }.not_to change { Clusters::Cluster.count }
-
- expect(response).to have_gitlab_http_status(:unprocessable_entity)
- expect(response.media_type).to eq('application/json')
- expect(response.body).to include('is invalid')
- end
- end
-
- describe 'security' do
- before do
- allow(WaitForClusterCreationWorker).to receive(:perform_in)
- end
-
- it 'is allowed for admin when admin mode enabled', :enable_admin_mode do
- expect { post_create_aws }.to be_allowed_for(:admin)
- end
- it 'is disabled for admin when admin mode disabled' do
- expect { post_create_aws }.to be_denied_for(:admin)
- end
- it { expect { post_create_aws }.to be_allowed_for(:owner).of(project) }
- it { expect { post_create_aws }.to be_allowed_for(:maintainer).of(project) }
- it { expect { post_create_aws }.to be_denied_for(:developer).of(project) }
- it { expect { post_create_aws }.to be_denied_for(:reporter).of(project) }
- it { expect { post_create_aws }.to be_denied_for(:guest).of(project) }
- it { expect { post_create_aws }.to be_denied_for(:user) }
- it { expect { post_create_aws }.to be_denied_for(:external) }
- end
- end
-
- describe 'POST authorize AWS role for EKS cluster' do
- let!(:role) { create(:aws_role, user: user) }
-
- let(:role_arn) { 'arn:new-role' }
- let(:params) do
- {
- cluster: {
- role_arn: role_arn
- }
- }
- end
-
- def go
- post :authorize_aws_role, params: params.merge(namespace_id: project.namespace, project_id: project)
- end
-
- before do
- allow(Clusters::Aws::FetchCredentialsService).to receive(:new)
- .and_return(double(execute: double))
- end
-
- include_examples ':certificate_based_clusters feature flag controller responses' do
- let(:subject) { go }
- end
-
- it 'updates the associated role with the supplied ARN' do
- go
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(role.reload.role_arn).to eq(role_arn)
- end
-
- context 'supplied role is invalid' do
- let(:role_arn) { 'invalid-role' }
-
- it 'does not update the associated role' do
- expect { go }.not_to change { role.role_arn }
-
- expect(response).to have_gitlab_http_status(:unprocessable_entity)
- end
- end
-
- describe 'security' do
- before do
- allow_next_instance_of(Clusters::Aws::AuthorizeRoleService) do |service|
- response = double(status: :ok, body: double)
-
- allow(service).to receive(:execute).and_return(response)
- end
- end
-
- it 'is allowed for admin when admin mode enabled', :enable_admin_mode do
- expect { go }.to be_allowed_for(:admin)
- end
- it 'is disabled for admin when admin mode disabled' do
- expect { go }.to be_denied_for(:admin)
- end
- it { expect { go }.to be_allowed_for(:owner).of(project) }
- it { expect { go }.to be_allowed_for(:maintainer).of(project) }
- it { expect { go }.to be_denied_for(:developer).of(project) }
- it { expect { go }.to be_denied_for(:reporter).of(project) }
- it { expect { go }.to be_denied_for(:guest).of(project) }
- it { expect { go }.to be_denied_for(:user) }
- it { expect { go }.to be_denied_for(:external) }
- end
- end
-
describe 'DELETE clear cluster cache' do
let(:cluster) { create(:cluster, :project, projects: [project]) }
let!(:kubernetes_namespace) { create(:cluster_kubernetes_namespace, cluster: cluster) }
diff --git a/spec/controllers/projects/commits_controller_spec.rb b/spec/controllers/projects/commits_controller_spec.rb
index c7f98406201..26d4725656f 100644
--- a/spec/controllers/projects/commits_controller_spec.rb
+++ b/spec/controllers/projects/commits_controller_spec.rb
@@ -166,6 +166,14 @@ RSpec.describe Projects::CommitsController do
end
end
end
+
+ context 'with markdown cache' do
+ it 'preloads markdown cache for commits' do
+ expect(Commit).to receive(:preload_markdown_cache!).and_call_original
+
+ get :show, params: { namespace_id: project.namespace, project_id: project, id: 'master/README.md' }
+ end
+ end
end
describe "GET /commits/:id/signatures" do
diff --git a/spec/controllers/projects/settings/ci_cd_controller_spec.rb b/spec/controllers/projects/settings/ci_cd_controller_spec.rb
index 7e96e99640a..d50f1aa1dd8 100644
--- a/spec/controllers/projects/settings/ci_cd_controller_spec.rb
+++ b/spec/controllers/projects/settings/ci_cd_controller_spec.rb
@@ -25,19 +25,6 @@ RSpec.describe Projects::Settings::CiCdController do
expect(response).to render_template(:show)
end
- context 'when the FF ci_owned_runners_cross_joins_fix is disabled' do
- before do
- stub_feature_flags(ci_owned_runners_cross_joins_fix: false)
- end
-
- it 'renders show with 200 status code' do
- get :show, params: { namespace_id: project.namespace, project_id: project }
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to render_template(:show)
- end
- end
-
context 'with CI/CD disabled' do
before do
project.project_feature.update_attribute(:builds_access_level, ProjectFeature::DISABLED)
diff --git a/spec/db/migration_spec.rb b/spec/db/migration_spec.rb
index ac649925751..7987c78b423 100644
--- a/spec/db/migration_spec.rb
+++ b/spec/db/migration_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe 'Migrations Validation' do
let(:all_migration_classes) do
{
2022_01_26_21_06_58.. => Gitlab::Database::Migration[2.0],
- 2021_09_01_15_33_24.. => Gitlab::Database::Migration[1.0],
+ 2021_09_01_15_33_24..2022_04_25_12_06_03 => Gitlab::Database::Migration[1.0],
2021_05_31_05_39_16..2021_09_01_15_33_24 => ActiveRecord::Migration[6.1],
..2021_05_31_05_39_16 => ActiveRecord::Migration[6.0]
}
diff --git a/spec/features/clusters/cluster_detail_page_spec.rb b/spec/features/clusters/cluster_detail_page_spec.rb
index 09e042b00cc..06e3e00db7d 100644
--- a/spec/features/clusters/cluster_detail_page_spec.rb
+++ b/spec/features/clusters/cluster_detail_page_spec.rb
@@ -36,20 +36,6 @@ RSpec.describe 'Clusterable > Show page' do
expect(page).not_to have_selector('[data-testid="cluster-environments-tab"]')
end
-
- context 'content-security policy' do
- it 'has AWS domains in the CSP' do
- visit cluster_path
-
- expect(response_headers['Content-Security-Policy']).to include(::Clusters::ClustersController::AWS_CSP_DOMAINS.join(' '))
- end
-
- it 'keeps existing connect-src in the CSP' do
- visit cluster_path
-
- expect(response_headers['Content-Security-Policy']).to include("connect-src #{Gitlab::ContentSecurityPolicy::Directives.connect_src}")
- end
- end
end
shared_examples 'editing a GCP cluster' do
diff --git a/spec/graphql/types/work_item_type_spec.rb b/spec/graphql/types/work_item_type_spec.rb
index a0480506156..7ed58786b5b 100644
--- a/spec/graphql/types/work_item_type_spec.rb
+++ b/spec/graphql/types/work_item_type_spec.rb
@@ -10,7 +10,18 @@ RSpec.describe GitlabSchema.types['WorkItem'] do
specify { expect(described_class).to expose_permissions_using(Types::PermissionTypes::WorkItem) }
it 'has specific fields' do
- fields = %i[description description_html id iid lock_version state title title_html userPermissions work_item_type]
+ fields = %i[
+ description
+ description_html
+ id
+ iid
+ lock_version
+ state title
+ title_html
+ userPermissions
+ widgets
+ work_item_type
+ ]
fields.each do |field_name|
expect(described_class).to have_graphql_fields(*fields)
diff --git a/spec/graphql/types/work_items/widget_interface_spec.rb b/spec/graphql/types/work_items/widget_interface_spec.rb
new file mode 100644
index 00000000000..63d7782df28
--- /dev/null
+++ b/spec/graphql/types/work_items/widget_interface_spec.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Types::WorkItems::WidgetInterface do
+ include GraphqlHelpers
+
+ it 'exposes the expected fields' do
+ expected_fields = %i[type]
+
+ expect(described_class).to have_graphql_fields(*expected_fields)
+ end
+
+ describe ".resolve_type" do
+ it 'knows the correct type for objects' do
+ expect(
+ described_class.resolve_type(WorkItems::Widgets::Description.new(build(:work_item)), {})
+ ).to eq(Types::WorkItems::Widgets::DescriptionType)
+ end
+
+ it 'raises an error for an unknown type' do
+ project = build(:project)
+
+ expect_graphql_error_to_be_created("Unknown GraphQL type for widget #{project}") do
+ described_class.resolve_type(project, {})
+ end
+ end
+ end
+end
diff --git a/spec/graphql/types/work_items/widget_type_enum_spec.rb b/spec/graphql/types/work_items/widget_type_enum_spec.rb
new file mode 100644
index 00000000000..e7ac9b9c317
--- /dev/null
+++ b/spec/graphql/types/work_items/widget_type_enum_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['WorkItemWidgetType'] do
+ specify { expect(described_class.graphql_name).to eq('WorkItemWidgetType') }
+
+ it 'exposes all the existing widget type values' do
+ expect(described_class.values.transform_values { |v| v.value }).to include(
+ 'DESCRIPTION' => :description
+ )
+ end
+end
diff --git a/spec/graphql/types/work_items/widgets/description_type_spec.rb b/spec/graphql/types/work_items/widgets/description_type_spec.rb
new file mode 100644
index 00000000000..5ade1fe4aa2
--- /dev/null
+++ b/spec/graphql/types/work_items/widgets/description_type_spec.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Types::WorkItems::Widgets::DescriptionType do
+ it 'exposes the expected fields' do
+ expected_fields = %i[description description_html type]
+
+ expect(described_class).to have_graphql_fields(*expected_fields)
+ end
+end
diff --git a/spec/lib/gitlab/graphql/markdown_field_spec.rb b/spec/lib/gitlab/graphql/markdown_field_spec.rb
index 84494d3dd68..a73eba1e9db 100644
--- a/spec/lib/gitlab/graphql/markdown_field_spec.rb
+++ b/spec/lib/gitlab/graphql/markdown_field_spec.rb
@@ -55,6 +55,20 @@ RSpec.describe Gitlab::Graphql::MarkdownField do
end
end
+ context 'when a block is passed for the resolved object' do
+ let(:type_class) do
+ class_with_markdown_field(:note_html, null: false) do |resolved_object|
+ resolved_object.object
+ end
+ end
+
+ let(:type_instance) { type_class.authorized_new(class_wrapped_object(note), context) }
+
+ it 'renders markdown from the same property as the field name without the `_html` suffix' do
+ expect(field.resolve(type_instance, {}, context)).to eq(expected_markdown)
+ end
+ end
+
describe 'basic verification that references work' do
let_it_be(:project) { create(:project, :public) }
@@ -83,12 +97,22 @@ RSpec.describe Gitlab::Graphql::MarkdownField do
end
end
- def class_with_markdown_field(name, **args)
+ def class_with_markdown_field(name, **args, &blk)
Class.new(Types::BaseObject) do
prepend Gitlab::Graphql::MarkdownField
graphql_name 'MarkdownFieldTest'
- markdown_field name, **args
+ markdown_field name, **args, &blk
end
end
+
+ def class_wrapped_object(object)
+ Class.new do
+ def initialize(object)
+ @object = object
+ end
+
+ attr_accessor :object
+ end.new(object)
+ end
end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 71171f98492..67d7e29627b 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -4363,16 +4363,6 @@ RSpec.describe User do
it_behaves_like '#ci_owned_runners'
end
- context 'when FF ci_owned_runners_cross_joins_fix is disabled' do
- before do
- skip_if_multiple_databases_are_setup
-
- stub_feature_flags(ci_owned_runners_cross_joins_fix: false)
- end
-
- it_behaves_like '#ci_owned_runners'
- end
-
context 'when FF ci_owned_runners_unnest_index is disabled uses GIN index' do
before do
stub_feature_flags(ci_owned_runners_unnest_index: false)
diff --git a/spec/models/work_item_spec.rb b/spec/models/work_item_spec.rb
index d126e81f1cd..6b2e33ec08d 100644
--- a/spec/models/work_item_spec.rb
+++ b/spec/models/work_item_spec.rb
@@ -33,6 +33,12 @@ RSpec.describe WorkItem do
end
end
+ describe '#widgets' do
+ subject { build(:work_item).widgets }
+
+ it { is_expected.to contain_exactly(instance_of(WorkItems::Widgets::Description)) }
+ end
+
describe 'callbacks' do
describe 'record_create_action' do
it 'records the creation action after saving' do
diff --git a/spec/models/work_items/type_spec.rb b/spec/models/work_items/type_spec.rb
index 6e9f3210e65..6936b8f558e 100644
--- a/spec/models/work_items/type_spec.rb
+++ b/spec/models/work_items/type_spec.rb
@@ -60,7 +60,13 @@ RSpec.describe WorkItems::Type do
it { is_expected.not_to allow_value('s' * 256).for(:icon_name) }
end
- describe 'default?' do
+ describe '.available_widgets' do
+ subject { described_class.available_widgets }
+
+ it { is_expected.to contain_exactly(::WorkItems::Widgets::Description) }
+ end
+
+ describe '#default?' do
subject { build(:work_item_type, namespace: namespace).default? }
context 'when namespace is nil' do
diff --git a/spec/models/work_items/widgets/base_spec.rb b/spec/models/work_items/widgets/base_spec.rb
new file mode 100644
index 00000000000..9b4b4d9e98f
--- /dev/null
+++ b/spec/models/work_items/widgets/base_spec.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe WorkItems::Widgets::Base do
+ let_it_be(:work_item) { create(:work_item, description: '# Title') }
+
+ describe '.type' do
+ subject { described_class.type }
+
+ it { is_expected.to eq(:base) }
+ end
+
+ describe '#type' do
+ subject { described_class.new(work_item).type }
+
+ it { is_expected.to eq(:base) }
+ end
+end
diff --git a/spec/models/work_items/widgets/description_spec.rb b/spec/models/work_items/widgets/description_spec.rb
new file mode 100644
index 00000000000..8359db31bff
--- /dev/null
+++ b/spec/models/work_items/widgets/description_spec.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe WorkItems::Widgets::Description do
+ let_it_be(:work_item) { create(:work_item, description: '# Title') }
+
+ describe '.type' do
+ subject { described_class.type }
+
+ it { is_expected.to eq(:description) }
+ end
+
+ describe '#type' do
+ subject { described_class.new(work_item).type }
+
+ it { is_expected.to eq(:description) }
+ end
+
+ describe '#description' do
+ subject { described_class.new(work_item).description }
+
+ it { is_expected.to eq(work_item.description) }
+ end
+end
diff --git a/spec/requests/api/graphql/work_item_spec.rb b/spec/requests/api/graphql/work_item_spec.rb
index 5b34c21989a..1c93ae453c0 100644
--- a/spec/requests/api/graphql/work_item_spec.rb
+++ b/spec/requests/api/graphql/work_item_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe 'Query.work_item(id)' do
let_it_be(:developer) { create(:user) }
let_it_be(:project) { create(:project, :private).tap { |project| project.add_developer(developer) } }
- let_it_be(:work_item) { create(:work_item, project: project) }
+ let_it_be(:work_item) { create(:work_item, project: project, description: '- List item') }
let(:current_user) { developer }
let(:work_item_data) { graphql_data['workItem'] }
@@ -38,6 +38,34 @@ RSpec.describe 'Query.work_item(id)' do
)
end
+ context 'when querying widgets' do
+ let(:work_item_fields) do
+ <<~GRAPHQL
+ id
+ widgets {
+ type
+ ... on WorkItemWidgetDescription {
+ description
+ descriptionHtml
+ }
+ }
+ GRAPHQL
+ end
+
+ it 'returns widget information' do
+ expect(work_item_data).to include(
+ 'id' => work_item.to_gid.to_s,
+ 'widgets' => contain_exactly(
+ hash_including(
+ 'type' => 'DESCRIPTION',
+ 'description' => work_item.description,
+ 'descriptionHtml' => ::MarkupHelper.markdown_field(work_item, :description, {})
+ )
+ )
+ )
+ end
+ end
+
context 'when an Issue Global ID is provided' do
let(:global_id) { Issue.find(work_item.id).to_gid.to_s }