From 9c8a86f60d2d36b628c5275004e4c17aa07aeeeb Mon Sep 17 00:00:00 2001
From: Clement Ho <ClemMakesApps@gmail.com>
Date: Thu, 10 Nov 2016 16:49:12 -0600
Subject: [PATCH] Update filter issue specs

---
 app/assets/stylesheets/framework/filters.scss |   2 +
 spec/features/issues/filter_issues_spec.rb    | 506 ++++++++++--------
 2 files changed, 273 insertions(+), 235 deletions(-)

diff --git a/app/assets/stylesheets/framework/filters.scss b/app/assets/stylesheets/framework/filters.scss
index 90b9394b207..c679a3833e9 100644
--- a/app/assets/stylesheets/framework/filters.scss
+++ b/app/assets/stylesheets/framework/filters.scss
@@ -24,10 +24,12 @@
 }
 
 .filtered-search-container {
+  display: -webkit-flex;
   display: flex;
 }
 
 .filtered-search-input-container {
+  display: -webkit-flex;
   display: flex;
   position: relative;
   width: 100%;
diff --git a/spec/features/issues/filter_issues_spec.rb b/spec/features/issues/filter_issues_spec.rb
index 0d19563d628..7d681742045 100644
--- a/spec/features/issues/filter_issues_spec.rb
+++ b/spec/features/issues/filter_issues_spec.rb
@@ -4,147 +4,236 @@ describe 'Filter issues', feature: true do
   include WaitForAjax
 
   let!(:group)     { create(:group) }
-  let!(:project)   { create(:project, group: group) }
+  let!(:project)   { create(:project) }
   let!(:user)      { create(:user)}
+  let!(:user)      { create(:user) }
+  let!(:user2)      { create(:user) }
   let!(:milestone) { create(:milestone, project: project) }
   let!(:label)     { create(:label, project: project) }
   let!(:wontfix)   { create(:label, project: project, title: "Won't fix") }
 
+  let!(:bug_label) { create(:label, project: project, title: 'bug') }
+  let!(:caps_sensitive_label) { create(:label, project: project, title: 'CAPS_sensitive') }
+  let!(:milestone) { create(:milestone, title: "8", project: project) }
+
+  def input_filtered_search(search_term)
+    filtered_search = find('.filtered-search')
+    filtered_search.set(search_term)
+    filtered_search.send_keys(:enter)
+  end
+
+  def expect_no_issues_list
+    page.within '.issues-list' do
+      expect(page).not_to have_selector('.issue')
+    end
+  end
+
+  def expect_issues_list_count(open_count, closed_count = 0)
+    all_count = open_count + closed_count
+
+    expect(page).to have_issuable_counts(open: open_count, closed: closed_count, all: all_count)
+    page.within '.issues-list' do
+      expect(page).to have_selector('.issue', count: open_count)
+    end
+  end
+
   before do
     project.team << [user, :master]
+    project.team << [user2, :master]
     group.add_developer(user)
+    group.add_developer(user2)
     login_as(user)
     create(:issue, project: project)
-  end
 
-  describe 'for assignee from issues#index' do
-    before do
-      visit namespace_project_issues_path(project.namespace, project)
+    create(:issue, title: "Bug report 1", project: project)
+    create(:issue, title: "Bug report 2", project: project)
+    create(:issue, title: "issue with 'single quotes'", project: project)
+    create(:issue, title: "issue with \"double quotes\"", project: project)
+    create(:issue, title: "issue with !@\#{$%^&*()-+", project: project)
+    create(:issue, title: "issue by assignee", project: project, milestone: milestone, author: user, assignee: user)
+    create(:issue, title: "issue by assignee with searchTerm", project: project, milestone: milestone, author: user, assignee: user)
+
+    issue = create(:issue,
+      title: "Bug 2",
+      project: project,
+      milestone: milestone,
+      author: user,
+      assignee: user)
+    issue.labels << bug_label
+
+    issue_with_caps_label = create(:issue, 
+      title: "issue by assignee with searchTerm and label", 
+      project: project, 
+      milestone: milestone, 
+      author: user, 
+      assignee: user)
+    issue_with_caps_label.labels << caps_sensitive_label
+
+    issue_with_everything = create(:issue, 
+      title: "Bug report with everything you thought was possible", 
+      project: project, 
+      milestone: milestone, 
+      author: user, 
+      assignee: user)
+    issue_with_everything.labels << bug_label
+    issue_with_everything.labels << caps_sensitive_label
+
+    visit namespace_project_issues_path(project.namespace, project)
+  end
 
-      find('.js-assignee-search').click
+  describe 'filter issues by author' do
+    context 'only author', js: true do
+      it 'filters issues by searched author' do
+        input_filtered_search("author:#{user.username}")
+        expect_issues_list_count(5)
+      end
 
-      find('.dropdown-menu-user-link', text: user.username).click
+      it 'filters issues by invalid author' do
+        # YOLO
+      end
 
-      wait_for_ajax
+      it 'filters issues by multiple authors' do
+        # YOLO
+      end
     end
 
-    context 'assignee', js: true do
-      it 'updates to current user' do
-        expect(find('.js-assignee-search .dropdown-toggle-text')).to have_content(user.name)
+    context 'author with other filters', js: true do
+      it 'filters issues by searched author and text' do
+        input_filtered_search("author:#{user.username} issue")
+        expect_issues_list_count(3)
       end
 
-      it 'does not change when closed link is clicked' do
-        find('.issues-state-filters a', text: "Closed").click
-
-        expect(find('.js-assignee-search .dropdown-toggle-text')).to have_content(user.name)
+      it 'filters issues by searched author, assignee and text' do
+        input_filtered_search("author:#{user.username} assignee:#{user.username} issue")
+        expect_issues_list_count(3)
       end
 
-      it 'does not change when all link is clicked' do
-        find('.issues-state-filters a', text: "All").click
+      it 'filters issues by searched author, assignee, label, and text' do
+        input_filtered_search("author:#{user.username} assignee:#{user.username} label:#{caps_sensitive_label.title} issue")
+        expect_issues_list_count(1)
+      end
 
-        expect(find('.js-assignee-search .dropdown-toggle-text')).to have_content(user.name)
+      it 'filters issues by searched author, assignee, label, milestone and text' do
+        input_filtered_search("author:#{user.username} assignee:#{user.username} label:#{caps_sensitive_label.title} milestone:#{milestone.title} issue")
+        expect_issues_list_count(1)
       end
     end
+
+    context 'sorting', js: true do
+      # TODO
+    end
   end
 
-  describe 'for milestone from issues#index' do
-    before do
-      visit namespace_project_issues_path(project.namespace, project)
+  describe 'filter issues by assignee' do
+    context 'only assignee', js: true do
+      it 'filters issues by searched assignee' do
+        input_filtered_search("assignee:#{user.username}")
+        expect_issues_list_count(5)
+      end
 
-      find('.js-milestone-select').click
+      it 'filters issues by no assignee' do
+        # TODO
+      end
 
-      find('.milestone-filter .dropdown-content a', text: milestone.title).click
+      it 'filters issues by invalid assignee' do
+        # YOLO
+      end
 
-      wait_for_ajax
+      it 'filters issues by multiple assignees' do
+        # YOLO
+      end
     end
 
-    context 'milestone', js: true do
-      it 'updates to current milestone' do
-        expect(find('.js-milestone-select .dropdown-toggle-text')).to have_content(milestone.title)
+    context 'assignee with other filters', js: true do
+      it 'filters issues by searched assignee and text' do
+        input_filtered_search("assignee:#{user.username} searchTerm")
+        expect_issues_list_count(2)
       end
 
-      it 'does not change when closed link is clicked' do
-        find('.issues-state-filters a', text: "Closed").click
-
-        expect(find('.js-milestone-select .dropdown-toggle-text')).to have_content(milestone.title)
+      it 'filters issues by searched assignee, author and text' do
+        input_filtered_search("assignee:#{user.username} author:#{user.username} searchTerm")
+        expect_issues_list_count(2)
       end
 
-      it 'does not change when all link is clicked' do
-        find('.issues-state-filters a', text: "All").click
-
-        expect(find('.js-milestone-select .dropdown-toggle-text')).to have_content(milestone.title)
+      it 'filters issues by searched assignee, author, label, text' do
+        input_filtered_search("assignee:#{user.username} author:#{user.username} label:#{caps_sensitive_label.title} searchTerm")
+        expect_issues_list_count(1)
       end
-    end
-  end
 
-  describe 'for label from issues#index', js: true do
-    before do
-      visit namespace_project_issues_path(project.namespace, project)
-      find('.js-label-select').click
-      wait_for_ajax
+      it 'filters issues by searched assignee, author, label, milestone and text' do
+        input_filtered_search("assignee:#{user.username} author:#{user.username} label:#{caps_sensitive_label.title} milestone:#{milestone.title} searchTerm")
+        expect_issues_list_count(1)
+      end
     end
 
-    it 'filters by any label' do
-      find('.dropdown-menu-labels a', text: 'Any Label').click
-      page.first('.labels-filter .dropdown-title .dropdown-menu-close-icon').click
-      wait_for_ajax
-
-      expect(find('.labels-filter')).to have_content 'Label'
+    context 'sorting', js: true do
+      # TODO
     end
+  end
 
-    it 'filters by no label' do
-      find('.dropdown-menu-labels a', text: 'No Label').click
-      page.first('.labels-filter .dropdown-title .dropdown-menu-close-icon').click
-      wait_for_ajax
-
-      page.within '.labels-filter' do
-        expect(page).to have_content 'Labels'
+  describe 'filter issues by label' do
+    context 'only label', js: true do
+      it 'filters issues by searched label' do
+        input_filtered_search("label:#{bug_label.title}")
+        expect_issues_list_count(2)
       end
-      expect(find('.js-label-select .dropdown-toggle-text')).to have_content('Labels')
-    end
 
-    it 'filters by a label' do
-      find('.dropdown-menu-labels a', text: label.title).click
-      page.within '.labels-filter' do
-        expect(page).to have_content label.title
+      it 'filters issues by no label' do
+        # TODO
       end
-      expect(find('.js-label-select .dropdown-toggle-text')).to have_content(label.title)
-    end
 
-    it "filters by `won't fix` and another label" do
-      page.within '.labels-filter' do
-        click_link wontfix.title
-        expect(page).to have_content wontfix.title
-        click_link label.title
+      it 'filters issues by invalid label' do
+        # YOLO
       end
 
-      expect(find('.js-label-select .dropdown-toggle-text')).to have_content("#{wontfix.title} +1 more")
+      it 'filters issues by multiple labels' do
+        input_filtered_search("label:#{bug_label.title} label:#{caps_sensitive_label.title}")
+        expect_issues_list_count(1)
+      end
     end
 
-    it "filters by `won't fix` label followed by another label after page load" do
-      page.within '.labels-filter' do
-        click_link wontfix.title
-        expect(page).to have_content wontfix.title
+    context 'label with other filters', js: true do
+      it 'filters issues by searched label and text' do
+        input_filtered_search("label:#{caps_sensitive_label.title} bug")
+        expect_issues_list_count(1)
       end
 
-      find('.dropdown-menu-close-icon').click
+      it 'filters issues by searched label, author and text' do
+        input_filtered_search("label:#{caps_sensitive_label.title} author:#{user.username} bug")
+        expect_issues_list_count(1)
+      end
 
-      expect(find('.filtered-labels')).to have_content(wontfix.title)
+      it 'filters issues by searched label, author, assignee and text' do
+        input_filtered_search("label:#{caps_sensitive_label.title} author:#{user.username} assignee:#{user.username} bug")
+        expect_issues_list_count(1)
+      end
 
-      find('.js-label-select').click
-      wait_for_ajax
-      find('.dropdown-menu-labels a', text: label.title).click
+      it 'filters issues by searched label, author, assignee, milestone and text' do
+        input_filtered_search("label:#{caps_sensitive_label.title} author:#{user.username} assignee:#{user.username} milestone:#{milestone.title} bug")
+        expect_issues_list_count(1)
+      end
+    end
 
-      find('.dropdown-menu-close-icon').click
+    context 'multiple labels with other filters', js: true do
+      it 'filters issues by searched label, label2, and text' do
+        input_filtered_search("label:#{bug_label.title} label:#{caps_sensitive_label.title} bug")
+        expect_issues_list_count(1)
+      end
 
-      expect(find('.filtered-labels')).to have_content(wontfix.title)
-      expect(find('.filtered-labels')).to have_content(label.title)
+      it 'filters issues by searched label, label2, author and text' do
+        input_filtered_search("label:#{bug_label.title} label:#{caps_sensitive_label.title} author:#{user.username} bug")
+        expect_issues_list_count(1)
+      end
 
-      find('.js-label-select').click
-      wait_for_ajax
+      it 'filters issues by searched label, label2, author, assignee and text' do
+        input_filtered_search("label:#{bug_label.title} label:#{caps_sensitive_label.title} author:#{user.username} assignee:#{user.username} bug")
+        expect_issues_list_count(1)
+      end
 
-      expect(find('.dropdown-menu-labels li', text: wontfix.title)).to have_css('.is-active')
-      expect(find('.dropdown-menu-labels li', text: label.title)).to have_css('.is-active')
+      it 'filters issues by searched label, label2, author, assignee, milestone and text' do
+        input_filtered_search("label:#{bug_label.title} label:#{caps_sensitive_label.title} author:#{user.username} assignee:#{user.username} milestone:#{milestone.title} bug")
+        expect_issues_list_count(1)
+      end
     end
 
     it "selects and unselects `won't fix`" do
@@ -153,211 +242,160 @@ describe 'Filter issues', feature: true do
 
       find('.dropdown-menu-close-icon').click
       expect(page).not_to have_css('.filtered-labels')
+    context 'sorting', js: true do
+      # TODO
     end
   end
 
-  describe 'for assignee and label from issues#index' do
-    before do
-      visit namespace_project_issues_path(project.namespace, project)
-
-      find('.js-assignee-search').click
-
-      find('.dropdown-menu-user-link', text: user.username).click
+  describe 'filter issues by milestone' do
+    context 'only milestone', js: true do
+      it 'filters issues by searched milestone' do
+        input_filtered_search("milestone:#{milestone.title}")
+        expect_issues_list_count(5)
+      end
 
-      expect(page).not_to have_selector('.issues-list .issue')
+      it 'filters issues by no milestone' do
+        # TODO
+      end
 
-      find('.js-label-select').click
+      it 'filters issues by upcoming milestones' do
+        # TODO
+      end
 
-      find('.dropdown-menu-labels .dropdown-content a', text: label.title).click
-      page.first('.labels-filter .dropdown-title .dropdown-menu-close-icon').click
+      it 'filters issues by invalid milestones' do
+        # YOLO
+      end
 
-      wait_for_ajax
+      it 'filters issues by multiple milestones' do
+        # YOLO
+      end
     end
 
-    context 'assignee and label', js: true do
-      it 'updates to current assignee and label' do
-        expect(find('.js-assignee-search .dropdown-toggle-text')).to have_content(user.name)
-        expect(find('.js-label-select .dropdown-toggle-text')).to have_content(label.title)
+    context 'milestone with other filters', js: true do
+      it 'filters issues by searched milestone and text' do
       end
 
-      it 'does not change when closed link is clicked' do
-        find('.issues-state-filters a', text: "Closed").click
-
-        expect(find('.js-assignee-search .dropdown-toggle-text')).to have_content(user.name)
-        expect(find('.js-label-select .dropdown-toggle-text')).to have_content(label.title)
+      it 'filters issues by searched milestone, author and text' do
       end
 
-      it 'does not change when all link is clicked' do
-        find('.issues-state-filters a', text: "All").click
+      it 'filters issues by searched milestone, author, assignee and text' do
+      end
 
-        expect(find('.js-assignee-search .dropdown-toggle-text')).to have_content(user.name)
-        expect(find('.js-label-select .dropdown-toggle-text')).to have_content(label.title)
+      it 'filters issues by searched milestone, author, assignee, label and text' do
       end
     end
-  end
-
-  describe 'filter issues by text' do
-    before do
-      create(:issue, title: "Bug", project: project)
-
-      bug_label = create(:label, project: project, title: 'bug')
-      milestone = create(:milestone, title: "8", project: project)
-
-      issue = create(:issue,
-        title: "Bug 2",
-        project: project,
-        milestone: milestone,
-        author: user,
-        assignee: user)
-      issue.labels << bug_label
 
-      visit namespace_project_issues_path(project.namespace, project)
+    context 'sorting', js: true do
+      # TODO
     end
+  end
 
+  describe 'filter issues by text' do
     context 'only text', js: true do
       it 'filters issues by searched text' do
-        fill_in 'issuable_search', with: 'Bug'
-
-        page.within '.issues-list' do
-          expect(page).to have_selector('.issue', count: 2)
-        end
+        input_filtered_search('Bug')
+        expect_issues_list_count(4)
       end
 
-      it 'does not show any issues' do
-        fill_in 'issuable_search', with: 'testing'
-
-        page.within '.issues-list' do
-          expect(page).not_to have_selector('.issue')
-        end
+      it 'filters issues by multiple searched text' do
+        input_filtered_search('Bug report')
+        expect_issues_list_count(3)
       end
-    end
 
-    context 'text and dropdown options', js: true do
-      it 'filters by text and label' do
-        fill_in 'issuable_search', with: 'Bug'
-
-        expect(page).to have_issuable_counts(open: 2, closed: 0, all: 2)
-        page.within '.issues-list' do
-          expect(page).to have_selector('.issue', count: 2)
-        end
-
-        click_button 'Label'
-        page.within '.labels-filter' do
-          click_link 'bug'
-        end
-        find('.dropdown-menu-close-icon').click
-
-        expect(page).to have_issuable_counts(open: 1, closed: 0, all: 1)
-        page.within '.issues-list' do
-          expect(page).to have_selector('.issue', count: 1)
-        end
+      it 'filters issues by case insensitive searched text' do
+        input_filtered_search('bug report')
+        expect_issues_list_count(3)
       end
 
-      it 'filters by text and milestone' do
-        fill_in 'issuable_search', with: 'Bug'
-
-        expect(page).to have_issuable_counts(open: 2, closed: 0, all: 2)
-        page.within '.issues-list' do
-          expect(page).to have_selector('.issue', count: 2)
-        end
-
-        click_button 'Milestone'
-        page.within '.milestone-filter' do
-          click_link '8'
-        end
-
-        expect(page).to have_issuable_counts(open: 1, closed: 0, all: 1)
-        page.within '.issues-list' do
-          expect(page).to have_selector('.issue', count: 1)
-        end
+      it 'filters issues by searched text containing single quotes' do
+        input_filtered_search('\'single quotes\'')
+        expect_issues_list_count(1)
       end
 
-      it 'filters by text and assignee' do
-        fill_in 'issuable_search', with: 'Bug'
-
-        expect(page).to have_issuable_counts(open: 2, closed: 0, all: 2)
-        page.within '.issues-list' do
-          expect(page).to have_selector('.issue', count: 2)
-        end
+      it 'filters issues by searched text containing double quotes' do
+        input_filtered_search('"double quotes"')
+        expect_issues_list_count(1)
+      end
 
-        click_button 'Assignee'
-        page.within '.dropdown-menu-assignee' do
-          click_link user.name
-        end
+      it 'filters issues by searched text containing special characters' do
+        input_filtered_search('!@#{$%^&*()-+')
+        expect_issues_list_count(1)
+      end
 
-        expect(page).to have_issuable_counts(open: 1, closed: 0, all: 1)
-        page.within '.issues-list' do
-          expect(page).to have_selector('.issue', count: 1)
-        end
+      it 'does not show any issues' do
+        input_filtered_search('testing')
+        expect_no_issues_list()
       end
+    end
 
-      it 'filters by text and author' do
-        fill_in 'issuable_search', with: 'Bug'
+    context 'searched text with other filters', js: true do
+      it 'filters issues by searched text and author' do
+        input_filtered_search("bug author:#{user.username}")
+        expect_issues_list_count(2)
+      end
 
-        expect(page).to have_issuable_counts(open: 2, closed: 0, all: 2)
-        page.within '.issues-list' do
-          expect(page).to have_selector('.issue', count: 2)
-        end
+      it 'filters issues by searched text, author and more text' do
+        input_filtered_search("bug author:#{user.username} report")
+        expect_issues_list_count(1)
+      end
 
-        click_button 'Author'
-        page.within '.dropdown-menu-author' do
-          click_link user.name
-        end
+      it 'filters issues by searched text, author and assignee' do
+        input_filtered_search("bug author:#{user.username} assignee:#{user.username}")
+        expect_issues_list_count(2)
+      end
 
-        expect(page).to have_issuable_counts(open: 1, closed: 0, all: 1)
-        page.within '.issues-list' do
-          expect(page).to have_selector('.issue', count: 1)
-        end
+      it 'filters issues by searched text, author, more text and assignee' do
+        input_filtered_search("bug author:#{user.username} report assignee:#{user.username}")
+        expect_issues_list_count(1)
       end
-    end
-  end
 
-  describe 'filter issues and sort', js: true do
-    before do
-      bug_label = create(:label, project: project, title: 'bug')
-      bug_one = create(:issue, title: "Frontend", project: project)
-      bug_two = create(:issue, title: "Bug 2", project: project)
+      it 'filters issues by searched text, author, more text, assignee and even more text' do
+        input_filtered_search("bug author:#{user.username} report assignee:#{user.username} with")
+        expect_issues_list_count(1)
+      end
 
-      bug_one.labels << bug_label
-      bug_two.labels << bug_label
+      it 'filters issues by searched text, author, assignee and label' do
+        input_filtered_search("bug author:#{user.username} assignee:#{user.username} label:#{bug_label.title}")
+        expect_issues_list_count(2)
+      end
 
-      visit namespace_project_issues_path(project.namespace, project)
-    end
+      it 'filters issues by searched text, author, text, assignee, text, label and text' do
+        input_filtered_search("bug author:#{user.username} report assignee:#{user.username} with label:#{bug_label.title} everything")
+        expect_issues_list_count(1)
+      end
 
-    it 'is able to filter and sort issues' do
-      click_button 'Label'
-      wait_for_ajax
-      page.within '.labels-filter' do
-        click_link 'bug'
+      it 'filters issues by searched text, author, assignee, label and milestone' do
+        input_filtered_search("bug author:#{user.username} assignee:#{user.username} label:#{bug_label.title} milestone:#{milestone.title}")
+        expect_issues_list_count(2)
       end
-      find('.dropdown-menu-close-icon').click
-      wait_for_ajax
 
-      expect(page).to have_issuable_counts(open: 2, closed: 0, all: 2)
-      page.within '.issues-list' do
-        expect(page).to have_selector('.issue', count: 2)
+      it 'filters issues by searched text, author, text, assignee, text, label, text, milestone and text' do
+        input_filtered_search("bug author:#{user.username} report assignee:#{user.username} with label:#{bug_label.title} everything milestone:#{milestone.title} you")
+        expect_issues_list_count(1)
       end
 
-      click_button 'Last created'
-      page.within '.dropdown-menu-sort' do
-        click_link 'Oldest created'
+      it 'filters issues by searched text, author, assignee, multiple labels and milestone' do
+        input_filtered_search("bug author:#{user.username} assignee:#{user.username} label:#{bug_label.title} label:#{caps_sensitive_label.title} milestone:#{milestone.title}")
+        expect_issues_list_count(1)
       end
-      wait_for_ajax
 
-      page.within '.issues-list' do
-        expect(page).to have_content('Frontend')
+      it 'filters issues by searched text, author, text, assignee, text, label1, text, label2, text, milestone and text' do
+        input_filtered_search("bug author:#{user.username} report assignee:#{user.username} with label:#{bug_label.title} everything label:#{caps_sensitive_label.title} you milestone:#{milestone.title} thought")
+        expect_issues_list_count(1)
       end
     end
+
+    context 'sorting', js: true do
+      # TODO
+    end
   end
 
   it 'updates atom feed link for project issues' do
     visit namespace_project_issues_path(project.namespace, project, milestone_title: '', assignee_id: user.id)
-
     link = find('.nav-controls a', text: 'Subscribe')
     params = CGI::parse(URI.parse(link[:href]).query)
     auto_discovery_link = find('link[type="application/atom+xml"]', visible: false)
     auto_discovery_params = CGI::parse(URI.parse(auto_discovery_link[:href]).query)
-
     expect(params).to include('private_token' => [user.private_token])
     expect(params).to include('milestone_title' => [''])
     expect(params).to include('assignee_id' => [user.id.to_s])
@@ -368,12 +406,10 @@ describe 'Filter issues', feature: true do
 
   it 'updates atom feed link for group issues' do
     visit issues_group_path(group, milestone_title: '', assignee_id: user.id)
-
     link = find('.nav-controls a', text: 'Subscribe')
     params = CGI::parse(URI.parse(link[:href]).query)
     auto_discovery_link = find('link[type="application/atom+xml"]', visible: false)
     auto_discovery_params = CGI::parse(URI.parse(auto_discovery_link[:href]).query)
-
     expect(params).to include('private_token' => [user.private_token])
     expect(params).to include('milestone_title' => [''])
     expect(params).to include('assignee_id' => [user.id.to_s])
-- 
GitLab