Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2024-01-31 09:09:21 +00:00
parent b51f959ffa
commit 7bea85341e
28 changed files with 143 additions and 86 deletions

View File

@ -500,7 +500,6 @@ RSpec/NamedSubject:
- 'ee/spec/lib/gitlab/search/aggregation_parser_spec.rb'
- 'ee/spec/lib/gitlab/search/aggregation_spec.rb'
- 'ee/spec/lib/gitlab/search/client_spec.rb'
- 'ee/spec/lib/gitlab/search/zoekt/client_spec.rb'
- 'ee/spec/lib/gitlab/search_context/builder_spec.rb'
- 'ee/spec/lib/gitlab/sitemaps/generator_spec.rb'
- 'ee/spec/lib/gitlab/sitemaps/sitemap_file_spec.rb'

View File

@ -28,7 +28,7 @@ gem 'rails', '~> 7.0.8' # rubocop:todo Gemfile/MissingFeatureCategory
gem 'activerecord-gitlab', path: 'gems/activerecord-gitlab' # rubocop:todo Gemfile/MissingFeatureCategory
gem 'bootsnap', '~> 1.18.1', require: false # rubocop:todo Gemfile/MissingFeatureCategory
gem 'bootsnap', '~> 1.17.1', require: false # rubocop:todo Gemfile/MissingFeatureCategory
gem 'openssl', '~> 3.0' # rubocop:todo Gemfile/MissingFeatureCategory
gem 'ipaddr', '~> 1.2.5' # rubocop:todo Gemfile/MissingFeatureCategory

View File

@ -62,7 +62,7 @@
{"name":"better_errors","version":"2.10.1","platform":"ruby","checksum":"f798f1bac93f3e775925b7fcb24cffbcf0bb62ee2210f5350f161a6b75fc0a73"},
{"name":"bindata","version":"2.4.11","platform":"ruby","checksum":"c38e0c99ffcd80c10a0a7ae6c8586d2fe26bf245cbefac90bec8764523220f6a"},
{"name":"binding_of_caller","version":"1.0.0","platform":"ruby","checksum":"3aad25d1d538fc6e7972978f9bf512ccd992784009947c81633bea776713161d"},
{"name":"bootsnap","version":"1.18.1","platform":"ruby","checksum":"8fca5d4b1f98cf29e4f512ea1809c0cd903424d0330d1d2c4fd78adb5d11b8a6"},
{"name":"bootsnap","version":"1.17.1","platform":"ruby","checksum":"dbb2c6d4d594b0c87854f34a9073c9114a0c9a1023b8579e2eaaeb28848b1809"},
{"name":"browser","version":"5.3.1","platform":"ruby","checksum":"62745301701ff2c6c5d32d077bb12532b20be261929dcb52c6781ed0d5658b3c"},
{"name":"builder","version":"3.2.4","platform":"ruby","checksum":"99caf08af60c8d7f3a6b004029c4c3c0bdaebced6c949165fe98f1db27fbbc10"},
{"name":"bullet","version":"7.1.2","platform":"ruby","checksum":"429725c174cb74ca0ae99b9720bf22cab80be59ee9401805f7ecc9ac62cbb3bb"},

View File

@ -355,7 +355,7 @@ GEM
bindata (2.4.11)
binding_of_caller (1.0.0)
debug_inspector (>= 0.0.1)
bootsnap (1.18.1)
bootsnap (1.17.1)
msgpack (~> 1.2)
browser (5.3.1)
builder (3.2.4)
@ -1836,7 +1836,7 @@ DEPENDENCIES
benchmark-ips (~> 2.11.0)
benchmark-memory (~> 0.1)
better_errors (~> 2.10.1)
bootsnap (~> 1.18.1)
bootsnap (~> 1.17.1)
browser (~> 5.3.1)
bullet (~> 7.1.2)
bundler-audit (~> 0.9.1)

View File

@ -2,7 +2,7 @@ import { isValidDate } from '~/lib/utils/datetime_utility';
import * as Sentry from '~/sentry/sentry_browser_wrapper';
import axios from '~/lib/utils/axios_utils';
import { logError } from '~/lib/logger';
import { DEFAULT_SORTING_OPTION, SORTING_OPTIONS } from './constants';
import { DEFAULT_SORTING_OPTION, SORTING_OPTIONS, CUSTOM_DATE_RANGE_OPTION } from './constants';
function reportErrorAndThrow(e) {
logError(e);
@ -358,7 +358,7 @@ function addMetricsDateRangeFilterToQueryParams(dateRangeFilter, params) {
if (!dateRangeFilter || !params) return;
const { value, endDate, startDate } = dateRangeFilter;
if (value === 'custom') {
if (value === CUSTOM_DATE_RANGE_OPTION) {
if (isValidDate(startDate) && isValidDate(endDate)) {
params.append('start_time', startDate.toISOString());
params.append('end_time', endDate.toISOString());

View File

@ -9,17 +9,30 @@ export const SORTING_OPTIONS = {
Object.freeze(SORTING_OPTIONS);
export const DEFAULT_SORTING_OPTION = SORTING_OPTIONS.TIMESTAMP_DESC;
export const TIME_RANGE_OPTIONS_VALUES = {
FIVE_MIN: '5m',
FIFTEEN_MIN: '15m',
THIRTY_MIN: '30m',
ONE_HOUR: '1h',
FOUR_HOURS: '4h',
TWELVE_HOURS: '12h',
ONE_DAY: '24h',
ONE_WEEK: '7d',
TWO_WEEKS: '14d',
ONE_MONTH: '30d',
};
export const TIME_RANGE_OPTIONS = [
{ value: '5m', title: s__('Observability|Last 5 minutes') },
{ value: '15m', title: s__('Observability|Last 15 minutes') },
{ value: '30m', title: s__('Observability|Last 30 minutes') },
{ value: '1h', title: s__('Observability|Last 1 hour') },
{ value: '4h', title: s__('Observability|Last 4 hours') },
{ value: '12h', title: s__('Observability|Last 12 hours') },
{ value: '24h', title: s__('Observability|Last 24 hours') },
{ value: '7d', title: s__('Observability|Last 7 days') },
{ value: '14d', title: s__('Observability|Last 14 days') },
{ value: '30d', title: s__('Observability|Last 30 days') },
{ value: TIME_RANGE_OPTIONS_VALUES.FIVE_MIN, title: s__('Observability|Last 5 minutes') },
{ value: TIME_RANGE_OPTIONS_VALUES.FIFTEEN_MIN, title: s__('Observability|Last 15 minutes') },
{ value: TIME_RANGE_OPTIONS_VALUES.THIRTY_MIN, title: s__('Observability|Last 30 minutes') },
{ value: TIME_RANGE_OPTIONS_VALUES.ONE_HOUR, title: s__('Observability|Last 1 hour') },
{ value: TIME_RANGE_OPTIONS_VALUES.FOUR_HOURS, title: s__('Observability|Last 4 hours') },
{ value: TIME_RANGE_OPTIONS_VALUES.TWELVE_HOURS, title: s__('Observability|Last 12 hours') },
{ value: TIME_RANGE_OPTIONS_VALUES.ONE_DAY, title: s__('Observability|Last 24 hours') },
{ value: TIME_RANGE_OPTIONS_VALUES.ONE_WEEK, title: s__('Observability|Last 7 days') },
{ value: TIME_RANGE_OPTIONS_VALUES.TWO_WEEKS, title: s__('Observability|Last 14 days') },
{ value: TIME_RANGE_OPTIONS_VALUES.ONE_MONTH, title: s__('Observability|Last 30 days') },
];
Object.freeze(TIME_RANGE_OPTIONS);
@ -31,3 +44,5 @@ const OPERERATOR_NOT_LIKE_TEXT = s__('ObservabilityMetrics|is not like');
const OPERATORS_LIKE = [{ value: OPERERATOR_LIKE, description: OPERERATOR_LIKE_TEXT }];
const OPERATORS_NOT_LIKE = [{ value: OPERERATOR_NOT_LIKE, description: OPERERATOR_NOT_LIKE_TEXT }];
export const OPERATORS_LIKE_NOT = [...OPERATORS_LIKE, ...OPERATORS_NOT_LIKE];
export const CUSTOM_DATE_RANGE_OPTION = 'custom';

View File

@ -67,6 +67,13 @@ class IssuesFinder < IssuableFinder
super.with_projects_matching_search_data
end
override :use_full_text_search?
def use_full_text_search?
return false if include_namespace_level_work_items?
super
end
override :by_parent
def by_parent(items)
return super unless include_namespace_level_work_items?

View File

@ -8,3 +8,12 @@ description: Stores unit test failure data produced from builds.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56137
milestone: '13.11'
gitlab_schema: gitlab_ci
desired_sharding_key:
project_id:
references: projects
backfill_via:
parent:
foreign_key: unit_test_id
table: ci_unit_tests
sharding_key: project_id
belongs_to: unit_test

View File

@ -1,5 +1,5 @@
---
stage: Data Stores
stage: Systems
group: Cloud Connector
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments
---

View File

@ -1,5 +1,5 @@
---
stage: Data Stores
stage: Systems
group: Cloud Connector
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments
---

View File

@ -1,5 +1,5 @@
---
stage: Data Stores
stage: Systems
group: Cloud Connector
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments
---

View File

@ -1,5 +1,5 @@
---
stage: Data Stores
stage: Systems
group: Cloud Connector
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments
---

View File

@ -1,5 +1,5 @@
---
stage: Data Stores
stage: Systems
group: Cloud Connector
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments
---

View File

@ -1,5 +1,5 @@
---
stage: Data Stores
stage: Systems
group: Cloud Connector
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments
---

View File

@ -136,7 +136,8 @@ The GitLab Support team can then look up why this is failing in the GitLab.com s
NOTE:
These steps can only be completed by GitLab Support.
In Kibana, the logs should be filtered for `json.meta.caller_id: JiraConnect::InstallationsController#update` and `NOT json.status: 200`.
[In Kibana](https://log.gprd.gitlab.net/app/r/s/0FdPP), the logs should be filtered for
`json.meta.caller_id: JiraConnect::InstallationsController#update` and `NOT json.status: 200`.
If you have been provided the `X-Request-Id` value, you can use that against `json.correlation_id` to narrow down the results.
Each `GET` request to the Jira Connect Proxy URL `https://gitlab.com/-/jira_connect/installations` generates two log entries.
@ -146,12 +147,17 @@ For the first log:
- `json.status` is `422`.
- `json.params.value` should match the GitLab self-managed URL `[[FILTERED], {"instance_url"=>"https://gitlab.example.com"}]`.
For the second log:
For the second log, you might have one of the following scenarios:
- `json.message` is `Proxy lifecycle event received error response` or similar.
- `json.jira_status_code` and `json.jira_body` might contain details on why GitLab.com wasn't able to connect back to the self-managed instance.
- If `json.jira_status_code` is `401` and `json.jira_body` is empty, [**Jira Connect Proxy URL**](jira_cloud_app.md#set-up-your-instance) might not be set to
- Scenario 1:
- `json.message`, `json.jira_status_code`, and `json.jira_body` are present.
- `json.message` is `Proxy lifecycle event received error response` or similar.
- `json.jira_status_code` and `json.jira_body` might contain the response received from the self-managed instance or a proxy in front of the instance.
- If `json.jira_status_code` is `401` and `json.jira_body` is empty, [**Jira Connect Proxy URL**](jira_cloud_app.md#set-up-your-instance) might not be set to
`https://gitlab.com`.
- Scenario 2:
- `json.exception.class` and `json.exception.message` are present.
- `json.exception.class` and `json.exception.message` contain whether an issue occurred while contacting the self-managed instance.
## Error when connecting the app

View File

@ -1,5 +1,5 @@
---
stage: Data Stores
stage: Systems
group: Cloud Connector
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments
---

View File

@ -351,7 +351,7 @@ def replenish_table_seq(table, lower_limit, count)
return if max_id - last_id > lower_limit
new_start, new_limit = post("/api/v4/internal/cells/database/claim", { table: table, count: count })
execute("ALTER SEQUENCE START ? MAXVALUE ?", new_start, new_limit)
execute("ALTER SEQUENCE RESTART ? MAXVALUE ?", new_start, new_limit)
end
```

View File

@ -43,7 +43,7 @@ Consider the following workflow:
## How it works
First, GitLab Runner uploads all [JUnit report format XML files](https://www.ibm.com/docs/en/adfz/developer-for-zos/14.1.0?topic=formats-junit-xml-format)
First, GitLab Runner uploads all [JUnit report format XML files](https://www.ibm.com/docs/en/developer-for-zos/16.0?topic=formats-junit-xml-format)
as [artifacts](../yaml/artifacts_reports.md#artifactsreportsjunit) to GitLab. Then, when you visit a merge request, GitLab starts
comparing the head and base branch's JUnit report format XML files, where:

View File

@ -283,7 +283,7 @@ The exceptions to the [original dotenv rules](https://github.com/motdotla/dotenv
## `artifacts:reports:junit`
The `junit` report collects [JUnit report format XML files](https://www.ibm.com/docs/en/adfz/developer-for-zos/14.1.0?topic=formats-junit-xml-format).
The `junit` report collects [JUnit report format XML files](https://www.ibm.com/docs/en/developer-for-zos/16.0?topic=formats-junit-xml-format).
The collected Unit test reports upload to GitLab as an artifact. Although JUnit was originally developed in Java, there
are many third-party ports for other languages such as JavaScript, Python, and Ruby.

View File

@ -1,5 +1,5 @@
---
stage: Data Stores
stage: Systems
group: Cloud Connector
info: Any user with at least the Maintainer role can merge updates to this content. For details, see https://docs.gitlab.com/ee/development/development_processes.html#development-guidelines-review.
---

View File

@ -1,5 +1,5 @@
---
stage: Data Stores
stage: Systems
group: Cloud Connector
info: Any user with at least the Maintainer role can merge updates to this content. For details, see https://docs.gitlab.com/ee/development/development_processes.html#development-guidelines-review.
---

View File

@ -64,28 +64,48 @@ On our SaaS instance both individual events and pre-computed metrics are availab
Additionally for SaaS page views are automatically instrumented.
For self-managed only the metrics instrumented on the version installed on the instance are available.
### Events
Events are collected in real-time but processed in an asynchronous manner.
In general events are available in the data warehouse at the latest 48 hours after being fired but can already be available earlier.
### Metrics
Metrics are being computed and sent once per week for every instance. On GitLab.com this happens on Sunday and newest values become available throughout Monday.
On self-managed this depends on the particular instance. In general, only the metrics instrumented for the installed GitLab version will be sent.
## Data discovery
The data visualization tools [Sisense](https://about.gitlab.com/handbook/business-technology/data-team/platform/sisensecdt/) and [Tableau](https://about.gitlab.com/handbook/business-technology/data-team/platform/tableau/),
which have access to our Data Warehouse, can be used to query the internal analytics data.
Event and metrics data is ultimately stored in our [Snowflake data warehouse](https://handbook.gitlab.com/handbook/business-technology/data-team/platform/snowflake/).
It can either be accessed directly via SQL in Snowflake for [ad-hoc analyses](https://handbook.gitlab.com/handbook/business-technology/data-team/platform/#snowflake-analyst) or visualized in our data visualization tool
[Tableau](https://about.gitlab.com/handbook/business-technology/data-team/platform/tableau/), which has access to Snowflake.
Both platforms need an access request ([Snowflake](https://handbook.gitlab.com/handbook/business-technology/data-team/platform/#warehouse-access), [Tableau](https://handbook.gitlab.com/handbook/business-technology/data-team/platform/tableau/#tableau-online-access)).
### Querying metrics
### Tableau
The following example query returns all values reported for `count_distinct_user_id_from_feature_used_7d` within the last six months and the according `instance_id`:
Tableau is a data visualization platform and allows building dashboards and GUI based discovery of events and metrics.
This method of discovery is most suited for users who are familiar with business intelligence tooling, basic verifications
and for creating persisted, shareable dashboards and visualizations.
Access to Tableau requires an [access request](https://handbook.gitlab.com/handbook/business-technology/data-team/platform/tableau/#tableau-online-access).
```sql
SELECT
date_trunc('week', ping_created_at),
dim_instance_id,
metric_value
FROM common.fct_ping_instance_metric_rolling_6_months --model limited to last 6 months for performance
WHERE metrics_path = 'counts.users_visiting_dashboard_weekly' --set to metric of interest
ORDER BY ping_created_at DESC
```
#### Checking events
For a list of other metrics tables refer to the [Data Models Cheat Sheet](https://handbook.gitlab.com/handbook/product/product-analysis/data-model-cheat-sheet/#commonly-used-data-models).
Visit the [Snowplow event exploration dashboard](https://10az.online.tableau.com/#/site/gitlab/views/SnowplowEventExplorationLast30Days/SnowplowEventExplorationLast30D?:iid=1).
This dashboard shows you event counts as well as the most fired events.
You can scroll down to the "Structured Events Firing in Production Last 30 Days" chart and filter for your specific event action. The filter only works with exact names.
### Querying events
#### Checking metrics
You can visit the [Metrics exploration dashboard](https://10az.online.tableau.com/#/site/gitlab/views/PDServicePingExplorationDashboard/MetricsExploration).
On the side there is a filter for metric path which is the `key_path` of your metric and a filter for the installation ID including guidance on how to filter for GitLab.com.
### Snowflake
Snowflake allows direct querying of relevant tables in the warehouse within their UI with the [Snowflake SQL dialect](https://docs.snowflake.com/en/sql-reference-commands).
This method of discovery is most suited to users who are familiar with SQL and for quick and flexible checks whether data is correctly propagated.
Access to Snowflake requires an [access request](https://handbook.gitlab.com/handbook/business-technology/data-team/platform/#warehouse-access).
#### Querying events
The following example query returns the number of daily event occurrences for the `feature_used` event.
@ -100,7 +120,23 @@ AND app_id='gitlab' -- use gitlab for production events and gitlab-staging for e
GROUP BY 1 ORDER BY 1 desc
```
For a list of other event tables refer to the [Data Models Cheat Sheet](https://handbook.gitlab.com/handbook/product/product-analysis/data-model-cheat-sheet/#commonly-used-data-models-2).
For a list of other metrics tables refer to the [Data Models Cheat Sheet](https://handbook.gitlab.com/handbook/product/product-analysis/data-model-cheat-sheet/#commonly-used-data-models).
#### Querying metrics
The following example query returns all values reported for `count_distinct_user_id_from_feature_used_7d` within the last six months and the according `instance_id`:
```sql
SELECT
date_trunc('week', ping_created_at),
dim_instance_id,
metric_value
FROM common.fct_ping_instance_metric_rolling_6_months --model limited to last 6 months for performance
WHERE metrics_path = 'counts.users_visiting_dashboard_weekly' --set to metric of interest
ORDER BY ping_created_at DESC
```
For a list of other metrics tables refer to the [Data Models Cheat Sheet](https://about.gitlab.com/handbook/product/product-analysis/data-model-cheat-sheet/#commonly-used-data-models).
## Data flow
@ -131,8 +167,8 @@ flowchart LR;
end
end
snowplow[\Snowplow Pipeline\]
snowflake[(Data Warehouse)]
vis[Dashboards in Sisense/Tableau]
snowflake[(Snowflake Data Warehouse)]
vis[Dashboards in Tableau]
```
## Data Privacy

View File

@ -162,7 +162,3 @@ To use a metric definition to manage [performance indicator](https://handbook.gi
[Metrics Dictionary is a separate application](https://gitlab.com/gitlab-org/analytics-section/analytics-instrumentation/metric-dictionary).
All metrics available in Service Ping are in the [Metrics Dictionary](https://metrics.gitlab.com/).
### Copy query to clipboard
To check if a metric has data in Sisense, use the copy query to clipboard feature. This copies a query that's ready to use in Sisense. The query gets the last five service ping data for GitLab.com for a given metric. For information about how to check if a Service Ping metric has data in Sisense, see this [demo](https://www.youtube.com/watch?v=n4o65ivta48).

View File

@ -33,12 +33,12 @@ Currently, the [Metrics Dictionary](https://metrics.gitlab.com/) is built automa
## Remove a metric
WARNING:
If a metric is not used in Sisense or any other system after 6 months, the
If a metric is not used in Tableau or any other system after 6 months, the
Analytics Instrumentation team marks it as inactive and assigns it to the group owner for review.
We are working on automating this process. See [this epic](https://gitlab.com/groups/gitlab-org/-/epics/8988) for details.
Analytics Instrumentation removes metrics from Service Ping if they are not used in any Sisense dashboard.
Analytics Instrumentation removes metrics from Service Ping if they are not used in any Tableau dashboard.
For an example of the metric removal process, see this [example issue](https://gitlab.com/gitlab-org/gitlab/-/issues/388236).

View File

@ -43,7 +43,7 @@ We use the following terminology to describe the Service Ping components:
## Service Ping request flow
The following example shows a basic request/response flow between a GitLab instance, the Versions Application, the License Application, Salesforce, the GitLab S3 Bucket, the GitLab Snowflake Data Warehouse, and Sisense:
The following example shows a basic request/response flow between a GitLab instance, the Versions Application, the License Application, Salesforce, the GitLab S3 Bucket, the GitLab Snowflake Data Warehouse, and Tableau:
```mermaid
sequenceDiagram
@ -53,7 +53,7 @@ sequenceDiagram
participant Salesforce
participant S3 Bucket
participant Snowflake DW
participant Sisense Dashboards
participant Tableau Dashboards
GitLab Instance->>Versions Application: Send Service Ping
loop Process usage data
Versions Application->>Versions Application: Parse usage data
@ -70,7 +70,7 @@ sequenceDiagram
Versions Application->>S3 Bucket: Export Versions database
S3 Bucket->>Snowflake DW: Import data
Snowflake DW->>Snowflake DW: Transform data using dbt
Snowflake DW->>Sisense Dashboards: Data available for querying
Snowflake DW->>Tableau Dashboards: Data available for querying
Versions Application->>GitLab Instance: DevOps Score (Conversational Development Index)
```

View File

@ -1,5 +1,5 @@
---
stage: Data Stores
stage: Systems
group: Cloud Connector
info: Any user with at least the Maintainer role can merge updates to this content. For details, see https://docs.gitlab.com/ee/development/development_processes.html#development-guidelines-review.
---

View File

@ -18,7 +18,7 @@ module Gitlab
return unless should_run_validations?
return if commits.empty?
paths = project.repository.find_changed_paths(treeish_objects, merge_commit_diff_mode: :all_parents)
paths = project.repository.find_changed_paths(commits, merge_commit_diff_mode: :all_parents)
paths.each do |path|
validate_path(path)
end
@ -28,28 +28,6 @@ module Gitlab
private
def treeish_objects
objects = commits
return objects unless project.repository.empty?
# It's a special case for the push to the empty repository
#
# Git doesn't display a diff of the initial commit of the repository
# if we just provide a commit sha.
#
# To fix that we can use TreeRequest to check the difference
# between empty tree sha and the tree sha of the initial commit
#
# `commits` are sorted in reverse order, the initial commit is the last one.
init_commit = objects.last
diff_tree = Gitlab::Git::DiffTree.from_commit(init_commit)
return [diff_tree] + objects if diff_tree
objects
end
def validate_lfs_file_locks?
strong_memoize(:validate_lfs_file_locks) do
project.lfs_enabled? && project.any_lfs_file_locks?

View File

@ -24,7 +24,8 @@ RSpec.describe 'getting a work_item list for a group', feature_category: :team_p
create(
:work_item,
namespace: group,
author: reporter
author: reporter,
title: 'search_term'
)
end
@ -56,6 +57,16 @@ RSpec.describe 'getting a work_item list for a group', feature_category: :team_p
end
end
context 'when filtering by search' do
let(:item_filter_params) { { search: 'search_term' } }
it 'returns matching work items' do
post_graphql(query, current_user: current_user)
expect(work_item_ids).to contain_exactly(group_work_item.to_global_id.to_s)
end
end
context 'when the user can not see confidential work_items' do
it_behaves_like 'a working graphql query' do
before do