diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-05-05 03:10:39 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-05-05 03:10:39 +0300 |
commit | 2b4ad9a839c3c8a99b2a8f5cdcb1f30421f3ff3e (patch) | |
tree | 13ab487e9fe46c40dccfbebc22b2fca46cbaf521 | |
parent | b3cd77e90438a6c6e837dc27627d4c76f85ecd29 (diff) |
Add latest changes from gitlab-org/gitlab@master
-rw-r--r-- | app/graphql/resolvers/issues_resolver.rb | 4 | ||||
-rw-r--r-- | app/graphql/types/issuable_sort_enum.rb | 2 | ||||
-rw-r--r-- | app/models/clusters/applications/knative.rb | 4 | ||||
-rw-r--r-- | changelogs/unreleased/38296-graphql-add-milestone_due_asc-sort-for-issuables.yml | 5 | ||||
-rw-r--r-- | changelogs/unreleased/sh-revert-codeowners-check.yml | 5 | ||||
-rw-r--r-- | db/structure.sql | 4 | ||||
-rw-r--r-- | doc/api/graphql/reference/gitlab_schema.graphql | 10 | ||||
-rw-r--r-- | doc/api/graphql/reference/gitlab_schema.json | 12 | ||||
-rw-r--r-- | spec/graphql/resolvers/issues_resolver_spec.rb | 17 | ||||
-rw-r--r-- | spec/graphql/types/issuable_sort_enum_spec.rb | 6 | ||||
-rw-r--r-- | spec/graphql/types/issue_sort_enum_spec.rb | 2 | ||||
-rw-r--r-- | spec/requests/api/graphql/project/issues_spec.rb | 256 |
12 files changed, 120 insertions, 207 deletions
diff --git a/app/graphql/resolvers/issues_resolver.rb b/app/graphql/resolvers/issues_resolver.rb index 314368360b2..f103da07666 100644 --- a/app/graphql/resolvers/issues_resolver.rb +++ b/app/graphql/resolvers/issues_resolver.rb @@ -52,7 +52,9 @@ module Resolvers type Types::IssueType, null: true - NON_STABLE_CURSOR_SORTS = %i[priority_asc priority_desc label_priority_asc label_priority_desc].freeze + NON_STABLE_CURSOR_SORTS = %i[priority_asc priority_desc + label_priority_asc label_priority_desc + milestone_due_asc milestone_due_desc].freeze def resolve(**args) # The project could have been loaded in batch by `BatchLoader`. diff --git a/app/graphql/types/issuable_sort_enum.rb b/app/graphql/types/issuable_sort_enum.rb index d08fcb16898..a6d52124d99 100644 --- a/app/graphql/types/issuable_sort_enum.rb +++ b/app/graphql/types/issuable_sort_enum.rb @@ -9,5 +9,7 @@ module Types value 'PRIORITY_DESC', 'Priority by descending order', value: :priority_desc value 'LABEL_PRIORITY_ASC', 'Label priority by ascending order', value: :label_priority_asc value 'LABEL_PRIORITY_DESC', 'Label priority by descending order', value: :label_priority_desc + value 'MILESTONE_DUE_ASC', 'Milestone due date by ascending order', value: :milestone_due_asc + value 'MILESTONE_DUE_DESC', 'Milestone due date by descending order', value: :milestone_due_desc end end diff --git a/app/models/clusters/applications/knative.rb b/app/models/clusters/applications/knative.rb index 1f90318f845..0de75a71cca 100644 --- a/app/models/clusters/applications/knative.rb +++ b/app/models/clusters/applications/knative.rb @@ -4,8 +4,8 @@ module Clusters module Applications class Knative < ApplicationRecord VERSION = '0.9.0' - REPOSITORY = 'https://storage.googleapis.com/triggermesh-charts' - METRICS_CONFIG = 'https://storage.googleapis.com/triggermesh-charts/istio-metrics.yaml' + REPOSITORY = 'https://charts.gitlab.io' + METRICS_CONFIG = 'https://gitlab.com/gitlab-org/charts/knative/-/blob/v0.9.0/vendor/istio-metrics.yml' FETCH_IP_ADDRESS_DELAY = 30.seconds API_GROUPS_PATH = 'config/knative/api_groups.yml' diff --git a/changelogs/unreleased/38296-graphql-add-milestone_due_asc-sort-for-issuables.yml b/changelogs/unreleased/38296-graphql-add-milestone_due_asc-sort-for-issuables.yml new file mode 100644 index 00000000000..4cc12c7710a --- /dev/null +++ b/changelogs/unreleased/38296-graphql-add-milestone_due_asc-sort-for-issuables.yml @@ -0,0 +1,5 @@ +--- +title: GraphQL issue queries can now be sorted by milestone due date +merge_request: 29992 +author: +type: added diff --git a/changelogs/unreleased/sh-revert-codeowners-check.yml b/changelogs/unreleased/sh-revert-codeowners-check.yml deleted file mode 100644 index e536d267115..00000000000 --- a/changelogs/unreleased/sh-revert-codeowners-check.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Revert CODEOWNERS validation of Web requests in diff check -merge_request: 30936 -author: -type: fixed diff --git a/db/structure.sql b/db/structure.sql index 11ceb670805..5007801d85e 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -6183,9 +6183,9 @@ ALTER SEQUENCE public.sprints_id_seq OWNED BY public.sprints.id; CREATE TABLE public.status_page_published_incidents ( id bigint NOT NULL, - issue_id bigint NOT NULL, created_at timestamp with time zone NOT NULL, - updated_at timestamp with time zone NOT NULL + updated_at timestamp with time zone NOT NULL, + issue_id bigint NOT NULL ); CREATE SEQUENCE public.status_page_published_incidents_id_seq diff --git a/doc/api/graphql/reference/gitlab_schema.graphql b/doc/api/graphql/reference/gitlab_schema.graphql index 2919cc59712..08ec55de6bc 100644 --- a/doc/api/graphql/reference/gitlab_schema.graphql +++ b/doc/api/graphql/reference/gitlab_schema.graphql @@ -4678,6 +4678,16 @@ enum IssueSort { LABEL_PRIORITY_DESC """ + Milestone due date by ascending order + """ + MILESTONE_DUE_ASC + + """ + Milestone due date by descending order + """ + MILESTONE_DUE_DESC + + """ Priority by ascending order """ PRIORITY_ASC diff --git a/doc/api/graphql/reference/gitlab_schema.json b/doc/api/graphql/reference/gitlab_schema.json index 3e39e418909..05098658f22 100644 --- a/doc/api/graphql/reference/gitlab_schema.json +++ b/doc/api/graphql/reference/gitlab_schema.json @@ -13273,6 +13273,18 @@ "deprecationReason": null }, { + "name": "MILESTONE_DUE_ASC", + "description": "Milestone due date by ascending order", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MILESTONE_DUE_DESC", + "description": "Milestone due date by descending order", + "isDeprecated": false, + "deprecationReason": null + }, + { "name": "DUE_DATE_ASC", "description": "Due date by ascending order", "isDeprecated": false, diff --git a/spec/graphql/resolvers/issues_resolver_spec.rb b/spec/graphql/resolvers/issues_resolver_spec.rb index bb975a629a0..b7cc9bc6d71 100644 --- a/spec/graphql/resolvers/issues_resolver_spec.rb +++ b/spec/graphql/resolvers/issues_resolver_spec.rb @@ -190,6 +190,23 @@ describe Resolvers::IssuesResolver do expect(resolve_issues(sort: :label_priority_desc).items).to eq([label_issue2, label_issue3, label_issue1, label_issue4]) end end + + context 'when sorting by milestone due date' do + let_it_be(:project) { create(:project) } + let_it_be(:early_milestone) { create(:milestone, project: project, due_date: 10.days.from_now) } + let_it_be(:late_milestone) { create(:milestone, project: project, due_date: 30.days.from_now) } + let_it_be(:milestone_issue1) { create(:issue, project: project) } + let_it_be(:milestone_issue2) { create(:issue, project: project, milestone: early_milestone) } + let_it_be(:milestone_issue3) { create(:issue, project: project, milestone: late_milestone) } + + it 'sorts issues ascending' do + expect(resolve_issues(sort: :milestone_due_asc).items).to eq([milestone_issue2, milestone_issue3, milestone_issue1]) + end + + it 'sorts issues descending' do + expect(resolve_issues(sort: :milestone_due_desc).items).to eq([milestone_issue3, milestone_issue2, milestone_issue1]) + end + end end it 'returns issues user can see' do diff --git a/spec/graphql/types/issuable_sort_enum_spec.rb b/spec/graphql/types/issuable_sort_enum_spec.rb index feb318df66d..5a680c8eae5 100644 --- a/spec/graphql/types/issuable_sort_enum_spec.rb +++ b/spec/graphql/types/issuable_sort_enum_spec.rb @@ -6,6 +6,10 @@ describe Types::IssuableSortEnum do it { expect(described_class.graphql_name).to eq('IssuableSort') } it 'exposes all the existing issuable sort values' do - expect(described_class.values.keys).to include(*%w[PRIORITY_ASC PRIORITY_DESC]) + expect(described_class.values.keys).to include( + *%w[PRIORITY_ASC PRIORITY_DESC + LABEL_PRIORITY_ASC LABEL_PRIORITY_DESC + MILESTONE_DUE_ASC MILESTONE_DUE_DESC] + ) end end diff --git a/spec/graphql/types/issue_sort_enum_spec.rb b/spec/graphql/types/issue_sort_enum_spec.rb index 433b94ac3c0..532f9686f25 100644 --- a/spec/graphql/types/issue_sort_enum_spec.rb +++ b/spec/graphql/types/issue_sort_enum_spec.rb @@ -9,7 +9,7 @@ describe GitlabSchema.types['IssueSort'] do it 'exposes all the existing issue sort values' do expect(described_class.values.keys).to include( - *%w[DUE_DATE_ASC DUE_DATE_DESC RELATIVE_POSITION_ASC LABEL_PRIORITY_ASC LABEL_PRIORITY_DESC] + *%w[DUE_DATE_ASC DUE_DATE_DESC RELATIVE_POSITION_ASC] ) end end diff --git a/spec/requests/api/graphql/project/issues_spec.rb b/spec/requests/api/graphql/project/issues_spec.rb index 31388b3061c..91fce3eed92 100644 --- a/spec/requests/api/graphql/project/issues_spec.rb +++ b/spec/requests/api/graphql/project/issues_spec.rb @@ -118,138 +118,64 @@ describe 'getting an issue list for a project' do end describe 'sorting and pagination' do - let(:start_cursor) { graphql_data['project']['issues']['pageInfo']['startCursor'] } - let(:end_cursor) { graphql_data['project']['issues']['pageInfo']['endCursor'] } + let_it_be(:data_path) { [:project, :issues] } + + def pagination_query(params, page_info) + graphql_query_for( + 'project', + { 'fullPath' => sort_project.full_path }, + "issues(#{params}) { #{page_info} edges { node { iid dueDate } } }" + ) + end + + def pagination_results_data(data) + data.map { |issue| issue.dig('node', 'iid').to_i } + end context 'when sorting by due date' do let_it_be(:sort_project) { create(:project, :public) } - let_it_be(:due_issue1) { create(:issue, project: sort_project, due_date: 3.days.from_now) } let_it_be(:due_issue2) { create(:issue, project: sort_project, due_date: nil) } let_it_be(:due_issue3) { create(:issue, project: sort_project, due_date: 2.days.ago) } let_it_be(:due_issue4) { create(:issue, project: sort_project, due_date: nil) } let_it_be(:due_issue5) { create(:issue, project: sort_project, due_date: 1.day.ago) } - let_it_be(:params) { 'sort: DUE_DATE_ASC' } - - def query(issue_params = params) - graphql_query_for( - 'project', - { 'fullPath' => sort_project.full_path }, - <<~ISSUES - issues(#{issue_params}) { - pageInfo { - endCursor - } - edges { - node { - iid - dueDate - } - } - } - ISSUES - ) - end - - before do - post_graphql(query, current_user: current_user) - end - - it_behaves_like 'a working graphql query' - context 'when ascending' do - it 'sorts issues' do - expect(grab_iids).to eq([due_issue3.iid, due_issue5.iid, due_issue1.iid, due_issue4.iid, due_issue2.iid]) - end - - context 'when paginating' do - let(:params) { 'sort: DUE_DATE_ASC, first: 2' } - - it 'sorts issues' do - expect(grab_iids).to eq([due_issue3.iid, due_issue5.iid]) - - cursored_query = query("sort: DUE_DATE_ASC, after: \"#{end_cursor}\"") - post_graphql(cursored_query, current_user: current_user) - response_data = Gitlab::Json.parse(response.body)['data']['project']['issues']['edges'] - - expect(grab_iids(response_data)).to eq([due_issue1.iid, due_issue4.iid, due_issue2.iid]) - end + it_behaves_like 'sorted paginated query' do + let(:sort_param) { 'DUE_DATE_ASC' } + let(:first_param) { 2 } + let(:expected_results) { [due_issue3.iid, due_issue5.iid, due_issue1.iid, due_issue4.iid, due_issue2.iid] } end end context 'when descending' do - let(:params) { 'sort: DUE_DATE_DESC' } - - it 'sorts issues' do - expect(grab_iids).to eq([due_issue1.iid, due_issue5.iid, due_issue3.iid, due_issue4.iid, due_issue2.iid]) - end - - context 'when paginating' do - let(:params) { 'sort: DUE_DATE_DESC, first: 2' } - - it 'sorts issues' do - expect(grab_iids).to eq([due_issue1.iid, due_issue5.iid]) - - cursored_query = query("sort: DUE_DATE_DESC, after: \"#{end_cursor}\"") - post_graphql(cursored_query, current_user: current_user) - response_data = Gitlab::Json.parse(response.body)['data']['project']['issues']['edges'] - - expect(grab_iids(response_data)).to eq([due_issue3.iid, due_issue4.iid, due_issue2.iid]) - end + it_behaves_like 'sorted paginated query' do + let(:sort_param) { 'DUE_DATE_DESC' } + let(:first_param) { 2 } + let(:expected_results) { [due_issue1.iid, due_issue5.iid, due_issue3.iid, due_issue4.iid, due_issue2.iid] } end end end context 'when sorting by relative position' do let_it_be(:sort_project) { create(:project, :public) } - let_it_be(:relative_issue1) { create(:issue, project: sort_project, relative_position: 2000) } let_it_be(:relative_issue2) { create(:issue, project: sort_project, relative_position: nil) } let_it_be(:relative_issue3) { create(:issue, project: sort_project, relative_position: 1000) } let_it_be(:relative_issue4) { create(:issue, project: sort_project, relative_position: nil) } let_it_be(:relative_issue5) { create(:issue, project: sort_project, relative_position: 500) } - let_it_be(:params) { 'sort: RELATIVE_POSITION_ASC' } - - def query(issue_params = params) - graphql_query_for( - 'project', - { 'fullPath' => sort_project.full_path }, - "issues(#{issue_params}) { pageInfo { endCursor} edges { node { iid dueDate } } }" - ) - end - - before do - post_graphql(query, current_user: current_user) - end - - it_behaves_like 'a working graphql query' - context 'when ascending' do - it 'sorts issues' do - expect(grab_iids).to eq([relative_issue5.iid, relative_issue3.iid, relative_issue1.iid, relative_issue4.iid, relative_issue2.iid]) - end - - context 'when paginating' do - let(:params) { 'sort: RELATIVE_POSITION_ASC, first: 2' } - - it 'sorts issues' do - expect(grab_iids).to eq([relative_issue5.iid, relative_issue3.iid]) - - cursored_query = query("sort: RELATIVE_POSITION_ASC, after: \"#{end_cursor}\"") - post_graphql(cursored_query, current_user: current_user) - response_data = Gitlab::Json.parse(response.body)['data']['project']['issues']['edges'] - - expect(grab_iids(response_data)).to eq([relative_issue1.iid, relative_issue4.iid, relative_issue2.iid]) - end + it_behaves_like 'sorted paginated query' do + let(:sort_param) { 'RELATIVE_POSITION_ASC' } + let(:first_param) { 2 } + let(:expected_results) { [relative_issue5.iid, relative_issue3.iid, relative_issue1.iid, relative_issue4.iid, relative_issue2.iid] } end end end context 'when sorting by priority' do let_it_be(:sort_project) { create(:project, :public) } - let_it_be(:early_milestone) { create(:milestone, project: sort_project, due_date: 10.days.from_now) } let_it_be(:late_milestone) { create(:milestone, project: sort_project, due_date: 30.days.from_now) } let_it_be(:priority_label1) { create(:label, project: sort_project, priority: 1) } @@ -259,68 +185,25 @@ describe 'getting an issue list for a project' do let_it_be(:priority_issue3) { create(:issue, project: sort_project, milestone: early_milestone) } let_it_be(:priority_issue4) { create(:issue, project: sort_project) } - let_it_be(:params) { 'sort: PRIORITY_ASC' } - - def query(issue_params = params) - graphql_query_for( - 'project', - { 'fullPath' => sort_project.full_path }, - "issues(#{issue_params}) { pageInfo { endCursor} edges { node { iid dueDate } } }" - ) - end - - before do - post_graphql(query, current_user: current_user) - end - - it_behaves_like 'a working graphql query' - context 'when ascending' do - it 'sorts issues' do - expect(grab_iids).to eq([priority_issue3.iid, priority_issue1.iid, priority_issue2.iid, priority_issue4.iid]) - end - - context 'when paginating' do - let(:params) { 'sort: PRIORITY_ASC, first: 2' } - - it 'sorts issues' do - expect(grab_iids).to eq([priority_issue3.iid, priority_issue1.iid]) - - cursored_query = query("sort: PRIORITY_ASC, after: \"#{end_cursor}\"") - post_graphql(cursored_query, current_user: current_user) - response_data = Gitlab::Json.parse(response.body)['data']['project']['issues']['edges'] - - expect(grab_iids(response_data)).to eq([priority_issue2.iid, priority_issue4.iid]) - end + it_behaves_like 'sorted paginated query' do + let(:sort_param) { 'PRIORITY_ASC' } + let(:first_param) { 2 } + let(:expected_results) { [priority_issue3.iid, priority_issue1.iid, priority_issue2.iid, priority_issue4.iid] } end end context 'when descending' do - let(:params) { 'sort: PRIORITY_DESC' } - - it 'sorts issues' do - expect(grab_iids).to eq([priority_issue1.iid, priority_issue3.iid, priority_issue2.iid, priority_issue4.iid]) - end - - context 'when paginating' do - let(:params) { 'sort: PRIORITY_DESC, first: 2' } - - it 'sorts issues' do - expect(grab_iids).to eq([priority_issue1.iid, priority_issue3.iid]) - - cursored_query = query("sort: PRIORITY_DESC, after: \"#{end_cursor}\"") - post_graphql(cursored_query, current_user: current_user) - response_data = Gitlab::Json.parse(response.body)['data']['project']['issues']['edges'] - - expect(grab_iids(response_data)).to eq([priority_issue2.iid, priority_issue4.iid]) - end + it_behaves_like 'sorted paginated query' do + let(:sort_param) { 'PRIORITY_DESC' } + let(:first_param) { 2 } + let(:expected_results) { [priority_issue1.iid, priority_issue3.iid, priority_issue2.iid, priority_issue4.iid] } end end end context 'when sorting by label priority' do let_it_be(:sort_project) { create(:project, :public) } - let_it_be(:label1) { create(:label, project: sort_project, priority: 1) } let_it_be(:label2) { create(:label, project: sort_project, priority: 5) } let_it_be(:label3) { create(:label, project: sort_project, priority: 10) } @@ -329,61 +212,44 @@ describe 'getting an issue list for a project' do let_it_be(:label_issue3) { create(:issue, project: sort_project, labels: [label1, label3]) } let_it_be(:label_issue4) { create(:issue, project: sort_project) } - let_it_be(:params) { 'sort: LABEL_PRIORITY_ASC' } - - def query(issue_params = params) - graphql_query_for( - 'project', - { 'fullPath' => sort_project.full_path }, - "issues(#{issue_params}) { pageInfo { endCursor} edges { node { iid dueDate } } }" - ) + context 'when ascending' do + it_behaves_like 'sorted paginated query' do + let(:sort_param) { 'LABEL_PRIORITY_ASC' } + let(:first_param) { 2 } + let(:expected_results) { [label_issue3.iid, label_issue1.iid, label_issue2.iid, label_issue4.iid] } + end end - before do - post_graphql(query, current_user: current_user) + context 'when descending' do + it_behaves_like 'sorted paginated query' do + let(:sort_param) { 'LABEL_PRIORITY_DESC' } + let(:first_param) { 2 } + let(:expected_results) { [label_issue2.iid, label_issue3.iid, label_issue1.iid, label_issue4.iid] } + end end + end - it_behaves_like 'a working graphql query' + context 'when sorting by milestone due date' do + let_it_be(:sort_project) { create(:project, :public) } + let_it_be(:early_milestone) { create(:milestone, project: sort_project, due_date: 10.days.from_now) } + let_it_be(:late_milestone) { create(:milestone, project: sort_project, due_date: 30.days.from_now) } + let_it_be(:milestone_issue1) { create(:issue, project: sort_project) } + let_it_be(:milestone_issue2) { create(:issue, project: sort_project, milestone: early_milestone) } + let_it_be(:milestone_issue3) { create(:issue, project: sort_project, milestone: late_milestone) } context 'when ascending' do - it 'sorts issues' do - expect(grab_iids).to eq [label_issue3.iid, label_issue1.iid, label_issue2.iid, label_issue4.iid] - end - - context 'when paginating' do - let(:params) { 'sort: LABEL_PRIORITY_ASC, first: 2' } - - it 'sorts issues' do - expect(grab_iids).to eq [label_issue3.iid, label_issue1.iid] - - cursored_query = query("sort: LABEL_PRIORITY_ASC, after: \"#{end_cursor}\"") - post_graphql(cursored_query, current_user: current_user) - response_data = Gitlab::Json.parse(response.body)['data']['project']['issues']['edges'] - - expect(grab_iids(response_data)).to eq [label_issue2.iid, label_issue4.iid] - end + it_behaves_like 'sorted paginated query' do + let(:sort_param) { 'MILESTONE_DUE_ASC' } + let(:first_param) { 2 } + let(:expected_results) { [milestone_issue2.iid, milestone_issue3.iid, milestone_issue1.iid] } end end context 'when descending' do - let(:params) { 'sort: LABEL_PRIORITY_DESC' } - - it 'sorts issues' do - expect(grab_iids).to eq [label_issue2.iid, label_issue3.iid, label_issue1.iid, label_issue4.iid] - end - - context 'when paginating' do - let(:params) { 'sort: LABEL_PRIORITY_DESC, first: 2' } - - it 'sorts issues' do - expect(grab_iids).to eq [label_issue2.iid, label_issue3.iid] - - cursored_query = query("sort: LABEL_PRIORITY_DESC, after: \"#{end_cursor}\"") - post_graphql(cursored_query, current_user: current_user) - response_data = Gitlab::Json.parse(response.body)['data']['project']['issues']['edges'] - - expect(grab_iids(response_data)).to eq [label_issue1.iid, label_issue4.iid] - end + it_behaves_like 'sorted paginated query' do + let(:sort_param) { 'MILESTONE_DUE_DESC' } + let(:first_param) { 2 } + let(:expected_results) { [milestone_issue3.iid, milestone_issue2.iid, milestone_issue1.iid] } end end end |