summaryrefslogtreecommitdiff
path: root/spec/features/merge_requests/filter_merge_requests_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/features/merge_requests/filter_merge_requests_spec.rb')
-rw-r--r--spec/features/merge_requests/filter_merge_requests_spec.rb355
1 files changed, 355 insertions, 0 deletions
diff --git a/spec/features/merge_requests/filter_merge_requests_spec.rb b/spec/features/merge_requests/filter_merge_requests_spec.rb
new file mode 100644
index 00000000000..4642b5a530d
--- /dev/null
+++ b/spec/features/merge_requests/filter_merge_requests_spec.rb
@@ -0,0 +1,355 @@
+require 'rails_helper'
+
+describe 'Filter merge requests', feature: true do
+ include WaitForAjax
+
+ let!(:project) { create(:project) }
+ let!(:group) { create(:group) }
+ let!(:user) { create(:user)}
+ let!(:milestone) { create(:milestone, project: project) }
+ let!(:label) { create(:label, project: project) }
+ let!(:wontfix) { create(:label, project: project, title: "Won't fix") }
+
+ before do
+ project.team << [user, :master]
+ group.add_developer(user)
+ login_as(user)
+ create(:merge_request, source_project: project, target_project: project)
+ end
+
+ describe 'for assignee from mr#index' do
+ before do
+ visit namespace_project_merge_requests_path(project.namespace, project)
+
+ find('.js-assignee-search').click
+
+ find('.dropdown-menu-user-link', text: user.username).click
+
+ wait_for_ajax
+ 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)
+ 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)
+ end
+
+ it 'does not change when all link is clicked' do
+ find('.issues-state-filters a', text: "All").click
+
+ expect(find('.js-assignee-search .dropdown-toggle-text')).to have_content(user.name)
+ end
+ end
+ end
+
+ describe 'for milestone from mr#index' do
+ before do
+ visit namespace_project_merge_requests_path(project.namespace, project)
+
+ find('.js-milestone-select').click
+
+ find('.milestone-filter .dropdown-content a', text: milestone.title).click
+
+ wait_for_ajax
+ 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)
+ 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)
+ 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)
+ end
+ end
+ end
+
+ describe 'for label from mr#index', js: true do
+ before do
+ visit namespace_project_merge_requests_path(project.namespace, project)
+ find('.js-label-select').click
+ wait_for_ajax
+ 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'
+ 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'
+ 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
+ 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
+ end
+
+ expect(find('.js-label-select .dropdown-toggle-text')).to have_content("#{wontfix.title} +1 more")
+ 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
+ end
+
+ find('body').click
+
+ expect(find('.filtered-labels')).to have_content(wontfix.title)
+
+ find('.js-label-select').click
+ wait_for_ajax
+ find('.dropdown-menu-labels a', text: label.title).click
+
+ find('body').click
+
+ expect(find('.filtered-labels')).to have_content(wontfix.title)
+ expect(find('.filtered-labels')).to have_content(label.title)
+
+ find('.js-label-select').click
+ wait_for_ajax
+
+ 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')
+ end
+
+ it "selects and unselects `won't fix`" do
+ find('.dropdown-menu-labels a', text: wontfix.title).click
+ find('.dropdown-menu-labels a', text: wontfix.title).click
+ # Close label dropdown to load
+ find('body').click
+ expect(page).not_to have_css('.filtered-labels')
+ end
+ end
+
+ describe 'for assignee and label from issues#index' do
+ before do
+ visit namespace_project_merge_requests_path(project.namespace, project)
+
+ find('.js-assignee-search').click
+
+ find('.dropdown-menu-user-link', text: user.username).click
+
+ expect(page).not_to have_selector('.mr-list .merge-request')
+
+ find('.js-label-select').click
+
+ find('.dropdown-menu-labels .dropdown-content a', text: label.title).click
+ page.first('.labels-filter .dropdown-title .dropdown-menu-close-icon').click
+
+ wait_for_ajax
+ 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)
+ 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)
+ end
+
+ it 'does not change when all link is clicked' do
+ find('.issues-state-filters a', text: "All").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)
+ end
+ end
+ end
+
+ describe 'filter merge requests by text' do
+ before do
+ create(:merge_request, title: "Bug", source_project: project, target_project: project, source_branch: "bug")
+
+ bug_label = create(:label, project: project, title: 'bug')
+ milestone = create(:milestone, title: "8", project: project)
+
+ mr = create(:merge_request,
+ title: "Bug 2",
+ source_project: project,
+ target_project: project,
+ source_branch: "bug2",
+ milestone: milestone,
+ author: user,
+ assignee: user)
+ mr.labels << bug_label
+
+ visit namespace_project_merge_requests_path(project.namespace, project)
+ end
+
+ context 'only text', js: true do
+ it 'filters merge requests by searched text' do
+ fill_in 'issuable_search', with: 'Bug'
+
+ page.within '.mr-list' do
+ expect(page).to have_selector('.merge-request', count: 2)
+ end
+ end
+
+ it 'does not show any merge requests' do
+ fill_in 'issuable_search', with: 'testing'
+
+ page.within '.mr-list' do
+ expect(page).not_to have_selector('.merge-request')
+ end
+ 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 '.mr-list' do
+ expect(page).to have_selector('.merge-request', 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 '.mr-list' do
+ expect(page).to have_selector('.merge-request', count: 1)
+ end
+ 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 '.mr-list' do
+ expect(page).to have_selector('.merge-request', 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 '.mr-list' do
+ expect(page).to have_selector('.merge-request', count: 1)
+ end
+ 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 '.mr-list' do
+ expect(page).to have_selector('.merge-request', count: 2)
+ end
+
+ click_button 'Assignee'
+ page.within '.dropdown-menu-assignee' do
+ click_link user.name
+ end
+
+ expect(page).to have_issuable_counts(open: 1, closed: 0, all: 1)
+ page.within '.mr-list' do
+ expect(page).to have_selector('.merge-request', count: 1)
+ end
+ end
+
+ it 'filters by text and author' do
+ fill_in 'issuable_search', with: 'Bug'
+
+ expect(page).to have_issuable_counts(open: 2, closed: 0, all: 2)
+ page.within '.mr-list' do
+ expect(page).to have_selector('.merge-request', count: 2)
+ end
+
+ click_button 'Author'
+ page.within '.dropdown-menu-author' do
+ click_link user.name
+ end
+
+ expect(page).to have_issuable_counts(open: 1, closed: 0, all: 1)
+ page.within '.mr-list' do
+ expect(page).to have_selector('.merge-request', count: 1)
+ end
+ end
+ end
+ end
+
+ describe 'filter merge requests and sort', js: true do
+ before do
+ bug_label = create(:label, project: project, title: 'bug')
+
+ mr1 = create(:merge_request, title: "Frontend", source_project: project, target_project: project, source_branch: "Frontend")
+ mr2 = create(:merge_request, title: "Bug 2", source_project: project, target_project: project, source_branch: "bug2")
+
+ mr1.labels << bug_label
+ mr2.labels << bug_label
+
+ visit namespace_project_merge_requests_path(project.namespace, project)
+ end
+
+ it 'is able to filter and sort merge requests' do
+ click_button 'Label'
+ wait_for_ajax
+ page.within '.labels-filter' do
+ click_link 'bug'
+ end
+ find('.dropdown-menu-close-icon').click
+ wait_for_ajax
+
+ expect(page).to have_issuable_counts(open: 2, closed: 0, all: 2)
+ page.within '.mr-list' do
+ expect(page).to have_selector('.merge-request', count: 2)
+ end
+
+ click_button 'Last created'
+ page.within '.dropdown-menu-sort' do
+ click_link 'Oldest created'
+ end
+ wait_for_ajax
+
+ page.within '.mr-list' do
+ expect(page).to have_content('Frontend')
+ end
+ end
+ end
+end