Issue analytics: assigneeUsernames provided as null results in error
See https://gitlab.com/gitlab-com/dev-sub-department/section-dev-request-for-help/-/issues/172 context.
When issue analytics GraphQL query is made, most arguments are required: false
The following query is considered valid:
query {
group(fullPath: "gitlab-org") {
flowMetrics {
issuesCompletedCount(
assigneeUsernames: null
from: "2024-01-01"
to: "2024-02-02"
) {
value
}
}
}
}
However, it results in a 500 error. It fails because of this line: https://gitlab.com/gitlab-org/gitlab/-/blob/9ea00673cd08f18bce685310800522f029f580f6/app/graphql/resolvers/analytics/cycle_analytics/issue_count_resolver.rb#L25 where the argument is only removed if it has a value.
We should consider modifying the rest of these as well, to ensure they handle null
types properly and filter out any that don't make sense to the underlying service.
workaround
If an API call is being made, remove the assigneeUsernames: null
portion of the arguments.
solution
The following will sort this on backend.
diff --git a/app/graphql/resolvers/analytics/cycle_analytics/issue_count_resolver.rb b/app/graphql/resolvers/analytics/cycle_analytics/issue_count_resolver.rb
index 32b884df84ff..d5cb80a03b8a 100644
--- a/app/graphql/resolvers/analytics/cycle_analytics/issue_count_resolver.rb
+++ b/app/graphql/resolvers/analytics/cycle_analytics/issue_count_resolver.rb
@@ -22,7 +22,7 @@ def resolve(**args)
private
def process_params(params)
- params[:assignee_username] = params.delete(:assignee_usernames) if params[:assignee_usernames]
+ params[:assignee_username] = params.delete(:assignee_usernames) if params[:assignee_usernames].present?
params[:label_name] = params.delete(:label_names) if params[:label_names]
params[:created_after] = params.delete(:from)
params[:created_before] = params.delete(:to)
diff --git a/spec/requests/api/graphql/issue_status_counts_spec.rb b/spec/requests/api/graphql/issue_status_counts_spec.rb
index 72a1968cb271..1335c833d09f 100644
--- a/spec/requests/api/graphql/issue_status_counts_spec.rb
+++ b/spec/requests/api/graphql/issue_status_counts_spec.rb
@@ -54,6 +54,34 @@
'closed' => 1
)
end
+
+ context 'when filtering by assignees' do
+ let_it_be(:some_issue) { create(:issue, project: project, assignees: [create(:user, username: "greatuser")]) }
+
+ context 'when assignee is provided' do
+ let(:params) { { 'assigneeUsernames' => ["greatuser"] } }
+
+ it 'returns the correct counts for each status' do
+ expect(issue_counts).to eq(
+ 'all' => 1,
+ 'opened' => 1,
+ 'closed' => 0
+ )
+ end
+ end
+
+ context 'when nil assignee is provided' do
+ let(:params) { { 'assigneeUsernames' => nil } }
+
+ it 'returns the correct counts for each status and does not error' do
+ expect(issue_counts).to eq(
+ 'all' => 3,
+ 'opened' => 2,
+ 'closed' => 1
+ )
+ end
+ end
+ end
end
end
end