summaryrefslogtreecommitdiff
path: root/spec/graphql/resolvers/issues_resolver_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/graphql/resolvers/issues_resolver_spec.rb')
-rw-r--r--spec/graphql/resolvers/issues_resolver_spec.rb72
1 files changed, 64 insertions, 8 deletions
diff --git a/spec/graphql/resolvers/issues_resolver_spec.rb b/spec/graphql/resolvers/issues_resolver_spec.rb
index 9b329e961cc..6e187e57729 100644
--- a/spec/graphql/resolvers/issues_resolver_spec.rb
+++ b/spec/graphql/resolvers/issues_resolver_spec.rb
@@ -11,9 +11,9 @@ RSpec.describe Resolvers::IssuesResolver do
let_it_be(:project) { create(:project, group: group) }
let_it_be(:other_project) { create(:project, group: group) }
- let_it_be(:milestone) { create(:milestone, project: project) }
+ let_it_be(:started_milestone) { create(:milestone, project: project, title: "started milestone", start_date: 1.day.ago) }
let_it_be(:assignee) { create(:user) }
- let_it_be(:issue1) { create(:incident, project: project, state: :opened, created_at: 3.hours.ago, updated_at: 3.hours.ago, milestone: milestone) }
+ let_it_be(:issue1) { create(:incident, project: project, state: :opened, created_at: 3.hours.ago, updated_at: 3.hours.ago, milestone: started_milestone) }
let_it_be(:issue2) { create(:issue, project: project, state: :closed, title: 'foo', created_at: 1.hour.ago, updated_at: 1.hour.ago, closed_at: 1.hour.ago, assignees: [assignee]) }
let_it_be(:issue3) { create(:issue, project: other_project, state: :closed, title: 'foo', created_at: 1.hour.ago, updated_at: 1.hour.ago, closed_at: 1.hour.ago, assignees: [assignee]) }
let_it_be(:issue4) { create(:issue) }
@@ -43,7 +43,63 @@ RSpec.describe Resolvers::IssuesResolver do
end
it 'filters by milestone' do
- expect(resolve_issues(milestone_title: [milestone.title])).to contain_exactly(issue1)
+ expect(resolve_issues(milestone_title: [started_milestone.title])).to contain_exactly(issue1)
+ end
+
+ describe 'filtering by milestone wildcard id' do
+ let_it_be(:upcoming_milestone) { create(:milestone, project: project, title: "upcoming milestone", start_date: 1.day.ago, due_date: 1.day.from_now) }
+ let_it_be(:past_milestone) { create(:milestone, project: project, title: "past milestone", due_date: 1.day.ago) }
+ let_it_be(:future_milestone) { create(:milestone, project: project, title: "future milestone", start_date: 1.day.from_now) }
+ let_it_be(:issue5) { create(:issue, project: project, state: :opened, milestone: upcoming_milestone) }
+ let_it_be(:issue6) { create(:issue, project: project, state: :opened, milestone: past_milestone) }
+ let_it_be(:issue7) { create(:issue, project: project, state: :opened, milestone: future_milestone) }
+
+ let(:wildcard_started) { 'STARTED' }
+ let(:wildcard_upcoming) { 'UPCOMING' }
+ let(:wildcard_any) { 'ANY' }
+ let(:wildcard_none) { 'NONE' }
+
+ it 'returns issues with started milestone' do
+ expect(resolve_issues(milestone_wildcard_id: wildcard_started)).to contain_exactly(issue1, issue5)
+ end
+
+ it 'returns issues with upcoming milestone' do
+ expect(resolve_issues(milestone_wildcard_id: wildcard_upcoming)).to contain_exactly(issue5)
+ end
+
+ it 'returns issues with any milestone' do
+ expect(resolve_issues(milestone_wildcard_id: wildcard_any)).to contain_exactly(issue1, issue5, issue6, issue7)
+ end
+
+ it 'returns issues with no milestone' do
+ expect(resolve_issues(milestone_wildcard_id: wildcard_none)).to contain_exactly(issue2)
+ end
+
+ it 'raises a mutually exclusive filter error when wildcard and title are provided' do
+ expect do
+ resolve_issues(milestone_title: ["started milestone"], milestone_wildcard_id: wildcard_started)
+ end.to raise_error(Gitlab::Graphql::Errors::ArgumentError, 'only one of [milestoneTitle, milestoneWildcardId] arguments is allowed at the same time.')
+ end
+
+ context 'negated filtering' do
+ it 'returns issues matching the searched title after applying a negated filter' do
+ expect(resolve_issues(milestone_title: ['past milestone'], not: { milestone_wildcard_id: wildcard_upcoming })).to contain_exactly(issue6)
+ end
+
+ it 'returns issues excluding the ones with started milestone' do
+ expect(resolve_issues(not: { milestone_wildcard_id: wildcard_started })).to contain_exactly(issue7)
+ end
+
+ it 'returns issues excluding the ones with upcoming milestone' do
+ expect(resolve_issues(not: { milestone_wildcard_id: wildcard_upcoming })).to contain_exactly(issue6)
+ end
+
+ it 'raises a mutually exclusive filter error when wildcard and title are provided as negated filters' do
+ expect do
+ resolve_issues(not: { milestone_title: ["started milestone"], milestone_wildcard_id: wildcard_started })
+ end.to raise_error(Gitlab::Graphql::Errors::ArgumentError, 'only one of [milestoneTitle, milestoneWildcardId] arguments is allowed at the same time.')
+ end
+ end
end
it 'filters by two assignees' do
@@ -169,7 +225,7 @@ RSpec.describe Resolvers::IssuesResolver do
end
it 'returns issues without the specified milestone' do
- expect(resolve_issues(not: { milestone_title: [milestone.title] })).to contain_exactly(issue2)
+ expect(resolve_issues(not: { milestone_title: [started_milestone.title] })).to contain_exactly(issue2)
end
it 'returns issues without the specified assignee_usernames' do
@@ -337,13 +393,13 @@ RSpec.describe Resolvers::IssuesResolver do
end
it 'finds a specific issue with iid', :request_store do
- result = batch_sync(max_queries: 4) { resolve_issues(iid: issue1.iid).to_a }
+ result = batch_sync(max_queries: 5) { resolve_issues(iid: issue1.iid).to_a }
expect(result).to contain_exactly(issue1)
end
it 'batches queries that only include IIDs', :request_store do
- result = batch_sync(max_queries: 4) do
+ result = batch_sync(max_queries: 5) do
[issue1, issue2]
.map { |issue| resolve_issues(iid: issue.iid.to_s) }
.flat_map(&:to_a)
@@ -353,7 +409,7 @@ RSpec.describe Resolvers::IssuesResolver do
end
it 'finds a specific issue with iids', :request_store do
- result = batch_sync(max_queries: 4) do
+ result = batch_sync(max_queries: 5) do
resolve_issues(iids: [issue1.iid]).to_a
end
@@ -407,7 +463,7 @@ RSpec.describe Resolvers::IssuesResolver do
end
it 'increases field complexity based on arguments' do
- field = Types::BaseField.new(name: 'test', type: GraphQL::STRING_TYPE.connection_type, resolver_class: described_class, null: false, max_page_size: 100)
+ field = Types::BaseField.new(name: 'test', type: GraphQL::Types::String.connection_type, resolver_class: described_class, null: false, max_page_size: 100)
expect(field.to_graphql.complexity.call({}, {}, 1)).to eq 4
expect(field.to_graphql.complexity.call({}, { labelName: 'foo' }, 1)).to eq 8